From 6fb252ee777258c03f9b3409f20b2089f25eeca9 Mon Sep 17 00:00:00 2001 From: egibs <20933572+egibs@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:28:43 -0500 Subject: [PATCH 1/2] Address false positives for SQLPad and Lerna Signed-off-by: egibs <20933572+egibs@users.noreply.github.com> --- pkg/compile/compile.go | 1 + rules/evasion/base64-python.yara | 43 ++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pkg/compile/compile.go b/pkg/compile/compile.go index a946201f4..02eb3a950 100644 --- a/pkg/compile/compile.go +++ b/pkg/compile/compile.go @@ -25,6 +25,7 @@ var badRules = map[string]bool{ "MALPEDIA_Win_Unidentified_107_Auto": true, "SIGNATURE_BASE_SUSP_PS1_JAB_Pattern_Jun22_1": true, "ELCEEF_HTML_Smuggling_A": true, + "DELIVRTO_SUSP_HTML_WASM_Smuggling": true, // ThreatHunting Keywords (some duplicates) "Adobe_XMP_Identifier": true, "Antivirus_Signature_signature_keyword": true, diff --git a/rules/evasion/base64-python.yara b/rules/evasion/base64-python.yara index 8ca8085bf..ec6135885 100644 --- a/rules/evasion/base64-python.yara +++ b/rules/evasion/base64-python.yara @@ -6,24 +6,29 @@ rule base64_python_functions : critical { hash_2023_0xShell_wesobase = "17a1219bf38d953ed22bbddd5aaf1811b9380ad0535089e6721d755a00bddbd0" hash_2024_static_demonizedshell_static = "b4e65c01ab90442cb5deda26660a3f81bd400c205e12605536483f979023aa15" strings: - $exec = "exec(" base64 - $eval = "eval(" base64 - $import_os = "import os" base64 - $import = "__import__" base64 - $importlib = "importlib" base64 - $import_module = "import_module" base64 - $urllib = "urllib.request" base64 - $requests_get = "requests.get" base64 - $urlopen = "urlopen" base64 - $read = "read()" base64 - $decode = "decode()" base64 - $b64decode = "base64.b64decode" base64 - $exc = "except Exception as" base64 - $os_system = "os.system" base64 - $os_popen = "os.popen" base64 - $thread = "threading.Thread" base64 - $os_environ = "os.environ" base64 - $with_open = "with open(" base64 + $f_exec = "exec(" base64 + $f_eval = "eval(" base64 + $f_import_os = "import os" base64 + $f_import = "__import__" base64 + $f_importlib = "importlib" base64 + $f_import_module = "import_module" base64 + $f_urllib = "urllib.request" base64 + $f_requests_get = "requests.get" base64 + $f_urlopen = "urlopen" base64 + $f_read = "read()" base64 + $f_decode = "decode()" base64 + $f_b64decode = "base64.b64decode" base64 + $f_exc = "except Exception as" base64 + $f_os_system = "os.system" base64 + $f_os_popen = "os.popen" base64 + $f_thread = "threading.Thread" base64 + $f_os_environ = "os.environ" base64 + $f_with_open = "with open(" base64 + $not_js = " ?? " base64 + $not_js2 = " === " base64 + $not_js3 = "const" base64 + $not_js4 = "this." base64 + $not_js5 = "throw" base64 condition: - 2 of them + 2 of ($f*) and none of ($not*) } From 635c47c00cc7b996714e17e73241bf9e0ea63f88 Mon Sep 17 00:00:00 2001 From: egibs <20933572+egibs@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:55:37 -0500 Subject: [PATCH 2/2] Add samples for Lerna and SQLPad Signed-off-by: egibs <20933572+egibs@users.noreply.github.com> --- samples/Javascript/clean/connection.js | 2700 ++++ samples/Javascript/clean/connection.js.simple | 8 + samples/Javascript/clean/napi_rs_runtime.js | 11538 ++++++++++++++++ .../clean/napi_rs_runtime.js.simple | 21 + 4 files changed, 14267 insertions(+) create mode 100644 samples/Javascript/clean/connection.js create mode 100644 samples/Javascript/clean/connection.js.simple create mode 100644 samples/Javascript/clean/napi_rs_runtime.js create mode 100644 samples/Javascript/clean/napi_rs_runtime.js.simple diff --git a/samples/Javascript/clean/connection.js b/samples/Javascript/clean/connection.js new file mode 100644 index 000000000..460c195cf --- /dev/null +++ b/samples/Javascript/clean/connection.js @@ -0,0 +1,2700 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _crypto = _interopRequireDefault(require("crypto")); +var _os = _interopRequireDefault(require("os")); +var tls = _interopRequireWildcard(require("tls")); +var net = _interopRequireWildcard(require("net")); +var _dns = _interopRequireDefault(require("dns")); +var _constants = _interopRequireDefault(require("constants")); +var _stream = require("stream"); +var _identity = require("@azure/identity"); +var _bulkLoad = _interopRequireDefault(require("./bulk-load")); +var _debug = _interopRequireDefault(require("./debug")); +var _events = require("events"); +var _instanceLookup = require("./instance-lookup"); +var _transientErrorLookup = require("./transient-error-lookup"); +var _packet = require("./packet"); +var _preloginPayload = _interopRequireDefault(require("./prelogin-payload")); +var _login7Payload = _interopRequireDefault(require("./login7-payload")); +var _ntlmPayload = _interopRequireDefault(require("./ntlm-payload")); +var _request = _interopRequireDefault(require("./request")); +var _rpcrequestPayload = _interopRequireDefault(require("./rpcrequest-payload")); +var _sqlbatchPayload = _interopRequireDefault(require("./sqlbatch-payload")); +var _messageIo = _interopRequireDefault(require("./message-io")); +var _tokenStreamParser = require("./token/token-stream-parser"); +var _transaction = require("./transaction"); +var _errors = require("./errors"); +var _connector = require("./connector"); +var _library = require("./library"); +var _tdsVersions = require("./tds-versions"); +var _message = _interopRequireDefault(require("./message")); +var _ntlm = require("./ntlm"); +var _nodeAbortController = require("node-abort-controller"); +var _dataType = require("./data-type"); +var _bulkLoadPayload = require("./bulk-load-payload"); +var _specialStoredProcedure = _interopRequireDefault(require("./special-stored-procedure")); +var _esAggregateError = _interopRequireDefault(require("es-aggregate-error")); +var _package = require("../package.json"); +var _url = require("url"); +var _handler = require("./token/handler"); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// eslint-disable-next-line @typescript-eslint/no-unused-vars + +/** + * @private + */ +const KEEP_ALIVE_INITIAL_DELAY = 30 * 1000; +/** + * @private + */ +const DEFAULT_CONNECT_TIMEOUT = 15 * 1000; +/** + * @private + */ +const DEFAULT_CLIENT_REQUEST_TIMEOUT = 15 * 1000; +/** + * @private + */ +const DEFAULT_CANCEL_TIMEOUT = 5 * 1000; +/** + * @private + */ +const DEFAULT_CONNECT_RETRY_INTERVAL = 500; +/** + * @private + */ +const DEFAULT_PACKET_SIZE = 4 * 1024; +/** + * @private + */ +const DEFAULT_TEXTSIZE = 2147483647; +/** + * @private + */ +const DEFAULT_DATEFIRST = 7; +/** + * @private + */ +const DEFAULT_PORT = 1433; +/** + * @private + */ +const DEFAULT_TDS_VERSION = '7_4'; +/** + * @private + */ +const DEFAULT_LANGUAGE = 'us_english'; +/** + * @private + */ +const DEFAULT_DATEFORMAT = 'mdy'; + +/** + * @private + */ + +/** + * @private + */ +const CLEANUP_TYPE = { + NORMAL: 0, + REDIRECT: 1, + RETRY: 2 +}; +/** + * A [[Connection]] instance represents a single connection to a database server. + * + * ```js + * var Connection = require('tedious').Connection; + * var config = { + * "authentication": { + * ..., + * "options": {...} + * }, + * "options": {...} + * }; + * var connection = new Connection(config); + * ``` + * + * Only one request at a time may be executed on a connection. Once a [[Request]] + * has been initiated (with [[Connection.callProcedure]], [[Connection.execSql]], + * or [[Connection.execSqlBatch]]), another should not be initiated until the + * [[Request]]'s completion callback is called. + */ +class Connection extends _events.EventEmitter { + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + _cancelAfterRequestSent; + + /** + * @private + */ + + /** + * Note: be aware of the different options field: + * 1. config.authentication.options + * 2. config.options + * + * ```js + * const { Connection } = require('tedious'); + * + * const config = { + * "authentication": { + * ..., + * "options": {...} + * }, + * "options": {...} + * }; + * + * const connection = new Connection(config); + * ``` + * + * @param config + */ + constructor(config) { + super(); + if (typeof config !== 'object' || config === null) { + throw new TypeError('The "config" argument is required and must be of type Object.'); + } + if (typeof config.server !== 'string') { + throw new TypeError('The "config.server" property is required and must be of type string.'); + } + this.fedAuthRequired = false; + let authentication; + if (config.authentication !== undefined) { + if (typeof config.authentication !== 'object' || config.authentication === null) { + throw new TypeError('The "config.authentication" property must be of type Object.'); + } + const type = config.authentication.type; + const options = config.authentication.options === undefined ? {} : config.authentication.options; + if (typeof type !== 'string') { + throw new TypeError('The "config.authentication.type" property must be of type string.'); + } + if (type !== 'default' && type !== 'ntlm' && type !== 'azure-active-directory-password' && type !== 'azure-active-directory-access-token' && type !== 'azure-active-directory-msi-vm' && type !== 'azure-active-directory-msi-app-service' && type !== 'azure-active-directory-service-principal-secret' && type !== 'azure-active-directory-default') { + throw new TypeError('The "type" property must one of "default", "ntlm", "azure-active-directory-password", "azure-active-directory-access-token", "azure-active-directory-default", "azure-active-directory-msi-vm" or "azure-active-directory-msi-app-service" or "azure-active-directory-service-principal-secret".'); + } + if (typeof options !== 'object' || options === null) { + throw new TypeError('The "config.authentication.options" property must be of type object.'); + } + if (type === 'ntlm') { + if (typeof options.domain !== 'string') { + throw new TypeError('The "config.authentication.options.domain" property must be of type string.'); + } + if (options.userName !== undefined && typeof options.userName !== 'string') { + throw new TypeError('The "config.authentication.options.userName" property must be of type string.'); + } + if (options.password !== undefined && typeof options.password !== 'string') { + throw new TypeError('The "config.authentication.options.password" property must be of type string.'); + } + authentication = { + type: 'ntlm', + options: { + userName: options.userName, + password: options.password, + domain: options.domain && options.domain.toUpperCase() + } + }; + } else if (type === 'azure-active-directory-password') { + if (typeof options.clientId !== 'string') { + throw new TypeError('The "config.authentication.options.clientId" property must be of type string.'); + } + if (options.userName !== undefined && typeof options.userName !== 'string') { + throw new TypeError('The "config.authentication.options.userName" property must be of type string.'); + } + if (options.password !== undefined && typeof options.password !== 'string') { + throw new TypeError('The "config.authentication.options.password" property must be of type string.'); + } + if (options.tenantId !== undefined && typeof options.tenantId !== 'string') { + throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-password', + options: { + userName: options.userName, + password: options.password, + tenantId: options.tenantId, + clientId: options.clientId + } + }; + } else if (type === 'azure-active-directory-access-token') { + if (typeof options.token !== 'string') { + throw new TypeError('The "config.authentication.options.token" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-access-token', + options: { + token: options.token + } + }; + } else if (type === 'azure-active-directory-msi-vm') { + if (options.clientId !== undefined && typeof options.clientId !== 'string') { + throw new TypeError('The "config.authentication.options.clientId" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-msi-vm', + options: { + clientId: options.clientId + } + }; + } else if (type === 'azure-active-directory-default') { + if (options.clientId !== undefined && typeof options.clientId !== 'string') { + throw new TypeError('The "config.authentication.options.clientId" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-default', + options: { + clientId: options.clientId + } + }; + } else if (type === 'azure-active-directory-msi-app-service') { + if (options.clientId !== undefined && typeof options.clientId !== 'string') { + throw new TypeError('The "config.authentication.options.clientId" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-msi-app-service', + options: { + clientId: options.clientId + } + }; + } else if (type === 'azure-active-directory-service-principal-secret') { + if (typeof options.clientId !== 'string') { + throw new TypeError('The "config.authentication.options.clientId" property must be of type string.'); + } + if (typeof options.clientSecret !== 'string') { + throw new TypeError('The "config.authentication.options.clientSecret" property must be of type string.'); + } + if (typeof options.tenantId !== 'string') { + throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.'); + } + authentication = { + type: 'azure-active-directory-service-principal-secret', + options: { + clientId: options.clientId, + clientSecret: options.clientSecret, + tenantId: options.tenantId + } + }; + } else { + if (options.userName !== undefined && typeof options.userName !== 'string') { + throw new TypeError('The "config.authentication.options.userName" property must be of type string.'); + } + if (options.password !== undefined && typeof options.password !== 'string') { + throw new TypeError('The "config.authentication.options.password" property must be of type string.'); + } + authentication = { + type: 'default', + options: { + userName: options.userName, + password: options.password + } + }; + } + } else { + authentication = { + type: 'default', + options: { + userName: undefined, + password: undefined + } + }; + } + this.config = { + server: config.server, + authentication: authentication, + options: { + abortTransactionOnError: false, + appName: undefined, + camelCaseColumns: false, + cancelTimeout: DEFAULT_CANCEL_TIMEOUT, + columnEncryptionKeyCacheTTL: 2 * 60 * 60 * 1000, + // Units: milliseconds + columnEncryptionSetting: false, + columnNameReplacer: undefined, + connectionRetryInterval: DEFAULT_CONNECT_RETRY_INTERVAL, + connectTimeout: DEFAULT_CONNECT_TIMEOUT, + connector: undefined, + connectionIsolationLevel: _transaction.ISOLATION_LEVEL.READ_COMMITTED, + cryptoCredentialsDetails: {}, + database: undefined, + datefirst: DEFAULT_DATEFIRST, + dateFormat: DEFAULT_DATEFORMAT, + debug: { + data: false, + packet: false, + payload: false, + token: false + }, + enableAnsiNull: true, + enableAnsiNullDefault: true, + enableAnsiPadding: true, + enableAnsiWarnings: true, + enableArithAbort: true, + enableConcatNullYieldsNull: true, + enableCursorCloseOnCommit: null, + enableImplicitTransactions: false, + enableNumericRoundabort: false, + enableQuotedIdentifier: true, + encrypt: true, + fallbackToDefaultDb: false, + encryptionKeyStoreProviders: undefined, + instanceName: undefined, + isolationLevel: _transaction.ISOLATION_LEVEL.READ_COMMITTED, + language: DEFAULT_LANGUAGE, + localAddress: undefined, + maxRetriesOnTransientErrors: 3, + multiSubnetFailover: false, + packetSize: DEFAULT_PACKET_SIZE, + port: DEFAULT_PORT, + readOnlyIntent: false, + requestTimeout: DEFAULT_CLIENT_REQUEST_TIMEOUT, + rowCollectionOnDone: false, + rowCollectionOnRequestCompletion: false, + serverName: undefined, + serverSupportsColumnEncryption: false, + tdsVersion: DEFAULT_TDS_VERSION, + textsize: DEFAULT_TEXTSIZE, + trustedServerNameAE: undefined, + trustServerCertificate: false, + useColumnNames: false, + useUTC: true, + workstationId: undefined, + lowerCaseGuids: false + } + }; + if (config.options) { + if (config.options.port && config.options.instanceName) { + throw new Error('Port and instanceName are mutually exclusive, but ' + config.options.port + ' and ' + config.options.instanceName + ' provided'); + } + if (config.options.abortTransactionOnError !== undefined) { + if (typeof config.options.abortTransactionOnError !== 'boolean' && config.options.abortTransactionOnError !== null) { + throw new TypeError('The "config.options.abortTransactionOnError" property must be of type string or null.'); + } + this.config.options.abortTransactionOnError = config.options.abortTransactionOnError; + } + if (config.options.appName !== undefined) { + if (typeof config.options.appName !== 'string') { + throw new TypeError('The "config.options.appName" property must be of type string.'); + } + this.config.options.appName = config.options.appName; + } + if (config.options.camelCaseColumns !== undefined) { + if (typeof config.options.camelCaseColumns !== 'boolean') { + throw new TypeError('The "config.options.camelCaseColumns" property must be of type boolean.'); + } + this.config.options.camelCaseColumns = config.options.camelCaseColumns; + } + if (config.options.cancelTimeout !== undefined) { + if (typeof config.options.cancelTimeout !== 'number') { + throw new TypeError('The "config.options.cancelTimeout" property must be of type number.'); + } + this.config.options.cancelTimeout = config.options.cancelTimeout; + } + if (config.options.columnNameReplacer) { + if (typeof config.options.columnNameReplacer !== 'function') { + throw new TypeError('The "config.options.cancelTimeout" property must be of type function.'); + } + this.config.options.columnNameReplacer = config.options.columnNameReplacer; + } + if (config.options.connectionIsolationLevel !== undefined) { + (0, _transaction.assertValidIsolationLevel)(config.options.connectionIsolationLevel, 'config.options.connectionIsolationLevel'); + this.config.options.connectionIsolationLevel = config.options.connectionIsolationLevel; + } + if (config.options.connectTimeout !== undefined) { + if (typeof config.options.connectTimeout !== 'number') { + throw new TypeError('The "config.options.connectTimeout" property must be of type number.'); + } + this.config.options.connectTimeout = config.options.connectTimeout; + } + if (config.options.connector !== undefined) { + if (typeof config.options.connector !== 'function') { + throw new TypeError('The "config.options.connector" property must be a function.'); + } + this.config.options.connector = config.options.connector; + } + if (config.options.cryptoCredentialsDetails !== undefined) { + if (typeof config.options.cryptoCredentialsDetails !== 'object' || config.options.cryptoCredentialsDetails === null) { + throw new TypeError('The "config.options.cryptoCredentialsDetails" property must be of type Object.'); + } + this.config.options.cryptoCredentialsDetails = config.options.cryptoCredentialsDetails; + } + if (config.options.database !== undefined) { + if (typeof config.options.database !== 'string') { + throw new TypeError('The "config.options.database" property must be of type string.'); + } + this.config.options.database = config.options.database; + } + if (config.options.datefirst !== undefined) { + if (typeof config.options.datefirst !== 'number' && config.options.datefirst !== null) { + throw new TypeError('The "config.options.datefirst" property must be of type number.'); + } + if (config.options.datefirst !== null && (config.options.datefirst < 1 || config.options.datefirst > 7)) { + throw new RangeError('The "config.options.datefirst" property must be >= 1 and <= 7'); + } + this.config.options.datefirst = config.options.datefirst; + } + if (config.options.dateFormat !== undefined) { + if (typeof config.options.dateFormat !== 'string' && config.options.dateFormat !== null) { + throw new TypeError('The "config.options.dateFormat" property must be of type string or null.'); + } + this.config.options.dateFormat = config.options.dateFormat; + } + if (config.options.debug) { + if (config.options.debug.data !== undefined) { + if (typeof config.options.debug.data !== 'boolean') { + throw new TypeError('The "config.options.debug.data" property must be of type boolean.'); + } + this.config.options.debug.data = config.options.debug.data; + } + if (config.options.debug.packet !== undefined) { + if (typeof config.options.debug.packet !== 'boolean') { + throw new TypeError('The "config.options.debug.packet" property must be of type boolean.'); + } + this.config.options.debug.packet = config.options.debug.packet; + } + if (config.options.debug.payload !== undefined) { + if (typeof config.options.debug.payload !== 'boolean') { + throw new TypeError('The "config.options.debug.payload" property must be of type boolean.'); + } + this.config.options.debug.payload = config.options.debug.payload; + } + if (config.options.debug.token !== undefined) { + if (typeof config.options.debug.token !== 'boolean') { + throw new TypeError('The "config.options.debug.token" property must be of type boolean.'); + } + this.config.options.debug.token = config.options.debug.token; + } + } + if (config.options.enableAnsiNull !== undefined) { + if (typeof config.options.enableAnsiNull !== 'boolean' && config.options.enableAnsiNull !== null) { + throw new TypeError('The "config.options.enableAnsiNull" property must be of type boolean or null.'); + } + this.config.options.enableAnsiNull = config.options.enableAnsiNull; + } + if (config.options.enableAnsiNullDefault !== undefined) { + if (typeof config.options.enableAnsiNullDefault !== 'boolean' && config.options.enableAnsiNullDefault !== null) { + throw new TypeError('The "config.options.enableAnsiNullDefault" property must be of type boolean or null.'); + } + this.config.options.enableAnsiNullDefault = config.options.enableAnsiNullDefault; + } + if (config.options.enableAnsiPadding !== undefined) { + if (typeof config.options.enableAnsiPadding !== 'boolean' && config.options.enableAnsiPadding !== null) { + throw new TypeError('The "config.options.enableAnsiPadding" property must be of type boolean or null.'); + } + this.config.options.enableAnsiPadding = config.options.enableAnsiPadding; + } + if (config.options.enableAnsiWarnings !== undefined) { + if (typeof config.options.enableAnsiWarnings !== 'boolean' && config.options.enableAnsiWarnings !== null) { + throw new TypeError('The "config.options.enableAnsiWarnings" property must be of type boolean or null.'); + } + this.config.options.enableAnsiWarnings = config.options.enableAnsiWarnings; + } + if (config.options.enableArithAbort !== undefined) { + if (typeof config.options.enableArithAbort !== 'boolean' && config.options.enableArithAbort !== null) { + throw new TypeError('The "config.options.enableArithAbort" property must be of type boolean or null.'); + } + this.config.options.enableArithAbort = config.options.enableArithAbort; + } + if (config.options.enableConcatNullYieldsNull !== undefined) { + if (typeof config.options.enableConcatNullYieldsNull !== 'boolean' && config.options.enableConcatNullYieldsNull !== null) { + throw new TypeError('The "config.options.enableConcatNullYieldsNull" property must be of type boolean or null.'); + } + this.config.options.enableConcatNullYieldsNull = config.options.enableConcatNullYieldsNull; + } + if (config.options.enableCursorCloseOnCommit !== undefined) { + if (typeof config.options.enableCursorCloseOnCommit !== 'boolean' && config.options.enableCursorCloseOnCommit !== null) { + throw new TypeError('The "config.options.enableCursorCloseOnCommit" property must be of type boolean or null.'); + } + this.config.options.enableCursorCloseOnCommit = config.options.enableCursorCloseOnCommit; + } + if (config.options.enableImplicitTransactions !== undefined) { + if (typeof config.options.enableImplicitTransactions !== 'boolean' && config.options.enableImplicitTransactions !== null) { + throw new TypeError('The "config.options.enableImplicitTransactions" property must be of type boolean or null.'); + } + this.config.options.enableImplicitTransactions = config.options.enableImplicitTransactions; + } + if (config.options.enableNumericRoundabort !== undefined) { + if (typeof config.options.enableNumericRoundabort !== 'boolean' && config.options.enableNumericRoundabort !== null) { + throw new TypeError('The "config.options.enableNumericRoundabort" property must be of type boolean or null.'); + } + this.config.options.enableNumericRoundabort = config.options.enableNumericRoundabort; + } + if (config.options.enableQuotedIdentifier !== undefined) { + if (typeof config.options.enableQuotedIdentifier !== 'boolean' && config.options.enableQuotedIdentifier !== null) { + throw new TypeError('The "config.options.enableQuotedIdentifier" property must be of type boolean or null.'); + } + this.config.options.enableQuotedIdentifier = config.options.enableQuotedIdentifier; + } + if (config.options.encrypt !== undefined) { + if (typeof config.options.encrypt !== 'boolean') { + if (config.options.encrypt !== 'strict') { + throw new TypeError('The "encrypt" property must be set to "strict", or of type boolean.'); + } + } + this.config.options.encrypt = config.options.encrypt; + } + if (config.options.fallbackToDefaultDb !== undefined) { + if (typeof config.options.fallbackToDefaultDb !== 'boolean') { + throw new TypeError('The "config.options.fallbackToDefaultDb" property must be of type boolean.'); + } + this.config.options.fallbackToDefaultDb = config.options.fallbackToDefaultDb; + } + if (config.options.instanceName !== undefined) { + if (typeof config.options.instanceName !== 'string') { + throw new TypeError('The "config.options.instanceName" property must be of type string.'); + } + this.config.options.instanceName = config.options.instanceName; + this.config.options.port = undefined; + } + if (config.options.isolationLevel !== undefined) { + (0, _transaction.assertValidIsolationLevel)(config.options.isolationLevel, 'config.options.isolationLevel'); + this.config.options.isolationLevel = config.options.isolationLevel; + } + if (config.options.language !== undefined) { + if (typeof config.options.language !== 'string' && config.options.language !== null) { + throw new TypeError('The "config.options.language" property must be of type string or null.'); + } + this.config.options.language = config.options.language; + } + if (config.options.localAddress !== undefined) { + if (typeof config.options.localAddress !== 'string') { + throw new TypeError('The "config.options.localAddress" property must be of type string.'); + } + this.config.options.localAddress = config.options.localAddress; + } + if (config.options.multiSubnetFailover !== undefined) { + if (typeof config.options.multiSubnetFailover !== 'boolean') { + throw new TypeError('The "config.options.multiSubnetFailover" property must be of type boolean.'); + } + this.config.options.multiSubnetFailover = config.options.multiSubnetFailover; + } + if (config.options.packetSize !== undefined) { + if (typeof config.options.packetSize !== 'number') { + throw new TypeError('The "config.options.packetSize" property must be of type number.'); + } + this.config.options.packetSize = config.options.packetSize; + } + if (config.options.port !== undefined) { + if (typeof config.options.port !== 'number') { + throw new TypeError('The "config.options.port" property must be of type number.'); + } + if (config.options.port <= 0 || config.options.port >= 65536) { + throw new RangeError('The "config.options.port" property must be > 0 and < 65536'); + } + this.config.options.port = config.options.port; + this.config.options.instanceName = undefined; + } + if (config.options.readOnlyIntent !== undefined) { + if (typeof config.options.readOnlyIntent !== 'boolean') { + throw new TypeError('The "config.options.readOnlyIntent" property must be of type boolean.'); + } + this.config.options.readOnlyIntent = config.options.readOnlyIntent; + } + if (config.options.requestTimeout !== undefined) { + if (typeof config.options.requestTimeout !== 'number') { + throw new TypeError('The "config.options.requestTimeout" property must be of type number.'); + } + this.config.options.requestTimeout = config.options.requestTimeout; + } + if (config.options.maxRetriesOnTransientErrors !== undefined) { + if (typeof config.options.maxRetriesOnTransientErrors !== 'number') { + throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be of type number.'); + } + if (config.options.maxRetriesOnTransientErrors < 0) { + throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be equal or greater than 0.'); + } + this.config.options.maxRetriesOnTransientErrors = config.options.maxRetriesOnTransientErrors; + } + if (config.options.connectionRetryInterval !== undefined) { + if (typeof config.options.connectionRetryInterval !== 'number') { + throw new TypeError('The "config.options.connectionRetryInterval" property must be of type number.'); + } + if (config.options.connectionRetryInterval <= 0) { + throw new TypeError('The "config.options.connectionRetryInterval" property must be greater than 0.'); + } + this.config.options.connectionRetryInterval = config.options.connectionRetryInterval; + } + if (config.options.rowCollectionOnDone !== undefined) { + if (typeof config.options.rowCollectionOnDone !== 'boolean') { + throw new TypeError('The "config.options.rowCollectionOnDone" property must be of type boolean.'); + } + this.config.options.rowCollectionOnDone = config.options.rowCollectionOnDone; + } + if (config.options.rowCollectionOnRequestCompletion !== undefined) { + if (typeof config.options.rowCollectionOnRequestCompletion !== 'boolean') { + throw new TypeError('The "config.options.rowCollectionOnRequestCompletion" property must be of type boolean.'); + } + this.config.options.rowCollectionOnRequestCompletion = config.options.rowCollectionOnRequestCompletion; + } + if (config.options.tdsVersion !== undefined) { + if (typeof config.options.tdsVersion !== 'string') { + throw new TypeError('The "config.options.tdsVersion" property must be of type string.'); + } + this.config.options.tdsVersion = config.options.tdsVersion; + } + if (config.options.textsize !== undefined) { + if (typeof config.options.textsize !== 'number' && config.options.textsize !== null) { + throw new TypeError('The "config.options.textsize" property must be of type number or null.'); + } + if (config.options.textsize > 2147483647) { + throw new TypeError('The "config.options.textsize" can\'t be greater than 2147483647.'); + } else if (config.options.textsize < -1) { + throw new TypeError('The "config.options.textsize" can\'t be smaller than -1.'); + } + this.config.options.textsize = config.options.textsize | 0; + } + if (config.options.trustServerCertificate !== undefined) { + if (typeof config.options.trustServerCertificate !== 'boolean') { + throw new TypeError('The "config.options.trustServerCertificate" property must be of type boolean.'); + } + this.config.options.trustServerCertificate = config.options.trustServerCertificate; + } + if (config.options.serverName !== undefined) { + if (typeof config.options.serverName !== 'string') { + throw new TypeError('The "config.options.serverName" property must be of type string.'); + } + this.config.options.serverName = config.options.serverName; + } + if (config.options.useColumnNames !== undefined) { + if (typeof config.options.useColumnNames !== 'boolean') { + throw new TypeError('The "config.options.useColumnNames" property must be of type boolean.'); + } + this.config.options.useColumnNames = config.options.useColumnNames; + } + if (config.options.useUTC !== undefined) { + if (typeof config.options.useUTC !== 'boolean') { + throw new TypeError('The "config.options.useUTC" property must be of type boolean.'); + } + this.config.options.useUTC = config.options.useUTC; + } + if (config.options.workstationId !== undefined) { + if (typeof config.options.workstationId !== 'string') { + throw new TypeError('The "config.options.workstationId" property must be of type string.'); + } + this.config.options.workstationId = config.options.workstationId; + } + if (config.options.lowerCaseGuids !== undefined) { + if (typeof config.options.lowerCaseGuids !== 'boolean') { + throw new TypeError('The "config.options.lowerCaseGuids" property must be of type boolean.'); + } + this.config.options.lowerCaseGuids = config.options.lowerCaseGuids; + } + } + this.secureContextOptions = this.config.options.cryptoCredentialsDetails; + if (this.secureContextOptions.secureOptions === undefined) { + // If the caller has not specified their own `secureOptions`, + // we set `SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS` here. + // Older SQL Server instances running on older Windows versions have + // trouble with the BEAST workaround in OpenSSL. + // As BEAST is a browser specific exploit, we can just disable this option here. + this.secureContextOptions = Object.create(this.secureContextOptions, { + secureOptions: { + value: _constants.default.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS + } + }); + } + this.debug = this.createDebug(); + this.inTransaction = false; + this.transactionDescriptors = [Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])]; + + // 'beginTransaction', 'commitTransaction' and 'rollbackTransaction' + // events are utilized to maintain inTransaction property state which in + // turn is used in managing transactions. These events are only fired for + // TDS version 7.2 and beyond. The properties below are used to emulate + // equivalent behavior for TDS versions before 7.2. + this.transactionDepth = 0; + this.isSqlBatch = false; + this.closed = false; + this.messageBuffer = Buffer.alloc(0); + this.curTransientRetryCount = 0; + this.transientErrorLookup = new _transientErrorLookup.TransientErrorLookup(); + this.state = this.STATE.INITIALIZED; + this._cancelAfterRequestSent = () => { + this.messageIo.sendMessage(_packet.TYPE.ATTENTION); + this.createCancelTimer(); + }; + } + connect(connectListener) { + if (this.state !== this.STATE.INITIALIZED) { + throw new _errors.ConnectionError('`.connect` can not be called on a Connection in `' + this.state.name + '` state.'); + } + if (connectListener) { + const onConnect = err => { + this.removeListener('error', onError); + connectListener(err); + }; + const onError = err => { + this.removeListener('connect', onConnect); + connectListener(err); + }; + this.once('connect', onConnect); + this.once('error', onError); + } + this.transitionTo(this.STATE.CONNECTING); + } + + /** + * The server has reported that the charset has changed. + */ + + /** + * The attempt to connect and validate has completed. + */ + + /** + * The server has reported that the active database has changed. + * This may be as a result of a successful login, or a `use` statement. + */ + + /** + * A debug message is available. It may be logged or ignored. + */ + + /** + * Internal error occurs. + */ + + /** + * The server has issued an error message. + */ + + /** + * The connection has ended. + * + * This may be as a result of the client calling [[close]], the server + * closing the connection, or a network error. + */ + + /** + * The server has issued an information message. + */ + + /** + * The server has reported that the language has changed. + */ + + /** + * The connection was reset. + */ + + /** + * A secure connection has been established. + */ + + on(event, listener) { + return super.on(event, listener); + } + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + /** + * @private + */ + + emit(event, ...args) { + return super.emit(event, ...args); + } + + /** + * Closes the connection to the database. + * + * The [[Event_end]] will be emitted once the connection has been closed. + */ + close() { + this.transitionTo(this.STATE.FINAL); + } + + /** + * @private + */ + initialiseConnection() { + const signal = this.createConnectTimer(); + if (this.config.options.port) { + return this.connectOnPort(this.config.options.port, this.config.options.multiSubnetFailover, signal, this.config.options.connector); + } else { + return (0, _instanceLookup.instanceLookup)({ + server: this.config.server, + instanceName: this.config.options.instanceName, + timeout: this.config.options.connectTimeout, + signal: signal + }).then(port => { + process.nextTick(() => { + this.connectOnPort(port, this.config.options.multiSubnetFailover, signal, this.config.options.connector); + }); + }, err => { + this.clearConnectTimer(); + if (signal.aborted) { + // Ignore the AbortError for now, this is still handled by the connectTimer firing + return; + } + process.nextTick(() => { + this.emit('connect', new _errors.ConnectionError(err.message, 'EINSTLOOKUP')); + }); + }); + } + } + + /** + * @private + */ + cleanupConnection(cleanupType) { + if (!this.closed) { + this.clearConnectTimer(); + this.clearRequestTimer(); + this.clearRetryTimer(); + this.closeConnection(); + if (cleanupType === CLEANUP_TYPE.REDIRECT) { + this.emit('rerouting'); + } else if (cleanupType !== CLEANUP_TYPE.RETRY) { + process.nextTick(() => { + this.emit('end'); + }); + } + const request = this.request; + if (request) { + const err = new _errors.RequestError('Connection closed before request completed.', 'ECLOSE'); + request.callback(err); + this.request = undefined; + } + this.closed = true; + this.loginError = undefined; + } + } + + /** + * @private + */ + createDebug() { + const debug = new _debug.default(this.config.options.debug); + debug.on('debug', message => { + this.emit('debug', message); + }); + return debug; + } + + /** + * @private + */ + createTokenStreamParser(message, handler) { + return new _tokenStreamParser.Parser(message, this.debug, handler, this.config.options); + } + socketHandlingForSendPreLogin(socket) { + socket.on('error', error => { + this.socketError(error); + }); + socket.on('close', () => { + this.socketClose(); + }); + socket.on('end', () => { + this.socketEnd(); + }); + socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY); + this.messageIo = new _messageIo.default(socket, this.config.options.packetSize, this.debug); + this.messageIo.on('secure', cleartext => { + this.emit('secure', cleartext); + }); + this.socket = socket; + this.closed = false; + this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port); + this.sendPreLogin(); + this.transitionTo(this.STATE.SENT_PRELOGIN); + } + wrapWithTls(socket, signal) { + signal.throwIfAborted(); + return new Promise((resolve, reject) => { + const secureContext = tls.createSecureContext(this.secureContextOptions); + // If connect to an ip address directly, + // need to set the servername to an empty string + // if the user has not given a servername explicitly + const serverName = !net.isIP(this.config.server) ? this.config.server : ''; + const encryptOptions = { + host: this.config.server, + socket: socket, + ALPNProtocols: ['tds/8.0'], + secureContext: secureContext, + servername: this.config.options.serverName ? this.config.options.serverName : serverName + }; + const encryptsocket = tls.connect(encryptOptions); + const onAbort = () => { + encryptsocket.removeListener('error', onError); + encryptsocket.removeListener('connect', onConnect); + encryptsocket.destroy(); + reject(signal.reason); + }; + const onError = err => { + signal.removeEventListener('abort', onAbort); + encryptsocket.removeListener('error', onError); + encryptsocket.removeListener('connect', onConnect); + encryptsocket.destroy(); + reject(err); + }; + const onConnect = () => { + signal.removeEventListener('abort', onAbort); + encryptsocket.removeListener('error', onError); + encryptsocket.removeListener('connect', onConnect); + resolve(encryptsocket); + }; + signal.addEventListener('abort', onAbort, { + once: true + }); + encryptsocket.on('error', onError); + encryptsocket.on('secureConnect', onConnect); + }); + } + connectOnPort(port, multiSubnetFailover, signal, customConnector) { + const connectOpts = { + host: this.routingData ? this.routingData.server : this.config.server, + port: this.routingData ? this.routingData.port : port, + localAddress: this.config.options.localAddress + }; + const connect = customConnector || (multiSubnetFailover ? _connector.connectInParallel : _connector.connectInSequence); + (async () => { + let socket = await connect(connectOpts, _dns.default.lookup, signal); + if (this.config.options.encrypt === 'strict') { + try { + // Wrap the socket with TLS for TDS 8.0 + socket = await this.wrapWithTls(socket, signal); + } catch (err) { + socket.end(); + throw err; + } + } + this.socketHandlingForSendPreLogin(socket); + })().catch(err => { + this.clearConnectTimer(); + if (signal.aborted) { + return; + } + process.nextTick(() => { + this.socketError(err); + }); + }); + } + + /** + * @private + */ + closeConnection() { + if (this.socket) { + this.socket.destroy(); + } + } + + /** + * @private + */ + createConnectTimer() { + const controller = new _nodeAbortController.AbortController(); + this.connectTimer = setTimeout(() => { + controller.abort(); + this.connectTimeout(); + }, this.config.options.connectTimeout); + return controller.signal; + } + + /** + * @private + */ + createCancelTimer() { + this.clearCancelTimer(); + const timeout = this.config.options.cancelTimeout; + if (timeout > 0) { + this.cancelTimer = setTimeout(() => { + this.cancelTimeout(); + }, timeout); + } + } + + /** + * @private + */ + createRequestTimer() { + this.clearRequestTimer(); // release old timer, just to be safe + const request = this.request; + const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout; + if (timeout) { + this.requestTimer = setTimeout(() => { + this.requestTimeout(); + }, timeout); + } + } + + /** + * @private + */ + createRetryTimer() { + this.clearRetryTimer(); + this.retryTimer = setTimeout(() => { + this.retryTimeout(); + }, this.config.options.connectionRetryInterval); + } + + /** + * @private + */ + connectTimeout() { + const hostPostfix = this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`; + // If we have routing data stored, this connection has been redirected + const server = this.routingData ? this.routingData.server : this.config.server; + const port = this.routingData ? `:${this.routingData.port}` : hostPostfix; + // Grab the target host from the connection configuration, and from a redirect message + // otherwise, leave the message empty. + const routingMessage = this.routingData ? ` (redirected from ${this.config.server}${hostPostfix})` : ''; + const message = `Failed to connect to ${server}${port}${routingMessage} in ${this.config.options.connectTimeout}ms`; + this.debug.log(message); + this.emit('connect', new _errors.ConnectionError(message, 'ETIMEOUT')); + this.connectTimer = undefined; + this.dispatchEvent('connectTimeout'); + } + + /** + * @private + */ + cancelTimeout() { + const message = `Failed to cancel request in ${this.config.options.cancelTimeout}ms`; + this.debug.log(message); + this.dispatchEvent('socketError', new _errors.ConnectionError(message, 'ETIMEOUT')); + } + + /** + * @private + */ + requestTimeout() { + this.requestTimer = undefined; + const request = this.request; + request.cancel(); + const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout; + const message = 'Timeout: Request failed to complete in ' + timeout + 'ms'; + request.error = new _errors.RequestError(message, 'ETIMEOUT'); + } + + /** + * @private + */ + retryTimeout() { + this.retryTimer = undefined; + this.emit('retry'); + this.transitionTo(this.STATE.CONNECTING); + } + + /** + * @private + */ + clearConnectTimer() { + if (this.connectTimer) { + clearTimeout(this.connectTimer); + this.connectTimer = undefined; + } + } + + /** + * @private + */ + clearCancelTimer() { + if (this.cancelTimer) { + clearTimeout(this.cancelTimer); + this.cancelTimer = undefined; + } + } + + /** + * @private + */ + clearRequestTimer() { + if (this.requestTimer) { + clearTimeout(this.requestTimer); + this.requestTimer = undefined; + } + } + + /** + * @private + */ + clearRetryTimer() { + if (this.retryTimer) { + clearTimeout(this.retryTimer); + this.retryTimer = undefined; + } + } + + /** + * @private + */ + transitionTo(newState) { + if (this.state === newState) { + this.debug.log('State is already ' + newState.name); + return; + } + if (this.state && this.state.exit) { + this.state.exit.call(this, newState); + } + this.debug.log('State change: ' + (this.state ? this.state.name : 'undefined') + ' -> ' + newState.name); + this.state = newState; + if (this.state.enter) { + this.state.enter.apply(this); + } + } + + /** + * @private + */ + getEventHandler(eventName) { + const handler = this.state.events[eventName]; + if (!handler) { + throw new Error(`No event '${eventName}' in state '${this.state.name}'`); + } + return handler; + } + + /** + * @private + */ + dispatchEvent(eventName, ...args) { + const handler = this.state.events[eventName]; + if (handler) { + handler.apply(this, args); + } else { + this.emit('error', new Error(`No event '${eventName}' in state '${this.state.name}'`)); + this.close(); + } + } + + /** + * @private + */ + socketError(error) { + if (this.state === this.STATE.CONNECTING || this.state === this.STATE.SENT_TLSSSLNEGOTIATION) { + const hostPostfix = this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`; + // If we have routing data stored, this connection has been redirected + const server = this.routingData ? this.routingData.server : this.config.server; + const port = this.routingData ? `:${this.routingData.port}` : hostPostfix; + // Grab the target host from the connection configuration, and from a redirect message + // otherwise, leave the message empty. + const routingMessage = this.routingData ? ` (redirected from ${this.config.server}${hostPostfix})` : ''; + const message = `Failed to connect to ${server}${port}${routingMessage} - ${error.message}`; + this.debug.log(message); + this.emit('connect', new _errors.ConnectionError(message, 'ESOCKET')); + } else { + const message = `Connection lost - ${error.message}`; + this.debug.log(message); + this.emit('error', new _errors.ConnectionError(message, 'ESOCKET')); + } + this.dispatchEvent('socketError', error); + } + + /** + * @private + */ + socketEnd() { + this.debug.log('socket ended'); + if (this.state !== this.STATE.FINAL) { + const error = new Error('socket hang up'); + error.code = 'ECONNRESET'; + this.socketError(error); + } + } + + /** + * @private + */ + socketClose() { + this.debug.log('connection to ' + this.config.server + ':' + this.config.options.port + ' closed'); + if (this.state === this.STATE.REROUTING) { + this.debug.log('Rerouting to ' + this.routingData.server + ':' + this.routingData.port); + this.dispatchEvent('reconnect'); + } else if (this.state === this.STATE.TRANSIENT_FAILURE_RETRY) { + const server = this.routingData ? this.routingData.server : this.config.server; + const port = this.routingData ? this.routingData.port : this.config.options.port; + this.debug.log('Retry after transient failure connecting to ' + server + ':' + port); + this.dispatchEvent('retry'); + } else { + this.transitionTo(this.STATE.FINAL); + } + } + + /** + * @private + */ + sendPreLogin() { + const [, major, minor, build] = /^(\d+)\.(\d+)\.(\d+)/.exec(_package.version) ?? ['0.0.0', '0', '0', '0']; + const payload = new _preloginPayload.default({ + // If encrypt setting is set to 'strict', then we should have already done the encryption before calling + // this function. Therefore, the encrypt will be set to false here. + // Otherwise, we will set encrypt here based on the encrypt Boolean value from the configuration. + encrypt: typeof this.config.options.encrypt === 'boolean' && this.config.options.encrypt, + version: { + major: Number(major), + minor: Number(minor), + build: Number(build), + subbuild: 0 + } + }); + this.messageIo.sendMessage(_packet.TYPE.PRELOGIN, payload.data); + this.debug.payload(function () { + return payload.toString(' '); + }); + } + + /** + * @private + */ + sendLogin7Packet() { + const payload = new _login7Payload.default({ + tdsVersion: _tdsVersions.versions[this.config.options.tdsVersion], + packetSize: this.config.options.packetSize, + clientProgVer: 0, + clientPid: process.pid, + connectionId: 0, + clientTimeZone: new Date().getTimezoneOffset(), + clientLcid: 0x00000409 + }); + const { + authentication + } = this.config; + switch (authentication.type) { + case 'azure-active-directory-password': + payload.fedAuth = { + type: 'ADAL', + echo: this.fedAuthRequired, + workflow: 'default' + }; + break; + case 'azure-active-directory-access-token': + payload.fedAuth = { + type: 'SECURITYTOKEN', + echo: this.fedAuthRequired, + fedAuthToken: authentication.options.token + }; + break; + case 'azure-active-directory-msi-vm': + case 'azure-active-directory-default': + case 'azure-active-directory-msi-app-service': + case 'azure-active-directory-service-principal-secret': + payload.fedAuth = { + type: 'ADAL', + echo: this.fedAuthRequired, + workflow: 'integrated' + }; + break; + case 'ntlm': + payload.sspi = (0, _ntlm.createNTLMRequest)({ + domain: authentication.options.domain + }); + break; + default: + payload.userName = authentication.options.userName; + payload.password = authentication.options.password; + } + payload.hostname = this.config.options.workstationId || _os.default.hostname(); + payload.serverName = this.routingData ? this.routingData.server : this.config.server; + payload.appName = this.config.options.appName || 'Tedious'; + payload.libraryName = _library.name; + payload.language = this.config.options.language; + payload.database = this.config.options.database; + payload.clientId = Buffer.from([1, 2, 3, 4, 5, 6]); + payload.readOnlyIntent = this.config.options.readOnlyIntent; + payload.initDbFatal = !this.config.options.fallbackToDefaultDb; + this.routingData = undefined; + this.messageIo.sendMessage(_packet.TYPE.LOGIN7, payload.toBuffer()); + this.debug.payload(function () { + return payload.toString(' '); + }); + } + + /** + * @private + */ + sendFedAuthTokenMessage(token) { + const accessTokenLen = Buffer.byteLength(token, 'ucs2'); + const data = Buffer.alloc(8 + accessTokenLen); + let offset = 0; + offset = data.writeUInt32LE(accessTokenLen + 4, offset); + offset = data.writeUInt32LE(accessTokenLen, offset); + data.write(token, offset, 'ucs2'); + this.messageIo.sendMessage(_packet.TYPE.FEDAUTH_TOKEN, data); + // sent the fedAuth token message, the rest is similar to standard login 7 + this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN); + } + + /** + * @private + */ + sendInitialSql() { + const payload = new _sqlbatchPayload.default(this.getInitialSql(), this.currentTransactionDescriptor(), this.config.options); + const message = new _message.default({ + type: _packet.TYPE.SQL_BATCH + }); + this.messageIo.outgoingMessageStream.write(message); + _stream.Readable.from(payload).pipe(message); + } + + /** + * @private + */ + getInitialSql() { + const options = []; + if (this.config.options.enableAnsiNull === true) { + options.push('set ansi_nulls on'); + } else if (this.config.options.enableAnsiNull === false) { + options.push('set ansi_nulls off'); + } + if (this.config.options.enableAnsiNullDefault === true) { + options.push('set ansi_null_dflt_on on'); + } else if (this.config.options.enableAnsiNullDefault === false) { + options.push('set ansi_null_dflt_on off'); + } + if (this.config.options.enableAnsiPadding === true) { + options.push('set ansi_padding on'); + } else if (this.config.options.enableAnsiPadding === false) { + options.push('set ansi_padding off'); + } + if (this.config.options.enableAnsiWarnings === true) { + options.push('set ansi_warnings on'); + } else if (this.config.options.enableAnsiWarnings === false) { + options.push('set ansi_warnings off'); + } + if (this.config.options.enableArithAbort === true) { + options.push('set arithabort on'); + } else if (this.config.options.enableArithAbort === false) { + options.push('set arithabort off'); + } + if (this.config.options.enableConcatNullYieldsNull === true) { + options.push('set concat_null_yields_null on'); + } else if (this.config.options.enableConcatNullYieldsNull === false) { + options.push('set concat_null_yields_null off'); + } + if (this.config.options.enableCursorCloseOnCommit === true) { + options.push('set cursor_close_on_commit on'); + } else if (this.config.options.enableCursorCloseOnCommit === false) { + options.push('set cursor_close_on_commit off'); + } + if (this.config.options.datefirst !== null) { + options.push(`set datefirst ${this.config.options.datefirst}`); + } + if (this.config.options.dateFormat !== null) { + options.push(`set dateformat ${this.config.options.dateFormat}`); + } + if (this.config.options.enableImplicitTransactions === true) { + options.push('set implicit_transactions on'); + } else if (this.config.options.enableImplicitTransactions === false) { + options.push('set implicit_transactions off'); + } + if (this.config.options.language !== null) { + options.push(`set language ${this.config.options.language}`); + } + if (this.config.options.enableNumericRoundabort === true) { + options.push('set numeric_roundabort on'); + } else if (this.config.options.enableNumericRoundabort === false) { + options.push('set numeric_roundabort off'); + } + if (this.config.options.enableQuotedIdentifier === true) { + options.push('set quoted_identifier on'); + } else if (this.config.options.enableQuotedIdentifier === false) { + options.push('set quoted_identifier off'); + } + if (this.config.options.textsize !== null) { + options.push(`set textsize ${this.config.options.textsize}`); + } + if (this.config.options.connectionIsolationLevel !== null) { + options.push(`set transaction isolation level ${this.getIsolationLevelText(this.config.options.connectionIsolationLevel)}`); + } + if (this.config.options.abortTransactionOnError === true) { + options.push('set xact_abort on'); + } else if (this.config.options.abortTransactionOnError === false) { + options.push('set xact_abort off'); + } + return options.join('\n'); + } + + /** + * @private + */ + processedInitialSql() { + this.clearConnectTimer(); + this.emit('connect'); + } + + /** + * Execute the SQL batch represented by [[Request]]. + * There is no param support, and unlike [[Request.execSql]], + * it is not likely that SQL Server will reuse the execution plan it generates for the SQL. + * + * In almost all cases, [[Request.execSql]] will be a better choice. + * + * @param request A [[Request]] object representing the request. + */ + execSqlBatch(request) { + this.makeRequest(request, _packet.TYPE.SQL_BATCH, new _sqlbatchPayload.default(request.sqlTextOrProcedure, this.currentTransactionDescriptor(), this.config.options)); + } + + /** + * Execute the SQL represented by [[Request]]. + * + * As `sp_executesql` is used to execute the SQL, if the same SQL is executed multiples times + * using this function, the SQL Server query optimizer is likely to reuse the execution plan it generates + * for the first execution. This may also result in SQL server treating the request like a stored procedure + * which can result in the [[Event_doneInProc]] or [[Event_doneProc]] events being emitted instead of the + * [[Event_done]] event you might expect. Using [[execSqlBatch]] will prevent this from occurring but may have a negative performance impact. + * + * Beware of the way that scoping rules apply, and how they may [affect local temp tables](http://weblogs.sqlteam.com/mladenp/archive/2006/11/03/17197.aspx) + * If you're running in to scoping issues, then [[execSqlBatch]] may be a better choice. + * See also [issue #24](https://github.com/pekim/tedious/issues/24) + * + * @param request A [[Request]] object representing the request. + */ + execSql(request) { + try { + request.validateParameters(this.databaseCollation); + } catch (error) { + request.error = error; + process.nextTick(() => { + this.debug.log(error.message); + request.callback(error); + }); + return; + } + const parameters = []; + parameters.push({ + type: _dataType.TYPES.NVarChar, + name: 'statement', + value: request.sqlTextOrProcedure, + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + if (request.parameters.length) { + parameters.push({ + type: _dataType.TYPES.NVarChar, + name: 'params', + value: request.makeParamsParameter(request.parameters), + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + parameters.push(...request.parameters); + } + this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_ExecuteSql, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation)); + } + + /** + * Creates a new BulkLoad instance. + * + * @param table The name of the table to bulk-insert into. + * @param options A set of bulk load options. + */ + + newBulkLoad(table, callbackOrOptions, callback) { + let options; + if (callback === undefined) { + callback = callbackOrOptions; + options = {}; + } else { + options = callbackOrOptions; + } + if (typeof options !== 'object') { + throw new TypeError('"options" argument must be an object'); + } + return new _bulkLoad.default(table, this.databaseCollation, this.config.options, options, callback); + } + + /** + * Execute a [[BulkLoad]]. + * + * ```js + * // We want to perform a bulk load into a table with the following format: + * // CREATE TABLE employees (first_name nvarchar(255), last_name nvarchar(255), day_of_birth date); + * + * const bulkLoad = connection.newBulkLoad('employees', (err, rowCount) => { + * // ... + * }); + * + * // First, we need to specify the columns that we want to write to, + * // and their definitions. These definitions must match the actual table, + * // otherwise the bulk load will fail. + * bulkLoad.addColumn('first_name', TYPES.NVarchar, { nullable: false }); + * bulkLoad.addColumn('last_name', TYPES.NVarchar, { nullable: false }); + * bulkLoad.addColumn('date_of_birth', TYPES.Date, { nullable: false }); + * + * // Execute a bulk load with a predefined list of rows. + * // + * // Note that these rows are held in memory until the + * // bulk load was performed, so if you need to write a large + * // number of rows (e.g. by reading from a CSV file), + * // passing an `AsyncIterable` is advisable to keep memory usage low. + * connection.execBulkLoad(bulkLoad, [ + * { 'first_name': 'Steve', 'last_name': 'Jobs', 'day_of_birth': new Date('02-24-1955') }, + * { 'first_name': 'Bill', 'last_name': 'Gates', 'day_of_birth': new Date('10-28-1955') } + * ]); + * ``` + * + * @param bulkLoad A previously created [[BulkLoad]]. + * @param rows A [[Iterable]] or [[AsyncIterable]] that contains the rows that should be bulk loaded. + */ + + execBulkLoad(bulkLoad, rows) { + bulkLoad.executionStarted = true; + if (rows) { + if (bulkLoad.streamingMode) { + throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that was put in streaming mode."); + } + if (bulkLoad.firstRowWritten) { + throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that already has rows written to it."); + } + const rowStream = _stream.Readable.from(rows); + + // Destroy the packet transform if an error happens in the row stream, + // e.g. if an error is thrown from within a generator or stream. + rowStream.on('error', err => { + bulkLoad.rowToPacketTransform.destroy(err); + }); + + // Destroy the row stream if an error happens in the packet transform, + // e.g. if the bulk load is cancelled. + bulkLoad.rowToPacketTransform.on('error', err => { + rowStream.destroy(err); + }); + rowStream.pipe(bulkLoad.rowToPacketTransform); + } else if (!bulkLoad.streamingMode) { + // If the bulkload was not put into streaming mode by the user, + // we end the rowToPacketTransform here for them. + // + // If it was put into streaming mode, it's the user's responsibility + // to end the stream. + bulkLoad.rowToPacketTransform.end(); + } + const onCancel = () => { + request.cancel(); + }; + const payload = new _bulkLoadPayload.BulkLoadPayload(bulkLoad); + const request = new _request.default(bulkLoad.getBulkInsertSql(), error => { + bulkLoad.removeListener('cancel', onCancel); + if (error) { + if (error.code === 'UNKNOWN') { + error.message += ' This is likely because the schema of the BulkLoad does not match the schema of the table you are attempting to insert into.'; + } + bulkLoad.error = error; + bulkLoad.callback(error); + return; + } + this.makeRequest(bulkLoad, _packet.TYPE.BULK_LOAD, payload); + }); + bulkLoad.once('cancel', onCancel); + this.execSqlBatch(request); + } + + /** + * Prepare the SQL represented by the request. + * + * The request can then be used in subsequent calls to + * [[execute]] and [[unprepare]] + * + * @param request A [[Request]] object representing the request. + * Parameters only require a name and type. Parameter values are ignored. + */ + prepare(request) { + const parameters = []; + parameters.push({ + type: _dataType.TYPES.Int, + name: 'handle', + value: undefined, + output: true, + length: undefined, + precision: undefined, + scale: undefined + }); + parameters.push({ + type: _dataType.TYPES.NVarChar, + name: 'params', + value: request.parameters.length ? request.makeParamsParameter(request.parameters) : null, + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + parameters.push({ + type: _dataType.TYPES.NVarChar, + name: 'stmt', + value: request.sqlTextOrProcedure, + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + request.preparing = true; + + // TODO: We need to clean up this event handler, otherwise this leaks memory + request.on('returnValue', (name, value) => { + if (name === 'handle') { + request.handle = value; + } else { + request.error = new _errors.RequestError(`Tedious > Unexpected output parameter ${name} from sp_prepare`); + } + }); + this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Prepare, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation)); + } + + /** + * Release the SQL Server resources associated with a previously prepared request. + * + * @param request A [[Request]] object representing the request. + * Parameters only require a name and type. + * Parameter values are ignored. + */ + unprepare(request) { + const parameters = []; + parameters.push({ + type: _dataType.TYPES.Int, + name: 'handle', + // TODO: Abort if `request.handle` is not set + value: request.handle, + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Unprepare, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation)); + } + + /** + * Execute previously prepared SQL, using the supplied parameters. + * + * @param request A previously prepared [[Request]]. + * @param parameters An object whose names correspond to the names of + * parameters that were added to the [[Request]] before it was prepared. + * The object's values are passed as the parameters' values when the + * request is executed. + */ + execute(request, parameters) { + const executeParameters = []; + executeParameters.push({ + type: _dataType.TYPES.Int, + name: '', + // TODO: Abort if `request.handle` is not set + value: request.handle, + output: false, + length: undefined, + precision: undefined, + scale: undefined + }); + try { + for (let i = 0, len = request.parameters.length; i < len; i++) { + const parameter = request.parameters[i]; + executeParameters.push({ + ...parameter, + value: parameter.type.validate(parameters ? parameters[parameter.name] : null, this.databaseCollation) + }); + } + } catch (error) { + request.error = error; + process.nextTick(() => { + this.debug.log(error.message); + request.callback(error); + }); + return; + } + this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Execute, executeParameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation)); + } + + /** + * Call a stored procedure represented by [[Request]]. + * + * @param request A [[Request]] object representing the request. + */ + callProcedure(request) { + try { + request.validateParameters(this.databaseCollation); + } catch (error) { + request.error = error; + process.nextTick(() => { + this.debug.log(error.message); + request.callback(error); + }); + return; + } + this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(request.sqlTextOrProcedure, request.parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation)); + } + + /** + * Start a transaction. + * + * @param callback + * @param name A string representing a name to associate with the transaction. + * Optional, and defaults to an empty string. Required when `isolationLevel` + * is present. + * @param isolationLevel The isolation level that the transaction is to be run with. + * + * The isolation levels are available from `require('tedious').ISOLATION_LEVEL`. + * * `READ_UNCOMMITTED` + * * `READ_COMMITTED` + * * `REPEATABLE_READ` + * * `SERIALIZABLE` + * * `SNAPSHOT` + * + * Optional, and defaults to the Connection's isolation level. + */ + beginTransaction(callback, name = '', isolationLevel = this.config.options.isolationLevel) { + (0, _transaction.assertValidIsolationLevel)(isolationLevel, 'isolationLevel'); + const transaction = new _transaction.Transaction(name, isolationLevel); + if (this.config.options.tdsVersion < '7_2') { + return this.execSqlBatch(new _request.default('SET TRANSACTION ISOLATION LEVEL ' + transaction.isolationLevelToTSQL() + ';BEGIN TRAN ' + transaction.name, err => { + this.transactionDepth++; + if (this.transactionDepth === 1) { + this.inTransaction = true; + } + callback(err); + })); + } + const request = new _request.default(undefined, err => { + return callback(err, this.currentTransactionDescriptor()); + }); + return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.beginPayload(this.currentTransactionDescriptor())); + } + + /** + * Commit a transaction. + * + * There should be an active transaction - that is, [[beginTransaction]] + * should have been previously called. + * + * @param callback + * @param name A string representing a name to associate with the transaction. + * Optional, and defaults to an empty string. Required when `isolationLevel`is present. + */ + commitTransaction(callback, name = '') { + const transaction = new _transaction.Transaction(name); + if (this.config.options.tdsVersion < '7_2') { + return this.execSqlBatch(new _request.default('COMMIT TRAN ' + transaction.name, err => { + this.transactionDepth--; + if (this.transactionDepth === 0) { + this.inTransaction = false; + } + callback(err); + })); + } + const request = new _request.default(undefined, callback); + return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.commitPayload(this.currentTransactionDescriptor())); + } + + /** + * Rollback a transaction. + * + * There should be an active transaction - that is, [[beginTransaction]] + * should have been previously called. + * + * @param callback + * @param name A string representing a name to associate with the transaction. + * Optional, and defaults to an empty string. + * Required when `isolationLevel` is present. + */ + rollbackTransaction(callback, name = '') { + const transaction = new _transaction.Transaction(name); + if (this.config.options.tdsVersion < '7_2') { + return this.execSqlBatch(new _request.default('ROLLBACK TRAN ' + transaction.name, err => { + this.transactionDepth--; + if (this.transactionDepth === 0) { + this.inTransaction = false; + } + callback(err); + })); + } + const request = new _request.default(undefined, callback); + return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.rollbackPayload(this.currentTransactionDescriptor())); + } + + /** + * Set a savepoint within a transaction. + * + * There should be an active transaction - that is, [[beginTransaction]] + * should have been previously called. + * + * @param callback + * @param name A string representing a name to associate with the transaction.\ + * Optional, and defaults to an empty string. + * Required when `isolationLevel` is present. + */ + saveTransaction(callback, name) { + const transaction = new _transaction.Transaction(name); + if (this.config.options.tdsVersion < '7_2') { + return this.execSqlBatch(new _request.default('SAVE TRAN ' + transaction.name, err => { + this.transactionDepth++; + callback(err); + })); + } + const request = new _request.default(undefined, callback); + return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.savePayload(this.currentTransactionDescriptor())); + } + + /** + * Run the given callback after starting a transaction, and commit or + * rollback the transaction afterwards. + * + * This is a helper that employs [[beginTransaction]], [[commitTransaction]], + * [[rollbackTransaction]], and [[saveTransaction]] to greatly simplify the + * use of database transactions and automatically handle transaction nesting. + * + * @param cb + * @param isolationLevel + * The isolation level that the transaction is to be run with. + * + * The isolation levels are available from `require('tedious').ISOLATION_LEVEL`. + * * `READ_UNCOMMITTED` + * * `READ_COMMITTED` + * * `REPEATABLE_READ` + * * `SERIALIZABLE` + * * `SNAPSHOT` + * + * Optional, and defaults to the Connection's isolation level. + */ + transaction(cb, isolationLevel) { + if (typeof cb !== 'function') { + throw new TypeError('`cb` must be a function'); + } + const useSavepoint = this.inTransaction; + const name = '_tedious_' + _crypto.default.randomBytes(10).toString('hex'); + const txDone = (err, done, ...args) => { + if (err) { + if (this.inTransaction && this.state === this.STATE.LOGGED_IN) { + this.rollbackTransaction(txErr => { + done(txErr || err, ...args); + }, name); + } else { + done(err, ...args); + } + } else if (useSavepoint) { + if (this.config.options.tdsVersion < '7_2') { + this.transactionDepth--; + } + done(null, ...args); + } else { + this.commitTransaction(txErr => { + done(txErr, ...args); + }, name); + } + }; + if (useSavepoint) { + return this.saveTransaction(err => { + if (err) { + return cb(err); + } + if (isolationLevel) { + return this.execSqlBatch(new _request.default('SET transaction isolation level ' + this.getIsolationLevelText(isolationLevel), err => { + return cb(err, txDone); + })); + } else { + return cb(null, txDone); + } + }, name); + } else { + return this.beginTransaction(err => { + if (err) { + return cb(err); + } + return cb(null, txDone); + }, name, isolationLevel); + } + } + + /** + * @private + */ + makeRequest(request, packetType, payload) { + if (this.state !== this.STATE.LOGGED_IN) { + const message = 'Requests can only be made in the ' + this.STATE.LOGGED_IN.name + ' state, not the ' + this.state.name + ' state'; + this.debug.log(message); + request.callback(new _errors.RequestError(message, 'EINVALIDSTATE')); + } else if (request.canceled) { + process.nextTick(() => { + request.callback(new _errors.RequestError('Canceled.', 'ECANCEL')); + }); + } else { + if (packetType === _packet.TYPE.SQL_BATCH) { + this.isSqlBatch = true; + } else { + this.isSqlBatch = false; + } + this.request = request; + request.connection = this; + request.rowCount = 0; + request.rows = []; + request.rst = []; + const onCancel = () => { + payloadStream.unpipe(message); + payloadStream.destroy(new _errors.RequestError('Canceled.', 'ECANCEL')); + + // set the ignore bit and end the message. + message.ignore = true; + message.end(); + if (request instanceof _request.default && request.paused) { + // resume the request if it was paused so we can read the remaining tokens + request.resume(); + } + }; + request.once('cancel', onCancel); + this.createRequestTimer(); + const message = new _message.default({ + type: packetType, + resetConnection: this.resetConnectionOnNextRequest + }); + this.messageIo.outgoingMessageStream.write(message); + this.transitionTo(this.STATE.SENT_CLIENT_REQUEST); + message.once('finish', () => { + request.removeListener('cancel', onCancel); + request.once('cancel', this._cancelAfterRequestSent); + this.resetConnectionOnNextRequest = false; + this.debug.payload(function () { + return payload.toString(' '); + }); + }); + const payloadStream = _stream.Readable.from(payload); + payloadStream.once('error', error => { + payloadStream.unpipe(message); + + // Only set a request error if no error was set yet. + request.error ??= error; + message.ignore = true; + message.end(); + }); + payloadStream.pipe(message); + } + } + + /** + * Cancel currently executed request. + */ + cancel() { + if (!this.request) { + return false; + } + if (this.request.canceled) { + return false; + } + this.request.cancel(); + return true; + } + + /** + * Reset the connection to its initial state. + * Can be useful for connection pool implementations. + * + * @param callback + */ + reset(callback) { + const request = new _request.default(this.getInitialSql(), err => { + if (this.config.options.tdsVersion < '7_2') { + this.inTransaction = false; + } + callback(err); + }); + this.resetConnectionOnNextRequest = true; + this.execSqlBatch(request); + } + + /** + * @private + */ + currentTransactionDescriptor() { + return this.transactionDescriptors[this.transactionDescriptors.length - 1]; + } + + /** + * @private + */ + getIsolationLevelText(isolationLevel) { + switch (isolationLevel) { + case _transaction.ISOLATION_LEVEL.READ_UNCOMMITTED: + return 'read uncommitted'; + case _transaction.ISOLATION_LEVEL.REPEATABLE_READ: + return 'repeatable read'; + case _transaction.ISOLATION_LEVEL.SERIALIZABLE: + return 'serializable'; + case _transaction.ISOLATION_LEVEL.SNAPSHOT: + return 'snapshot'; + default: + return 'read committed'; + } + } +} +function isTransientError(error) { + if (error instanceof _esAggregateError.default) { + error = error.errors[0]; + } + return error instanceof _errors.ConnectionError && !!error.isTransient; +} +var _default = Connection; +exports.default = _default; +module.exports = Connection; +Connection.prototype.STATE = { + INITIALIZED: { + name: 'Initialized', + events: {} + }, + CONNECTING: { + name: 'Connecting', + enter: function () { + this.initialiseConnection(); + }, + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + SENT_PRELOGIN: { + name: 'SentPrelogin', + enter: function () { + (async () => { + let messageBuffer = Buffer.alloc(0); + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + for await (const data of message) { + messageBuffer = Buffer.concat([messageBuffer, data]); + } + const preloginPayload = new _preloginPayload.default(messageBuffer); + this.debug.payload(function () { + return preloginPayload.toString(' '); + }); + if (preloginPayload.fedAuthRequired === 1) { + this.fedAuthRequired = true; + } + if ('strict' !== this.config.options.encrypt && (preloginPayload.encryptionString === 'ON' || preloginPayload.encryptionString === 'REQ')) { + if (!this.config.options.encrypt) { + this.emit('connect', new _errors.ConnectionError("Server requires encryption, set 'encrypt' config option to true.", 'EENCRYPT')); + return this.close(); + } + try { + var _this$routingData; + this.transitionTo(this.STATE.SENT_TLSSSLNEGOTIATION); + await this.messageIo.startTls(this.secureContextOptions, this.config.options.serverName ? this.config.options.serverName : ((_this$routingData = this.routingData) === null || _this$routingData === void 0 ? void 0 : _this$routingData.server) ?? this.config.server, this.config.options.trustServerCertificate); + } catch (err) { + return this.socketError(err); + } + } + this.sendLogin7Packet(); + const { + authentication + } = this.config; + switch (authentication.type) { + case 'azure-active-directory-password': + case 'azure-active-directory-msi-vm': + case 'azure-active-directory-msi-app-service': + case 'azure-active-directory-service-principal-secret': + case 'azure-active-directory-default': + this.transitionTo(this.STATE.SENT_LOGIN7_WITH_FEDAUTH); + break; + case 'ntlm': + this.transitionTo(this.STATE.SENT_LOGIN7_WITH_NTLM); + break; + default: + this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN); + break; + } + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + REROUTING: { + name: 'ReRouting', + enter: function () { + this.cleanupConnection(CLEANUP_TYPE.REDIRECT); + }, + events: { + message: function () {}, + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + }, + reconnect: function () { + this.transitionTo(this.STATE.CONNECTING); + } + } + }, + TRANSIENT_FAILURE_RETRY: { + name: 'TRANSIENT_FAILURE_RETRY', + enter: function () { + this.curTransientRetryCount++; + this.cleanupConnection(CLEANUP_TYPE.RETRY); + }, + events: { + message: function () {}, + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + }, + retry: function () { + this.createRetryTimer(); + } + } + }, + SENT_TLSSSLNEGOTIATION: { + name: 'SentTLSSSLNegotiation', + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + SENT_LOGIN7_WITH_STANDARD_LOGIN: { + name: 'SentLogin7WithStandardLogin', + enter: function () { + (async () => { + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + const handler = new _handler.Login7TokenHandler(this); + const tokenStreamParser = this.createTokenStreamParser(message, handler); + await (0, _events.once)(tokenStreamParser, 'end'); + if (handler.loginAckReceived) { + if (handler.routingData) { + this.routingData = handler.routingData; + this.transitionTo(this.STATE.REROUTING); + } else { + this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL); + } + } else if (this.loginError) { + if (isTransientError(this.loginError)) { + this.debug.log('Initiating retry on transient error'); + this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY); + } else { + this.emit('connect', this.loginError); + this.transitionTo(this.STATE.FINAL); + } + } else { + this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN')); + this.transitionTo(this.STATE.FINAL); + } + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + SENT_LOGIN7_WITH_NTLM: { + name: 'SentLogin7WithNTLMLogin', + enter: function () { + (async () => { + while (true) { + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + const handler = new _handler.Login7TokenHandler(this); + const tokenStreamParser = this.createTokenStreamParser(message, handler); + await (0, _events.once)(tokenStreamParser, 'end'); + if (handler.loginAckReceived) { + if (handler.routingData) { + this.routingData = handler.routingData; + return this.transitionTo(this.STATE.REROUTING); + } else { + return this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL); + } + } else if (this.ntlmpacket) { + const authentication = this.config.authentication; + const payload = new _ntlmPayload.default({ + domain: authentication.options.domain, + userName: authentication.options.userName, + password: authentication.options.password, + ntlmpacket: this.ntlmpacket + }); + this.messageIo.sendMessage(_packet.TYPE.NTLMAUTH_PKT, payload.data); + this.debug.payload(function () { + return payload.toString(' '); + }); + this.ntlmpacket = undefined; + } else if (this.loginError) { + if (isTransientError(this.loginError)) { + this.debug.log('Initiating retry on transient error'); + return this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY); + } else { + this.emit('connect', this.loginError); + return this.transitionTo(this.STATE.FINAL); + } + } else { + this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN')); + return this.transitionTo(this.STATE.FINAL); + } + } + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + SENT_LOGIN7_WITH_FEDAUTH: { + name: 'SentLogin7Withfedauth', + enter: function () { + (async () => { + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + const handler = new _handler.Login7TokenHandler(this); + const tokenStreamParser = this.createTokenStreamParser(message, handler); + await (0, _events.once)(tokenStreamParser, 'end'); + if (handler.loginAckReceived) { + if (handler.routingData) { + this.routingData = handler.routingData; + this.transitionTo(this.STATE.REROUTING); + } else { + this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL); + } + return; + } + const fedAuthInfoToken = handler.fedAuthInfoToken; + if (fedAuthInfoToken && fedAuthInfoToken.stsurl && fedAuthInfoToken.spn) { + const authentication = this.config.authentication; + const tokenScope = new _url.URL('/.default', fedAuthInfoToken.spn).toString(); + let credentials; + switch (authentication.type) { + case 'azure-active-directory-password': + credentials = new _identity.UsernamePasswordCredential(authentication.options.tenantId ?? 'common', authentication.options.clientId, authentication.options.userName, authentication.options.password); + break; + case 'azure-active-directory-msi-vm': + case 'azure-active-directory-msi-app-service': + const msiArgs = authentication.options.clientId ? [authentication.options.clientId, {}] : [{}]; + credentials = new _identity.ManagedIdentityCredential(...msiArgs); + break; + case 'azure-active-directory-default': + const args = authentication.options.clientId ? { + managedIdentityClientId: authentication.options.clientId + } : {}; + credentials = new _identity.DefaultAzureCredential(args); + break; + case 'azure-active-directory-service-principal-secret': + credentials = new _identity.ClientSecretCredential(authentication.options.tenantId, authentication.options.clientId, authentication.options.clientSecret); + break; + } + let tokenResponse; + try { + tokenResponse = await credentials.getToken(tokenScope); + } catch (err) { + this.loginError = new _esAggregateError.default([new _errors.ConnectionError('Security token could not be authenticated or authorized.', 'EFEDAUTH'), err]); + this.emit('connect', this.loginError); + this.transitionTo(this.STATE.FINAL); + return; + } + const token = tokenResponse.token; + this.sendFedAuthTokenMessage(token); + } else if (this.loginError) { + if (isTransientError(this.loginError)) { + this.debug.log('Initiating retry on transient error'); + this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY); + } else { + this.emit('connect', this.loginError); + this.transitionTo(this.STATE.FINAL); + } + } else { + this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN')); + this.transitionTo(this.STATE.FINAL); + } + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + LOGGED_IN_SENDING_INITIAL_SQL: { + name: 'LoggedInSendingInitialSql', + enter: function () { + (async () => { + this.sendInitialSql(); + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + const tokenStreamParser = this.createTokenStreamParser(message, new _handler.InitialSqlTokenHandler(this)); + await (0, _events.once)(tokenStreamParser, 'end'); + this.transitionTo(this.STATE.LOGGED_IN); + this.processedInitialSql(); + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function socketError() { + this.transitionTo(this.STATE.FINAL); + }, + connectTimeout: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + LOGGED_IN: { + name: 'LoggedIn', + events: { + socketError: function () { + this.transitionTo(this.STATE.FINAL); + } + } + }, + SENT_CLIENT_REQUEST: { + name: 'SentClientRequest', + enter: function () { + (async (_this$request, _this$request3, _this$request10) => { + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + // request timer is stopped on first data package + this.clearRequestTimer(); + const tokenStreamParser = this.createTokenStreamParser(message, new _handler.RequestTokenHandler(this, this.request)); + + // If the request was canceled and we have a `cancelTimer` + // defined, we send a attention message after the + // request message was fully sent off. + // + // We already started consuming the current message + // (but all the token handlers should be no-ops), and + // need to ensure the next message is handled by the + // `SENT_ATTENTION` state. + if ((_this$request = this.request) !== null && _this$request !== void 0 && _this$request.canceled && this.cancelTimer) { + return this.transitionTo(this.STATE.SENT_ATTENTION); + } + const onResume = () => { + tokenStreamParser.resume(); + }; + const onPause = () => { + var _this$request2; + tokenStreamParser.pause(); + (_this$request2 = this.request) === null || _this$request2 === void 0 ? void 0 : _this$request2.once('resume', onResume); + }; + (_this$request3 = this.request) === null || _this$request3 === void 0 ? void 0 : _this$request3.on('pause', onPause); + if (this.request instanceof _request.default && this.request.paused) { + onPause(); + } + const onCancel = () => { + var _this$request4, _this$request5; + tokenStreamParser.removeListener('end', onEndOfMessage); + if (this.request instanceof _request.default && this.request.paused) { + // resume the request if it was paused so we can read the remaining tokens + this.request.resume(); + } + (_this$request4 = this.request) === null || _this$request4 === void 0 ? void 0 : _this$request4.removeListener('pause', onPause); + (_this$request5 = this.request) === null || _this$request5 === void 0 ? void 0 : _this$request5.removeListener('resume', onResume); + + // The `_cancelAfterRequestSent` callback will have sent a + // attention message, so now we need to also switch to + // the `SENT_ATTENTION` state to make sure the attention ack + // message is processed correctly. + this.transitionTo(this.STATE.SENT_ATTENTION); + }; + const onEndOfMessage = () => { + var _this$request6, _this$request7, _this$request8, _this$request9; + (_this$request6 = this.request) === null || _this$request6 === void 0 ? void 0 : _this$request6.removeListener('cancel', this._cancelAfterRequestSent); + (_this$request7 = this.request) === null || _this$request7 === void 0 ? void 0 : _this$request7.removeListener('cancel', onCancel); + (_this$request8 = this.request) === null || _this$request8 === void 0 ? void 0 : _this$request8.removeListener('pause', onPause); + (_this$request9 = this.request) === null || _this$request9 === void 0 ? void 0 : _this$request9.removeListener('resume', onResume); + this.transitionTo(this.STATE.LOGGED_IN); + const sqlRequest = this.request; + this.request = undefined; + if (this.config.options.tdsVersion < '7_2' && sqlRequest.error && this.isSqlBatch) { + this.inTransaction = false; + } + sqlRequest.callback(sqlRequest.error, sqlRequest.rowCount, sqlRequest.rows); + }; + tokenStreamParser.once('end', onEndOfMessage); + (_this$request10 = this.request) === null || _this$request10 === void 0 ? void 0 : _this$request10.once('cancel', onCancel); + })(); + }, + exit: function (nextState) { + this.clearRequestTimer(); + }, + events: { + socketError: function (err) { + const sqlRequest = this.request; + this.request = undefined; + this.transitionTo(this.STATE.FINAL); + sqlRequest.callback(err); + } + } + }, + SENT_ATTENTION: { + name: 'SentAttention', + enter: function () { + (async () => { + let message; + try { + message = await this.messageIo.readMessage(); + } catch (err) { + return this.socketError(err); + } + const handler = new _handler.AttentionTokenHandler(this, this.request); + const tokenStreamParser = this.createTokenStreamParser(message, handler); + await (0, _events.once)(tokenStreamParser, 'end'); + // 3.2.5.7 Sent Attention State + // Discard any data contained in the response, until we receive the attention response + if (handler.attentionReceived) { + this.clearCancelTimer(); + const sqlRequest = this.request; + this.request = undefined; + this.transitionTo(this.STATE.LOGGED_IN); + if (sqlRequest.error && sqlRequest.error instanceof _errors.RequestError && sqlRequest.error.code === 'ETIMEOUT') { + sqlRequest.callback(sqlRequest.error); + } else { + sqlRequest.callback(new _errors.RequestError('Canceled.', 'ECANCEL')); + } + } + })().catch(err => { + process.nextTick(() => { + throw err; + }); + }); + }, + events: { + socketError: function (err) { + const sqlRequest = this.request; + this.request = undefined; + this.transitionTo(this.STATE.FINAL); + sqlRequest.callback(err); + } + } + }, + FINAL: { + name: 'Final', + enter: function () { + this.cleanupConnection(CLEANUP_TYPE.NORMAL); + }, + events: { + connectTimeout: function () { + // Do nothing, as the timer should be cleaned up. + }, + message: function () { + // Do nothing + }, + socketError: function () { + // Do nothing + } + } + } +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfb3MiLCJ0bHMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIm5ldCIsIl9kbnMiLCJfY29uc3RhbnRzIiwiX3N0cmVhbSIsIl9pZGVudGl0eSIsIl9idWxrTG9hZCIsIl9kZWJ1ZyIsIl9ldmVudHMiLCJfaW5zdGFuY2VMb29rdXAiLCJfdHJhbnNpZW50RXJyb3JMb29rdXAiLCJfcGFja2V0IiwiX3ByZWxvZ2luUGF5bG9hZCIsIl9sb2dpbjdQYXlsb2FkIiwiX250bG1QYXlsb2FkIiwiX3JlcXVlc3QiLCJfcnBjcmVxdWVzdFBheWxvYWQiLCJfc3FsYmF0Y2hQYXlsb2FkIiwiX21lc3NhZ2VJbyIsIl90b2tlblN0cmVhbVBhcnNlciIsIl90cmFuc2FjdGlvbiIsIl9lcnJvcnMiLCJfY29ubmVjdG9yIiwiX2xpYnJhcnkiLCJfdGRzVmVyc2lvbnMiLCJfbWVzc2FnZSIsIl9udGxtIiwiX25vZGVBYm9ydENvbnRyb2xsZXIiLCJfZGF0YVR5cGUiLCJfYnVsa0xvYWRQYXlsb2FkIiwiX3NwZWNpYWxTdG9yZWRQcm9jZWR1cmUiLCJfZXNBZ2dyZWdhdGVFcnJvciIsIl9wYWNrYWdlIiwiX3VybCIsIl9oYW5kbGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIktFRVBfQUxJVkVfSU5JVElBTF9ERUxBWSIsIkRFRkFVTFRfQ09OTkVDVF9USU1FT1VUIiwiREVGQVVMVF9DTElFTlRfUkVRVUVTVF9USU1FT1VUIiwiREVGQVVMVF9DQU5DRUxfVElNRU9VVCIsIkRFRkFVTFRfQ09OTkVDVF9SRVRSWV9JTlRFUlZBTCIsIkRFRkFVTFRfUEFDS0VUX1NJWkUiLCJERUZBVUxUX1RFWFRTSVpFIiwiREVGQVVMVF9EQVRFRklSU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1REU19WRVJTSU9OIiwiREVGQVVMVF9MQU5HVUFHRSIsIkRFRkFVTFRfREFURUZPUk1BVCIsIkNMRUFOVVBfVFlQRSIsIk5PUk1BTCIsIlJFRElSRUNUIiwiUkVUUlkiLCJDb25uZWN0aW9uIiwiRXZlbnRFbWl0dGVyIiwiX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsIlR5cGVFcnJvciIsInNlcnZlciIsImZlZEF1dGhSZXF1aXJlZCIsImF1dGhlbnRpY2F0aW9uIiwidW5kZWZpbmVkIiwidHlwZSIsIm9wdGlvbnMiLCJkb21haW4iLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwidG9VcHBlckNhc2UiLCJjbGllbnRJZCIsInRlbmFudElkIiwidG9rZW4iLCJjbGllbnRTZWNyZXQiLCJhYm9ydFRyYW5zYWN0aW9uT25FcnJvciIsImFwcE5hbWUiLCJjYW1lbENhc2VDb2x1bW5zIiwiY2FuY2VsVGltZW91dCIsImNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCIsImNvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY29sdW1uTmFtZVJlcGxhY2VyIiwiY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwiLCJjb25uZWN0VGltZW91dCIsImNvbm5lY3RvciIsImNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCIsIklTT0xBVElPTl9MRVZFTCIsIlJFQURfQ09NTUlUVEVEIiwiY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzIiwiZGF0YWJhc2UiLCJkYXRlZmlyc3QiLCJkYXRlRm9ybWF0IiwiZGVidWciLCJkYXRhIiwicGFja2V0IiwicGF5bG9hZCIsImVuYWJsZUFuc2lOdWxsIiwiZW5hYmxlQW5zaU51bGxEZWZhdWx0IiwiZW5hYmxlQW5zaVBhZGRpbmciLCJlbmFibGVBbnNpV2FybmluZ3MiLCJlbmFibGVBcml0aEFib3J0IiwiZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwiLCJlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0IiwiZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMiLCJlbmFibGVOdW1lcmljUm91bmRhYm9ydCIsImVuYWJsZVF1b3RlZElkZW50aWZpZXIiLCJlbmNyeXB0IiwiZmFsbGJhY2tUb0RlZmF1bHREYiIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsImluc3RhbmNlTmFtZSIsImlzb2xhdGlvbkxldmVsIiwibGFuZ3VhZ2UiLCJsb2NhbEFkZHJlc3MiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJtdWx0aVN1Ym5ldEZhaWxvdmVyIiwicGFja2V0U2l6ZSIsInBvcnQiLCJyZWFkT25seUludGVudCIsInJlcXVlc3RUaW1lb3V0Iiwicm93Q29sbGVjdGlvbk9uRG9uZSIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwic2VydmVyTmFtZSIsInNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbiIsInRkc1ZlcnNpb24iLCJ0ZXh0c2l6ZSIsInRydXN0ZWRTZXJ2ZXJOYW1lQUUiLCJ0cnVzdFNlcnZlckNlcnRpZmljYXRlIiwidXNlQ29sdW1uTmFtZXMiLCJ1c2VVVEMiLCJ3b3Jrc3RhdGlvbklkIiwibG93ZXJDYXNlR3VpZHMiLCJFcnJvciIsImFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwiLCJSYW5nZUVycm9yIiwic2VjdXJlQ29udGV4dE9wdGlvbnMiLCJzZWN1cmVPcHRpb25zIiwiY3JlYXRlIiwidmFsdWUiLCJjb25zdGFudHMiLCJTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIiwiY3JlYXRlRGVidWciLCJpblRyYW5zYWN0aW9uIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsIkJ1ZmZlciIsImZyb20iLCJ0cmFuc2FjdGlvbkRlcHRoIiwiaXNTcWxCYXRjaCIsImNsb3NlZCIsIm1lc3NhZ2VCdWZmZXIiLCJhbGxvYyIsImN1clRyYW5zaWVudFJldHJ5Q291bnQiLCJ0cmFuc2llbnRFcnJvckxvb2t1cCIsIlRyYW5zaWVudEVycm9yTG9va3VwIiwic3RhdGUiLCJTVEFURSIsIklOSVRJQUxJWkVEIiwibWVzc2FnZUlvIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiQVRURU5USU9OIiwiY3JlYXRlQ2FuY2VsVGltZXIiLCJjb25uZWN0IiwiY29ubmVjdExpc3RlbmVyIiwiQ29ubmVjdGlvbkVycm9yIiwibmFtZSIsIm9uQ29ubmVjdCIsImVyciIsInJlbW92ZUxpc3RlbmVyIiwib25FcnJvciIsIm9uY2UiLCJ0cmFuc2l0aW9uVG8iLCJDT05ORUNUSU5HIiwib24iLCJldmVudCIsImxpc3RlbmVyIiwiZW1pdCIsImFyZ3MiLCJjbG9zZSIsIkZJTkFMIiwiaW5pdGlhbGlzZUNvbm5lY3Rpb24iLCJzaWduYWwiLCJjcmVhdGVDb25uZWN0VGltZXIiLCJjb25uZWN0T25Qb3J0IiwiaW5zdGFuY2VMb29rdXAiLCJ0aW1lb3V0IiwidGhlbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImNsZWFyQ29ubmVjdFRpbWVyIiwiYWJvcnRlZCIsIm1lc3NhZ2UiLCJjbGVhbnVwQ29ubmVjdGlvbiIsImNsZWFudXBUeXBlIiwiY2xlYXJSZXF1ZXN0VGltZXIiLCJjbGVhclJldHJ5VGltZXIiLCJjbG9zZUNvbm5lY3Rpb24iLCJyZXF1ZXN0IiwiUmVxdWVzdEVycm9yIiwiY2FsbGJhY2siLCJsb2dpbkVycm9yIiwiRGVidWciLCJjcmVhdGVUb2tlblN0cmVhbVBhcnNlciIsImhhbmRsZXIiLCJUb2tlblN0cmVhbVBhcnNlciIsInNvY2tldEhhbmRsaW5nRm9yU2VuZFByZUxvZ2luIiwic29ja2V0IiwiZXJyb3IiLCJzb2NrZXRFcnJvciIsInNvY2tldENsb3NlIiwic29ja2V0RW5kIiwic2V0S2VlcEFsaXZlIiwiTWVzc2FnZUlPIiwiY2xlYXJ0ZXh0IiwibG9nIiwic2VuZFByZUxvZ2luIiwiU0VOVF9QUkVMT0dJTiIsIndyYXBXaXRoVGxzIiwidGhyb3dJZkFib3J0ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNlY3VyZUNvbnRleHQiLCJjcmVhdGVTZWN1cmVDb250ZXh0IiwiaXNJUCIsImVuY3J5cHRPcHRpb25zIiwiaG9zdCIsIkFMUE5Qcm90b2NvbHMiLCJzZXJ2ZXJuYW1lIiwiZW5jcnlwdHNvY2tldCIsIm9uQWJvcnQiLCJkZXN0cm95IiwicmVhc29uIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJjdXN0b21Db25uZWN0b3IiLCJjb25uZWN0T3B0cyIsInJvdXRpbmdEYXRhIiwiY29ubmVjdEluUGFyYWxsZWwiLCJjb25uZWN0SW5TZXF1ZW5jZSIsImRucyIsImxvb2t1cCIsImVuZCIsImNhdGNoIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImNvbm5lY3RUaW1lciIsInNldFRpbWVvdXQiLCJhYm9ydCIsImNsZWFyQ2FuY2VsVGltZXIiLCJjYW5jZWxUaW1lciIsImNyZWF0ZVJlcXVlc3RUaW1lciIsInJlcXVlc3RUaW1lciIsImNyZWF0ZVJldHJ5VGltZXIiLCJyZXRyeVRpbWVyIiwicmV0cnlUaW1lb3V0IiwiaG9zdFBvc3RmaXgiLCJyb3V0aW5nTWVzc2FnZSIsImRpc3BhdGNoRXZlbnQiLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJuZXdTdGF0ZSIsImV4aXQiLCJlbnRlciIsImFwcGx5IiwiZ2V0RXZlbnRIYW5kbGVyIiwiZXZlbnROYW1lIiwiZXZlbnRzIiwiU0VOVF9UTFNTU0xORUdPVElBVElPTiIsImNvZGUiLCJSRVJPVVRJTkciLCJUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSIsIm1ham9yIiwibWlub3IiLCJidWlsZCIsImV4ZWMiLCJ2ZXJzaW9uIiwiUHJlbG9naW5QYXlsb2FkIiwiTnVtYmVyIiwic3ViYnVpbGQiLCJQUkVMT0dJTiIsInRvU3RyaW5nIiwic2VuZExvZ2luN1BhY2tldCIsIkxvZ2luN1BheWxvYWQiLCJ2ZXJzaW9ucyIsImNsaWVudFByb2dWZXIiLCJjbGllbnRQaWQiLCJwaWQiLCJjb25uZWN0aW9uSWQiLCJjbGllbnRUaW1lWm9uZSIsIkRhdGUiLCJnZXRUaW1lem9uZU9mZnNldCIsImNsaWVudExjaWQiLCJmZWRBdXRoIiwiZWNobyIsIndvcmtmbG93IiwiZmVkQXV0aFRva2VuIiwic3NwaSIsImNyZWF0ZU5UTE1SZXF1ZXN0IiwiaG9zdG5hbWUiLCJvcyIsImxpYnJhcnlOYW1lIiwiaW5pdERiRmF0YWwiLCJMT0dJTjciLCJ0b0J1ZmZlciIsInNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlIiwiYWNjZXNzVG9rZW5MZW4iLCJieXRlTGVuZ3RoIiwib2Zmc2V0Iiwid3JpdGVVSW50MzJMRSIsIndyaXRlIiwiRkVEQVVUSF9UT0tFTiIsIlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4iLCJzZW5kSW5pdGlhbFNxbCIsIlNxbEJhdGNoUGF5bG9hZCIsImdldEluaXRpYWxTcWwiLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiTWVzc2FnZSIsIlNRTF9CQVRDSCIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsIlJlYWRhYmxlIiwicGlwZSIsInB1c2giLCJnZXRJc29sYXRpb25MZXZlbFRleHQiLCJqb2luIiwicHJvY2Vzc2VkSW5pdGlhbFNxbCIsImV4ZWNTcWxCYXRjaCIsIm1ha2VSZXF1ZXN0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiZXhlY1NxbCIsInZhbGlkYXRlUGFyYW1ldGVycyIsImRhdGFiYXNlQ29sbGF0aW9uIiwicGFyYW1ldGVycyIsIlRZUEVTIiwiTlZhckNoYXIiLCJvdXRwdXQiLCJsZW5ndGgiLCJwcmVjaXNpb24iLCJzY2FsZSIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJSUENfUkVRVUVTVCIsIlJwY1JlcXVlc3RQYXlsb2FkIiwiUHJvY2VkdXJlcyIsIlNwX0V4ZWN1dGVTcWwiLCJuZXdCdWxrTG9hZCIsInRhYmxlIiwiY2FsbGJhY2tPck9wdGlvbnMiLCJCdWxrTG9hZCIsImV4ZWNCdWxrTG9hZCIsImJ1bGtMb2FkIiwicm93cyIsImV4ZWN1dGlvblN0YXJ0ZWQiLCJzdHJlYW1pbmdNb2RlIiwiZmlyc3RSb3dXcml0dGVuIiwicm93U3RyZWFtIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJvbkNhbmNlbCIsIkJ1bGtMb2FkUGF5bG9hZCIsIlJlcXVlc3QiLCJnZXRCdWxrSW5zZXJ0U3FsIiwiQlVMS19MT0FEIiwicHJlcGFyZSIsIkludCIsInByZXBhcmluZyIsImhhbmRsZSIsIlNwX1ByZXBhcmUiLCJ1bnByZXBhcmUiLCJTcF9VbnByZXBhcmUiLCJleGVjdXRlIiwiZXhlY3V0ZVBhcmFtZXRlcnMiLCJpIiwibGVuIiwicGFyYW1ldGVyIiwidmFsaWRhdGUiLCJTcF9FeGVjdXRlIiwiY2FsbFByb2NlZHVyZSIsImJlZ2luVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbiIsIlRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiYmVnaW5QYXlsb2FkIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJjb21taXRQYXlsb2FkIiwicm9sbGJhY2tUcmFuc2FjdGlvbiIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVUcmFuc2FjdGlvbiIsInNhdmVQYXlsb2FkIiwiY2IiLCJ1c2VTYXZlcG9pbnQiLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInR4RG9uZSIsImRvbmUiLCJMT0dHRURfSU4iLCJ0eEVyciIsInBhY2tldFR5cGUiLCJjYW5jZWxlZCIsImNvbm5lY3Rpb24iLCJyb3dDb3VudCIsInJzdCIsInBheWxvYWRTdHJlYW0iLCJ1bnBpcGUiLCJpZ25vcmUiLCJwYXVzZWQiLCJyZXN1bWUiLCJyZXNldENvbm5lY3Rpb24iLCJyZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0IiwiU0VOVF9DTElFTlRfUkVRVUVTVCIsInJlc2V0IiwiUkVBRF9VTkNPTU1JVFRFRCIsIlJFUEVBVEFCTEVfUkVBRCIsIlNFUklBTElaQUJMRSIsIlNOQVBTSE9UIiwiaXNUcmFuc2llbnRFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiZXJyb3JzIiwiaXNUcmFuc2llbnQiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZWFkTWVzc2FnZSIsImNvbmNhdCIsInByZWxvZ2luUGF5bG9hZCIsImVuY3J5cHRpb25TdHJpbmciLCJfdGhpcyRyb3V0aW5nRGF0YSIsInN0YXJ0VGxzIiwiU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIIiwiU0VOVF9MT0dJTjdfV0lUSF9OVExNIiwicmVjb25uZWN0IiwicmV0cnkiLCJMb2dpbjdUb2tlbkhhbmRsZXIiLCJ0b2tlblN0cmVhbVBhcnNlciIsImxvZ2luQWNrUmVjZWl2ZWQiLCJMT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTCIsIm50bG1wYWNrZXQiLCJOVExNUmVzcG9uc2VQYXlsb2FkIiwiTlRMTUFVVEhfUEtUIiwiZmVkQXV0aEluZm9Ub2tlbiIsInN0c3VybCIsInNwbiIsInRva2VuU2NvcGUiLCJVUkwiLCJjcmVkZW50aWFscyIsIlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsIiwibXNpQXJncyIsIk1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwiLCJtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZCIsIkRlZmF1bHRBenVyZUNyZWRlbnRpYWwiLCJDbGllbnRTZWNyZXRDcmVkZW50aWFsIiwidG9rZW5SZXNwb25zZSIsImdldFRva2VuIiwiSW5pdGlhbFNxbFRva2VuSGFuZGxlciIsIl90aGlzJHJlcXVlc3QiLCJfdGhpcyRyZXF1ZXN0MyIsIl90aGlzJHJlcXVlc3QxMCIsIlJlcXVlc3RUb2tlbkhhbmRsZXIiLCJTRU5UX0FUVEVOVElPTiIsIm9uUmVzdW1lIiwib25QYXVzZSIsIl90aGlzJHJlcXVlc3QyIiwicGF1c2UiLCJfdGhpcyRyZXF1ZXN0NCIsIl90aGlzJHJlcXVlc3Q1Iiwib25FbmRPZk1lc3NhZ2UiLCJfdGhpcyRyZXF1ZXN0NiIsIl90aGlzJHJlcXVlc3Q3IiwiX3RoaXMkcmVxdWVzdDgiLCJfdGhpcyRyZXF1ZXN0OSIsInNxbFJlcXVlc3QiLCJuZXh0U3RhdGUiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyB0bHMgZnJvbSAndGxzJztcbmltcG9ydCAqIGFzIG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IGRucyBmcm9tICdkbnMnO1xuXG5pbXBvcnQgY29uc3RhbnRzIGZyb20gJ2NvbnN0YW50cyc7XG5pbXBvcnQgeyB0eXBlIFNlY3VyZUNvbnRleHRPcHRpb25zIH0gZnJvbSAndGxzJztcblxuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuXG5pbXBvcnQge1xuICBEZWZhdWx0QXp1cmVDcmVkZW50aWFsLFxuICBDbGllbnRTZWNyZXRDcmVkZW50aWFsLFxuICBNYW5hZ2VkSWRlbnRpdHlDcmVkZW50aWFsLFxuICBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbCxcbn0gZnJvbSAnQGF6dXJlL2lkZW50aXR5JztcblxuaW1wb3J0IEJ1bGtMb2FkLCB7IHR5cGUgT3B0aW9ucyBhcyBCdWxrTG9hZE9wdGlvbnMsIHR5cGUgQ2FsbGJhY2sgYXMgQnVsa0xvYWRDYWxsYmFjayB9IGZyb20gJy4vYnVsay1sb2FkJztcbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgb25jZSB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBpbnN0YW5jZUxvb2t1cCB9IGZyb20gJy4vaW5zdGFuY2UtbG9va3VwJztcbmltcG9ydCB7IFRyYW5zaWVudEVycm9yTG9va3VwIH0gZnJvbSAnLi90cmFuc2llbnQtZXJyb3ItbG9va3VwJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgUHJlbG9naW5QYXlsb2FkIGZyb20gJy4vcHJlbG9naW4tcGF5bG9hZCc7XG5pbXBvcnQgTG9naW43UGF5bG9hZCBmcm9tICcuL2xvZ2luNy1wYXlsb2FkJztcbmltcG9ydCBOVExNUmVzcG9uc2VQYXlsb2FkIGZyb20gJy4vbnRsbS1wYXlsb2FkJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IFNxbEJhdGNoUGF5bG9hZCBmcm9tICcuL3NxbGJhdGNoLXBheWxvYWQnO1xuaW1wb3J0IE1lc3NhZ2VJTyBmcm9tICcuL21lc3NhZ2UtaW8nO1xuaW1wb3J0IHsgUGFyc2VyIGFzIFRva2VuU3RyZWFtUGFyc2VyIH0gZnJvbSAnLi90b2tlbi90b2tlbi1zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBJU09MQVRJT05fTEVWRUwsIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgY29ubmVjdEluUGFyYWxsZWwsIGNvbm5lY3RJblNlcXVlbmNlIH0gZnJvbSAnLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgbmFtZSBhcyBsaWJyYXJ5TmFtZSB9IGZyb20gJy4vbGlicmFyeSc7XG5pbXBvcnQgeyB2ZXJzaW9ucyB9IGZyb20gJy4vdGRzLXZlcnNpb25zJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyB0eXBlIE1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgY3JlYXRlTlRMTVJlcXVlc3QgfSBmcm9tICcuL250bG0nO1xuaW1wb3J0IHsgQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciB9IGZyb20gJy4vYWx3YXlzLWVuY3J5cHRlZC9rZXlzdG9yZS1wcm92aWRlci1henVyZS1rZXktdmF1bHQnO1xuXG5pbXBvcnQgeyBBYm9ydENvbnRyb2xsZXIsIEFib3J0U2lnbmFsIH0gZnJvbSAnbm9kZS1hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IHR5cGUgUGFyYW1ldGVyLCBUWVBFUyB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IEJ1bGtMb2FkUGF5bG9hZCB9IGZyb20gJy4vYnVsay1sb2FkLXBheWxvYWQnO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFByb2NlZHVyZXMgZnJvbSAnLi9zcGVjaWFsLXN0b3JlZC1wcm9jZWR1cmUnO1xuXG5pbXBvcnQgQWdncmVnYXRlRXJyb3IgZnJvbSAnZXMtYWdncmVnYXRlLWVycm9yJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEF0dGVudGlvblRva2VuSGFuZGxlciwgSW5pdGlhbFNxbFRva2VuSGFuZGxlciwgTG9naW43VG9rZW5IYW5kbGVyLCBSZXF1ZXN0VG9rZW5IYW5kbGVyLCBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL3Rva2VuL2hhbmRsZXInO1xuXG50eXBlIEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgQSBCdWZmZXIgdGhhdCBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHJhbnNhY3Rpb25EZXNjcmlwdG9yPzogQnVmZmVyKSA9PiB2b2lkXG5cbnR5cGUgU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHRvIHNldCBhIHNhdmVwb2ludCB3aXRoaW4gdGhlXG4gICAqIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgKiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkIHRoZW4gYGVycmAgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGhhc1xuICAgKiBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBlcnIgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJlc2V0Q2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlc2V0IGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICpcbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlclxuICAgKiByZXF1ZXN0IHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xudHlwZSBUcmFuc2FjdGlvbkNhbGxiYWNrPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbiAob3IgY3JlYXRlIGEgc2F2ZXBvaW50LCBpblxuICAgKiB0aGUgY2FzZSBvZiBhIG5lc3RlZCB0cmFuc2FjdGlvbikgaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICogSWYgbm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBjYWxsYmFjayBzaG91bGQgcGVyZm9ybSBpdHMgd29yayBhbmQgZXZlbnR1YWxseSBjYWxsXG4gICAqIGBkb25lYCB3aXRoIGFuIGVycm9yIG9yIG51bGwgKHRvIHRyaWdnZXIgYSB0cmFuc2FjdGlvbiByb2xsYmFjayBvciBhXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdCkgYW5kIGFuIGFkZGl0aW9uYWwgY29tcGxldGlvbiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RcbiAgICogdG8gcm9sbGJhY2sgb3IgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gdG8gYGRvbmVgIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gdHhEb25lIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiBUcmFuc2FjdGlvbkRvbmU8VD4pID0+IHZvaWQ7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2sgPSAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xudHlwZSBDYWxsYmFja1BhcmFtZXRlcnM8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IGFueT4gPSBUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gY29tbWl0IG9yIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnIgb2NjdXJyZWQsIGEgc3RyaW5nIHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMTUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQgPSA1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMID0gNTAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX1BBQ0tFVF9TSVpFID0gNCAqIDEwMjQ7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVEVYVFNJWkUgPSAyMTQ3NDgzNjQ3O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGSVJTVCA9IDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IDE0MzM7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVERTX1ZFUlNJT04gPSAnN180Jztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICd1c19lbmdsaXNoJztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9EQVRFRk9STUFUID0gJ21keSc7XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlciB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQXp1cmUgYXBwIHNlcnZpY2UgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlIHRvIHRoZWlyIGNyZWF0ZWQgaWRlbnRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSB0b2tlbiBmcm9tIGF6dXJlIHdlYiBhcHAgc2VydmljZVxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmUgYSB0b2tlblxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmluZyBhIHRva2VuXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGB0b2tlbmAgd2hpY2ggdGhleSByZXRyaWV2ZWQgZWxzZSB3aGVyZVxuICAgICAqIHRvIGZvcm1pbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHVzZXJOYW1lYCBhc3NvY2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICB1c2VyTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSB1c2VyIG5lZWQgdG8gcHJvdmlkZSBgcGFzc3dvcmRgIGFzc29jaWF0ZSB0byB0aGVpciBhY2NvdW50LlxuICAgICAqL1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGNsaWVudCBpZCB0byB1c2UuXG4gICAgICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHBhcmFtZXRlciBmb3Igc3BlY2lmaWMgQXp1cmUgdGVuYW50IElEXG4gICAgICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiAoYGNsaWVudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRlZCBgY2xpZW50IHNlY3JldGAgZm9yIHRoaXMgcmVnaXN0ZXJlZCBBenVyZSBhcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERpcmVjdG9yeSAoYHRlbmFudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIE50bG1BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdudGxtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSBmcm9tIHlvdXIgd2luZG93cyBhY2NvdW50LlxuICAgICAqL1xuICAgIHVzZXJOYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgZnJvbSB5b3VyIHdpbmRvd3MgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9uY2UgeW91IHNldCBkb21haW4gZm9yIG50bG0gYXV0aGVudGljYXRpb24gdHlwZSwgZHJpdmVyIHdpbGwgY29ubmVjdCB0byBTUUwgU2VydmVyIHVzaW5nIGRvbWFpbiBsb2dpbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmb3JtaW5nIGEgY29ubmVjdGlvbiB1c2luZyBudGxtIHR5cGVcbiAgICAgKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlZmF1bHRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdkZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSB0byB1c2UgZm9yIHNxbCBzZXJ2ZXIgbG9naW4uXG4gICAgICovXG4gICAgdXNlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgdG8gdXNlIGZvciBzcWwgc2VydmVyIGxvZ2luLlxuICAgICAqL1xuICAgIHBhc3N3b3JkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSBleHRlbmRzIEVycm9yIHtcbiAgY29kZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVybmFsQ29ubmVjdGlvbkNvbmZpZyB7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBhdXRoZW50aWNhdGlvbjogRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHwgTnRsbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQgfCBBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbjtcbiAgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIHtcbiAgYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I6IGJvb2xlYW47XG4gIGFwcE5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgY2FtZWxDYXNlQ29sdW1uczogYm9vbGVhbjtcbiAgY2FuY2VsVGltZW91dDogbnVtYmVyO1xuICBjb2x1bW5FbmNyeXB0aW9uS2V5Q2FjaGVUVEw6IG51bWJlcjtcbiAgY29sdW1uRW5jcnlwdGlvblNldHRpbmc6IGJvb2xlYW47XG4gIGNvbHVtbk5hbWVSZXBsYWNlcjogdW5kZWZpbmVkIHwgKChjb2xOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gc3RyaW5nKTtcbiAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw6IG51bWJlcjtcbiAgY29ubmVjdG9yOiB1bmRlZmluZWQgfCAoKCkgPT4gUHJvbWlzZTxuZXQuU29ja2V0Pik7XG4gIGNvbm5lY3RUaW1lb3V0OiBudW1iZXI7XG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXTtcbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgZGF0YWJhc2U6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgZGF0ZWZpcnN0OiBudW1iZXI7XG4gIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgZGVidWc6IHtcbiAgICBkYXRhOiBib29sZWFuO1xuICAgIHBhY2tldDogYm9vbGVhbjtcbiAgICBwYXlsb2FkOiBib29sZWFuO1xuICAgIHRva2VuOiBib29sZWFuO1xuICB9O1xuICBlbmFibGVBbnNpTnVsbDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lQYWRkaW5nOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaVdhcm5pbmdzOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQXJpdGhBYm9ydDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5jcnlwdDogc3RyaW5nIHwgYm9vbGVhbjtcbiAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiBLZXlTdG9yZVByb3ZpZGVyTWFwIHwgdW5kZWZpbmVkO1xuICBmYWxsYmFja1RvRGVmYXVsdERiOiBib29sZWFuO1xuICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF07XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IG51bWJlcjtcbiAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbjtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXI7XG4gIHJlYWRPbmx5SW50ZW50OiBib29sZWFuO1xuICByZXF1ZXN0VGltZW91dDogbnVtYmVyO1xuICByb3dDb2xsZWN0aW9uT25Eb25lOiBib29sZWFuO1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogYm9vbGVhbjtcbiAgc2VydmVyTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGJvb2xlYW47XG4gIHRkc1ZlcnNpb246IHN0cmluZztcbiAgdGV4dHNpemU6IG51bWJlcjtcbiAgdHJ1c3RlZFNlcnZlck5hbWVBRTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBib29sZWFuO1xuICB1c2VDb2x1bW5OYW1lczogYm9vbGVhbjtcbiAgdXNlVVRDOiBib29sZWFuO1xuICB3b3Jrc3RhdGlvbklkOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGxvd2VyQ2FzZUd1aWRzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS2V5U3RvcmVQcm92aWRlck1hcCB7XG4gIFtrZXk6IHN0cmluZ106IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW50ZXJmYWNlIFN0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbnRlcj8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIGV4aXQ/KHRoaXM6IENvbm5lY3Rpb24sIG5ld1N0YXRlOiBTdGF0ZSk6IHZvaWQ7XG4gIGV2ZW50czoge1xuICAgIHNvY2tldEVycm9yPyh0aGlzOiBDb25uZWN0aW9uLCBlcnI6IEVycm9yKTogdm9pZDtcbiAgICBjb25uZWN0VGltZW91dD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgbWVzc2FnZT8odGhpczogQ29ubmVjdGlvbiwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQ7XG4gICAgcmV0cnk/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICAgIHJlY29ubmVjdD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIH07XG59XG5cbnR5cGUgQXV0aGVudGljYXRpb24gPSBEZWZhdWx0QXV0aGVudGljYXRpb24gfFxuICBOdGxtQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuXG50eXBlIEF1dGhlbnRpY2F0aW9uVHlwZSA9IEF1dGhlbnRpY2F0aW9uWyd0eXBlJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogSG9zdG5hbWUgdG8gY29ubmVjdCB0by5cbiAgICovXG4gIHNlcnZlcjogc3RyaW5nO1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBmb3JtaW5nIHRoZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgb3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gcmVsYXRlZCBvcHRpb25zIGZvciBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXV0aGVudGljYXRpb24/OiBBdXRoZW50aWNhdGlvbk9wdGlvbnM7XG59XG5cbmludGVyZmFjZSBEZWJ1Z09wdGlvbnMge1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkYXRhIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBkYXRhOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgcGFja2V0OiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBwYXlsb2FkIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBwYXlsb2FkOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHRva2VuIHN0cmVhbSB0b2tlbnNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICB0b2tlbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QsIHZhbGlkIHR5cGVzIGFyZSBgZGVmYXVsdGAsIGBudGxtYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5gLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1gLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0YFxuICAgKiBvciBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgXG4gICAqL1xuICB0eXBlPzogQXV0aGVudGljYXRpb25UeXBlO1xuICAvKipcbiAgICogRGlmZmVyZW50IG9wdGlvbnMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGVzOlxuICAgKlxuICAgKiAqIGBkZWZhdWx0YDogW1tEZWZhdWx0QXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYG50bG1gIDpbW050bG1BdXRoZW50aWNhdGlvbl1dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bWAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdGAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKi9cbiAgb3B0aW9ucz86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByb2xsYmFjayBhIHRyYW5zYWN0aW9uIGF1dG9tYXRpY2FsbHkgaWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkXG4gICAqIGR1cmluZyB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24ncyBleGVjdXRpb24uIFRoaXMgc2V0cyB0aGUgdmFsdWUgZm9yIGBTRVQgWEFDVF9BQk9SVGAgZHVyaW5nIHRoZVxuICAgKiBpbml0aWFsIFNRTCBwaGFzZSBvZiBhIGNvbm5lY3Rpb24gW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC14YWN0LWFib3J0LXRyYW5zYWN0LXNxbCkuXG4gICAqL1xuICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgdXNlZCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiBpbiBwcm9maWxpbmcsIGxvZ2dpbmcgb3IgdHJhY2luZyB0b29scyBvZiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgVGVkaW91c2ApXG4gICAqL1xuICBhcHBOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIGNvbHVtbiBuYW1lcyByZXR1cm5lZCB3aWxsIGhhdmUgdGhlIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZVxuICAgKiAoYHRydWVgKSBvciBub3QuIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiB5b3UgcHJvdmlkZSBhIFtbY29sdW1uTmFtZVJlcGxhY2VyXV0uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGNhbWVsQ2FzZUNvbHVtbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIFtbUmVxdWVzdC5jYW5jZWxdXSAoYWJvcnQpIG9mIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIGZhaWxlZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDUwMDBgKS5cbiAgICovXG4gIGNhbmNlbFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGAoY29sdW1uTmFtZSwgaW5kZXgsIGNvbHVtbk1ldGFEYXRhKWAgYW5kIHJldHVybmluZyBhIHN0cmluZy4gSWYgcHJvdmlkZWQsXG4gICAqIHRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIgY29sdW1uIHBlciByZXN1bHQtc2V0LiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFNRTC1wcm92aWRlZFxuICAgKiBjb2x1bW4gbmFtZSBvbiByb3cgYW5kIG1ldGEgZGF0YSBvYmplY3RzLiBUaGlzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgY29udmVydCBiZXR3ZWVuIG5hbWluZyBjb252ZW50aW9ucy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBudWxsYClcbiAgICovXG4gIGNvbHVtbk5hbWVSZXBsYWNlcj86IChjb2xOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiwgaW4gY2FzZSBvZiB0cmFuc2llbnQgZmFpbHVyZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6YDUwMGApXG4gICAqL1xuICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ3VzdG9tIGNvbm5lY3RvciBmYWN0b3J5IG1ldGhvZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB1bmRlZmluZWRgKVxuICAgKi9cbiAgY29ubmVjdG9yPzogKCkgPT4gUHJvbWlzZTxuZXQuU29ja2V0PjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgaXMgY29uc2lkZXJlZCBmYWlsZWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbCBmb3IgbmV3IGNvbm5lY3Rpb25zLiBBbGwgb3V0LW9mLXRyYW5zYWN0aW9uIHF1ZXJpZXMgYXJlIGV4ZWN1dGVkIHdpdGggdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAoZGVmYXVsdDogYFJFQURfQ09NTUlURURgKS5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBlbmNyeXB0aW9uIGlzIHVzZWQsIGFuIG9iamVjdCBtYXkgYmUgc3VwcGxpZWQgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB3aGVuIGNhbGxpbmcgW2B0bHMuY3JlYXRlU2VjdXJlUGFpcmBdKGh0dHA6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0L2FwaS90bHMuaHRtbCN0bHNfdGxzX2NyZWF0ZXNlY3VyZXBhaXJfY3JlZGVudGlhbHNfaXNzZXJ2ZXJfcmVxdWVzdGNlcnRfcmVqZWN0dW5hdXRob3JpemVkKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscz86IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSB0byBjb25uZWN0IHRvIChkZWZhdWx0OiBkZXBlbmRlbnQgb24gc2VydmVyIGNvbmZpZ3VyYXRpb24pLlxuICAgKi9cbiAgZGF0YWJhc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayB0byBhIG51bWJlciBmcm9tIDEgdGhyb3VnaCA3LlxuICAgKi9cbiAgZGF0ZWZpcnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgcG9zaXRpb24gb2YgbW9udGgsIGRheSBhbmQgeWVhciBpbiB0ZW1wb3JhbCBkYXRhdHlwZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbWR5YClcbiAgICovXG4gIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgZGVidWc/OiBEZWJ1Z09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgdGhlIHdheSBudWxsIHZhbHVlcyBzaG91bGQgYmUgdXNlZCBkdXJpbmcgY29tcGFyaXNvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGBTRVQgQU5TSV9OVUxMX0RGTFRfT04gT05gIHdpbGwgYmUgc2V0IGluIHRoZSBpbml0aWFsIHNxbC4gVGhpcyBtZWFucyBuZXcgY29sdW1ucyB3aWxsIGJlXG4gICAqIG51bGxhYmxlIGJ5IGRlZmF1bHQuIFNlZSB0aGUgW1QtU1FMIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODczNzUuYXNweClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIGlmIHBhZGRpbmcgc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHZhbHVlcyBzaG9ydGVyIHRoYW4gdGhlIHNpemUgb2YgZGVmaW5lZCBjb2x1bW4uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpUGFkZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIFNRTCBTZXJ2ZXIgd2lsbCBmb2xsb3cgSVNPIHN0YW5kYXJkIGJlaGF2aW9yIGR1cmluZyB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMuIEZvciBkZXRhaWxzLFxuICAgKiBzZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hbnNpLXdhcm5pbmdzLXRyYW5zYWN0LXNxbClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lXYXJuaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuZHMgYSBxdWVyeSB3aGVuIGFuIG92ZXJmbG93IG9yIGRpdmlkZS1ieS16ZXJvIGVycm9yIG9jY3VycyBkdXJpbmcgcXVlcnkgZXhlY3V0aW9uLlxuICAgKiBTZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hcml0aGFib3J0LXRyYW5zYWN0LXNxbD92aWV3PXNxbC1zZXJ2ZXItMjAxNylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFyaXRoQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGRldGVybWluZXMgaWYgY29uY2F0ZW5hdGlvbiB3aXRoIE5VTEwgc2hvdWxkIHJlc3VsdCBpbiBOVUxMIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSwgbW9yZSBkZXRhaWxzIGluXG4gICAqIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9zcWwvdC1zcWwvc3RhdGVtZW50cy9zZXQtY29uY2F0LW51bGwteWllbGRzLW51bGwtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIHdoZXRoZXIgY3Vyc29yIHNob3VsZCBiZSBjbG9zZWQsIGlmIHRoZSB0cmFuc2FjdGlvbiBvcGVuaW5nIGl0IGdldHMgY29tbWl0dGVkIG9yIHJvbGxlZFxuICAgKiBiYWNrLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdD86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHNldHMgdGhlIGNvbm5lY3Rpb24gdG8gZWl0aGVyIGltcGxpY2l0IG9yIGF1dG9jb21taXQgdHJhbnNhY3Rpb24gbW9kZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBlcnJvciBpcyBub3QgZ2VuZXJhdGVkIGR1cmluZyBsb3NzIG9mIHByZWNlc3Npb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjaGFyYWN0ZXJzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMgYW5kIHRob3NlIGVuY2xvc2VkIGRvdWJsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpZmllcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgdmFsdWUgdGhhdCBjYW4gYmUgb25seSBzZXQgdG8gJ3N0cmljdCcsIHdoaWNoIGluZGljYXRlcyB0aGUgdXNhZ2UgVERTIDguMCBwcm90b2NvbC4gT3RoZXJ3aXNlLFxuICAgKiBhIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlbmNyeXB0ZWQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmNyeXB0Pzogc3RyaW5nIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgaWYgdGhlIGRhdGFiYXNlIHJlcXVlc3RlZCBieSBbW2RhdGFiYXNlXV0gY2Fubm90IGJlIGFjY2Vzc2VkLFxuICAgKiB0aGUgY29ubmVjdGlvbiB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci4gSG93ZXZlciwgaWYgW1tmYWxsYmFja1RvRGVmYXVsdERiXV0gaXNcbiAgICogc2V0IHRvIGB0cnVlYCwgdGhlbiB0aGUgdXNlcidzIGRlZmF1bHQgZGF0YWJhc2Ugd2lsbCBiZSB1c2VkIGluc3RlYWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBmYWxsYmFja1RvRGVmYXVsdERiPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG5hbWUgdG8gY29ubmVjdCB0by5cbiAgICogVGhlIFNRTCBTZXJ2ZXIgQnJvd3NlciBzZXJ2aWNlIG11c3QgYmUgcnVubmluZyBvbiB0aGUgZGF0YWJhc2Ugc2VydmVyLFxuICAgKiBhbmQgVURQIHBvcnQgMTQzNCBvbiB0aGUgZGF0YWJhc2Ugc2VydmVyIG11c3QgYmUgcmVhY2hhYmxlLlxuICAgKlxuICAgKiAobm8gZGVmYXVsdClcbiAgICpcbiAgICogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggW1twb3J0XV0uXG4gICAqL1xuICBpbnN0YW5jZU5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbCB0aGF0IHRyYW5zYWN0aW9ucyB3aWxsIGJlIHJ1biB3aXRoLlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAoZGVmYXVsdDogYFJFQURfQ09NTUlURURgKS5cbiAgICovXG4gIGlzb2xhdGlvbkxldmVsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGxhbmd1YWdlIGVudmlyb25tZW50IGZvciB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gbGFuZ3VhZ2UgZGV0ZXJtaW5lcyB0aGUgZGF0ZXRpbWUgZm9ybWF0cyBhbmQgc3lzdGVtIG1lc3NhZ2VzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYHVzX2VuZ2xpc2hgKS5cbiAgICovXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHdoaWNoIG5ldHdvcmsgaW50ZXJmYWNlIChpcCBhZGRyZXNzKSB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIFNRTCBTZXJ2ZXIuXG4gICAqL1xuICBsb2NhbEFkZHJlc3M/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhcnNlIHVuaXF1ZSBpZGVudGlmaWVyIHR5cGUgd2l0aCBsb3dlcmNhc2UgY2FzZSBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBsb3dlckNhc2VHdWlkcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9uIHJldHJpZXMgZm9yIHRyYW5zaWVudCBlcnJvcnMu44CBXG4gICAqXG4gICAqIChkZWZhdWx0OiBgM2ApLlxuICAgKi9cbiAgbWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBNdWx0aVN1Ym5ldEZhaWxvdmVyID0gVHJ1ZSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBoZWxwIG1pbmltaXplIHRoZSBjbGllbnQgcmVjb3ZlcnkgbGF0ZW5jeSB3aGVuIGZhaWxvdmVycyBvY2N1ci5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgbXVsdGlTdWJuZXRGYWlsb3Zlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIFREUyBwYWNrZXRzIChzdWJqZWN0IHRvIG5lZ290aWF0aW9uIHdpdGggdGhlIHNlcnZlcikuXG4gICAqIFNob3VsZCBiZSBhIHBvd2VyIG9mIDIuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgNDA5NmApLlxuICAgKi9cbiAgcGFja2V0U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogUG9ydCB0byBjb25uZWN0IHRvIChkZWZhdWx0OiBgMTQzM2ApLlxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBbW2luc3RhbmNlTmFtZV1dXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gd2lsbCByZXF1ZXN0IHJlYWQgb25seSBhY2Nlc3MgZnJvbSBhIFNRTCBTZXJ2ZXIgQXZhaWxhYmlsaXR5XG4gICAqIEdyb3VwLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtoZXJlXShodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGg3MTAwNTQuYXNweCBcIk1pY3Jvc29mdDogQ29uZmlndXJlIFJlYWQtT25seSBSb3V0aW5nIGZvciBhbiBBdmFpbGFiaWxpdHkgR3JvdXAgKFNRTCBTZXJ2ZXIpXCIpXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIHJlYWRPbmx5SW50ZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIGZhaWxlZCwgb3IgYDBgIGZvciBubyB0aW1lb3V0LlxuICAgKlxuICAgKiBBcyBzb29uIGFzIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIHRoZSB0aW1lb3V0IGlzIGNsZWFyZWQuIFRoaXMgbWVhbnMgdGhhdCBxdWVyaWVzIHRoYXQgaW1tZWRpYXRlbHkgcmV0dXJuIGEgcmVzcG9uc2UgaGF2ZSBhYmlsaXR5IHRvIHJ1biBsb25nZXIgdGhhbiB0aGlzIHRpbWVvdXQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgMTUwMDBgKS5cbiAgICovXG4gIHJlcXVlc3RUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHRoYXQgd2hlbiB0cnVlIHdpbGwgZXhwb3NlIHJlY2VpdmVkIHJvd3MgaW4gUmVxdWVzdHMgZG9uZSByZWxhdGVkIGV2ZW50czpcbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZUluUHJvY11dXG4gICAqICogW1tSZXF1ZXN0LkV2ZW50X2RvbmVQcm9jXV1cbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZV1dXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKlxuICAgKiBDYXV0aW9uOiBJZiBtYW55IHJvdyBhcmUgcmVjZWl2ZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIGNvdWxkIHJlc3VsdCBpblxuICAgKiBleGNlc3NpdmUgbWVtb3J5IHVzYWdlLlxuICAgKi9cbiAgcm93Q29sbGVjdGlvbk9uRG9uZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgdGhhdCB3aGVuIHRydWUgd2lsbCBleHBvc2UgcmVjZWl2ZWQgcm93cyBpbiBSZXF1ZXN0cycgY29tcGxldGlvbiBjYWxsYmFjay5TZWUgW1tSZXF1ZXN0LmNvbnN0cnVjdG9yXV0uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKlxuICAgKiBDYXV0aW9uOiBJZiBtYW55IHJvdyBhcmUgcmVjZWl2ZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIGNvdWxkIHJlc3VsdCBpblxuICAgKiBleGNlc3NpdmUgbWVtb3J5IHVzYWdlLlxuICAgKi9cbiAgcm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBURFMgdG8gdXNlLiBJZiBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHNwZWNpZmllZCB2ZXJzaW9uLCBuZWdvdGlhdGVkIHZlcnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICAgKlxuICAgKiBUaGUgdmVyc2lvbnMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuVERTX1ZFUlNJT05gLlxuICAgKiAqIGA3XzFgXG4gICAqICogYDdfMmBcbiAgICogKiBgN18zX0FgXG4gICAqICogYDdfM19CYFxuICAgKiAqIGA3XzRgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgN180YClcbiAgICovXG4gIHRkc1ZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB2YXJjaGFyKG1heCksIG52YXJjaGFyKG1heCksIHZhcmJpbmFyeShtYXgpLCB0ZXh0LCBudGV4dCwgYW5kIGltYWdlIGRhdGEgcmV0dXJuZWQgYnkgYSBTRUxFQ1Qgc3RhdGVtZW50LlxuICAgKlxuICAgKiAoZGVmYXVsdDogYDIxNDc0ODM2NDdgKVxuICAgKi9cbiAgdGV4dHNpemU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIFwidHJ1ZVwiLCB0aGUgU1FMIFNlcnZlciBTU0wgY2VydGlmaWNhdGUgaXMgYXV0b21hdGljYWxseSB0cnVzdGVkIHdoZW4gdGhlIGNvbW11bmljYXRpb24gbGF5ZXIgaXMgZW5jcnlwdGVkIHVzaW5nIFNTTC5cbiAgICpcbiAgICogSWYgXCJmYWxzZVwiLCB0aGUgU1FMIFNlcnZlciB2YWxpZGF0ZXMgdGhlIHNlcnZlciBTU0wgY2VydGlmaWNhdGUuIElmIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiBmYWlscyxcbiAgICogdGhlIGRyaXZlciByYWlzZXMgYW4gZXJyb3IgYW5kIHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24uIE1ha2Ugc3VyZSB0aGUgdmFsdWUgcGFzc2VkIHRvIHNlcnZlck5hbWUgZXhhY3RseVxuICAgKiBtYXRjaGVzIHRoZSBDb21tb24gTmFtZSAoQ04pIG9yIEROUyBuYW1lIGluIHRoZSBTdWJqZWN0IEFsdGVybmF0ZSBOYW1lIGluIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZm9yIGFuIFNTTCBjb25uZWN0aW9uIHRvIHN1Y2NlZWQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICB0cnVzdFNlcnZlckNlcnRpZmljYXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICpcbiAgICovXG4gIHNlcnZlck5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByZXR1cm4gcm93cyBhcyBhcnJheXMgb3Iga2V5LXZhbHVlIGNvbGxlY3Rpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICB1c2VDb2x1bW5OYW1lcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhc3MgdGltZSB2YWx1ZXMgaW4gVVRDIG9yIGxvY2FsIHRpbWUuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApLlxuICAgKi9cbiAgdXNlVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHdvcmtzdGF0aW9uIElEIChXU0lEKSBvZiB0aGUgY2xpZW50LCBkZWZhdWx0IG9zLmhvc3RuYW1lKCkuXG4gICAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgY2xpZW50IGluIHByb2ZpbGluZywgbG9nZ2luZyBvclxuICAgKiB0cmFjaW5nIGNsaWVudCBhY3Rpdml0eSBpbiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXBvcnRlZCBieSB0aGUgVFNRTCBmdW5jdGlvbiBIT1NUX05BTUUoKS5cbiAgICovXG4gIHdvcmtzdGF0aW9uSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgQ0xFQU5VUF9UWVBFID0ge1xuICBOT1JNQUw6IDAsXG4gIFJFRElSRUNUOiAxLFxuICBSRVRSWTogMlxufTtcblxuaW50ZXJmYWNlIFJvdXRpbmdEYXRhIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFtbQ29ubmVjdGlvbl1dIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaW5nbGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHNlcnZlci5cbiAqXG4gKiBgYGBqc1xuICogdmFyIENvbm5lY3Rpb24gPSByZXF1aXJlKCd0ZWRpb3VzJykuQ29ubmVjdGlvbjtcbiAqIHZhciBjb25maWcgPSB7XG4gKiAgXCJhdXRoZW50aWNhdGlvblwiOiB7XG4gKiAgICAuLi4sXG4gKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAqICB9LFxuICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICogfTtcbiAqIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAqIGBgYFxuICpcbiAqIE9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24uIE9uY2UgYSBbW1JlcXVlc3RdXVxuICogaGFzIGJlZW4gaW5pdGlhdGVkICh3aXRoIFtbQ29ubmVjdGlvbi5jYWxsUHJvY2VkdXJlXV0sIFtbQ29ubmVjdGlvbi5leGVjU3FsXV0sXG4gKiBvciBbW0Nvbm5lY3Rpb24uZXhlY1NxbEJhdGNoXV0pLCBhbm90aGVyIHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoZVxuICogW1tSZXF1ZXN0XV0ncyBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBmZWRBdXRoUmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjb25maWc6IEludGVybmFsQ29ubmVjdGlvbkNvbmZpZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHNlY3VyZUNvbnRleHRPcHRpb25zOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGluVHJhbnNhY3Rpb246IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzOiBCdWZmZXJbXTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHRyYW5zYWN0aW9uRGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGlzU3FsQmF0Y2g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjdXJUcmFuc2llbnRSZXRyeUNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSB0cmFuc2llbnRFcnJvckxvb2t1cDogVHJhbnNpZW50RXJyb3JMb29rdXA7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjbG9zZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBsb2dpbkVycm9yOiB1bmRlZmluZWQgfCBBZ2dyZWdhdGVFcnJvciB8IENvbm5lY3Rpb25FcnJvcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGRlYnVnOiBEZWJ1ZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIG50bG1wYWNrZXQ6IHVuZGVmaW5lZCB8IGFueTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIG50bG1wYWNrZXRCdWZmZXI6IHVuZGVmaW5lZCB8IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgU1RBVEU6IHtcbiAgICBJTklUSUFMSVpFRDogU3RhdGU7XG4gICAgQ09OTkVDVElORzogU3RhdGU7XG4gICAgU0VOVF9QUkVMT0dJTjogU3RhdGU7XG4gICAgUkVST1VUSU5HOiBTdGF0ZTtcbiAgICBUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWTogU3RhdGU7XG4gICAgU0VOVF9UTFNTU0xORUdPVElBVElPTjogU3RhdGU7XG4gICAgU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTjogU3RhdGU7XG4gICAgU0VOVF9MT0dJTjdfV0lUSF9OVExNOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX0ZFREFVVEg6IFN0YXRlO1xuICAgIExPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMOiBTdGF0ZTtcbiAgICBMT0dHRURfSU46IFN0YXRlO1xuICAgIFNFTlRfQ0xJRU5UX1JFUVVFU1Q6IFN0YXRlO1xuICAgIFNFTlRfQVRURU5USU9OOiBTdGF0ZTtcbiAgICBGSU5BTDogU3RhdGU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHJvdXRpbmdEYXRhOiB1bmRlZmluZWQgfCBSb3V0aW5nRGF0YTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgbWVzc2FnZUlvOiBNZXNzYWdlSU87XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBzdGF0ZTogU3RhdGU7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0OiB1bmRlZmluZWQgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZXF1ZXN0OiB1bmRlZmluZWQgfCBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBwcm9jUmV0dXJuU3RhdHVzVmFsdWU6IHVuZGVmaW5lZCB8IGFueTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHNvY2tldDogdW5kZWZpbmVkIHwgbmV0LlNvY2tldDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIG1lc3NhZ2VCdWZmZXI6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgY29ubmVjdFRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGNhbmNlbFRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHJlcXVlc3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZXRyeVRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jYW5jZWxBZnRlclJlcXVlc3RTZW50OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBkYXRhYmFzZUNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBOb3RlOiBiZSBhd2FyZSBvZiB0aGUgZGlmZmVyZW50IG9wdGlvbnMgZmllbGQ6XG4gICAqIDEuIGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zXG4gICAqIDIuIGNvbmZpZy5vcHRpb25zXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHsgQ29ubmVjdGlvbiB9ID0gcmVxdWlyZSgndGVkaW91cycpO1xuICAgKlxuICAgKiBjb25zdCBjb25maWcgPSB7XG4gICAqICBcImF1dGhlbnRpY2F0aW9uXCI6IHtcbiAgICogICAgLi4uLFxuICAgKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAgICogIH0sXG4gICAqICBcIm9wdGlvbnNcIjogey4uLn1cbiAgICogfTtcbiAgICpcbiAgICogY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKGNvbmZpZyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbm5lY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JyB8fCBjb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZ1wiIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnNlcnZlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5zZXJ2ZXJcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uOiBJbnRlcm5hbENvbm5lY3Rpb25Db25maWdbJ2F1dGhlbnRpY2F0aW9uJ107XG4gICAgaWYgKGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gJ29iamVjdCcgfHwgY29uZmlnLmF1dGhlbnRpY2F0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBjb25maWcuYXV0aGVudGljYXRpb24udHlwZTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucyA9PT0gdW5kZWZpbmVkID8ge30gOiBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucztcblxuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24udHlwZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlICE9PSAnZGVmYXVsdCcgJiYgdHlwZSAhPT0gJ250bG0nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IG9uZSBvZiBcImRlZmF1bHRcIiwgXCJudGxtXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZFwiLCBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0XCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1cIiBvciBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlXCIgb3IgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldFwiLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnIHx8IG9wdGlvbnMgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ250bG0nKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kb21haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnbnRsbScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4gJiYgb3B0aW9ucy5kb21haW4udG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy50ZW5hbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRva2VuXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdG9rZW46IG9wdGlvbnMudG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0Jykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRTZWNyZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50U2VjcmV0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50ZW5hbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50U2VjcmV0OiBvcHRpb25zLmNsaWVudFNlY3JldCxcbiAgICAgICAgICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlck5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy51c2VyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdXNlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzZXJ2ZXI6IGNvbmZpZy5zZXJ2ZXIsXG4gICAgICBhdXRoZW50aWNhdGlvbjogYXV0aGVudGljYXRpb24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBmYWxzZSxcbiAgICAgICAgYXBwTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBjYW1lbENhc2VDb2x1bW5zOiBmYWxzZSxcbiAgICAgICAgY2FuY2VsVGltZW91dDogREVGQVVMVF9DQU5DRUxfVElNRU9VVCxcbiAgICAgICAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiAyICogNjAgKiA2MCAqIDEwMDAsICAvLyBVbml0czogbWlsbGlzZWNvbmRzXG4gICAgICAgIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBmYWxzZSxcbiAgICAgICAgY29sdW1uTmFtZVJlcGxhY2VyOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwsXG4gICAgICAgIGNvbm5lY3RUaW1lb3V0OiBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCxcbiAgICAgICAgY29ubmVjdG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogSVNPTEFUSU9OX0xFVkVMLlJFQURfQ09NTUlUVEVELFxuICAgICAgICBjcnlwdG9DcmVkZW50aWFsc0RldGFpbHM6IHt9LFxuICAgICAgICBkYXRhYmFzZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRlZmlyc3Q6IERFRkFVTFRfREFURUZJUlNULFxuICAgICAgICBkYXRlRm9ybWF0OiBERUZBVUxUX0RBVEVGT1JNQVQsXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgZGF0YTogZmFsc2UsXG4gICAgICAgICAgcGFja2V0OiBmYWxzZSxcbiAgICAgICAgICBwYXlsb2FkOiBmYWxzZSxcbiAgICAgICAgICB0b2tlbjogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgZW5hYmxlQW5zaU51bGw6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaVBhZGRpbmc6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lXYXJuaW5nczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXJpdGhBYm9ydDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw6IHRydWUsXG4gICAgICAgIGVuYWJsZUN1cnNvckNsb3NlT25Db21taXQ6IG51bGwsXG4gICAgICAgIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IGZhbHNlLFxuICAgICAgICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiB0cnVlLFxuICAgICAgICBlbmNyeXB0OiB0cnVlLFxuICAgICAgICBmYWxsYmFja1RvRGVmYXVsdERiOiBmYWxzZSxcbiAgICAgICAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIGluc3RhbmNlTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBpc29sYXRpb25MZXZlbDogSVNPTEFUSU9OX0xFVkVMLlJFQURfQ09NTUlUVEVELFxuICAgICAgICBsYW5ndWFnZTogREVGQVVMVF9MQU5HVUFHRSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFJldHJpZXNPblRyYW5zaWVudEVycm9yczogMyxcbiAgICAgICAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogZmFsc2UsXG4gICAgICAgIHBhY2tldFNpemU6IERFRkFVTFRfUEFDS0VUX1NJWkUsXG4gICAgICAgIHBvcnQ6IERFRkFVTFRfUE9SVCxcbiAgICAgICAgcmVhZE9ubHlJbnRlbnQ6IGZhbHNlLFxuICAgICAgICByZXF1ZXN0VGltZW91dDogREVGQVVMVF9DTElFTlRfUkVRVUVTVF9USU1FT1VULFxuICAgICAgICByb3dDb2xsZWN0aW9uT25Eb25lOiBmYWxzZSxcbiAgICAgICAgcm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb246IGZhbHNlLFxuICAgICAgICBzZXJ2ZXJOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbjogZmFsc2UsXG4gICAgICAgIHRkc1ZlcnNpb246IERFRkFVTFRfVERTX1ZFUlNJT04sXG4gICAgICAgIHRleHRzaXplOiBERUZBVUxUX1RFWFRTSVpFLFxuICAgICAgICB0cnVzdGVkU2VydmVyTmFtZUFFOiB1bmRlZmluZWQsXG4gICAgICAgIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGZhbHNlLFxuICAgICAgICB1c2VDb2x1bW5OYW1lczogZmFsc2UsXG4gICAgICAgIHVzZVVUQzogdHJ1ZSxcbiAgICAgICAgd29ya3N0YXRpb25JZDogdW5kZWZpbmVkLFxuICAgICAgICBsb3dlckNhc2VHdWlkczogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGNvbmZpZy5vcHRpb25zKSB7XG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCAmJiBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0IGFuZCBpbnN0YW5jZU5hbWUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgYnV0ICcgKyBjb25maWcub3B0aW9ucy5wb3J0ICsgJyBhbmQgJyArIGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSArICcgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3JcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yID0gY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmFwcE5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5hcHBOYW1lID0gY29uZmlnLm9wdGlvbnMuYXBwTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucyA9IGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciA9IGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsLCAnY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwgPSBjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0b3JcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RvciA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3RvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPSBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRhYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0YWJhc2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZSA9IGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09ICdudW1iZXInICYmIGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSBudWxsICYmIChjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPCAxIHx8IGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCA+IDcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgPj0gMSBhbmQgPD0gNycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPSBjb25maWcub3B0aW9ucy5kYXRlZmlyc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSAnc3RyaW5nJyAmJiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGFcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZ1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5nc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPSBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllcjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5jcnlwdCAhPT0gJ3N0cmljdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVuY3J5cHRcIiBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBcInN0cmljdFwiLCBvciBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0ID0gY29uZmlnLm9wdGlvbnMuZW5jcnlwdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGIgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiA9IGNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgPSBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWU7XG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbChjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCwgJ2NvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCA9IGNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSAnc3RyaW5nJyAmJiBjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmxhbmd1YWdlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZSA9IGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzID0gY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlclwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyID0gY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUgPSBjb25maWcub3B0aW9ucy5wYWNrZXRTaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucG9ydCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5wb3J0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5wb3J0IDw9IDAgfHwgY29uZmlnLm9wdGlvbnMucG9ydCA+PSA2NTUzNikge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5wb3J0XCIgcHJvcGVydHkgbXVzdCBiZSA+IDAgYW5kIDwgNjU1MzYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCA9IGNvbmZpZy5vcHRpb25zLnBvcnQ7XG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCA9IGNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQgPSBjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9yc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9yc1wiIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIDAuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyA9IGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsXCIgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgPSBjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSA9IGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uID0gY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb25cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uID0gY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gJ251bWJlcicgJiYgY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZXh0c2l6ZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSA+IDIxNDc0ODM2NDcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZXh0c2l6ZVwiIGNhblxcJ3QgYmUgZ3JlYXRlciB0aGFuIDIxNDc0ODM2NDcuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPCAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgY2FuXFwndCBiZSBzbWFsbGVyIHRoYW4gLTEuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplID0gY29uZmlnLm9wdGlvbnMudGV4dHNpemUgfCAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlID0gY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnNlcnZlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnNlcnZlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5zZXJ2ZXJOYW1lID0gY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgPSBjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnVzZVVUQyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudXNlVVRDICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy51c2VVVENcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudXNlVVRDID0gY29uZmlnLm9wdGlvbnMudXNlVVRDO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCA9IGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzID0gY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucyA9IHRoaXMuY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzO1xuICAgIGlmICh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zLnNlY3VyZU9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgdGhlIGNhbGxlciBoYXMgbm90IHNwZWNpZmllZCB0aGVpciBvd24gYHNlY3VyZU9wdGlvbnNgLFxuICAgICAgLy8gd2Ugc2V0IGBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTYCBoZXJlLlxuICAgICAgLy8gT2xkZXIgU1FMIFNlcnZlciBpbnN0YW5jZXMgcnVubmluZyBvbiBvbGRlciBXaW5kb3dzIHZlcnNpb25zIGhhdmVcbiAgICAgIC8vIHRyb3VibGUgd2l0aCB0aGUgQkVBU1Qgd29ya2Fyb3VuZCBpbiBPcGVuU1NMLlxuICAgICAgLy8gQXMgQkVBU1QgaXMgYSBicm93c2VyIHNwZWNpZmljIGV4cGxvaXQsIHdlIGNhbiBqdXN0IGRpc2FibGUgdGhpcyBvcHRpb24gaGVyZS5cbiAgICAgIHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMsIHtcbiAgICAgICAgc2VjdXJlT3B0aW9uczoge1xuICAgICAgICAgIHZhbHVlOiBjb25zdGFudHMuU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UU1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnID0gdGhpcy5jcmVhdGVEZWJ1ZygpO1xuICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMudHJhbnNhY3Rpb25EZXNjcmlwdG9ycyA9IFtCdWZmZXIuZnJvbShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pXTtcblxuICAgIC8vICdiZWdpblRyYW5zYWN0aW9uJywgJ2NvbW1pdFRyYW5zYWN0aW9uJyBhbmQgJ3JvbGxiYWNrVHJhbnNhY3Rpb24nXG4gICAgLy8gZXZlbnRzIGFyZSB1dGlsaXplZCB0byBtYWludGFpbiBpblRyYW5zYWN0aW9uIHByb3BlcnR5IHN0YXRlIHdoaWNoIGluXG4gICAgLy8gdHVybiBpcyB1c2VkIGluIG1hbmFnaW5nIHRyYW5zYWN0aW9ucy4gVGhlc2UgZXZlbnRzIGFyZSBvbmx5IGZpcmVkIGZvclxuICAgIC8vIFREUyB2ZXJzaW9uIDcuMiBhbmQgYmV5b25kLiBUaGUgcHJvcGVydGllcyBiZWxvdyBhcmUgdXNlZCB0byBlbXVsYXRlXG4gICAgLy8gZXF1aXZhbGVudCBiZWhhdmlvciBmb3IgVERTIHZlcnNpb25zIGJlZm9yZSA3LjIuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoID0gMDtcbiAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZUJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcblxuICAgIHRoaXMuY3VyVHJhbnNpZW50UmV0cnlDb3VudCA9IDA7XG4gICAgdGhpcy50cmFuc2llbnRFcnJvckxvb2t1cCA9IG5ldyBUcmFuc2llbnRFcnJvckxvb2t1cCgpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuU1RBVEUuSU5JVElBTElaRUQ7XG5cbiAgICB0aGlzLl9jYW5jZWxBZnRlclJlcXVlc3RTZW50ID0gKCkgPT4ge1xuICAgICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5BVFRFTlRJT04pO1xuICAgICAgdGhpcy5jcmVhdGVDYW5jZWxUaW1lcigpO1xuICAgIH07XG4gIH1cblxuICBjb25uZWN0KGNvbm5lY3RMaXN0ZW5lcj86IChlcnI/OiBFcnJvcikgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSB0aGlzLlNUQVRFLklOSVRJQUxJWkVEKSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdgLmNvbm5lY3RgIGNhbiBub3QgYmUgY2FsbGVkIG9uIGEgQ29ubmVjdGlvbiBpbiBgJyArIHRoaXMuc3RhdGUubmFtZSArICdgIHN0YXRlLicpO1xuICAgIH1cblxuICAgIGlmIChjb25uZWN0TGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IG9uQ29ubmVjdCA9IChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBjb25uZWN0TGlzdGVuZXIoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgICAgY29ubmVjdExpc3RlbmVyKGVycik7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgdGhpcy5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgY2hhcnNldCBoYXMgY2hhbmdlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnY2hhcnNldENoYW5nZScsIGxpc3RlbmVyOiAoY2hhcnNldDogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCB0byBjb25uZWN0IGFuZCB2YWxpZGF0ZSBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgb24oXG4gICAgZXZlbnQ6ICdjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZXJyIElmIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQsIHdpbGwgYmUgZmFsc2V5LiBJZiB0aGVyZSB3YXMgYVxuICAgICAqICAgcHJvYmxlbSAod2l0aCBlaXRoZXIgY29ubmVjdGluZyBvciB2YWxpZGF0aW9uKSwgd2lsbCBiZSBhbiBbW0Vycm9yXV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGxpc3RlbmVyOiAoZXJyOiBFcnJvciB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGFjdGl2ZSBkYXRhYmFzZSBoYXMgY2hhbmdlZC5cbiAgICogVGhpcyBtYXkgYmUgYXMgYSByZXN1bHQgb2YgYSBzdWNjZXNzZnVsIGxvZ2luLCBvciBhIGB1c2VgIHN0YXRlbWVudC5cbiAgICovXG4gIG9uKGV2ZW50OiAnZGF0YWJhc2VDaGFuZ2UnLCBsaXN0ZW5lcjogKGRhdGFiYXNlTmFtZTogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBBIGRlYnVnIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiBJdCBtYXkgYmUgbG9nZ2VkIG9yIGlnbm9yZWQuXG4gICAqL1xuICBvbihldmVudDogJ2RlYnVnJywgbGlzdGVuZXI6IChtZXNzYWdlVGV4dDogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBlcnJvciBvY2N1cnMuXG4gICAqL1xuICBvbihldmVudDogJ2Vycm9yJywgbGlzdGVuZXI6IChlcnI6IEVycm9yKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyBpc3N1ZWQgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIG9uKGV2ZW50OiAnZXJyb3JNZXNzYWdlJywgbGlzdGVuZXI6IChtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5FcnJvck1lc3NhZ2VUb2tlbikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gaGFzIGVuZGVkLlxuICAgKlxuICAgKiBUaGlzIG1heSBiZSBhcyBhIHJlc3VsdCBvZiB0aGUgY2xpZW50IGNhbGxpbmcgW1tjbG9zZV1dLCB0aGUgc2VydmVyXG4gICAqIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIG9yIGEgbmV0d29yayBlcnJvci5cbiAgICovXG4gIG9uKGV2ZW50OiAnZW5kJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIGlzc3VlZCBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdpbmZvTWVzc2FnZScsIGxpc3RlbmVyOiAobWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuSW5mb01lc3NhZ2VUb2tlbikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBvbihldmVudDogJ2xhbmd1YWdlQ2hhbmdlJywgbGlzdGVuZXI6IChsYW5ndWFnZU5hbWU6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gd2FzIHJlc2V0LlxuICAgKi9cbiAgb24oZXZlbnQ6ICdyZXNldENvbm5lY3Rpb24nLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogQSBzZWN1cmUgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnc2VjdXJlJywgbGlzdGVuZXI6IChjbGVhcnRleHQ6IGltcG9ydCgndGxzJykuVExTU29ja2V0KSA9PiB2b2lkKTogdGhpc1xuXG4gIG9uKGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICByZXR1cm4gc3VwZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2NoYXJzZXRDaGFuZ2UnLCBjaGFyc2V0OiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Nvbm5lY3QnLCBlcnJvcj86IEVycm9yKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdkYXRhYmFzZUNoYW5nZScsIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdkZWJ1ZycsIG1lc3NhZ2VUZXh0OiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Vycm9yJywgZXJyb3I6IEVycm9yKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlcnJvck1lc3NhZ2UnLCBtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5FcnJvck1lc3NhZ2VUb2tlbik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZW5kJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnaW5mb01lc3NhZ2UnLCBtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5JbmZvTWVzc2FnZVRva2VuKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdsYW5ndWFnZUNoYW5nZScsIGxhbmd1YWdlTmFtZTogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdzZWN1cmUnLCBjbGVhcnRleHQ6IGltcG9ydCgndGxzJykuVExTU29ja2V0KTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXJvdXRpbmcnKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXNldENvbm5lY3Rpb24nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXRyeScpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTogYm9vbGVhblxuXG4gIGVtaXQoZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gc3VwZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogVGhlIFtbRXZlbnRfZW5kXV0gd2lsbCBiZSBlbWl0dGVkIG9uY2UgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRpYWxpc2VDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY3JlYXRlQ29ubmVjdFRpbWVyKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5wb3J0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0T25Qb3J0KHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCwgdGhpcy5jb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyLCBzaWduYWwsIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGluc3RhbmNlTG9va3VwKHtcbiAgICAgICAgc2VydmVyOiB0aGlzLmNvbmZpZy5zZXJ2ZXIsXG4gICAgICAgIGluc3RhbmNlTmFtZTogdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUhLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0LFxuICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgfSkudGhlbigocG9ydCkgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3RPblBvcnQocG9ydCwgdGhpcy5jb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyLCBzaWduYWwsIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcblxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGhlIEFib3J0RXJyb3IgZm9yIG5vdywgdGhpcyBpcyBzdGlsbCBoYW5kbGVkIGJ5IHRoZSBjb25uZWN0VGltZXIgZmlyaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihlcnIubWVzc2FnZSwgJ0VJTlNUTE9PS1VQJykpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW51cENvbm5lY3Rpb24oY2xlYW51cFR5cGU6IHR5cGVvZiBDTEVBTlVQX1RZUEVba2V5b2YgdHlwZW9mIENMRUFOVVBfVFlQRV0pIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsZWFyQ29ubmVjdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgIGlmIChjbGVhbnVwVHlwZSA9PT0gQ0xFQU5VUF9UWVBFLlJFRElSRUNUKSB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVyb3V0aW5nJyk7XG4gICAgICB9IGVsc2UgaWYgKGNsZWFudXBUeXBlICE9PSBDTEVBTlVQX1RZUEUuUkVUUlkpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3Q7XG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgUmVxdWVzdEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVxdWVzdCBjb21wbGV0ZWQuJywgJ0VDTE9TRScpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgdGhpcy5sb2dpbkVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRGVidWcoKSB7XG4gICAgY29uc3QgZGVidWcgPSBuZXcgRGVidWcodGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zyk7XG4gICAgZGVidWcub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2U6IE1lc3NhZ2UsIGhhbmRsZXI6IFRva2VuSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgdGhpcy5kZWJ1ZywgaGFuZGxlciwgdGhpcy5jb25maWcub3B0aW9ucyk7XG4gIH1cblxuICBzb2NrZXRIYW5kbGluZ0ZvclNlbmRQcmVMb2dpbihzb2NrZXQ6IG5ldC5Tb2NrZXQpIHtcbiAgICBzb2NrZXQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7IHRoaXMuc29ja2V0RXJyb3IoZXJyb3IpOyB9KTtcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4geyB0aGlzLnNvY2tldENsb3NlKCk7IH0pO1xuICAgIHNvY2tldC5vbignZW5kJywgKCkgPT4geyB0aGlzLnNvY2tldEVuZCgpOyB9KTtcbiAgICBzb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUsIEtFRVBfQUxJVkVfSU5JVElBTF9ERUxBWSk7XG5cbiAgICB0aGlzLm1lc3NhZ2VJbyA9IG5ldyBNZXNzYWdlSU8oc29ja2V0LCB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUsIHRoaXMuZGVidWcpO1xuICAgIHRoaXMubWVzc2FnZUlvLm9uKCdzZWN1cmUnLCAoY2xlYXJ0ZXh0KSA9PiB7IHRoaXMuZW1pdCgnc2VjdXJlJywgY2xlYXJ0ZXh0KTsgfSk7XG5cbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ2Nvbm5lY3RlZCB0byAnICsgdGhpcy5jb25maWcuc2VydmVyICsgJzonICsgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0KTtcblxuICAgIHRoaXMuc2VuZFByZUxvZ2luKCk7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1BSRUxPR0lOKTtcbiAgfVxuXG4gIHdyYXBXaXRoVGxzKHNvY2tldDogbmV0LlNvY2tldCwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dGxzLlRMU1NvY2tldD4ge1xuICAgIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlY3VyZUNvbnRleHQgPSB0bHMuY3JlYXRlU2VjdXJlQ29udGV4dCh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zKTtcbiAgICAgIC8vIElmIGNvbm5lY3QgdG8gYW4gaXAgYWRkcmVzcyBkaXJlY3RseSxcbiAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBzZXJ2ZXJuYW1lIHRvIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIG5vdCBnaXZlbiBhIHNlcnZlcm5hbWUgZXhwbGljaXRseVxuICAgICAgY29uc3Qgc2VydmVyTmFtZSA9ICFuZXQuaXNJUCh0aGlzLmNvbmZpZy5zZXJ2ZXIpID8gdGhpcy5jb25maWcuc2VydmVyIDogJyc7XG4gICAgICBjb25zdCBlbmNyeXB0T3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdDogdGhpcy5jb25maWcuc2VydmVyLFxuICAgICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgICAgQUxQTlByb3RvY29sczogWyd0ZHMvOC4wJ10sXG4gICAgICAgIHNlY3VyZUNvbnRleHQ6IHNlY3VyZUNvbnRleHQsXG4gICAgICAgIHNlcnZlcm5hbWU6IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA/IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA6IHNlcnZlck5hbWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNyeXB0c29ja2V0ID0gdGxzLmNvbm5lY3QoZW5jcnlwdE9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICBlbmNyeXB0c29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBlbmNyeXB0c29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgICBlbmNyeXB0c29ja2V0LmRlc3Ryb3koKTtcblxuICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgICAgZW5jcnlwdHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgZW5jcnlwdHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG5cbiAgICAgICAgZW5jcnlwdHNvY2tldC5kZXN0cm95KCk7XG5cbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkNvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuXG4gICAgICAgIGVuY3J5cHRzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIGVuY3J5cHRzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuXG4gICAgICAgIHJlc29sdmUoZW5jcnlwdHNvY2tldCk7XG4gICAgICB9O1xuXG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAgIGVuY3J5cHRzb2NrZXQub24oJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICBlbmNyeXB0c29ja2V0Lm9uKCdzZWN1cmVDb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbm5lY3RPblBvcnQocG9ydDogbnVtYmVyLCBtdWx0aVN1Ym5ldEZhaWxvdmVyOiBib29sZWFuLCBzaWduYWw6IEFib3J0U2lnbmFsLCBjdXN0b21Db25uZWN0b3I/OiAoKSA9PiBQcm9taXNlPG5ldC5Tb2NrZXQ+KSB7XG4gICAgY29uc3QgY29ubmVjdE9wdHMgPSB7XG4gICAgICBob3N0OiB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXIsXG4gICAgICBwb3J0OiB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5wb3J0IDogcG9ydCxcbiAgICAgIGxvY2FsQWRkcmVzczogdGhpcy5jb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3NcbiAgICB9O1xuXG4gICAgY29uc3QgY29ubmVjdCA9IGN1c3RvbUNvbm5lY3RvciB8fCAobXVsdGlTdWJuZXRGYWlsb3ZlciA/IGNvbm5lY3RJblBhcmFsbGVsIDogY29ubmVjdEluU2VxdWVuY2UpO1xuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzb2NrZXQgPSBhd2FpdCBjb25uZWN0KGNvbm5lY3RPcHRzLCBkbnMubG9va3VwLCBzaWduYWwpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0ID09PSAnc3RyaWN0Jykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFdyYXAgdGhlIHNvY2tldCB3aXRoIFRMUyBmb3IgVERTIDguMFxuICAgICAgICAgIHNvY2tldCA9IGF3YWl0IHRoaXMud3JhcFdpdGhUbHMoc29ja2V0LCBzaWduYWwpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzb2NrZXQuZW5kKCk7XG5cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXRIYW5kbGluZ0ZvclNlbmRQcmVMb2dpbihzb2NrZXQpO1xuICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy5jbGVhckNvbm5lY3RUaW1lcigpO1xuXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHsgdGhpcy5zb2NrZXRFcnJvcihlcnIpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xvc2VDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQ29ubmVjdFRpbWVyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5jb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHRoaXMuY29ubmVjdFRpbWVvdXQoKTtcbiAgICB9LCB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0KTtcbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZUNhbmNlbFRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJDYW5jZWxUaW1lcigpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQ7XG4gICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsVGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXF1ZXN0VGltZXIoKSB7XG4gICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpOyAvLyByZWxlYXNlIG9sZCB0aW1lciwganVzdCB0byBiZSBzYWZlXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCBhcyBSZXF1ZXN0O1xuICAgIGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdC50aW1lb3V0ICE9PSB1bmRlZmluZWQpID8gcmVxdWVzdC50aW1lb3V0IDogdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXRyeVRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgdGhpcy5yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dCgpO1xuICAgIH0sIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0VGltZW91dCgpIHtcbiAgICBjb25zdCBob3N0UG9zdGZpeCA9IHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCA/IGA6JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnR9YCA6IGBcXFxcJHt0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZX1gO1xuICAgIC8vIElmIHdlIGhhdmUgcm91dGluZyBkYXRhIHN0b3JlZCwgdGhpcyBjb25uZWN0aW9uIGhhcyBiZWVuIHJlZGlyZWN0ZWRcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMucm91dGluZ0RhdGEgPyBgOiR7dGhpcy5yb3V0aW5nRGF0YS5wb3J0fWAgOiBob3N0UG9zdGZpeDtcbiAgICAvLyBHcmFiIHRoZSB0YXJnZXQgaG9zdCBmcm9tIHRoZSBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24sIGFuZCBmcm9tIGEgcmVkaXJlY3QgbWVzc2FnZVxuICAgIC8vIG90aGVyd2lzZSwgbGVhdmUgdGhlIG1lc3NhZ2UgZW1wdHkuXG4gICAgY29uc3Qgcm91dGluZ01lc3NhZ2UgPSB0aGlzLnJvdXRpbmdEYXRhID8gYCAocmVkaXJlY3RlZCBmcm9tICR7dGhpcy5jb25maWcuc2VydmVyfSR7aG9zdFBvc3RmaXh9KWAgOiAnJztcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjb25uZWN0IHRvICR7c2VydmVyfSR7cG9ydH0ke3JvdXRpbmdNZXNzYWdlfSBpbiAke3RoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXR9bXNgO1xuICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJykpO1xuICAgIHRoaXMuY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY29ubmVjdFRpbWVvdXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZW91dCgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjYW5jZWwgcmVxdWVzdCBpbiAke3RoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dH1tc2A7XG4gICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzb2NrZXRFcnJvcicsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXF1ZXN0VGltZW91dCgpIHtcbiAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICByZXF1ZXN0LmNhbmNlbCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdC50aW1lb3V0ICE9PSB1bmRlZmluZWQpID8gcmVxdWVzdC50aW1lb3V0IDogdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICBjb25zdCBtZXNzYWdlID0gJ1RpbWVvdXQ6IFJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGluICcgKyB0aW1lb3V0ICsgJ21zJztcbiAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmV0cnlUaW1lb3V0KCkge1xuICAgIHRoaXMucmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVtaXQoJ3JldHJ5Jyk7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJDb25uZWN0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZXIpO1xuICAgICAgdGhpcy5jb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhckNhbmNlbFRpbWVyKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jYW5jZWxUaW1lcik7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJSZXF1ZXN0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZXIpO1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhclJldHJ5VGltZXIoKSB7XG4gICAgaWYgKHRoaXMucmV0cnlUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmV0cnlUaW1lcik7XG4gICAgICB0aGlzLnJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2l0aW9uVG8obmV3U3RhdGU6IFN0YXRlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IG5ld1N0YXRlKSB7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnU3RhdGUgaXMgYWxyZWFkeSAnICsgbmV3U3RhdGUubmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5leGl0KSB7XG4gICAgICB0aGlzLnN0YXRlLmV4aXQuY2FsbCh0aGlzLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Zy5sb2coJ1N0YXRlIGNoYW5nZTogJyArICh0aGlzLnN0YXRlID8gdGhpcy5zdGF0ZS5uYW1lIDogJ3VuZGVmaW5lZCcpICsgJyAtPiAnICsgbmV3U3RhdGUubmFtZSk7XG4gICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuZW50ZXIpIHtcbiAgICAgIHRoaXMuc3RhdGUuZW50ZXIuYXBwbHkodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRFdmVudEhhbmRsZXI8VCBleHRlbmRzIGtleW9mIFN0YXRlWydldmVudHMnXT4oZXZlbnROYW1lOiBUKTogTm9uTnVsbGFibGU8U3RhdGVbJ2V2ZW50cyddW1RdPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuc3RhdGUuZXZlbnRzW2V2ZW50TmFtZV07XG5cbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZXZlbnQgJyR7ZXZlbnROYW1lfScgaW4gc3RhdGUgJyR7dGhpcy5zdGF0ZS5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlciE7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoRXZlbnQ8VCBleHRlbmRzIGtleW9mIFN0YXRlWydldmVudHMnXT4oZXZlbnROYW1lOiBULCAuLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPFN0YXRlWydldmVudHMnXVtUXT4+KSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuc3RhdGUuZXZlbnRzW2V2ZW50TmFtZV0gYXMgKCh0aGlzOiBDb25uZWN0aW9uLCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYE5vIGV2ZW50ICcke2V2ZW50TmFtZX0nIGluIHN0YXRlICcke3RoaXMuc3RhdGUubmFtZX0nYCkpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0RXJyb3IoZXJyb3I6IEVycm9yKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuQ09OTkVDVElORyB8fCB0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlNFTlRfVExTU1NMTkVHT1RJQVRJT04pIHtcbiAgICAgIGNvbnN0IGhvc3RQb3N0Zml4ID0gdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID8gYDoke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydH1gIDogYFxcXFwke3RoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lfWA7XG4gICAgICAvLyBJZiB3ZSBoYXZlIHJvdXRpbmcgZGF0YSBzdG9yZWQsIHRoaXMgY29ubmVjdGlvbiBoYXMgYmVlbiByZWRpcmVjdGVkXG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5yb3V0aW5nRGF0YSA/IGA6JHt0aGlzLnJvdXRpbmdEYXRhLnBvcnR9YCA6IGhvc3RQb3N0Zml4O1xuICAgICAgLy8gR3JhYiB0aGUgdGFyZ2V0IGhvc3QgZnJvbSB0aGUgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uLCBhbmQgZnJvbSBhIHJlZGlyZWN0IG1lc3NhZ2VcbiAgICAgIC8vIG90aGVyd2lzZSwgbGVhdmUgdGhlIG1lc3NhZ2UgZW1wdHkuXG4gICAgICBjb25zdCByb3V0aW5nTWVzc2FnZSA9IHRoaXMucm91dGluZ0RhdGEgPyBgIChyZWRpcmVjdGVkIGZyb20gJHt0aGlzLmNvbmZpZy5zZXJ2ZXJ9JHtob3N0UG9zdGZpeH0pYCA6ICcnO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3NlcnZlcn0ke3BvcnR9JHtyb3V0aW5nTWVzc2FnZX0gLSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVNPQ0tFVCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb25uZWN0aW9uIGxvc3QgLSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VTT0NLRVQnKSk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc29ja2V0RXJyb3InLCBlcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldEVuZCgpIHtcbiAgICB0aGlzLmRlYnVnLmxvZygnc29ja2V0IGVuZGVkJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuU1RBVEUuRklOQUwpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBFcnJvcldpdGhDb2RlID0gbmV3IEVycm9yKCdzb2NrZXQgaGFuZyB1cCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIHRoaXMuc29ja2V0RXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0Q2xvc2UoKSB7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ2Nvbm5lY3Rpb24gdG8gJyArIHRoaXMuY29uZmlnLnNlcnZlciArICc6JyArIHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCArICcgY2xvc2VkJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuUkVST1VUSU5HKSB7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUmVyb3V0aW5nIHRvICcgKyB0aGlzLnJvdXRpbmdEYXRhIS5zZXJ2ZXIgKyAnOicgKyB0aGlzLnJvdXRpbmdEYXRhIS5wb3J0KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWNvbm5lY3QnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5wb3J0IDogdGhpcy5jb25maWcub3B0aW9ucy5wb3J0O1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1JldHJ5IGFmdGVyIHRyYW5zaWVudCBmYWlsdXJlIGNvbm5lY3RpbmcgdG8gJyArIHNlcnZlciArICc6JyArIHBvcnQpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JldHJ5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VuZFByZUxvZ2luKCkge1xuICAgIGNvbnN0IFssIG1ham9yLCBtaW5vciwgYnVpbGRdID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModmVyc2lvbikgPz8gWycwLjAuMCcsICcwJywgJzAnLCAnMCddO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKHtcbiAgICAgIC8vIElmIGVuY3J5cHQgc2V0dGluZyBpcyBzZXQgdG8gJ3N0cmljdCcsIHRoZW4gd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBkb25lIHRoZSBlbmNyeXB0aW9uIGJlZm9yZSBjYWxsaW5nXG4gICAgICAvLyB0aGlzIGZ1bmN0aW9uLiBUaGVyZWZvcmUsIHRoZSBlbmNyeXB0IHdpbGwgYmUgc2V0IHRvIGZhbHNlIGhlcmUuXG4gICAgICAvLyBPdGhlcndpc2UsIHdlIHdpbGwgc2V0IGVuY3J5cHQgaGVyZSBiYXNlZCBvbiB0aGUgZW5jcnlwdCBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICBlbmNyeXB0OiB0eXBlb2YgdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0ID09PSAnYm9vbGVhbicgJiYgdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0LFxuICAgICAgdmVyc2lvbjogeyBtYWpvcjogTnVtYmVyKG1ham9yKSwgbWlub3I6IE51bWJlcihtaW5vciksIGJ1aWxkOiBOdW1iZXIoYnVpbGQpLCBzdWJidWlsZDogMCB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBwYXlsb2FkLmRhdGEpO1xuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kTG9naW43UGFja2V0KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTG9naW43UGF5bG9hZCh7XG4gICAgICB0ZHNWZXJzaW9uOiB2ZXJzaW9uc1t0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb25dLFxuICAgICAgcGFja2V0U2l6ZTogdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplLFxuICAgICAgY2xpZW50UHJvZ1ZlcjogMCxcbiAgICAgIGNsaWVudFBpZDogcHJvY2Vzcy5waWQsXG4gICAgICBjb25uZWN0aW9uSWQ6IDAsXG4gICAgICBjbGllbnRUaW1lWm9uZTogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLFxuICAgICAgY2xpZW50TGNpZDogMHgwMDAwMDQwOVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG4gICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdBREFMJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICB3b3JrZmxvdzogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic6XG4gICAgICAgIHBheWxvYWQuZmVkQXV0aCA9IHtcbiAgICAgICAgICB0eXBlOiAnU0VDVVJJVFlUT0tFTicsXG4gICAgICAgICAgZWNobzogdGhpcy5mZWRBdXRoUmVxdWlyZWQsXG4gICAgICAgICAgZmVkQXV0aFRva2VuOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnRva2VuXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bSc6XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnaW50ZWdyYXRlZCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICBwYXlsb2FkLnNzcGkgPSBjcmVhdGVOVExNUmVxdWVzdCh7IGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4gfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXlsb2FkLnVzZXJOYW1lID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZTtcbiAgICAgICAgcGF5bG9hZC5wYXNzd29yZCA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgcGF5bG9hZC5ob3N0bmFtZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCB8fCBvcy5ob3N0bmFtZSgpO1xuICAgIHBheWxvYWQuc2VydmVyTmFtZSA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBwYXlsb2FkLmFwcE5hbWUgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmFwcE5hbWUgfHwgJ1RlZGlvdXMnO1xuICAgIHBheWxvYWQubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTtcbiAgICBwYXlsb2FkLmxhbmd1YWdlID0gdGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICBwYXlsb2FkLmRhdGFiYXNlID0gdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICBwYXlsb2FkLmNsaWVudElkID0gQnVmZmVyLmZyb20oWzEsIDIsIDMsIDQsIDUsIDZdKTtcblxuICAgIHBheWxvYWQucmVhZE9ubHlJbnRlbnQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50O1xuICAgIHBheWxvYWQuaW5pdERiRmF0YWwgPSAhdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuXG4gICAgdGhpcy5yb3V0aW5nRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkxPR0lONywgcGF5bG9hZC50b0J1ZmZlcigpKTtcblxuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW5MZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aCh0b2tlbiwgJ3VjczInKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDggKyBhY2Nlc3NUb2tlbkxlbik7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgb2Zmc2V0ID0gZGF0YS53cml0ZVVJbnQzMkxFKGFjY2Vzc1Rva2VuTGVuICsgNCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgPSBkYXRhLndyaXRlVUludDMyTEUoYWNjZXNzVG9rZW5MZW4sIG9mZnNldCk7XG4gICAgZGF0YS53cml0ZSh0b2tlbiwgb2Zmc2V0LCAndWNzMicpO1xuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuRkVEQVVUSF9UT0tFTiwgZGF0YSk7XG4gICAgLy8gc2VudCB0aGUgZmVkQXV0aCB0b2tlbiBtZXNzYWdlLCB0aGUgcmVzdCBpcyBzaW1pbGFyIHRvIHN0YW5kYXJkIGxvZ2luIDdcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kSW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFNxbEJhdGNoUGF5bG9hZCh0aGlzLmdldEluaXRpYWxTcWwoKSwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogVFlQRS5TUUxfQkFUQ0ggfSk7XG4gICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgIFJlYWRhYmxlLmZyb20ocGF5bG9hZCkucGlwZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxscyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbHMgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV93YXJuaW5ncyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3dhcm5pbmdzIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGNvbmNhdF9udWxsX3lpZWxkc19udWxsIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY29uY2F0X251bGxfeWllbGRzX251bGwgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmaXJzdCAke3RoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmb3JtYXQgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgbGFuZ3VhZ2UgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHF1b3RlZF9pZGVudGlmaWVyIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0ZXh0c2l6ZSAke3RoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJHt0aGlzLmdldElzb2xhdGlvbkxldmVsVGV4dCh0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHhhY3RfYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCB4YWN0X2Fib3J0IG9mZicpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcm9jZXNzZWRJbml0aWFsU3FsKCkge1xuICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBTUUwgYmF0Y2ggcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqIFRoZXJlIGlzIG5vIHBhcmFtIHN1cHBvcnQsIGFuZCB1bmxpa2UgW1tSZXF1ZXN0LmV4ZWNTcWxdXSxcbiAgICogaXQgaXMgbm90IGxpa2VseSB0aGF0IFNRTCBTZXJ2ZXIgd2lsbCByZXVzZSB0aGUgZXhlY3V0aW9uIHBsYW4gaXQgZ2VuZXJhdGVzIGZvciB0aGUgU1FMLlxuICAgKlxuICAgKiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBbW1JlcXVlc3QuZXhlY1NxbF1dIHdpbGwgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleGVjU3FsQmF0Y2gocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5TUUxfQkFUQ0gsIG5ldyBTcWxCYXRjaFBheWxvYWQocmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqICBFeGVjdXRlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEFzIGBzcF9leGVjdXRlc3FsYCBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIFNRTCwgaWYgdGhlIHNhbWUgU1FMIGlzIGV4ZWN1dGVkIG11bHRpcGxlcyB0aW1lc1xuICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU1FMIFNlcnZlciBxdWVyeSBvcHRpbWl6ZXIgaXMgbGlrZWx5IHRvIHJldXNlIHRoZSBleGVjdXRpb24gcGxhbiBpdCBnZW5lcmF0ZXNcbiAgICogZm9yIHRoZSBmaXJzdCBleGVjdXRpb24uIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIFNRTCBzZXJ2ZXIgdHJlYXRpbmcgdGhlIHJlcXVlc3QgbGlrZSBhIHN0b3JlZCBwcm9jZWR1cmVcbiAgICogd2hpY2ggY2FuIHJlc3VsdCBpbiB0aGUgW1tFdmVudF9kb25lSW5Qcm9jXV0gb3IgW1tFdmVudF9kb25lUHJvY11dIGV2ZW50cyBiZWluZyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlXG4gICAqIFtbRXZlbnRfZG9uZV1dIGV2ZW50IHlvdSBtaWdodCBleHBlY3QuIFVzaW5nIFtbZXhlY1NxbEJhdGNoXV0gd2lsbCBwcmV2ZW50IHRoaXMgZnJvbSBvY2N1cnJpbmcgYnV0IG1heSBoYXZlIGEgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgKlxuICAgKiBCZXdhcmUgb2YgdGhlIHdheSB0aGF0IHNjb3BpbmcgcnVsZXMgYXBwbHksIGFuZCBob3cgdGhleSBtYXkgW2FmZmVjdCBsb2NhbCB0ZW1wIHRhYmxlc10oaHR0cDovL3dlYmxvZ3Muc3FsdGVhbS5jb20vbWxhZGVucC9hcmNoaXZlLzIwMDYvMTEvMDMvMTcxOTcuYXNweClcbiAgICogSWYgeW91J3JlIHJ1bm5pbmcgaW4gdG8gc2NvcGluZyBpc3N1ZXMsIHRoZW4gW1tleGVjU3FsQmF0Y2hdXSBtYXkgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKiBTZWUgYWxzbyBbaXNzdWUgIzI0XShodHRwczovL2dpdGh1Yi5jb20vcGVraW0vdGVkaW91cy9pc3N1ZXMvMjQpXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4ZWNTcWwocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuTlZhckNoYXIsXG4gICAgICBuYW1lOiAnc3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgICBuYW1lOiAncGFyYW1zJyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpLFxuICAgICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBwYXJhbWV0ZXJzLnB1c2goLi4ucmVxdWVzdC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChQcm9jZWR1cmVzLlNwX0V4ZWN1dGVTcWwsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCdWxrTG9hZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBidWxrLWluc2VydCBpbnRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBIHNldCBvZiBidWxrIGxvYWQgb3B0aW9ucy5cbiAgICovXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiBCdWxrTG9hZENhbGxiYWNrKTogQnVsa0xvYWRcbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zLCBjYWxsYmFjazogQnVsa0xvYWRDYWxsYmFjayk6IEJ1bGtMb2FkXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrT3JPcHRpb25zOiBCdWxrTG9hZE9wdGlvbnMgfCBCdWxrTG9hZENhbGxiYWNrLCBjYWxsYmFjaz86IEJ1bGtMb2FkQ2FsbGJhY2spIHtcbiAgICBsZXQgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zO1xuXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tPck9wdGlvbnMgYXMgQnVsa0xvYWRDYWxsYmFjaztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGNhbGxiYWNrT3JPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm9wdGlvbnNcIiBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJ1bGtMb2FkKHRhYmxlLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uLCB0aGlzLmNvbmZpZy5vcHRpb25zLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIFtbQnVsa0xvYWRdXS5cbiAgICpcbiAgICogYGBganNcbiAgICogLy8gV2Ugd2FudCB0byBwZXJmb3JtIGEgYnVsayBsb2FkIGludG8gYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKiAvLyBDUkVBVEUgVEFCTEUgZW1wbG95ZWVzIChmaXJzdF9uYW1lIG52YXJjaGFyKDI1NSksIGxhc3RfbmFtZSBudmFyY2hhcigyNTUpLCBkYXlfb2ZfYmlydGggZGF0ZSk7XG4gICAqXG4gICAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnZW1wbG95ZWVzJywgKGVyciwgcm93Q291bnQpID0+IHtcbiAgICogICAvLyAuLi5cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIGNvbHVtbnMgdGhhdCB3ZSB3YW50IHRvIHdyaXRlIHRvLFxuICAgKiAvLyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMuIFRoZXNlIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCB0YWJsZSxcbiAgICogLy8gb3RoZXJ3aXNlIHRoZSBidWxrIGxvYWQgd2lsbCBmYWlsLlxuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignbGFzdF9uYW1lJywgVFlQRVMuTlZhcmNoYXIsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2RhdGVfb2ZfYmlydGgnLCBUWVBFUy5EYXRlLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICpcbiAgICogLy8gRXhlY3V0ZSBhIGJ1bGsgbG9hZCB3aXRoIGEgcHJlZGVmaW5lZCBsaXN0IG9mIHJvd3MuXG4gICAqIC8vXG4gICAqIC8vIE5vdGUgdGhhdCB0aGVzZSByb3dzIGFyZSBoZWxkIGluIG1lbW9yeSB1bnRpbCB0aGVcbiAgICogLy8gYnVsayBsb2FkIHdhcyBwZXJmb3JtZWQsIHNvIGlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbGFyZ2VcbiAgICogLy8gbnVtYmVyIG9mIHJvd3MgKGUuZy4gYnkgcmVhZGluZyBmcm9tIGEgQ1NWIGZpbGUpLFxuICAgKiAvLyBwYXNzaW5nIGFuIGBBc3luY0l0ZXJhYmxlYCBpcyBhZHZpc2FibGUgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LlxuICAgKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnU3RldmUnLCAnbGFzdF9uYW1lJzogJ0pvYnMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzAyLTI0LTE5NTUnKSB9LFxuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnQmlsbCcsICdsYXN0X25hbWUnOiAnR2F0ZXMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzEwLTI4LTE5NTUnKSB9XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGJ1bGtMb2FkIEEgcHJldmlvdXNseSBjcmVhdGVkIFtbQnVsa0xvYWRdXS5cbiAgICogQHBhcmFtIHJvd3MgQSBbW0l0ZXJhYmxlXV0gb3IgW1tBc3luY0l0ZXJhYmxlXV0gdGhhdCBjb250YWlucyB0aGUgcm93cyB0aGF0IHNob3VsZCBiZSBidWxrIGxvYWRlZC5cbiAgICovXG4gIGV4ZWNCdWxrTG9hZChidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pOiB2b2lkXG5cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93cz86IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pIHtcbiAgICBidWxrTG9hZC5leGVjdXRpb25TdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmIChyb3dzKSB7XG4gICAgICBpZiAoYnVsa0xvYWQuc3RyZWFtaW5nTW9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgd2FzIHB1dCBpbiBzdHJlYW1pbmcgbW9kZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWxrTG9hZC5maXJzdFJvd1dyaXR0ZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbi5leGVjQnVsa0xvYWQgY2FuJ3QgYmUgY2FsbGVkIHdpdGggYSBCdWxrTG9hZCB0aGF0IGFscmVhZHkgaGFzIHJvd3Mgd3JpdHRlbiB0byBpdC5cIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd1N0cmVhbSA9IFJlYWRhYmxlLmZyb20ocm93cyk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHBhY2tldCB0cmFuc2Zvcm0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcm93IHN0cmVhbSxcbiAgICAgIC8vIGUuZy4gaWYgYW4gZXJyb3IgaXMgdGhyb3duIGZyb20gd2l0aGluIGEgZ2VuZXJhdG9yIG9yIHN0cmVhbS5cbiAgICAgIHJvd1N0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmRlc3Ryb3koZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZXN0cm95IHRoZSByb3cgc3RyZWFtIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gdGhlIHBhY2tldCB0cmFuc2Zvcm0sXG4gICAgICAvLyBlLmcuIGlmIHRoZSBidWxrIGxvYWQgaXMgY2FuY2VsbGVkLlxuICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByb3dTdHJlYW0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHJvd1N0cmVhbS5waXBlKGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtKTtcbiAgICB9IGVsc2UgaWYgKCFidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgYnVsa2xvYWQgd2FzIG5vdCBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSBieSB0aGUgdXNlcixcbiAgICAgIC8vIHdlIGVuZCB0aGUgcm93VG9QYWNrZXRUcmFuc2Zvcm0gaGVyZSBmb3IgdGhlbS5cbiAgICAgIC8vXG4gICAgICAvLyBJZiBpdCB3YXMgcHV0IGludG8gc3RyZWFtaW5nIG1vZGUsIGl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eVxuICAgICAgLy8gdG8gZW5kIHRoZSBzdHJlYW0uXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5lbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgQnVsa0xvYWRQYXlsb2FkKGJ1bGtMb2FkKTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChidWxrTG9hZC5nZXRCdWxrSW5zZXJ0U3FsKCksIChlcnJvcjogKEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0pIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgYnVsa0xvYWQucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnVU5LTk9XTicpIHtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICs9ICcgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB0aGUgc2NoZW1hIG9mIHRoZSBCdWxrTG9hZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2NoZW1hIG9mIHRoZSB0YWJsZSB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGludG8uJztcbiAgICAgICAgfVxuICAgICAgICBidWxrTG9hZC5lcnJvciA9IGVycm9yO1xuICAgICAgICBidWxrTG9hZC5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYWtlUmVxdWVzdChidWxrTG9hZCwgVFlQRS5CVUxLX0xPQUQsIHBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgYnVsa0xvYWQub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgdGhpcy5leGVjU3FsQmF0Y2gocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSB0aGUgU1FMIHJlcHJlc2VudGVkIGJ5IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgcmVxdWVzdCBjYW4gdGhlbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG9cbiAgICogW1tleGVjdXRlXV0gYW5kIFtbdW5wcmVwYXJlXV1cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS4gUGFyYW1ldGVyIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHByZXBhcmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgdmFsdWU6IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGggPyByZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSA6IG51bGwsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdzdG10JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5wcmVwYXJpbmcgPSB0cnVlO1xuXG4gICAgLy8gVE9ETzogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGlzIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGlzIGxlYWtzIG1lbW9yeVxuICAgIHJlcXVlc3Qub24oJ3JldHVyblZhbHVlJywgKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKG5hbWUgPT09ICdoYW5kbGUnKSB7XG4gICAgICAgIHJlcXVlc3QuaGFuZGxlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihgVGVkaW91cyA+IFVuZXhwZWN0ZWQgb3V0cHV0IHBhcmFtZXRlciAke25hbWV9IGZyb20gc3BfcHJlcGFyZWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoUHJvY2VkdXJlcy5TcF9QcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIFNRTCBTZXJ2ZXIgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXZpb3VzbHkgcHJlcGFyZWQgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS5cbiAgICogICBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgdW5wcmVwYXJlKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLkludCxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgLy8gVE9ETzogQWJvcnQgaWYgYHJlcXVlc3QuaGFuZGxlYCBpcyBub3Qgc2V0XG4gICAgICB2YWx1ZTogcmVxdWVzdC5oYW5kbGUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfVW5wcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcHJldmlvdXNseSBwcmVwYXJlZCBTUUwsIHVzaW5nIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIHByZXZpb3VzbHkgcHJlcGFyZWQgW1tSZXF1ZXN0XV0uXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzICBBbiBvYmplY3Qgd2hvc2UgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgb2ZcbiAgICogICBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgW1tSZXF1ZXN0XV0gYmVmb3JlIGl0IHdhcyBwcmVwYXJlZC5cbiAgICogICBUaGUgb2JqZWN0J3MgdmFsdWVzIGFyZSBwYXNzZWQgYXMgdGhlIHBhcmFtZXRlcnMnIHZhbHVlcyB3aGVuIHRoZVxuICAgKiAgIHJlcXVlc3QgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBleGVjdXRlKHJlcXVlc3Q6IFJlcXVlc3QsIHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGNvbnN0IGV4ZWN1dGVQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIC8vIFRPRE86IEFib3J0IGlmIGByZXF1ZXN0LmhhbmRsZWAgaXMgbm90IHNldFxuICAgICAgdmFsdWU6IHJlcXVlc3QuaGFuZGxlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnNbaV07XG5cbiAgICAgICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgICAgLi4ucGFyYW1ldGVyLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbWV0ZXIudHlwZS52YWxpZGF0ZShwYXJhbWV0ZXJzID8gcGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0gOiBudWxsLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfRXhlY3V0ZSwgZXhlY3V0ZVBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHN0b3JlZCBwcm9jZWR1cmUgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGNhbGxQcm9jZWR1cmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgcmVxdWVzdC5wYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4gUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgXG4gICAqICAgaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIGlzb2xhdGlvbkxldmVsIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIGJlZ2luVHJhbnNhY3Rpb24oY2FsbGJhY2s6IEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnLCBpc29sYXRpb25MZXZlbCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsLCAnaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUsIGlzb2xhdGlvbkxldmVsKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMICcgKyAodHJhbnNhY3Rpb24uaXNvbGF0aW9uTGV2ZWxUb1RTUUwoKSkgKyAnO0JFR0lOIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uYmVnaW5QYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYGlzIHByZXNlbnQuXG4gICAqL1xuICBjb21taXRUcmFuc2FjdGlvbihjYWxsYmFjazogQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ0NPTU1JVCBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5jb21taXRQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHJvbGxiYWNrVHJhbnNhY3Rpb24oY2FsbGJhY2s6IFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1JPTExCQUNLIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5yb2xsYmFja1BheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzYXZlcG9pbnQgd2l0aGluIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXFxcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHNhdmVUcmFuc2FjdGlvbihjYWxsYmFjazogU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTQVZFIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLnNhdmVQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBnaXZlbiBjYWxsYmFjayBhZnRlciBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCBhbmQgY29tbWl0IG9yXG4gICAqIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIHRoYXQgZW1wbG95cyBbW2JlZ2luVHJhbnNhY3Rpb25dXSwgW1tjb21taXRUcmFuc2FjdGlvbl1dLFxuICAgKiBbW3JvbGxiYWNrVHJhbnNhY3Rpb25dXSwgYW5kIFtbc2F2ZVRyYW5zYWN0aW9uXV0gdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGVcbiAgICogdXNlIG9mIGRhdGFiYXNlIHRyYW5zYWN0aW9ucyBhbmQgYXV0b21hdGljYWxseSBoYW5kbGUgdHJhbnNhY3Rpb24gbmVzdGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNiXG4gICAqIEBwYXJhbSBpc29sYXRpb25MZXZlbFxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIHRyYW5zYWN0aW9uKGNiOiAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIHR4RG9uZT86IDxUIGV4dGVuZHMgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2s+KGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBkb25lOiBULCAuLi5hcmdzOiBDYWxsYmFja1BhcmFtZXRlcnM8VD4pID0+IHZvaWQpID0+IHZvaWQsIGlzb2xhdGlvbkxldmVsPzogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BjYmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlU2F2ZXBvaW50ID0gdGhpcy5pblRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5hbWUgPSAnX3RlZGlvdXNfJyArIChjcnlwdG8ucmFuZG9tQnl0ZXMoMTApLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgdHhEb25lOiA8VCBleHRlbmRzIFRyYW5zYWN0aW9uRG9uZUNhbGxiYWNrPihlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkID0gKGVyciwgZG9uZSwgLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhpcy5pblRyYW5zYWN0aW9uICYmIHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuTE9HR0VEX0lOKSB7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCh0eEVycikgPT4ge1xuICAgICAgICAgICAgZG9uZSh0eEVyciB8fCBlcnIsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0sIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUoZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1c2VTYXZlcG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgZG9uZShudWxsLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tbWl0VHJhbnNhY3Rpb24oKHR4RXJyKSA9PiB7XG4gICAgICAgICAgZG9uZSh0eEVyciwgLi4uYXJncyk7XG4gICAgICAgIH0sIG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodXNlU2F2ZXBvaW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zYXZlVHJhbnNhY3Rpb24oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NFVCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJyArIHRoaXMuZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGVyciwgdHhEb25lKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5iZWdpblRyYW5zYWN0aW9uKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICB9LCBuYW1lLCBpc29sYXRpb25MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWtlUmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQsIHBhY2tldFR5cGU6IG51bWJlciwgcGF5bG9hZDogKEl0ZXJhYmxlPEJ1ZmZlcj4gfCBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pICYgeyB0b1N0cmluZzogKGluZGVudD86IHN0cmluZykgPT4gc3RyaW5nIH0pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5MT0dHRURfSU4pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnUmVxdWVzdHMgY2FuIG9ubHkgYmUgbWFkZSBpbiB0aGUgJyArIHRoaXMuU1RBVEUuTE9HR0VEX0lOLm5hbWUgKyAnIHN0YXRlLCBub3QgdGhlICcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnIHN0YXRlJztcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgcmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFSU5WQUxJRFNUQVRFJykpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhY2tldFR5cGUgPT09IFRZUEUuU1FMX0JBVENIKSB7XG4gICAgICAgIHRoaXMuaXNTcWxCYXRjaCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QuY29ubmVjdGlvbiEgPSB0aGlzO1xuICAgICAgcmVxdWVzdC5yb3dDb3VudCEgPSAwO1xuICAgICAgcmVxdWVzdC5yb3dzISA9IFtdO1xuICAgICAgcmVxdWVzdC5yc3QhID0gW107XG5cbiAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBwYXlsb2FkU3RyZWFtLnVucGlwZShtZXNzYWdlKTtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS5kZXN0cm95KG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaWdub3JlIGJpdCBhbmQgZW5kIHRoZSBtZXNzYWdlLlxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICByZXF1ZXN0LnJlc3VtZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgdGhpcy5jcmVhdGVSZXF1ZXN0VGltZXIoKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogcGFja2V0VHlwZSwgcmVzZXRDb25uZWN0aW9uOiB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQ0xJRU5UX1JFUVVFU1QpO1xuXG4gICAgICBtZXNzYWdlLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHBheWxvYWQhLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYXlsb2FkU3RyZWFtID0gUmVhZGFibGUuZnJvbShwYXlsb2FkKTtcbiAgICAgIHBheWxvYWRTdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gT25seSBzZXQgYSByZXF1ZXN0IGVycm9yIGlmIG5vIGVycm9yIHdhcyBzZXQgeWV0LlxuICAgICAgICByZXF1ZXN0LmVycm9yID8/PSBlcnJvcjtcblxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHBheWxvYWRTdHJlYW0ucGlwZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGN1cnJlbnRseSBleGVjdXRlZCByZXF1ZXN0LlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdC5jYW5jZWwoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29ubmVjdGlvbiB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICogQ2FuIGJlIHVzZWZ1bCBmb3IgY29ubmVjdGlvbiBwb29sIGltcGxlbWVudGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZXNldChjYWxsYmFjazogUmVzZXRDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLmdldEluaXRpYWxTcWwoKSwgKGVycikgPT4ge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhlY1NxbEJhdGNoKHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnNbdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJc29sYXRpb25MZXZlbFRleHQoaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF0pIHtcbiAgICBzd2l0Y2ggKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX1VOQ09NTUlUVEVEOlxuICAgICAgICByZXR1cm4gJ3JlYWQgdW5jb21taXR0ZWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVQRUFUQUJMRV9SRUFEOlxuICAgICAgICByZXR1cm4gJ3JlcGVhdGFibGUgcmVhZCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TRVJJQUxJWkFCTEU6XG4gICAgICAgIHJldHVybiAnc2VyaWFsaXphYmxlJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gJ3NuYXBzaG90JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncmVhZCBjb21taXR0ZWQnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RyYW5zaWVudEVycm9yKGVycm9yOiBBZ2dyZWdhdGVFcnJvciB8IENvbm5lY3Rpb25FcnJvcik6IGJvb2xlYW4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgIGVycm9yID0gZXJyb3IuZXJyb3JzWzBdO1xuICB9XG4gIHJldHVybiAoZXJyb3IgaW5zdGFuY2VvZiBDb25uZWN0aW9uRXJyb3IpICYmICEhZXJyb3IuaXNUcmFuc2llbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbm5lY3Rpb247XG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Rpb247XG5cbkNvbm5lY3Rpb24ucHJvdG90eXBlLlNUQVRFID0ge1xuICBJTklUSUFMSVpFRDoge1xuICAgIG5hbWU6ICdJbml0aWFsaXplZCcsXG4gICAgZXZlbnRzOiB7fVxuICB9LFxuICBDT05ORUNUSU5HOiB7XG4gICAgbmFtZTogJ0Nvbm5lY3RpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzZUNvbm5lY3Rpb24oKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9QUkVMT0dJTjoge1xuICAgIG5hbWU6ICdTZW50UHJlbG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgbWVzc2FnZSkge1xuICAgICAgICAgIG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFttZXNzYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVsb2dpblBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKG1lc3NhZ2VCdWZmZXIpO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWxvZ2luUGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdzdHJpY3QnICE9PSB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgJiYgKHByZWxvZ2luUGF5bG9hZC5lbmNyeXB0aW9uU3RyaW5nID09PSAnT04nIHx8IHByZWxvZ2luUGF5bG9hZC5lbmNyeXB0aW9uU3RyaW5nID09PSAnUkVRJykpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihcIlNlcnZlciByZXF1aXJlcyBlbmNyeXB0aW9uLCBzZXQgJ2VuY3J5cHQnIGNvbmZpZyBvcHRpb24gdG8gdHJ1ZS5cIiwgJ0VFTkNSWVBUJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1RMU1NTTE5FR09USUFUSU9OKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVzc2FnZUlvLnN0YXJ0VGxzKHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMsIHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA/IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA6IHRoaXMucm91dGluZ0RhdGE/LnNlcnZlciA/PyB0aGlzLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kTG9naW43UGFja2V0KCk7XG5cbiAgICAgICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJzpcbiAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JzpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX05UTE0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgUkVST1VUSU5HOiB7XG4gICAgbmFtZTogJ1JlUm91dGluZycsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuUkVESVJFQ1QpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgcmVjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiB7XG4gICAgbmFtZTogJ1RSQU5TSUVOVF9GQUlMVVJFX1JFVFJZJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmN1clRyYW5zaWVudFJldHJ5Q291bnQrKztcbiAgICAgIHRoaXMuY2xlYW51cENvbm5lY3Rpb24oQ0xFQU5VUF9UWVBFLlJFVFJZKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIHJldHJ5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXRyeVRpbWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiB7XG4gICAgbmFtZTogJ1NlbnRUTFNTU0xOZWdvdGlhdGlvbicsXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoU3RhbmRhcmRMb2dpbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuXG4gICAgICAgIGlmIChoYW5kbGVyLmxvZ2luQWNrUmVjZWl2ZWQpIHtcbiAgICAgICAgICBpZiAoaGFuZGxlci5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0aW5nRGF0YSA9IGhhbmRsZXIucm91dGluZ0RhdGE7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlJFUk9VVElORyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICB9XG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX05UTE06IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhOVExNTG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICAgIGlmIChoYW5kbGVyLmxvZ2luQWNrUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5udGxtcGFja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uIGFzIE50bG1BdXRoZW50aWNhdGlvbjtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IG5ldyBOVExNUmVzcG9uc2VQYXlsb2FkKHtcbiAgICAgICAgICAgICAgZG9tYWluOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmRvbWFpbixcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgICBudGxtcGFja2V0OiB0aGlzLm50bG1wYWNrZXRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLk5UTE1BVVRIX1BLVCwgcGF5bG9hZC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJyAgJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5udGxtcGFja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX0ZFREFVVEg6IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhmZWRhdXRoJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBMb2dpbjdUb2tlbkhhbmRsZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZWRBdXRoSW5mb1Rva2VuID0gaGFuZGxlci5mZWRBdXRoSW5mb1Rva2VuO1xuXG4gICAgICAgIGlmIChmZWRBdXRoSW5mb1Rva2VuICYmIGZlZEF1dGhJbmZvVG9rZW4uc3RzdXJsICYmIGZlZEF1dGhJbmZvVG9rZW4uc3BuKSB7XG4gICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuICAgICAgICAgIGNvbnN0IHRva2VuU2NvcGUgPSBuZXcgVVJMKCcvLmRlZmF1bHQnLCBmZWRBdXRoSW5mb1Rva2VuLnNwbikudG9TdHJpbmcoKTtcblxuICAgICAgICAgIGxldCBjcmVkZW50aWFscztcblxuICAgICAgICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc6XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsKFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWQgPz8gJ2NvbW1vbicsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bSc6XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc6XG4gICAgICAgICAgICAgIGNvbnN0IG1zaUFyZ3MgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkID8gW2F1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsIHt9XSA6IFt7fV07XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwoLi4ubXNpQXJncyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JzpcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQgPyB7IG1hbmFnZWRJZGVudGl0eUNsaWVudElkOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkIH0gOiB7fTtcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBuZXcgRGVmYXVsdEF6dXJlQ3JlZGVudGlhbChhcmdzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc6XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IENsaWVudFNlY3JldENyZWRlbnRpYWwoXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50U2VjcmV0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB0b2tlblJlc3BvbnNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0b2tlblJlc3BvbnNlID0gYXdhaXQgY3JlZGVudGlhbHMuZ2V0VG9rZW4odG9rZW5TY29wZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgICAgIFtuZXcgQ29ubmVjdGlvbkVycm9yKCdTZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkLicsICdFRkVEQVVUSCcpLCBlcnJdKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cblxuICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5SZXNwb25zZS50b2tlbjtcbiAgICAgICAgICB0aGlzLnNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlKHRva2VuKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgIGlmIChpc1RyYW5zaWVudEVycm9yKHRoaXMubG9naW5FcnJvcikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcignTG9naW4gZmFpbGVkLicsICdFTE9HSU4nKSk7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW5TZW5kaW5nSW5pdGlhbFNxbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5zZW5kSW5pdGlhbFNxbCgpO1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBuZXcgSW5pdGlhbFNxbFRva2VuSGFuZGxlcih0aGlzKSk7XG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5pdGlhbFNxbCgpO1xuXG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24gc29ja2V0RXJyb3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBMT0dHRURfSU46IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW4nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFNFTlRfQ0xJRU5UX1JFUVVFU1Q6IHtcbiAgICBuYW1lOiAnU2VudENsaWVudFJlcXVlc3QnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVxdWVzdCB0aW1lciBpcyBzdG9wcGVkIG9uIGZpcnN0IGRhdGEgcGFja2FnZVxuICAgICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIG5ldyBSZXF1ZXN0VG9rZW5IYW5kbGVyKHRoaXMsIHRoaXMucmVxdWVzdCEpKTtcblxuICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQgYW5kIHdlIGhhdmUgYSBgY2FuY2VsVGltZXJgXG4gICAgICAgIC8vIGRlZmluZWQsIHdlIHNlbmQgYSBhdHRlbnRpb24gbWVzc2FnZSBhZnRlciB0aGVcbiAgICAgICAgLy8gcmVxdWVzdCBtZXNzYWdlIHdhcyBmdWxseSBzZW50IG9mZi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgYWxyZWFkeSBzdGFydGVkIGNvbnN1bWluZyB0aGUgY3VycmVudCBtZXNzYWdlXG4gICAgICAgIC8vIChidXQgYWxsIHRoZSB0b2tlbiBoYW5kbGVycyBzaG91bGQgYmUgbm8tb3BzKSwgYW5kXG4gICAgICAgIC8vIG5lZWQgdG8gZW5zdXJlIHRoZSBuZXh0IG1lc3NhZ2UgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgICAgLy8gYFNFTlRfQVRURU5USU9OYCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdD8uY2FuY2VsZWQgJiYgdGhpcy5jYW5jZWxUaW1lcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQVRURU5USU9OKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9uUmVzdW1lID0gKCkgPT4ge1xuICAgICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLnJlc3VtZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvblBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLnBhdXNlKCk7XG5cbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/Lm9uY2UoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3Q/Lm9uKCdwYXVzZScsIG9uUGF1c2UpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5wYXVzZWQpIHtcbiAgICAgICAgICBvblBhdXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmRPZk1lc3NhZ2UpO1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgdGhpcy5yZXF1ZXN0LnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdC5yZXN1bWUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIC8vIFRoZSBgX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnRgIGNhbGxiYWNrIHdpbGwgaGF2ZSBzZW50IGFcbiAgICAgICAgICAvLyBhdHRlbnRpb24gbWVzc2FnZSwgc28gbm93IHdlIG5lZWQgdG8gYWxzbyBzd2l0Y2ggdG9cbiAgICAgICAgICAvLyB0aGUgYFNFTlRfQVRURU5USU9OYCBzdGF0ZSB0byBtYWtlIHN1cmUgdGhlIGF0dGVudGlvbiBhY2tcbiAgICAgICAgICAvLyBtZXNzYWdlIGlzIHByb2Nlc3NlZCBjb3JyZWN0bHkuXG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0FUVEVOVElPTik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb25FbmRPZk1lc3NhZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgdGhpcy5fY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudCk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlJywgb25QYXVzZSk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncmVzdW1lJywgb25SZXN1bWUpO1xuXG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuICAgICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QgYXMgUmVxdWVzdDtcbiAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInICYmIHNxbFJlcXVlc3QuZXJyb3IgJiYgdGhpcy5pc1NxbEJhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhzcWxSZXF1ZXN0LmVycm9yLCBzcWxSZXF1ZXN0LnJvd0NvdW50LCBzcWxSZXF1ZXN0LnJvd3MpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uY2UoJ2VuZCcsIG9uRW5kT2ZNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG4gICAgICB9KSgpO1xuXG4gICAgfSxcbiAgICBleGl0OiBmdW5jdGlvbihuZXh0U3RhdGUpIHtcbiAgICAgIHRoaXMuY2xlYXJSZXF1ZXN0VGltZXIoKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcblxuICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0FUVEVOVElPTjoge1xuICAgIG5hbWU6ICdTZW50QXR0ZW50aW9uJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBBdHRlbnRpb25Ub2tlbkhhbmRsZXIodGhpcywgdGhpcy5yZXF1ZXN0ISk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG4gICAgICAgIC8vIDMuMi41LjcgU2VudCBBdHRlbnRpb24gU3RhdGVcbiAgICAgICAgLy8gRGlzY2FyZCBhbnkgZGF0YSBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBhdHRlbnRpb24gcmVzcG9uc2VcbiAgICAgICAgaWYgKGhhbmRsZXIuYXR0ZW50aW9uUmVjZWl2ZWQpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQ2FuY2VsVGltZXIoKTtcblxuICAgICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG5cbiAgICAgICAgICBpZiAoc3FsUmVxdWVzdC5lcnJvciAmJiBzcWxSZXF1ZXN0LmVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yICYmIHNxbFJlcXVlc3QuZXJyb3IuY29kZSA9PT0gJ0VUSU1FT1VUJykge1xuICAgICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhzcWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKCdDYW5jZWxlZC4nLCAnRUNBTkNFTCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuXG4gICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEZJTkFMOiB7XG4gICAgbmFtZTogJ0ZpbmFsJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5OT1JNQUwpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcsIGFzIHRoZSB0aW1lciBzaG91bGQgYmUgY2xlYW5lZCB1cC5cbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgfSxcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsR0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsR0FBQSxHQUFBQyx1QkFB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 \ No newline at end of file diff --git a/samples/Javascript/clean/connection.js.simple b/samples/Javascript/clean/connection.js.simple new file mode 100644 index 000000000..68add63b9 --- /dev/null +++ b/samples/Javascript/clean/connection.js.simple @@ -0,0 +1,8 @@ +# Javascript/clean/connection.js +data/embedded/base64/terms +data/embedded/base64/url +encoding/base64 +fd/write +net/socket/send +ref/site/url +ref/words/password diff --git a/samples/Javascript/clean/napi_rs_runtime.js b/samples/Javascript/clean/napi_rs_runtime.js new file mode 100644 index 000000000..e06c158f4 --- /dev/null +++ b/samples/Javascript/clean/napi_rs_runtime.js @@ -0,0 +1,11538 @@ +/* eslint-disable no-undef */ +var _WebAssembly$1 = typeof WebAssembly !== 'undefined' + ? WebAssembly + : typeof WXWebAssembly !== 'undefined' + ? WXWebAssembly + : undefined; +function validateImports(imports) { + if (imports && typeof imports !== 'object') { + throw new TypeError('imports must be an object or undefined'); + } + return true; +} +function load(wasmInput, imports) { + if (!wasmInput) + throw new TypeError('Invalid wasm source'); + validateImports(imports); + imports = imports !== null && imports !== void 0 ? imports : {}; + // Promise + try { + var then = typeof wasmInput === 'object' && wasmInput !== null && 'then' in wasmInput ? wasmInput.then : undefined; + if (typeof then === 'function') { + return then.call(wasmInput, function (input) { return load(input, imports); }); + } + } + catch (_) { } + // BufferSource + if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) { + return _WebAssembly$1.instantiate(wasmInput, imports); + } + // WebAssembly.Module + if (wasmInput instanceof _WebAssembly$1.Module) { + return _WebAssembly$1.instantiate(wasmInput, imports).then(function (instance) { + return { instance: instance, module: wasmInput }; + }); + } + // Response + if (typeof Response !== 'undefined' && wasmInput instanceof Response) { + return wasmInput.arrayBuffer().then(function (buffer) { + return _WebAssembly$1.instantiate(buffer, imports); + }); + } + // string | URL + var inputIsString = typeof wasmInput === 'string'; + if (inputIsString || (typeof URL !== 'undefined' && wasmInput instanceof URL)) { + if (inputIsString && typeof wx !== 'undefined' && typeof __wxConfig !== 'undefined') { + return _WebAssembly$1.instantiate(wasmInput, imports); + } + if (typeof fetch !== 'function') { + throw new TypeError('wasm source can not be a string or URL in this environment'); + } + if (typeof _WebAssembly$1.instantiateStreaming === 'function') { + try { + return _WebAssembly$1.instantiateStreaming(fetch(wasmInput), imports).catch(function () { + return load(fetch(wasmInput), imports); + }); + } + catch (_) { + return load(fetch(wasmInput), imports); + } + } + else { + return load(fetch(wasmInput), imports); + } + } + throw new TypeError('Invalid wasm source'); +} +function loadSync(wasmInput, imports) { + if (!wasmInput) + throw new TypeError('Invalid wasm source'); + validateImports(imports); + imports = imports !== null && imports !== void 0 ? imports : {}; + var module; + if ((wasmInput instanceof ArrayBuffer) || ArrayBuffer.isView(wasmInput)) { + module = new _WebAssembly$1.Module(wasmInput); + } + else if (wasmInput instanceof WebAssembly.Module) { + module = wasmInput; + } + else { + throw new TypeError('Invalid wasm source'); + } + var instance = new _WebAssembly$1.Instance(module, imports); + var source = { instance: instance, module: module }; + return source; +} + +function createNapiModule(options) { + var napiModule = (function () { + var ENVIRONMENT_IS_NODE = null !== null ; + var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread); + var reuseWorker = Boolean(options.reuseWorker); + var wasmInstance; + var wasmModule; + var wasmMemory; + var wasmTable; + var _malloc; + var _free; + function abort(msg) { + if (typeof _WebAssembly$1.RuntimeError === 'function') { + throw new _WebAssembly$1.RuntimeError(msg); + } + throw Error(msg); + } + var napiModule = { + imports: { + env: {}, + napi: {}, + emnapi: {} + }, + exports: {}, + emnapi: {}, + loaded: false, + filename: '', + childThread: Boolean(options.childThread), + spawnThread: undefined, + startThread: undefined, + initWorker: undefined, + executeAsyncWork: undefined, + init: function (options) { + if (napiModule.loaded) + return napiModule.exports; + if (!options) + throw new TypeError('Invalid napi init options'); + var instance = options.instance; + if (!(instance === null || instance === void 0 ? void 0 : instance.exports)) + throw new TypeError('Invalid wasm instance'); + wasmInstance = instance; + var exports = instance.exports; + var module = options.module; + var memory = options.memory || exports.memory; + var table = options.table || exports.__indirect_function_table; + if (!(module instanceof _WebAssembly$1.Module)) + throw new TypeError('Invalid wasm module'); + if (!(memory instanceof _WebAssembly$1.Memory)) + throw new TypeError('Invalid wasm memory'); + if (!(table instanceof _WebAssembly$1.Table)) + throw new TypeError('Invalid wasm table'); + wasmModule = module; + wasmMemory = memory; + wasmTable = table; + if (typeof exports.malloc !== 'function') + throw new TypeError('malloc is not exported'); + if (typeof exports.free !== 'function') + throw new TypeError('free is not exported'); + _malloc = exports.malloc; + _free = exports.free; + if (!napiModule.childThread) { + // main thread only + var moduleApiVersion = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */; + var node_api_module_get_api_version_v1 = instance.exports.node_api_module_get_api_version_v1; + if (typeof node_api_module_get_api_version_v1 === 'function') { + moduleApiVersion = node_api_module_get_api_version_v1(); + } + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + var envObject = napiModule.envObject || (napiModule.envObject = emnapiCtx.createEnv(napiModule.filename, moduleApiVersion, function (cb) { return (wasmTable.get(cb)); }, function (cb) { return (wasmTable.get(cb)); }, abort, emnapiNodeBinding)); + var scope_1 = emnapiCtx.openScope(envObject); + try { + envObject.callIntoModule(function (_envObject) { + var exports = napiModule.exports; + var exportsHandle = scope_1.add(exports); + var napi_register_wasm_v1 = instance.exports.napi_register_wasm_v1; + var napiValue = napi_register_wasm_v1(_envObject.id, exportsHandle.id); + napiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue).value; + }); + } + finally { + emnapiCtx.closeScope(envObject, scope_1); + } + napiModule.loaded = true; + delete napiModule.envObject; + return napiModule.exports; + } + } + }; + var emnapiCtx; + var emnapiNodeBinding; + var onCreateWorker; + var err; + if (!ENVIRONMENT_IS_PTHREAD) { + var context = options.context; + if (typeof context !== 'object' || context === null) { + throw new TypeError("Invalid `options.context`. Use `import { getDefaultContext } from '@emnapi/runtime'`"); + } + emnapiCtx = context; + } + else { + emnapiCtx = options === null || options === void 0 ? void 0 : options.context; + var postMsg = typeof options.postMessage === 'function' + ? options.postMessage + : typeof postMessage === 'function' + ? postMessage + : undefined; + if (typeof postMsg !== 'function') { + throw new TypeError('No postMessage found'); + } + napiModule.postMessage = postMsg; + } + if (typeof options.filename === 'string') { + napiModule.filename = options.filename; + } + if (typeof options.onCreateWorker === 'function') { + onCreateWorker = options.onCreateWorker; + } + if (typeof options.print === 'function') { + options.print; + } + else { + console.log.bind(console); + } + if (typeof options.printErr === 'function') { + err = options.printErr; + } + else { + err = console.warn.bind(console); + } + if ('nodeBinding' in options) { + var nodeBinding = options.nodeBinding; + if (typeof nodeBinding !== 'object' || nodeBinding === null) { + throw new TypeError('Invalid `options.nodeBinding`. Use @emnapi/node-binding package'); + } + emnapiNodeBinding = nodeBinding; + } + var emnapiAsyncWorkPoolSize = 0; + if ('asyncWorkPoolSize' in options) { + if (typeof options.asyncWorkPoolSize !== 'number') { + throw new TypeError('options.asyncWorkPoolSize must be a integer'); + } + emnapiAsyncWorkPoolSize = options.asyncWorkPoolSize >> 0; + if (emnapiAsyncWorkPoolSize > 1024) { + emnapiAsyncWorkPoolSize = 1024; + } + else if (emnapiAsyncWorkPoolSize < -1024) { + emnapiAsyncWorkPoolSize = -1024; + } + } + var singleThreadAsyncWork = ENVIRONMENT_IS_PTHREAD ? false : (emnapiAsyncWorkPoolSize <= 0); + function _emnapi_async_work_pool_size() { + return Math.abs(emnapiAsyncWorkPoolSize); + } + napiModule.imports.env._emnapi_async_work_pool_size = _emnapi_async_work_pool_size; + // ------------------------------ pthread ------------------------------- + function emnapiAddSendListener(worker) { + if (!worker) + return false; + if (worker._emnapiSendListener) + return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__ && __emnapi__.type === 'async-send') { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ __emnapi__: __emnapi__ }); + } + else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var callback = __emnapi__.payload.callback; + (wasmTable.get(callback))(__emnapi__.payload.data); + } + } + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiSendListener; + }; + worker._emnapiSendListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); + } + return true; + } + napiModule.emnapi.addSendListener = emnapiAddSendListener; + function terminateWorker(worker) { + var tid = worker.__emnapi_tid; + worker.terminate(); + worker.onmessage = function (e) { + if (e.data.__emnapi__) { + err('received "' + e.data.__emnapi__.type + '" command from terminated worker: ' + tid); + } + }; + } + function spawnThread(startArg, errorOrTid) { + var isNewABI = errorOrTid !== undefined; + if (!isNewABI) { + errorOrTid = _malloc(8); + if (!errorOrTid) { + return -48; /* ENOMEM */ + } + } + var struct = new Int32Array(wasmMemory.buffer, errorOrTid, 2); + Atomics.store(struct, 0, 0); + Atomics.store(struct, 1, 0); + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_2 = napiModule.postMessage; + postMessage_2({ + __emnapi__: { + type: 'spawn-thread', + payload: { + startArg: startArg, + errorOrTid: errorOrTid + } + } + }); + Atomics.wait(struct, 1, 0); + var isError = Atomics.load(struct, 0); + var result = Atomics.load(struct, 1); + if (isNewABI) { + return isError; + } + _free(errorOrTid); + return isError ? -result : result; + } + var worker; + try { + worker = PThread.getNewWorker(); + if (!worker) { + throw new Error('failed to get new worker'); + } + } + catch (e) { + var EAGAIN = 6; + Atomics.store(struct, 0, 1); + Atomics.store(struct, 1, EAGAIN); + Atomics.notify(struct, 1); + err(e.message); + if (isNewABI) { + return 1; + } + _free(errorOrTid); + return -EAGAIN; + } + var tid = PThread.nextWorkerID + 43; + Atomics.store(struct, 0, 0); + Atomics.store(struct, 1, tid); + Atomics.notify(struct, 1); + var WASI_THREADS_MAX_TID = 0x1FFFFFFF; + PThread.nextWorkerID = (PThread.nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42); + PThread.pthreads[tid] = worker; + worker.__emnapi_tid = tid; + PThread.runningWorkers.push(worker); + worker.postMessage({ + __emnapi__: { + type: 'start', + payload: { + tid: tid, + arg: startArg + } + } + }); + if (isNewABI) { + return 0; + } + _free(errorOrTid); + return tid; + } + function startThread(tid, startArg) { + if (napiModule.childThread) { + if (typeof wasmInstance.exports.wasi_thread_start !== 'function') { + throw new TypeError('wasi_thread_start is not exported'); + } + var postMessage_3 = napiModule.postMessage; + wasmInstance.exports.wasi_thread_start(tid, startArg); + postMessage_3({ + __emnapi__: { + type: 'cleanup-thread', + payload: { + tid: tid + } + } + }); + } + else { + throw new Error('startThread is only available in child threads'); + } + } + napiModule.spawnThread = spawnThread; + napiModule.startThread = startThread; + var PThread = { + unusedWorkers: [], + runningWorkers: [], + pthreads: Object.create(null), + nextWorkerID: 0, + init: function () { }, + returnWorkerToPool: function (worker) { + var tid = worker.__emnapi_tid; + delete PThread.pthreads[tid]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + delete worker.__emnapi_tid; + }, + loadWasmModuleToWorker: function (worker) { + if (worker.whenLoaded) + return worker.whenLoaded; + worker.whenLoaded = new Promise(function (resolve, reject) { + worker.onmessage = function (e) { + if (e.data.__emnapi__) { + var type = e.data.__emnapi__.type; + var payload = e.data.__emnapi__.payload; + if (type === 'loaded') { + worker.loaded = true; + resolve(worker); + // if (payload.err) { + // err('failed to load in child thread: ' + (payload.err.message || payload.err)) + // } + } + else if (type === 'spawn-thread') { + spawnThread(payload.startArg, payload.errorOrTid); + } + else if (type === 'cleanup-thread') { + if (reuseWorker) { + PThread.returnWorkerToPool(worker); + } + else { + delete PThread.pthreads[payload.tid]; + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + terminateWorker(worker); + delete worker.__emnapi_tid; + } + } + } + }; + worker.onerror = function (e) { + var message = 'worker sent an error!'; + // if (worker.pthread_ptr) { + // message = 'Pthread ' + ptrToString(worker.pthread_ptr) + ' sent an error!' + // } + err(message + ' ' + e.message); + reject(e); + throw e; + }; + // napiModule.emnapi.addSendListener(worker) + emnapiAddSendListener(worker); + // if (typeof emnapiTSFN !== 'undefined') { + // emnapiTSFN.addListener(worker) + // } + try { + worker.postMessage({ + __emnapi__: { + type: 'load', + payload: { + wasmModule: wasmModule, + wasmMemory: wasmMemory + } + } + }); + } + catch (err) { + if (typeof SharedArrayBuffer === 'undefined' || !(wasmMemory.buffer instanceof SharedArrayBuffer)) { + throw new Error('Multithread features require shared wasm memory. ' + + 'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking'); + } + throw err; + } + }); + return worker.whenLoaded; + }, + allocateUnusedWorker: function () { + if (typeof onCreateWorker !== 'function') { + throw new TypeError('`options.onCreateWorker` is not provided'); + } + var worker = onCreateWorker({ type: 'thread' }); + PThread.unusedWorkers.push(worker); + return worker; + }, + getNewWorker: function () { + if (reuseWorker) { + if (PThread.unusedWorkers.length === 0) { + var worker_1 = PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(worker_1); + } + return PThread.unusedWorkers.pop(); + } + var worker = PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(worker); + return worker; + } + }; + /** + * @__sig ipiip + */ + function napi_set_last_error(env, error_code, engine_error_code, engine_reserved) { + var envObject = emnapiCtx.envStore.get(env); + return envObject.setLastError(error_code, engine_error_code, engine_reserved); + } + /** + * @__sig ip + */ + function napi_clear_last_error(env) { + var envObject = emnapiCtx.envStore.get(env); + return envObject.clearLastError(); + } + /** + * @__sig vppp + */ + function _emnapi_get_node_version(major, minor, patch) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var versions = [0, 0, 0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(major, versions[0], true); + HEAP_DATA_VIEW.setUint32(minor, versions[1], true); + HEAP_DATA_VIEW.setUint32(patch, versions[2], true); + } + /** + * @__sig v + * @__deps $runtimeKeepalivePush + */ + function _emnapi_runtime_keepalive_push() { + } + /** + * @__sig v + * @__deps $runtimeKeepalivePop + */ + function _emnapi_runtime_keepalive_pop() { + } + /** + * @__sig vpp + */ + function _emnapi_set_immediate(callback, data) { + emnapiCtx.feature.setImmediate(function () { + (wasmTable.get(callback))(data); + }); + } + /** + * @__sig vpp + */ + function _emnapi_next_tick(callback, data) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + Promise.resolve().then(function () { + (wasmTable.get(callback))(data); + }); + } + /** + * @__sig vipppi + */ + function _emnapi_callback_into_module(forceUncaught, env, callback, data, close_scope_if_throw) { + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + try { + envObject.callbackIntoModule(Boolean(forceUncaught), function () { + (wasmTable.get(callback))(env, data); + }); + } + catch (err) { + emnapiCtx.closeScope(envObject, scope); + if (close_scope_if_throw) { + emnapiCtx.closeScope(envObject); + } + throw err; + } + emnapiCtx.closeScope(envObject, scope); + } + /** + * @__sig vipppp + */ + function _emnapi_call_finalizer(forceUncaught, env, callback, data, hint) { + var envObject = emnapiCtx.envStore.get(env); + envObject.callFinalizerInternal(forceUncaught, callback, data, hint); + } + /** + * @__sig v + */ + function _emnapi_ctx_increase_waiting_request_counter() { + emnapiCtx.increaseWaitingRequestCounter(); + } + /** + * @__sig v + */ + function _emnapi_ctx_decrease_waiting_request_counter() { + emnapiCtx.decreaseWaitingRequestCounter(); + } + function $emnapiSetValueI64(result, numberValue) { + var tempDouble; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var tempI64 = [ + numberValue >>> 0, + (tempDouble = numberValue, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0) + ]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, tempI64[0], true); + HEAP_DATA_VIEW.setInt32(result + 4, tempI64[1], true); + } + var utilMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + $emnapiSetValueI64: $emnapiSetValueI64, + _emnapi_call_finalizer: _emnapi_call_finalizer, + _emnapi_callback_into_module: _emnapi_callback_into_module, + _emnapi_ctx_decrease_waiting_request_counter: _emnapi_ctx_decrease_waiting_request_counter, + _emnapi_ctx_increase_waiting_request_counter: _emnapi_ctx_increase_waiting_request_counter, + _emnapi_get_node_version: _emnapi_get_node_version, + _emnapi_next_tick: _emnapi_next_tick, + _emnapi_runtime_keepalive_pop: _emnapi_runtime_keepalive_pop, + _emnapi_runtime_keepalive_push: _emnapi_runtime_keepalive_push, + _emnapi_set_immediate: _emnapi_set_immediate, + napi_clear_last_error: napi_clear_last_error, + napi_set_last_error: napi_set_last_error + }); + function emnapiGetWorkerByPthreadPtr(pthreadPtr) { + var view = new DataView(wasmMemory.buffer); + /** + * wasi-sdk-20.0+threads + * + * struct pthread { + * struct pthread *self; // 0 + * struct pthread *prev, *next; // 4, 8 + * uintptr_t sysinfo; // 12 + * uintptr_t canary; // 16 + * int tid; // 20 + * // ... + * } + */ + var tidOffset = 20; + var tid = view.getInt32(pthreadPtr + tidOffset, true); + var worker = PThread.pthreads[tid]; + return worker; + } + /** @__sig vp */ + function _emnapi_worker_unref(pthreadPtr) { + if (ENVIRONMENT_IS_PTHREAD) + return; + var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); + if (worker && typeof worker.unref === 'function') { + worker.unref(); + } + } + /** @__sig vipp */ + function _emnapi_async_send_js(type, callback, data) { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ + __emnapi__: { + type: 'async-send', + payload: { + callback: callback, + data: data + } + } + }); + } + else { + switch (type) { + case 0: + _emnapi_set_immediate(callback, data); + break; + case 1: + _emnapi_next_tick(callback, data); + break; + } + } + } + // function ptrToString (ptr: number): string { + // return '0x' + ('00000000' + ptr.toString(16)).slice(-8) + // } + var uvThreadpoolReadyResolve; + var uvThreadpoolReady = new Promise(function (resolve) { + uvThreadpoolReadyResolve = function () { + uvThreadpoolReady.ready = true; + resolve(); + }; + }); + uvThreadpoolReady.ready = false; + /** @__sig i */ + function _emnapi_is_main_browser_thread() { + return (typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE) ? 1 : 0; + } + /** @__sig vppi */ + function _emnapi_after_uvthreadpool_ready(callback, q, type) { + if (uvThreadpoolReady.ready) { + (wasmTable.get(callback))(q, type); + } + else { + uvThreadpoolReady.then(function () { + (wasmTable.get(callback))(q, type); + }); + } + } + /** @__sig vpi */ + function _emnapi_tell_js_uvthreadpool(threads, size) { + var p = []; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var _loop_1 = function (i) { + var pthreadPtr = HEAP_DATA_VIEW.getInt32(threads + i * 4, true); + var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); + p.push(new Promise(function (resolve) { + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__ && __emnapi__.type === 'async-thread-ready') { + resolve(); + if (worker && typeof worker.unref === 'function') { + worker.unref(); + } + { + worker.removeEventListener('message', handler); + } + } + }; + { + worker.addEventListener('message', handler); + } + })); + }; + for (var i = 0; i < size; i++) { + _loop_1(i); + } + Promise.all(p).then(uvThreadpoolReadyResolve); + } + /** @__sig v */ + function _emnapi_emit_async_thread_ready() { + if (!ENVIRONMENT_IS_PTHREAD) + return; + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'async-thread-ready', + payload: {} + } + }); + } + var asyncMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_after_uvthreadpool_ready: _emnapi_after_uvthreadpool_ready, + _emnapi_async_send_js: _emnapi_async_send_js, + _emnapi_emit_async_thread_ready: _emnapi_emit_async_thread_ready, + _emnapi_is_main_browser_thread: _emnapi_is_main_browser_thread, + _emnapi_tell_js_uvthreadpool: _emnapi_tell_js_uvthreadpool, + _emnapi_worker_unref: _emnapi_worker_unref + }); + /* eslint-disable @typescript-eslint/indent */ + /** @__sig ipjp */ + function napi_adjust_external_memory(env, change_in_bytes, adjusted_value) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!adjusted_value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var change_in_bytes_number = Number(change_in_bytes); + if (change_in_bytes_number < 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var old_size = wasmMemory.buffer.byteLength; + var new_size = old_size + change_in_bytes_number; + new_size = new_size + ((65536 - new_size % 65536) % 65536); + if (wasmMemory.grow((new_size - old_size + 65535) >> 16) === -1) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (emnapiCtx.feature.supportBigInt) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setBigInt64(adjusted_value, BigInt(wasmMemory.buffer.byteLength), true); + } + else { + $emnapiSetValueI64(adjusted_value, wasmMemory.buffer.byteLength); + } + return envObject.clearLastError(); + } + var memoryMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_adjust_external_memory: napi_adjust_external_memory + }); + /** + * @__postset + * ``` + * emnapiAWST.init(); + * ``` + */ + var emnapiAWST = { + idGen: {}, + values: [undefined], + queued: new Set(), + pending: [], + init: function () { + var idGen = { + nextId: 1, + list: [], + generate: function () { + var id; + if (idGen.list.length) { + id = idGen.list.shift(); + } + else { + id = idGen.nextId; + idGen.nextId++; + } + return id; + }, + reuse: function (id) { + idGen.list.push(id); + } + }; + emnapiAWST.idGen = idGen; + emnapiAWST.values = [undefined]; + emnapiAWST.queued = new Set(); + emnapiAWST.pending = []; + }, + create: function (env, resource, resourceName, execute, complete, data) { + var asyncId = 0; + var triggerAsyncId = 0; + if (emnapiNodeBinding) { + var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resourceName, -1); + asyncId = asyncContext.asyncId; + triggerAsyncId = asyncContext.triggerAsyncId; + } + var id = emnapiAWST.idGen.generate(); + emnapiAWST.values[id] = { + env: env, + id: id, + resource: resource, + asyncId: asyncId, + triggerAsyncId: triggerAsyncId, + status: 0, + execute: execute, + complete: complete, + data: data + }; + return id; + }, + callComplete: function (work, status) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var complete = work.complete; + var env = work.env; + var data = work.data; + var callback = function () { + if (!complete) + return; + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + try { + envObject.callbackIntoModule(true, function () { + (wasmTable.get(complete))(env, status, data); + }); + } + finally { + emnapiCtx.closeScope(envObject, scope); + } + }; + if (emnapiNodeBinding) { + emnapiNodeBinding.node.makeCallback(work.resource, callback, [], { + asyncId: work.asyncId, + triggerAsyncId: work.triggerAsyncId + }); + } + else { + callback(); + } + }, + queue: function (id) { + var work = emnapiAWST.values[id]; + if (!work) + return; + if (work.status === 0) { + work.status = 1; + if (emnapiAWST.queued.size >= (Math.abs(emnapiAsyncWorkPoolSize) || 4)) { + emnapiAWST.pending.push(id); + return; + } + emnapiAWST.queued.add(id); + var env_1 = work.env; + var data_1 = work.data; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var execute = work.execute; + work.status = 2; + emnapiCtx.feature.setImmediate(function () { + (wasmTable.get(execute))(env_1, data_1); + emnapiAWST.queued.delete(id); + work.status = 3; + emnapiCtx.feature.setImmediate(function () { + emnapiAWST.callComplete(work, 0 /* napi_status.napi_ok */); + }); + if (emnapiAWST.pending.length > 0) { + var nextWorkId = emnapiAWST.pending.shift(); + emnapiAWST.values[nextWorkId].status = 0; + emnapiAWST.queue(nextWorkId); + } + }); + } + }, + cancel: function (id) { + var index = emnapiAWST.pending.indexOf(id); + if (index !== -1) { + var work_1 = emnapiAWST.values[id]; + if (work_1 && (work_1.status === 1)) { + work_1.status = 4; + emnapiAWST.pending.splice(index, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiAWST.callComplete(work_1, 11 /* napi_status.napi_cancelled */); + }); + return 0 /* napi_status.napi_ok */; + } + else { + return 9 /* napi_status.napi_generic_failure */; + } + } + return 9 /* napi_status.napi_generic_failure */; + }, + remove: function (id) { + var work = emnapiAWST.values[id]; + if (!work) + return; + if (emnapiNodeBinding) { + emnapiNodeBinding.node.emitAsyncDestroy({ + asyncId: work.asyncId, + triggerAsyncId: work.triggerAsyncId + }); + } + emnapiAWST.values[id] = undefined; + emnapiAWST.idGen.reuse(id); + } + }; + /** @__sig vppdp */ + function _emnapi_node_emit_async_init(async_resource, async_resource_name, trigger_async_id, result) { + if (!emnapiNodeBinding) + return; + var resource = emnapiCtx.handleStore.get(async_resource).value; + var resource_name = emnapiCtx.handleStore.get(async_resource_name).value; + var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resource_name, trigger_async_id); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var asyncId = asyncContext.asyncId; + var triggerAsyncId = asyncContext.triggerAsyncId; + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, asyncId, true); + HEAP_DATA_VIEW.setFloat64(result + 8, triggerAsyncId, true); + } + } + /** @__sig vdd */ + function _emnapi_node_emit_async_destroy(async_id, trigger_async_id) { + if (!emnapiNodeBinding) + return; + emnapiNodeBinding.node.emitAsyncDestroy({ + asyncId: async_id, + triggerAsyncId: trigger_async_id + }); + } + /* vpddp export function _emnapi_node_open_callback_scope (async_resource: napi_value, async_id: double, trigger_async_id: double, result: Pointer): void { + if (!emnapiNodeBinding || !result) return + const resource = emnapiCtx.handleStore.get(async_resource)!.value + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const nativeCallbackScopePointer = emnapiNodeBinding.node.openCallbackScope(resource, { + asyncId: async_id, + triggerAsyncId: trigger_async_id + }) + + from64('result') + $_TODO_makeSetValue('result', 0, 'nativeCallbackScopePointer', 'i64') + } + + vp + export function _emnapi_node_close_callback_scope (scope: Pointer): void { + if (!emnapiNodeBinding || !scope) return + from64('scope') + const nativeCallbackScopePointer = $_TODO_makeGetValue('scope', 0, 'i64') + emnapiNodeBinding.node.closeCallbackScope(BigInt(nativeCallbackScopePointer)) + } */ + /** @__sig ipppppddp */ + function _emnapi_node_make_callback(env, async_resource, cb, argv, size, async_id, trigger_async_id, result) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!emnapiNodeBinding) + return; + var resource = emnapiCtx.handleStore.get(async_resource).value; + var callback = emnapiCtx.handleStore.get(cb).value; + size = size >>> 0; + var arr = Array(size); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (; i < size; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + arr[i] = emnapiCtx.handleStore.get(argVal).value; + } + var ret = emnapiNodeBinding.node.makeCallback(resource, callback, arr, { + asyncId: async_id, + triggerAsyncId: trigger_async_id + }); + if (result) { + var envObject = emnapiCtx.envStore.get(env); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + } + /** @__sig ippp */ + function _emnapi_async_init_js(async_resource, async_resource_name, result) { + if (!emnapiNodeBinding) { + return 9 /* napi_status.napi_generic_failure */; + } + var resource; + if (async_resource) { + resource = Object(emnapiCtx.handleStore.get(async_resource).value); + } + var name = emnapiCtx.handleStore.get(async_resource_name).value; + var ret = emnapiNodeBinding.napi.asyncInit(resource, name); + if (ret.status !== 0) + return ret.status; + var numberValue = ret.value; + if (!((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63))))) { + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + if (numberValue >= (BigInt(1) << BigInt(63))) { + numberValue = numberValue - (BigInt(1) << BigInt(64)); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, low, true); + HEAP_DATA_VIEW.setInt32(result + 4, high, true); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ip */ + function _emnapi_async_destroy_js(async_context) { + if (!emnapiNodeBinding) { + return 9 /* napi_status.napi_generic_failure */; + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var low = HEAP_DATA_VIEW.getInt32(async_context, true); + var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); + var pointer = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); + var ret = emnapiNodeBinding.napi.asyncDestroy(pointer); + if (ret.status !== 0) + return ret.status; + return 0 /* napi_status.napi_ok */; + } + // https://github.com/nodejs/node-addon-api/pull/1283 + /** @__sig ipppp */ + function napi_open_callback_scope(env, ignored, async_context_handle, result) { + throw new Error('napi_open_callback_scope has not been implemented yet'); + } + /** @__sig ipp */ + function napi_close_callback_scope(env, scope) { + throw new Error('napi_close_callback_scope has not been implemented yet'); + } + /** @__sig ippppppp */ + function napi_make_callback(env, async_context, recv, func, argc, argv, result) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!emnapiNodeBinding) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!recv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v8recv = Object(emnapiCtx.handleStore.get(recv).value); + var v8func = emnapiCtx.handleStore.get(func).value; + if (typeof v8func !== 'function') { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var low = HEAP_DATA_VIEW.getInt32(async_context, true); + var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); + var ctx = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); + argc = argc >>> 0; + var arr = Array(argc); + for (; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + arr[i] = emnapiCtx.handleStore.get(argVal).value; + } + var ret = emnapiNodeBinding.napi.makeCallback(ctx, v8recv, v8func, arr); + if (ret.error) { + throw ret.error; + } + if (ret.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(ret.status); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(ret.value); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig vp */ + function _emnapi_env_check_gc_access(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + } + var nodeMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_async_destroy_js: _emnapi_async_destroy_js, + _emnapi_async_init_js: _emnapi_async_init_js, + _emnapi_env_check_gc_access: _emnapi_env_check_gc_access, + _emnapi_node_emit_async_destroy: _emnapi_node_emit_async_destroy, + _emnapi_node_emit_async_init: _emnapi_node_emit_async_init, + _emnapi_node_make_callback: _emnapi_node_make_callback, + napi_close_callback_scope: napi_close_callback_scope, + napi_make_callback: napi_make_callback, + napi_open_callback_scope: napi_open_callback_scope + }); + /** + * @__deps malloc + * @__deps free + * @__postset + * ``` + * emnapiTSFN.init(); + * ``` + */ + var emnapiTSFN = { + offset: { + /* napi_ref */ resource: 0, + /* double */ async_id: 8, + /* double */ trigger_async_id: 16, + /* size_t */ queue_size: 24, + /* void* */ queue: 1 * 4 + 24, + /* size_t */ thread_count: 2 * 4 + 24, + /* bool */ is_closing: 3 * 4 + 24, + /* atomic_uchar */ dispatch_state: 3 * 4 + 28, + /* void* */ context: 3 * 4 + 32, + /* size_t */ max_queue_size: 4 * 4 + 32, + /* napi_ref */ ref: 5 * 4 + 32, + /* napi_env */ env: 6 * 4 + 32, + /* void* */ finalize_data: 7 * 4 + 32, + /* napi_finalize */ finalize_cb: 8 * 4 + 32, + /* napi_threadsafe_function_call_js */ call_js_cb: 9 * 4 + 32, + /* bool */ handles_closing: 10 * 4 + 32, + /* bool */ async_ref: 10 * 4 + 36, + /* int32_t */ mutex: 10 * 4 + 40, + /* int32_t */ cond: 10 * 4 + 44, + end: 10 * 4 + 48 + }, + init: function () { + if (typeof PThread !== 'undefined') { + PThread.unusedWorkers.forEach(emnapiTSFN.addListener); + PThread.runningWorkers.forEach(emnapiTSFN.addListener); + var __original_getNewWorker_1 = PThread.getNewWorker; + PThread.getNewWorker = function () { + var r = __original_getNewWorker_1.apply(this, arguments); + emnapiTSFN.addListener(r); + return r; + }; + } + }, + addListener: function (worker) { + if (!worker) + return false; + if (worker._emnapiTSFNListener) + return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__) { + var type = __emnapi__.type; + var payload = __emnapi__.payload; + if (type === 'tsfn-send') { + emnapiTSFN.dispatch(payload.tsfn); + } + } + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiTSFNListener; + }; + worker._emnapiTSFNListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); + } + return true; + }, + initQueue: function (func) { + var size = 2 * 4; + var queue = _malloc(size); + if (!queue) + return false; + new Uint8Array(wasmMemory.buffer, queue, size).fill(0); + emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false); + return true; + }, + destroyQueue: function (func) { + var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); + if (queue) { + _free(queue); + } + }, + pushQueue: function (func, data) { + var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); + var head = emnapiTSFN.loadSizeTypeValue(queue, false); + var tail = emnapiTSFN.loadSizeTypeValue(queue + 4, false); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var size = 2 * 4; + var node = _malloc(size); + if (!node) + throw new Error('OOM'); + emnapiTSFN.storeSizeTypeValue(node, data, false); + emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); + if (head === 0 && tail === 0) { + emnapiTSFN.storeSizeTypeValue(queue, node, false); + emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); + } + else { + emnapiTSFN.storeSizeTypeValue(tail + 4, node, false); + emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); + } + emnapiTSFN.addQueueSize(func); + }, + shiftQueue: function (func) { + var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); + var head = emnapiTSFN.loadSizeTypeValue(queue, false); + if (head === 0) + return 0; + var node = head; + var next = emnapiTSFN.loadSizeTypeValue(head + 4, false); + emnapiTSFN.storeSizeTypeValue(queue, next, false); + if (next === 0) { + emnapiTSFN.storeSizeTypeValue(queue + 4, 0, false); + } + emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); + var value = emnapiTSFN.loadSizeTypeValue(node, false); + _free(node); + emnapiTSFN.subQueueSize(func); + return value; + }, + push: function (func, data, mode) { + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + var waitCondition = function () { + var queueSize = emnapiTSFN.getQueueSize(func); + var maxSize = emnapiTSFN.getMaxQueueSize(func); + var isClosing = emnapiTSFN.getIsClosing(func); + return queueSize >= maxSize && maxSize > 0 && !isClosing; + }; + var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE; + return mutex.execute(function () { + while (waitCondition()) { + if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) { + return 15 /* napi_status.napi_queue_full */; + } + /** + * Browser JS main thread can not use `Atomics.wait` + * + * Related: + * https://github.com/nodejs/node/pull/32689 + * https://github.com/nodejs/node/pull/33453 + */ + if (isBrowserMain) { + return 21 /* napi_status.napi_would_deadlock */; + } + cond.wait(); + } + if (emnapiTSFN.getIsClosing(func)) { + if (emnapiTSFN.getThreadCount(func) === 0) { + return 1 /* napi_status.napi_invalid_arg */; + } + else { + emnapiTSFN.subThreadCount(func); + return 16 /* napi_status.napi_closing */; + } + } + else { + emnapiTSFN.pushQueue(func, data); + emnapiTSFN.send(func); + return 0 /* napi_status.napi_ok */; + } + }); + }, + getMutex: function (func) { + var index = func + emnapiTSFN.offset.mutex; + var mutex = { + lock: function () { + var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE; + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + if (isBrowserMain) { + while (true) { + var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); + if (oldValue === 0) { + return; + } + } + } + else { + while (true) { + var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); + if (oldValue === 0) { + return; + } + Atomics.wait(i32a, 0, 1); + } + } + }, + /* lockAsync () { + return new Promise(resolve => { + const again = (): void => { fn() } + const fn = (): void => { + const i32a = new Int32Array(wasmMemory.buffer, index, 1) + const oldValue = Atomics.compareExchange(i32a, 0, 0, 1) + if (oldValue === 0) { + resolve() + return + } + (Atomics as any).waitAsync(i32a, 0, 1).value.then(again) + } + fn() + }) + }, */ + unlock: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + var oldValue = Atomics.compareExchange(i32a, 0, 1, 0); + if (oldValue !== 1) { + throw new Error('Tried to unlock while not holding the mutex'); + } + Atomics.notify(i32a, 0, 1); + }, + execute: function (fn) { + mutex.lock(); + try { + return fn(); + } + finally { + mutex.unlock(); + } + } /* , + executeAsync (fn: () => Promise): Promise { + return mutex.lockAsync().then(() => { + const r = fn() + mutex.unlock() + return r + }, (err) => { + mutex.unlock() + throw err + }) + } */ + }; + return mutex; + }, + getCond: function (func) { + var index = func + emnapiTSFN.offset.cond; + var mutex = emnapiTSFN.getMutex(func); + var cond = { + wait: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + var value = Atomics.load(i32a, 0); + mutex.unlock(); + Atomics.wait(i32a, 0, value); + mutex.lock(); + }, + /* waitAsync () { + const i32a = new Int32Array(wasmMemory.buffer, index, 1) + const value = Atomics.load(i32a, 0) + mutex.unlock() + const lock = (): Promise => mutex.lockAsync() + try { + return (Atomics as any).waitAsync(i32a, 0, value).value.then(lock, lock) + } catch (err) { + return lock() + } + }, */ + signal: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + Atomics.add(i32a, 0, 1); + Atomics.notify(i32a, 0, 1); + } + }; + return cond; + }, + getQueueSize: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue_size, true); + }, + addQueueSize: function (func) { + var offset = emnapiTSFN.offset.queue_size; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.add(arr, index, 1); + }, + subQueueSize: function (func) { + var offset = emnapiTSFN.offset.queue_size; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.sub(arr, index, 1); + }, + getThreadCount: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.thread_count, true); + }, + addThreadCount: function (func) { + var offset = emnapiTSFN.offset.thread_count; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.add(arr, index, 1); + }, + subThreadCount: function (func) { + var offset = emnapiTSFN.offset.thread_count; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.sub(arr, index, 1); + }, + getIsClosing: function (func) { + return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2); + }, + setIsClosing: function (func, value) { + Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2, value); + }, + getHandlesClosing: function (func) { + return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2); + }, + setHandlesClosing: function (func, value) { + Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2, value); + }, + getDispatchState: function (func) { + return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2); + }, + getContext: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false); + }, + getMaxQueueSize: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.max_queue_size, true); + }, + getEnv: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.env, false); + }, + getCallJSCb: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.call_js_cb, false); + }, + getRef: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.ref, false); + }, + getResource: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.resource, false); + }, + getFinalizeCb: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_cb, false); + }, + getFinalizeData: function (func) { + return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_data, false); + }, + loadSizeTypeValue: function (offset, unsigned) { + var ret; + var arr; + if (unsigned) { + arr = new Uint32Array(wasmMemory.buffer); + ret = Atomics.load(arr, offset >> 2); + return ret; + } + else { + arr = new Int32Array(wasmMemory.buffer); + ret = Atomics.load(arr, offset >> 2); + return ret; + } + }, + storeSizeTypeValue: function (offset, value, unsigned) { + var arr; + if (unsigned) { + arr = new Uint32Array(wasmMemory.buffer); + Atomics.store(arr, offset >> 2, value); + return undefined; + } + else { + arr = new Int32Array(wasmMemory.buffer); + Atomics.store(arr, offset >> 2, value >>> 0); + return undefined; + } + }, + destroy: function (func) { + emnapiTSFN.destroyQueue(func); + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + var ref = emnapiTSFN.getRef(func); + if (ref) { + emnapiCtx.refStore.get(ref).dispose(); + } + emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func); + envObject.unref(); + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 0); + emnapiCtx.decreaseWaitingRequestCounter(); + } + var resource = emnapiTSFN.getResource(func); + emnapiCtx.refStore.get(resource).dispose(); + if (emnapiNodeBinding) { + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true); + var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true); + _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); + } + _free(func); + }, + emptyQueueAndDelete: function (func) { + var callJsCb = emnapiTSFN.getCallJSCb(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var data; + while (emnapiTSFN.getQueueSize(func) > 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + data = emnapiTSFN.shiftQueue(func); + if (callJsCb) { + (wasmTable.get(callJsCb))(0, 0, context, data); + } + } + emnapiTSFN.destroy(func); + }, + finalize: function (func) { + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject); + var finalize = emnapiTSFN.getFinalizeCb(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data = emnapiTSFN.getFinalizeData(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var f = function () { + envObject.callFinalizerInternal(0, finalize, data, context); + }; + try { + if (finalize) { + if (emnapiNodeBinding) { + var resource = emnapiTSFN.getResource(func); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true); + var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true); + emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { + asyncId: asyncId, + triggerAsyncId: triggerAsyncId + }); + } + else { + f(); + } + } + emnapiTSFN.emptyQueueAndDelete(func); + } + finally { + emnapiCtx.closeScope(envObject); + } + }, + cleanup: function (func) { + emnapiTSFN.closeHandlesAndMaybeDelete(func, 1); + }, + closeHandlesAndMaybeDelete: function (func, set_closing) { + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject); + try { + if (set_closing) { + emnapiTSFN.getMutex(func).execute(function () { + emnapiTSFN.setIsClosing(func, 1); + if (emnapiTSFN.getMaxQueueSize(func) > 0) { + emnapiTSFN.getCond(func).signal(); + } + }); + } + if (emnapiTSFN.getHandlesClosing(func)) { + return; + } + emnapiTSFN.setHandlesClosing(func, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiTSFN.finalize(func); + }); + } + finally { + emnapiCtx.closeScope(envObject); + } + }, + dispatchOne: function (func) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data = 0; + var popped_value = false; + var has_more = false; + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + mutex.execute(function () { + if (emnapiTSFN.getIsClosing(func)) { + emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); + } + else { + var size = emnapiTSFN.getQueueSize(func); + if (size > 0) { + data = emnapiTSFN.shiftQueue(func); + popped_value = true; + var maxQueueSize = emnapiTSFN.getMaxQueueSize(func); + if (size === maxQueueSize && maxQueueSize > 0) { + cond.signal(); + } + size--; + } + if (size === 0) { + if (emnapiTSFN.getThreadCount(func) === 0) { + emnapiTSFN.setIsClosing(func, 1); + if (emnapiTSFN.getMaxQueueSize(func) > 0) { + cond.signal(); + } + emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); + } + } + else { + has_more = true; + } + } + }); + if (popped_value) { + var env = emnapiTSFN.getEnv(func); + var envObject_1 = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject_1); + var f = function () { + envObject_1.callbackIntoModule(false, function () { + var callJsCb = emnapiTSFN.getCallJSCb(func); + var ref = emnapiTSFN.getRef(func); + var js_callback = ref ? emnapiCtx.refStore.get(ref).get() : 0; + if (callJsCb) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + (wasmTable.get(callJsCb))(env, js_callback, context, data); + } + else { + var jsCallback = js_callback ? emnapiCtx.handleStore.get(js_callback).value : null; + if (typeof jsCallback === 'function') { + jsCallback(); + } + } + }); + }; + try { + if (emnapiNodeBinding) { + var resource = emnapiTSFN.getResource(func); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { + asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true), + triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true) + }); + } + else { + f(); + } + } + finally { + emnapiCtx.closeScope(envObject_1); + } + } + return has_more; + }, + dispatch: function (func) { + var has_more = true; + var iterations_left = 1000; + var ui32a = new Uint32Array(wasmMemory.buffer); + var index = (func + emnapiTSFN.offset.dispatch_state) >> 2; + while (has_more && --iterations_left !== 0) { + Atomics.store(ui32a, index, 1); + has_more = emnapiTSFN.dispatchOne(func); + if (Atomics.exchange(ui32a, index, 0) !== 1) { + has_more = true; + } + } + if (has_more) { + emnapiTSFN.send(func); + } + }, + send: function (func) { + var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2, 1 << 1); + if ((current_state & 1) === 1) { + return; + } + if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) { + postMessage({ + __emnapi__: { + type: 'tsfn-send', + payload: { + tsfn: func + } + } + }); + } + else { + emnapiCtx.feature.setImmediate(function () { + emnapiTSFN.dispatch(func); + }); + } + } + }; + /** @__sig ippppppppppp */ + function napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size, initial_thread_count, thread_finalize_data, thread_finalize_cb, context, call_js_cb, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!async_resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + max_queue_size = max_queue_size >>> 0; + initial_thread_count = initial_thread_count >>> 0; + if (initial_thread_count === 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var ref = 0; + if (!func) { + if (!call_js_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + else { + var funcValue = emnapiCtx.handleStore.get(func).value; + if (typeof funcValue !== 'function') { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ref = emnapiCtx.createReference(envObject, func, 1, 1 /* Ownership.kUserland */).id; + } + var asyncResourceObject; + if (async_resource) { + asyncResourceObject = emnapiCtx.handleStore.get(async_resource).value; + if (asyncResourceObject == null) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + asyncResourceObject = Object(asyncResourceObject); + } + else { + asyncResourceObject = {}; + } + var resource = envObject.ensureHandleId(asyncResourceObject); + var asyncResourceName = emnapiCtx.handleStore.get(async_resource_name).value; + if (typeof asyncResourceName === 'symbol') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + asyncResourceName = String(asyncResourceName); + var resource_name = envObject.ensureHandleId(asyncResourceName); + // tsfn create + var sizeofTSFN = emnapiTSFN.offset.end; + var tsfn = _malloc(sizeofTSFN); + if (!tsfn) + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0); + var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* Ownership.kUserland */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var resource_ = resourceRef.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(tsfn, resource_, true); + if (!emnapiTSFN.initQueue(tsfn)) { + _free(tsfn); + resourceRef.dispose(); + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + _emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id); + HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.thread_count, initial_thread_count, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.context, context, true); + HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.max_queue_size, max_queue_size, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.ref, ref, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.env, env, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_data, thread_finalize_data, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_cb, thread_finalize_cb, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.call_js_cb, call_js_cb, true); + emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn); + envObject.ref(); + emnapiCtx.increaseWaitingRequestCounter(); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.async_ref, 1, true); + HEAP_DATA_VIEW.setInt32(result, tsfn, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_threadsafe_function_context(func, result) { + if (!func || !result) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, context, true); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ippi */ + function napi_call_threadsafe_function(func, data, mode) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + return emnapiTSFN.push(func, data, mode); + } + /** @__sig ip */ + function napi_acquire_threadsafe_function(func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var mutex = emnapiTSFN.getMutex(func); + return mutex.execute(function () { + if (emnapiTSFN.getIsClosing(func)) { + return 16 /* napi_status.napi_closing */; + } + emnapiTSFN.addThreadCount(func); + return 0 /* napi_status.napi_ok */; + }); + } + /** @__sig ipi */ + function napi_release_threadsafe_function(func, mode) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + return mutex.execute(function () { + if (emnapiTSFN.getThreadCount(func) === 0) { + return 1 /* napi_status.napi_invalid_arg */; + } + emnapiTSFN.subThreadCount(func); + if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) { + var isClosing = emnapiTSFN.getIsClosing(func); + if (!isClosing) { + var isClosingValue = (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) ? 1 : 0; + emnapiTSFN.setIsClosing(func, isClosingValue); + if (isClosingValue && emnapiTSFN.getMaxQueueSize(func) > 0) { + cond.signal(); + } + emnapiTSFN.send(func); + } + } + return 0 /* napi_status.napi_ok */; + }); + } + /** @__sig ipp */ + function napi_unref_threadsafe_function(env, func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 0); + emnapiCtx.decreaseWaitingRequestCounter(); + } + return 0 /* napi_status.napi_ok */; + } + /** @__sig ipp */ + function napi_ref_threadsafe_function(env, func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (!Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 1); + emnapiCtx.increaseWaitingRequestCounter(); + } + return 0 /* napi_status.napi_ok */; + } + var emnapiAWMT = { + unusedWorkers: [], + runningWorkers: [], + workQueue: [], + workerReady: null, + offset: { + /* napi_ref */ resource: 0, + /* double */ async_id: 8, + /* double */ trigger_async_id: 16, + /* napi_env */ env: 24, + /* void* */ data: 1 * 4 + 24, + /* napi_async_execute_callback */ execute: 2 * 4 + 24, + /* napi_async_complete_callback */ complete: 3 * 4 + 24, + end: 4 * 4 + 24 + }, + init: function () { + emnapiAWMT.unusedWorkers = []; + emnapiAWMT.runningWorkers = []; + emnapiAWMT.workQueue = []; + emnapiAWMT.workerReady = null; + }, + addListener: function (worker) { + if (!worker) + return false; + if (worker._emnapiAWMTListener) + return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__) { + var type = __emnapi__.type; + var payload = __emnapi__.payload; + if (type === 'async-work-complete') { + emnapiCtx.decreaseWaitingRequestCounter(); + emnapiAWMT.runningWorkers.splice(emnapiAWMT.runningWorkers.indexOf(worker), 1); + emnapiAWMT.unusedWorkers.push(worker); + emnapiAWMT.checkIdleWorker(); + emnapiAWMT.callComplete(payload.work, 0 /* napi_status.napi_ok */); + } + else if (type === 'async-work-queue') { + emnapiAWMT.scheduleWork(payload.work); + } + else if (type === 'async-work-cancel') { + emnapiAWMT.cancelWork(payload.work); + } + } + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiAWMTListener; + }; + worker._emnapiAWMTListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); + } + return true; + }, + initWorkers: function (n) { + if (ENVIRONMENT_IS_PTHREAD) { + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + return emnapiAWMT.workerReady || (emnapiAWMT.workerReady = Promise.resolve()); + } + if (emnapiAWMT.workerReady) + return emnapiAWMT.workerReady; + if (typeof onCreateWorker !== 'function') { + throw new TypeError('`options.onCreateWorker` is not a function'); + } + var promises = []; + var args = []; + if (!('emnapi_async_worker_create' in wasmInstance.exports)) { + throw new TypeError('`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags'); + } + for (var i = 0; i < n; ++i) { + args.push(wasmInstance.exports.emnapi_async_worker_create()); + } + try { + var _loop_1 = function (i) { + var worker = onCreateWorker({ type: 'async-work' }); + var p = PThread.loadWasmModuleToWorker(worker); + emnapiAWMT.addListener(worker); + promises.push(p.then(function () { + if (typeof worker.unref === 'function') { + worker.unref(); + } + })); + emnapiAWMT.unusedWorkers.push(worker); + var arg = args[i]; + worker.threadBlockBase = arg; + worker.postMessage({ + __emnapi__: { + type: 'async-worker-init', + payload: { arg: arg } + } + }); + }; + for (var i = 0; i < n; ++i) { + _loop_1(i); + } + } + catch (err) { + for (var i = 0; i < n; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var arg = args[i]; + _free(arg); + } + throw err; + } + emnapiAWMT.workerReady = Promise.all(promises); + return emnapiAWMT.workerReady; + }, + checkIdleWorker: function () { + if (emnapiAWMT.unusedWorkers.length > 0 && emnapiAWMT.workQueue.length > 0) { + var worker = emnapiAWMT.unusedWorkers.shift(); + var work = emnapiAWMT.workQueue.shift(); + emnapiAWMT.runningWorkers.push(worker); + worker.postMessage({ + __emnapi__: { + type: 'async-work-execute', + payload: { work: work } + } + }); + } + }, + getResource: function (work) { + return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.resource, false); + }, + getExecute: function (work) { + return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.execute, false); + }, + getComplete: function (work) { + return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.complete, false); + }, + getEnv: function (work) { + return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.env, false); + }, + getData: function (work) { + return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.data, false); + }, + scheduleWork: function (work) { + var _a; + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ + __emnapi__: { + type: 'async-work-queue', + payload: { work: work } + } + }); + return; + } + emnapiCtx.increaseWaitingRequestCounter(); + emnapiAWMT.workQueue.push(work); + if ((_a = emnapiAWMT.workerReady) === null || _a === void 0 ? void 0 : _a.ready) { + emnapiAWMT.checkIdleWorker(); + } + else { + var fail = function (err) { + emnapiCtx.decreaseWaitingRequestCounter(); + throw err; + }; + try { + emnapiAWMT.initWorkers(_emnapi_async_work_pool_size()).then(function () { + emnapiAWMT.workerReady.ready = true; + emnapiAWMT.checkIdleWorker(); + }, fail); + } + catch (err) { + fail(err); + } + } + }, + cancelWork: function (work) { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_2 = napiModule.postMessage; + postMessage_2({ + __emnapi__: { + type: 'async-work-cancel', + payload: { work: work } + } + }); + return 0 /* napi_status.napi_ok */; + } + var index = emnapiAWMT.workQueue.indexOf(work); + if (index !== -1) { + emnapiAWMT.workQueue.splice(index, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiCtx.decreaseWaitingRequestCounter(); + emnapiAWMT.checkIdleWorker(); + emnapiAWMT.callComplete(work, 11 /* napi_status.napi_cancelled */); + }); + return 0 /* napi_status.napi_ok */; + } + return 9 /* napi_status.napi_generic_failure */; + }, + callComplete: function (work, status) { + var complete = emnapiAWMT.getComplete(work); + var env = emnapiAWMT.getEnv(work); + var data = emnapiAWMT.getData(work); + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + var callback = function () { + if (!complete) + return; + envObject.callbackIntoModule(true, function () { + (wasmTable.get(complete))(env, status, data); + }); + }; + try { + if (emnapiNodeBinding) { + var resource = emnapiAWMT.getResource(work); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true); + var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true); + emnapiNodeBinding.node.makeCallback(resourceObject, callback, [], { + asyncId: asyncId, + triggerAsyncId: triggerAsyncId + }); + } + else { + callback(); + } + } + finally { + emnapiCtx.closeScope(envObject, scope); + } + } + }; + /** @__sig ippppppp */ + var napi_create_async_work = singleThreadAsyncWork + ? function (env, resource, resource_name, execute, complete, data, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!execute) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceObject; + if (resource) { + resourceObject = Object(emnapiCtx.handleStore.get(resource).value); + } + else { + resourceObject = {}; + } + if (!resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceName = String(emnapiCtx.handleStore.get(resource_name).value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var id = emnapiAWST.create(env, resourceObject, resourceName, execute, complete, data); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, id, true); + return envObject.clearLastError(); + } + : function (env, resource, resource_name, execute, complete, data, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!execute) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceObject; + if (resource) { + resourceObject = Object(emnapiCtx.handleStore.get(resource).value); + } + else { + resourceObject = {}; + } + if (!resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var sizeofAW = emnapiAWMT.offset.end; + var aw = _malloc(sizeofAW); + if (!aw) + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0); + var s = envObject.ensureHandleId(resourceObject); + var resourceRef = emnapiCtx.createReference(envObject, s, 1, 1 /* Ownership.kUserland */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var resource_ = resourceRef.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(aw, resource_, true); + _emnapi_node_emit_async_init(s, resource_name, -1, aw + emnapiAWMT.offset.async_id); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.env, env, true); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.execute, execute, true); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.complete, complete, true); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.data, data, true); + HEAP_DATA_VIEW.setInt32(result, aw, true); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_delete_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWST.remove(work); + return envObject.clearLastError(); + } + : function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resource = emnapiAWMT.getResource(work); + emnapiCtx.refStore.get(resource).dispose(); + if (emnapiNodeBinding) { + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true); + var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true); + _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); + } + _free(work); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_queue_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWST.queue(work); + return envObject.clearLastError(); + } + : function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWMT.scheduleWork(work); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_cancel_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = emnapiAWST.cancel(work); + if (status === 0 /* napi_status.napi_ok */) + return envObject.clearLastError(); + return envObject.setLastError(status); + } + : function (env, work) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = emnapiAWMT.cancelWork(work); + if (status === 0 /* napi_status.napi_ok */) + return envObject.clearLastError(); + return envObject.setLastError(status); + }; + function initWorker(startArg) { + if (napiModule.childThread) { + if (typeof wasmInstance.exports.emnapi_async_worker_init !== 'function') { + throw new TypeError('`emnapi_async_worker_init` is not exported, please try to add `--export=emnapi_async_worker_init` to linker flags'); + } + wasmInstance.exports.emnapi_async_worker_init(startArg); + } + else { + throw new Error('startThread is only available in child threads'); + } + } + function executeAsyncWork(work) { + if (!ENVIRONMENT_IS_PTHREAD) + return; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var execute = emnapiAWMT.getExecute(work); + var env = emnapiAWMT.getEnv(work); + var data = emnapiAWMT.getData(work); + (wasmTable.get(execute))(env, data); + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'async-work-complete', + payload: { work: work } + } + }); + } + napiModule.initWorker = initWorker; + napiModule.executeAsyncWork = executeAsyncWork; + var asyncWorkMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_cancel_async_work: napi_cancel_async_work, + napi_create_async_work: napi_create_async_work, + napi_delete_async_work: napi_delete_async_work, + napi_queue_async_work: napi_queue_async_work + }); + /** + * @__deps malloc + * @__deps free + * @__postset + * ``` + * emnapiExternalMemory.init(); + * ``` + */ + var emnapiExternalMemory = { + registry: typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined, + table: new WeakMap(), + wasmMemoryViewTable: new WeakMap(), + init: function () { + emnapiExternalMemory.registry = typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined; + emnapiExternalMemory.table = new WeakMap(); + emnapiExternalMemory.wasmMemoryViewTable = new WeakMap(); + }, + isDetachedArrayBuffer: function (arrayBuffer) { + if (arrayBuffer.byteLength === 0) { + try { + // eslint-disable-next-line no-new + new Uint8Array(arrayBuffer); + } + catch (_) { + return true; + } + } + return false; + }, + getArrayBufferPointer: function (arrayBuffer, shouldCopy) { + var _a; + var info = { + address: 0, + ownership: 0 /* Ownership.kRuntime */, + runtimeAllocated: 0 + }; + if (arrayBuffer === wasmMemory.buffer) { + return info; + } + var isDetached = emnapiExternalMemory.isDetachedArrayBuffer(arrayBuffer); + if (emnapiExternalMemory.table.has(arrayBuffer)) { + var cachedInfo = emnapiExternalMemory.table.get(arrayBuffer); + if (isDetached) { + cachedInfo.address = 0; + return cachedInfo; + } + if (shouldCopy && cachedInfo.ownership === 0 /* Ownership.kRuntime */ && cachedInfo.runtimeAllocated === 1) { + new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), cachedInfo.address); + } + return cachedInfo; + } + if (isDetached || (arrayBuffer.byteLength === 0)) { + return info; + } + if (!shouldCopy) { + return info; + } + var pointer = _malloc(arrayBuffer.byteLength); + if (!pointer) + throw new Error('Out of memory'); + new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), pointer); + info.address = pointer; + info.ownership = emnapiExternalMemory.registry ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */; + info.runtimeAllocated = 1; + emnapiExternalMemory.table.set(arrayBuffer, info); + (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(arrayBuffer, pointer); + return info; + }, + getOrUpdateMemoryView: function (view) { + if (view.buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(view)) { + emnapiExternalMemory.wasmMemoryViewTable.set(view, { + Ctor: view.constructor, + address: view.byteOffset, + length: view instanceof DataView ? view.byteLength : view.length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0 + }); + } + return view; + } + var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || + ((typeof SharedArrayBuffer === 'function') && (view.buffer instanceof SharedArrayBuffer)); + if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) { + var info = emnapiExternalMemory.wasmMemoryViewTable.get(view); + var Ctor = info.Ctor; + var newView = void 0; + var Buffer = emnapiCtx.feature.Buffer; + if (typeof Buffer === 'function' && Ctor === Buffer) { + newView = Buffer.from(wasmMemory.buffer, info.address, info.length); + } + else { + newView = new Ctor(wasmMemory.buffer, info.address, info.length); + } + emnapiExternalMemory.wasmMemoryViewTable.set(newView, info); + return newView; + } + return view; + }, + getViewPointer: function (view, shouldCopy) { + view = emnapiExternalMemory.getOrUpdateMemoryView(view); + if (view.buffer === wasmMemory.buffer) { + if (emnapiExternalMemory.wasmMemoryViewTable.has(view)) { + var _a = emnapiExternalMemory.wasmMemoryViewTable.get(view), address_1 = _a.address, ownership_1 = _a.ownership, runtimeAllocated_1 = _a.runtimeAllocated; + return { address: address_1, ownership: ownership_1, runtimeAllocated: runtimeAllocated_1, view: view }; + } + return { address: view.byteOffset, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0, view: view }; + } + var _b = emnapiExternalMemory.getArrayBufferPointer(view.buffer, shouldCopy), address = _b.address, ownership = _b.ownership, runtimeAllocated = _b.runtimeAllocated; + return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view }; + } + }; + /* eslint-disable @typescript-eslint/indent */ + /** + * @__postset + * ``` + * emnapiString.init(); + * ``` + */ + var emnapiString = { + utf8Decoder: undefined, + utf16Decoder: undefined, + init: function () { + var fallbackDecoder = { + decode: function (bytes) { + var inputIndex = 0; + var pendingSize = Math.min(0x1000, bytes.length + 1); + var pending = new Uint16Array(pendingSize); + var chunks = []; + var pendingIndex = 0; + for (;;) { + var more = inputIndex < bytes.length; + if (!more || (pendingIndex >= pendingSize - 1)) { + var subarray = pending.subarray(0, pendingIndex); + var arraylike = subarray; + chunks.push(String.fromCharCode.apply(null, arraylike)); + if (!more) { + return chunks.join(''); + } + bytes = bytes.subarray(inputIndex); + inputIndex = 0; + pendingIndex = 0; + } + var byte1 = bytes[inputIndex++]; + if ((byte1 & 0x80) === 0) { + pending[pendingIndex++] = byte1; + } + else if ((byte1 & 0xe0) === 0xc0) { + var byte2 = bytes[inputIndex++] & 0x3f; + pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2; + } + else if ((byte1 & 0xf0) === 0xe0) { + var byte2 = bytes[inputIndex++] & 0x3f; + var byte3 = bytes[inputIndex++] & 0x3f; + pending[pendingIndex++] = ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3; + } + else if ((byte1 & 0xf8) === 0xf0) { + var byte2 = bytes[inputIndex++] & 0x3f; + var byte3 = bytes[inputIndex++] & 0x3f; + var byte4 = bytes[inputIndex++] & 0x3f; + var codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4; + if (codepoint > 0xffff) { + codepoint -= 0x10000; + pending[pendingIndex++] = (codepoint >>> 10) & 0x3ff | 0xd800; + codepoint = 0xdc00 | codepoint & 0x3ff; + } + pending[pendingIndex++] = codepoint; + } + else ; + } + } + }; + var utf8Decoder; + utf8Decoder = typeof TextDecoder === 'function' ? new TextDecoder() : fallbackDecoder; + emnapiString.utf8Decoder = utf8Decoder; + var fallbackDecoder2 = { + decode: function (input) { + var bytes = new Uint16Array(input.buffer, input.byteOffset, input.byteLength / 2); + if (bytes.length <= 0x1000) { + return String.fromCharCode.apply(null, bytes); + } + var chunks = []; + var i = 0; + var len = 0; + for (; i < bytes.length; i += len) { + len = Math.min(0x1000, bytes.length - i); + chunks.push(String.fromCharCode.apply(null, bytes.subarray(i, i + len))); + } + return chunks.join(''); + } + }; + var utf16Decoder; + utf16Decoder = typeof TextDecoder === 'function' ? new TextDecoder('utf-16le') : fallbackDecoder2; + emnapiString.utf16Decoder = utf16Decoder; + }, + lengthBytesUTF8: function (str) { + var c; + var len = 0; + for (var i = 0; i < str.length; ++i) { + c = str.charCodeAt(i); + if (c <= 0x7F) { + len++; + } + else if (c <= 0x7FF) { + len += 2; + } + else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; + ++i; + } + else { + len += 3; + } + } + return len; + }, + UTF8ToString: function (ptr, length) { + if (!ptr || !length) + return ''; + ptr >>>= 0; + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + var end = ptr; + if (length === -1) { + for (; HEAPU8[end];) + ++end; + } + else { + end = ptr + (length >>> 0); + } + length = end - ptr; + if (length <= 16) { + var idx = ptr; + var str = ''; + while (idx < end) { + var u0 = HEAPU8[idx++]; + if (!(u0 & 0x80)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = HEAPU8[idx++] & 63; + if ((u0 & 0xE0) === 0xC0) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = HEAPU8[idx++] & 63; + if ((u0 & 0xF0) === 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } + else { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (HEAPU8[idx++] & 63); + } + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } + else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + } + return emnapiString.utf8Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer.constructor) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end)); + }, + stringToUTF8: function (str, outPtr, maxBytesToWrite) { + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + var outIdx = outPtr; + outIdx >>>= 0; + if (!(maxBytesToWrite > 0)) { + return 0; + } + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) + break; + HEAPU8[outIdx++] = u; + } + else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) + break; + HEAPU8[outIdx++] = 0xC0 | (u >> 6); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } + else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) + break; + HEAPU8[outIdx++] = 0xE0 | (u >> 12); + HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } + else { + if (outIdx + 3 >= endIdx) + break; + HEAPU8[outIdx++] = 0xF0 | (u >> 18); + HEAPU8[outIdx++] = 0x80 | ((u >> 12) & 63); + HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } + } + HEAPU8[outIdx] = 0; + return outIdx - startIdx; + }, + UTF16ToString: function (ptr, length) { + if (!ptr || !length) + return ''; + ptr >>>= 0; + var end = ptr; + if (length === -1) { + var idx = end >> 1; + var HEAPU16 = new Uint16Array(wasmMemory.buffer); + while (HEAPU16[idx]) + ++idx; + end = idx << 1; + } + else { + end = ptr + (length >>> 0) * 2; + } + length = end - ptr; + if (length <= 32) { + return String.fromCharCode.apply(null, new Uint16Array(wasmMemory.buffer, ptr, length / 2)); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + return emnapiString.utf16Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer.constructor) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end)); + }, + stringToUTF16: function (str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) + return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < numCharsToWrite; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var codeUnit = str.charCodeAt(i); + HEAP_DATA_VIEW.setInt16(outPtr, codeUnit, true); + outPtr += 2; + } + HEAP_DATA_VIEW.setInt16(outPtr, 0, true); + return outPtr - startPtr; + }, + newString: function (env, str, length, result, stringMaker) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!str) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!(autoLength || (sizelength <= 2147483647))) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var strValue = stringMaker(str, autoLength, sizelength); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(strValue).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + }, + newExternalString: function (env, str, length, finalize_callback, finalize_hint, result, copied, createApi, stringMaker) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!str) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!(autoLength || (sizelength <= 2147483647))) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = createApi(env, str, length, result); + if (status === 0 /* napi_status.napi_ok */) { + if (copied) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(copied, 1, true); + } + if (finalize_callback) { + envObject.callFinalizer(finalize_callback, str, finalize_hint); + } + } + return status; + } + }; + /** + * @__sig ippp + */ + function napi_get_array_length(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isArray()) { + return envObject.setLastError(8 /* napi_status.napi_array_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = handle.value.length >>> 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppp + */ + function napi_get_arraybuffer_info(env, arraybuffer, data, byte_length) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(arraybuffer); + if (!handle.isArrayBuffer()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getArrayBufferPointer(handle.value, true).address; + HEAP_DATA_VIEW.setInt32(data, p, true); + } + if (byte_length) { + HEAP_DATA_VIEW.setUint32(byte_length, handle.value.byteLength, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_prototype(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = handle.isObject() || handle.isFunction() ? handle.value : Object(handle.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = envObject.ensureHandleId(Object.getPrototypeOf(v)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, p, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ippppppp + */ + function napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!typedarray) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(typedarray); + if (!handle.isTypedArray()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (type) { + var t = void 0; + if (v instanceof Int8Array) { + t = 0 /* napi_typedarray_type.napi_int8_array */; + } + else if (v instanceof Uint8Array) { + t = 1 /* napi_typedarray_type.napi_uint8_array */; + } + else if (v instanceof Uint8ClampedArray) { + t = 2 /* napi_typedarray_type.napi_uint8_clamped_array */; + } + else if (v instanceof Int16Array) { + t = 3 /* napi_typedarray_type.napi_int16_array */; + } + else if (v instanceof Uint16Array) { + t = 4 /* napi_typedarray_type.napi_uint16_array */; + } + else if (v instanceof Int32Array) { + t = 5 /* napi_typedarray_type.napi_int32_array */; + } + else if (v instanceof Uint32Array) { + t = 6 /* napi_typedarray_type.napi_uint32_array */; + } + else if (v instanceof Float32Array) { + t = 7 /* napi_typedarray_type.napi_float32_array */; + } + else if (v instanceof Float64Array) { + t = 8 /* napi_typedarray_type.napi_float64_array */; + } + else if (v instanceof BigInt64Array) { + t = 9 /* napi_typedarray_type.napi_bigint64_array */; + } + else if (v instanceof BigUint64Array) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + t = 10 /* napi_typedarray_type.napi_biguint64_array */; + } + else { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + HEAP_DATA_VIEW.setInt32(type, t, true); + } + if (length) { + HEAP_DATA_VIEW.setUint32(length, v.length, true); + } + var buffer; + if (data || arraybuffer) { + buffer = v.buffer; + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getViewPointer(v, true).address; + HEAP_DATA_VIEW.setInt32(data, p, true); + } + if (arraybuffer) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ab = envObject.ensureHandleId(buffer); + HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); + } + } + if (byte_offset) { + HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_buffer_info(env, buffer, data, length) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!buffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(buffer); + if (!handle.isBuffer()) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0); + } + /** + * @__sig ipppppp + */ + function napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer, byte_offset) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!dataview) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(dataview); + if (!handle.isDataView()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (byte_length) { + HEAP_DATA_VIEW.setUint32(byte_length, v.byteLength, true); + } + var buffer; + if (data || arraybuffer) { + buffer = v.buffer; + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getViewPointer(v, true).address; + HEAP_DATA_VIEW.setInt32(data, p, true); + } + if (arraybuffer) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ab = envObject.ensureHandleId(buffer); + HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); + } + } + if (byte_offset) { + HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_date_value(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isDate()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + v = handle.value.valueOf(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ippp + */ + function napi_get_value_bool(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'boolean') { + return envObject.setLastError(7 /* napi_status.napi_boolean_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = handle.value ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_double(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, r, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_value_bigint_int64(env, value, result, lossless) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!lossless) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + var numberValue = handle.value; + if (typeof numberValue !== 'bigint') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if ((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63)))) { + HEAP_DATA_VIEW.setInt8(lossless, 1, true); + } + else { + HEAP_DATA_VIEW.setInt8(lossless, 0, true); + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + if (numberValue >= (BigInt(1) << BigInt(63))) { + numberValue = numberValue - (BigInt(1) << BigInt(64)); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + HEAP_DATA_VIEW.setInt32(result, low, true); + HEAP_DATA_VIEW.setInt32(result + 4, high, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_value_bigint_uint64(env, value, result, lossless) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!lossless) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + var numberValue = handle.value; + if (typeof numberValue !== 'bigint') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if ((numberValue >= BigInt(0)) && (numberValue < (BigInt(1) << BigInt(64)))) { + HEAP_DATA_VIEW.setInt8(lossless, 1, true); + } + else { + HEAP_DATA_VIEW.setInt8(lossless, 0, true); + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + HEAP_DATA_VIEW.setUint32(result, low, true); + HEAP_DATA_VIEW.setUint32(result + 4, high, true); + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_bigint_words(env, value, sign_bit, word_count, words) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!word_count) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isBigInt()) { + return envObject.setLastError(17 /* napi_status.napi_bigint_expected */); + } + var isMinus = handle.value < BigInt(0); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var word_count_int = HEAP_DATA_VIEW.getUint32(word_count, true); + var wordCount = 0; + var bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value; + while (bigintValue !== BigInt(0)) { + wordCount++; + bigintValue = bigintValue >> BigInt(64); + } + bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value; + if (!sign_bit && !words) { + word_count_int = wordCount; + HEAP_DATA_VIEW.setUint32(word_count, word_count_int, true); + } + else { + if (!sign_bit) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!words) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var wordsArr = []; + while (bigintValue !== BigInt(0)) { + var uint64 = bigintValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + wordsArr.push(uint64); + bigintValue = bigintValue >> BigInt(64); + } + var len = Math.min(word_count_int, wordsArr.length); + for (var i = 0; i < len; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(wordsArr[i] & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(wordsArr[i] >> BigInt(32)); + HEAP_DATA_VIEW.setUint32(words + i * 8, low, true); + HEAP_DATA_VIEW.setUint32(words + i * 8 + 4, high, true); + } + HEAP_DATA_VIEW.setInt32(sign_bit, isMinus ? 1 : 0, true); + HEAP_DATA_VIEW.setUint32(word_count, len, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_external(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isExternal()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = handle.data(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, p, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_int32(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = new Int32Array([handle.value])[0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_int64(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var numberValue = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (numberValue === Number.POSITIVE_INFINITY || numberValue === Number.NEGATIVE_INFINITY || isNaN(numberValue)) { + HEAP_DATA_VIEW.setInt32(result, 0, true); + HEAP_DATA_VIEW.setInt32(result + 4, 0, true); + } + else if (numberValue < /* INT64_RANGE_NEGATIVE */ -9223372036854776000) { + HEAP_DATA_VIEW.setInt32(result, 0, true); + HEAP_DATA_VIEW.setInt32(result + 4, 0x80000000, true); + } + else if (numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000) { + HEAP_DATA_VIEW.setUint32(result, 0xffffffff, true); + HEAP_DATA_VIEW.setUint32(result + 4, 0x7fffffff, true); + } + else { + $emnapiSetValueI64(result, Math.trunc(numberValue)); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_latin1(env, value, buf, buf_size, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); + } + else if (buf_size !== 0) { + var copied = 0; + var v = void 0; + for (var i = 0; i < buf_size - 1; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = handle.value.charCodeAt(i) & 0xff; + HEAP_DATA_VIEW.setUint8(buf + i, v, true); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + copied++; + } + HEAP_DATA_VIEW.setUint8(buf + copied, 0, true); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied, true); + } + } + else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_utf8(env, value, buf, buf_size, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var strLength = emnapiString.lengthBytesUTF8(handle.value); + HEAP_DATA_VIEW.setUint32(result, strLength, true); + } + else if (buf_size !== 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var copied = emnapiString.stringToUTF8(handle.value, buf, buf_size); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied, true); + } + } + else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_utf16(env, value, buf, buf_size, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); + } + else if (buf_size !== 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var copied = emnapiString.stringToUTF16(handle.value, buf, buf_size * 2); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied / 2, true); + } + } + else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_uint32(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = new Uint32Array([handle.value])[0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, v, true); + return envObject.clearLastError(); + } + var convert2cMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_array_length: napi_get_array_length, + napi_get_arraybuffer_info: napi_get_arraybuffer_info, + napi_get_buffer_info: napi_get_buffer_info, + napi_get_dataview_info: napi_get_dataview_info, + napi_get_date_value: napi_get_date_value, + napi_get_prototype: napi_get_prototype, + napi_get_typedarray_info: napi_get_typedarray_info, + napi_get_value_bigint_int64: napi_get_value_bigint_int64, + napi_get_value_bigint_uint64: napi_get_value_bigint_uint64, + napi_get_value_bigint_words: napi_get_value_bigint_words, + napi_get_value_bool: napi_get_value_bool, + napi_get_value_double: napi_get_value_double, + napi_get_value_external: napi_get_value_external, + napi_get_value_int32: napi_get_value_int32, + napi_get_value_int64: napi_get_value_int64, + napi_get_value_string_latin1: napi_get_value_string_latin1, + napi_get_value_string_utf16: napi_get_value_string_utf16, + napi_get_value_string_utf8: napi_get_value_string_utf8, + napi_get_value_uint32: napi_get_value_uint32 + }); + /** + * @__sig ipip + */ + function napi_create_int32(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipip + */ + function napi_create_uint32(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value >>> 0).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipjp + */ + function napi_create_int64(env, low, high, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = Number(low); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipdp + */ + function napi_create_double(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_create_string_latin1(env, str, length, result) { + return emnapiString.newString(env, str, length, result, function (str, autoLength, sizeLength) { + var latin1String = ''; + var len = 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (autoLength) { + while (true) { + var ch = HEAP_DATA_VIEW.getUint8(str, true); + if (!ch) + break; + latin1String += String.fromCharCode(ch); + str++; + } + } + else { + while (len < sizeLength) { + var ch = HEAP_DATA_VIEW.getUint8(str, true); + if (!ch) + break; + latin1String += String.fromCharCode(ch); + len++; + str++; + } + } + return latin1String; + }); + } + /** + * @__sig ipppp + */ + function napi_create_string_utf16(env, str, length, result) { + return emnapiString.newString(env, str, length, result, function (str) { + return emnapiString.UTF16ToString(str, length); + }); + } + /** + * @__sig ipppp + */ + function napi_create_string_utf8(env, str, length, result) { + return emnapiString.newString(env, str, length, result, function (str) { + return emnapiString.UTF8ToString(str, length); + }); + } + /** + * @__sig ippppppp + */ + function node_api_create_external_string_latin1(env, str, length, finalize_callback, finalize_hint, result, copied) { + return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_latin1, undefined); + } + /** + * @__sig ippppppp + */ + function node_api_create_external_string_utf16(env, str, length, finalize_callback, finalize_hint, result, copied) { + return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_utf16, undefined); + } + /** + * @__sig ipppp + */ + function node_api_create_property_key_utf16(env, str, length, result) { + return napi_create_string_utf16(env, str, length, result); + } + /** + * @__sig ipjp + */ + function napi_create_bigint_int64(env, low, high, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = low; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipjp + */ + function napi_create_bigint_uint64(env, low, high, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = low & ((BigInt(1) << BigInt(64)) - BigInt(1)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipippp + */ + function napi_create_bigint_words(env, sign_bit, word_count, words, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v, i; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + word_count = word_count >>> 0; + if (word_count > 2147483647) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (word_count > (1024 * 1024 / (4 * 8) / 2)) { + throw new RangeError('Maximum BigInt size exceeded'); + } + var value = BigInt(0); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (i = 0; i < word_count; i++) { + var low = HEAP_DATA_VIEW.getUint32(words + i * 8, true); + var high = HEAP_DATA_VIEW.getUint32(words + i * 8 + 4, true); + var wordi = BigInt(low) | (BigInt(high) << BigInt(32)); + value += wordi << BigInt(64 * i); + } + value *= ((BigInt(sign_bit) % BigInt(2) === BigInt(0)) ? BigInt(1) : BigInt(-1)); + v = emnapiCtx.addToCurrentScope(value).id; + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + var convert2napiMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_bigint_int64: napi_create_bigint_int64, + napi_create_bigint_uint64: napi_create_bigint_uint64, + napi_create_bigint_words: napi_create_bigint_words, + napi_create_double: napi_create_double, + napi_create_int32: napi_create_int32, + napi_create_int64: napi_create_int64, + napi_create_string_latin1: napi_create_string_latin1, + napi_create_string_utf16: napi_create_string_utf16, + napi_create_string_utf8: napi_create_string_utf8, + napi_create_uint32: napi_create_uint32, + node_api_create_external_string_latin1: node_api_create_external_string_latin1, + node_api_create_external_string_utf16: node_api_create_external_string_utf16, + node_api_create_property_key_utf16: node_api_create_property_key_utf16 + }); + function emnapiCreateFunction(envObject, utf8name, length, cb, data) { + var functionName = (!utf8name || !length) ? '' : (emnapiString.UTF8ToString(utf8name, length)); + var f; + var makeFunction = function () { + return function () { + var cbinfo = emnapiCtx.cbinfoStack.push(this, data, arguments, f); + var scope = emnapiCtx.openScope(envObject); + try { + return envObject.callIntoModule(function (envObject) { + var napiValue = (wasmTable.get(cb))(envObject.id, cbinfo); + return (!napiValue) ? undefined : emnapiCtx.handleStore.get(napiValue).value; + }); + } + finally { + emnapiCtx.cbinfoStack.pop(); + emnapiCtx.closeScope(envObject, scope); + } + }; + }; + if (functionName === '') { + f = makeFunction(); + return { status: 0 /* napi_status.napi_ok */, f: f }; + } + if (!(/^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(functionName))) { + return { status: 1 /* napi_status.napi_invalid_arg */, f: undefined }; + } + if (emnapiCtx.feature.supportNewFunction) { + var _ = makeFunction(); + try { + f = (new Function('_', 'return function ' + functionName + '(){' + + '"use strict";' + + 'return _.apply(this,arguments);' + + '};'))(_); + } + catch (_err) { + f = makeFunction(); + if (emnapiCtx.feature.canSetFunctionName) + Object.defineProperty(f, 'name', { value: functionName }); + } + } + else { + f = makeFunction(); + if (emnapiCtx.feature.canSetFunctionName) + Object.defineProperty(f, 'name', { value: functionName }); + } + return { status: 0 /* napi_status.napi_ok */, f: f }; + } + function emnapiDefineProperty(envObject, obj, propertyName, method, getter, setter, value, attributes, data) { + if (getter || setter) { + var localGetter = void 0; + var localSetter = void 0; + if (getter) { + localGetter = emnapiCreateFunction(envObject, 0, 0, getter, data).f; + } + if (setter) { + localSetter = emnapiCreateFunction(envObject, 0, 0, setter, data).f; + } + var desc = { + configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, + enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, + get: localGetter, + set: localSetter + }; + Object.defineProperty(obj, propertyName, desc); + } + else if (method) { + var localMethod = emnapiCreateFunction(envObject, 0, 0, method, data).f; + var desc = { + configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, + enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, + writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0, + value: localMethod + }; + Object.defineProperty(obj, propertyName, desc); + } + else { + var desc = { + configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, + enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, + writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0, + value: emnapiCtx.handleStore.get(value).value + }; + Object.defineProperty(obj, propertyName, desc); + } + } + function emnapiGetHandle(js_object) { + var handle = emnapiCtx.handleStore.get(js_object); + if (!(handle.isObject() || handle.isFunction())) { + return { status: 1 /* napi_status.napi_invalid_arg */ }; + } + if (typeof emnapiExternalMemory !== 'undefined' && ArrayBuffer.isView(handle.value)) { + if (emnapiExternalMemory.wasmMemoryViewTable.has(handle.value)) { + handle = emnapiCtx.addToCurrentScope(emnapiExternalMemory.wasmMemoryViewTable.get(handle.value)); + } + } + return { status: 0 /* napi_status.napi_ok */, handle: handle }; + } + function emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var referenceId; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!emnapiCtx.feature.supportFinalizer) { + if (finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "finalize_cb" must be 0(NULL)'); + } + if (result) { + throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "result" must be 0(NULL)'); + } + } + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handleResult = emnapiGetHandle(js_object); + if (handleResult.status !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(handleResult.status); + } + var handle = handleResult.handle; + if (envObject.getObjectBinding(handle.value).wrapped !== 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var reference = void 0; + if (result) { + if (!finalize_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + reference = emnapiCtx.createReference(envObject, handle.id, 0, 1 /* Ownership.kUserland */, finalize_cb, native_object, finalize_hint); + referenceId = reference.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, referenceId, true); + } + else { + reference = emnapiCtx.createReference(envObject, handle.id, 0, 0 /* Ownership.kRuntime */, finalize_cb, native_object, !finalize_cb ? finalize_cb : finalize_hint); + } + envObject.getObjectBinding(handle.value).wrapped = reference.id; + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + function emnapiUnwrap(env, js_object, result, action) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (action === 0 /* UnwrapAction.KeepWrap */) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var value = emnapiCtx.handleStore.get(js_object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var binding = envObject.getObjectBinding(value.value); + var referenceId = binding.wrapped; + var ref = emnapiCtx.refStore.get(referenceId); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + data = ref.data(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, data, true); + } + if (action === 1 /* UnwrapAction.RemoveWrap */) { + binding.wrapped = 0; + if (ref.ownership() === 1 /* Ownership.kUserland */) { + // When the wrap is been removed, the finalizer should be reset. + ref.resetFinalizer(); + } + else { + ref.dispose(); + } + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppppppp + */ + function napi_define_class(env, utf8name, length, constructor, callback_data, property_count, properties, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var propPtr, valueHandleId, attributes; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + property_count = property_count >>> 0; + if (property_count > 0) { + if (!properties) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if ((length < -1) || (length > 2147483647) || (!utf8name)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var fresult = emnapiCreateFunction(envObject, utf8name, length, constructor, callback_data); + if (fresult.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(fresult.status); + var F = fresult.f; + var propertyName = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < property_count; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + propPtr = properties + (i * (4 * 8)); + var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); + var name_1 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); + var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); + var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); + var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); + var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); + attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); + var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); + if (utf8Name) { + propertyName = emnapiString.UTF8ToString(utf8Name, -1); + } + else { + if (!name_1) { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + propertyName = emnapiCtx.handleStore.get(name_1).value; + if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + } + if ((attributes & 1024 /* napi_property_attributes.napi_static */) !== 0) { + emnapiDefineProperty(envObject, F, propertyName, method, getter, setter, value, attributes, data); + continue; + } + emnapiDefineProperty(envObject, F.prototype, propertyName, method, getter, setter, value, attributes, data); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var valueHandle = emnapiCtx.addToCurrentScope(F); + valueHandleId = valueHandle.id; + HEAP_DATA_VIEW.setInt32(result, valueHandleId, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppppp + */ + function napi_wrap(env, js_object, native_object, finalize_cb, finalize_hint, result) { + return emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result); + } + /** + * @__sig ippp + */ + function napi_unwrap(env, js_object, result) { + return emnapiUnwrap(env, js_object, result, 0 /* UnwrapAction.KeepWrap */); + } + /** + * @__sig ippp + */ + function napi_remove_wrap(env, js_object, result) { + return emnapiUnwrap(env, js_object, result, 1 /* UnwrapAction.RemoveWrap */); + } + /** + * @__sig ippp + */ + function napi_type_tag_object(env, object, type_tag) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + var value = emnapiCtx.handleStore.get(object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */); + } + if (!type_tag) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + var binding = envObject.getObjectBinding(value.value); + if (binding.tag !== null) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + var tag = new Uint8Array(16); + tag.set(new Uint8Array(wasmMemory.buffer, type_tag, 16)); + binding.tag = new Uint32Array(tag.buffer); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppp + */ + function napi_check_object_type_tag(env, object, type_tag, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, one-var + var ret = true; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + var value = emnapiCtx.handleStore.get(object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */); + } + if (!type_tag) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + if (!result) { + return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); + } + var binding = envObject.getObjectBinding(value.value); + if (binding.tag !== null) { + var tag = binding.tag; + var typeTag = new Uint32Array(wasmMemory.buffer, type_tag, 4); + ret = (tag[0] === typeTag[0] && + tag[1] === typeTag[1] && + tag[2] === typeTag[2] && + tag[3] === typeTag[3]); + } + else { + ret = false; + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, ret ? 1 : 0, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppppp + */ + function napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportFinalizer) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!finalize_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handleResult = emnapiGetHandle(js_object); + if (handleResult.status !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(handleResult.status); + } + var handle = handleResult.handle; + var ownership = !result ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */; + var reference = emnapiCtx.createReference(envObject, handle.id, 0, ownership, finalize_cb, finalize_data, finalize_hint); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var referenceId = reference.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, referenceId, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function node_api_post_finalizer(env, finalize_cb, finalize_data, finalize_hint) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + envObject.enqueueFinalizer(emnapiCtx.createTrackedFinalizer(envObject, finalize_cb, finalize_data, finalize_hint)); + return envObject.clearLastError(); + } + var wrapMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_add_finalizer: napi_add_finalizer, + napi_check_object_type_tag: napi_check_object_type_tag, + napi_define_class: napi_define_class, + napi_remove_wrap: napi_remove_wrap, + napi_type_tag_object: napi_type_tag_object, + napi_unwrap: napi_unwrap, + napi_wrap: napi_wrap, + node_api_post_finalizer: node_api_post_finalizer + }); + /** + * @__sig ipippppp + */ + function emnapi_create_memory_view(env, typedarray_type, external_data, byte_length, finalize_cb, finalize_hint, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + if (!external_data) { + byte_length = 0; + } + if (byte_length > 2147483647) { + throw new RangeError('Cannot create a memory view larger than 2147483647 bytes'); + } + if ((external_data + byte_length) > wasmMemory.buffer.byteLength) { + throw new RangeError('Memory out of range'); + } + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError('emnapi_create_memory_view', 'Parameter "finalize_cb" must be 0(NULL)'); + } + var viewDescriptor = void 0; + switch (typedarray_type) { + case 0 /* emnapi_memory_view_type.emnapi_int8_array */: + viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 1 /* emnapi_memory_view_type.emnapi_uint8_array */: + viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 2 /* emnapi_memory_view_type.emnapi_uint8_clamped_array */: + viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 3 /* emnapi_memory_view_type.emnapi_int16_array */: + viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 4 /* emnapi_memory_view_type.emnapi_uint16_array */: + viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 5 /* emnapi_memory_view_type.emnapi_int32_array */: + viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 6 /* emnapi_memory_view_type.emnapi_uint32_array */: + viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 7 /* emnapi_memory_view_type.emnapi_float32_array */: + viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 8 /* emnapi_memory_view_type.emnapi_float64_array */: + viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 9 /* emnapi_memory_view_type.emnapi_bigint64_array */: + viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case 10 /* emnapi_memory_view_type.emnapi_biguint64_array */: + viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case -1 /* emnapi_memory_view_type.emnapi_data_view */: + viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + case -2 /* emnapi_memory_view_type.emnapi_buffer */: { + if (!emnapiCtx.feature.Buffer) { + throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', ''); + } + viewDescriptor = { Ctor: emnapiCtx.feature.Buffer, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; + break; + } + default: return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var Ctor = viewDescriptor.Ctor; + var typedArray = typedarray_type === -2 /* emnapi_memory_view_type.emnapi_buffer */ + ? emnapiCtx.feature.Buffer.from(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length) + : new Ctor(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length); + var handle = emnapiCtx.addToCurrentScope(typedArray); + emnapiExternalMemory.wasmMemoryViewTable.set(typedArray, viewDescriptor); + if (finalize_cb) { + var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0); + if (status_1 === 10 /* napi_status.napi_pending_exception */) { + var err = envObject.tryCatch.extractException(); + envObject.clearLastError(); + throw err; + } + else if (status_1 !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(status_1); + } + } + value = handle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig i + */ + function emnapi_is_support_weakref() { + return emnapiCtx.feature.supportFinalizer ? 1 : 0; + } + /** + * @__sig i + */ + function emnapi_is_support_bigint() { + return emnapiCtx.feature.supportBigInt ? 1 : 0; + } + /** + * @__sig i + */ + function emnapi_is_node_binding_available() { + return emnapiNodeBinding ? 1 : 0; + } + function $emnapiSyncMemory(js_to_wasm, arrayBufferOrView, offset, len) { + offset = offset !== null && offset !== void 0 ? offset : 0; + offset = offset >>> 0; + var view; + if (arrayBufferOrView instanceof ArrayBuffer) { + var pointer = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false).address; + if (!pointer) + throw new Error('Unknown ArrayBuffer address'); + if (typeof len !== 'number' || len === -1) { + len = arrayBufferOrView.byteLength - offset; + } + len = len >>> 0; + if (len === 0) + return arrayBufferOrView; + view = new Uint8Array(arrayBufferOrView, offset, len); + var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); + if (!js_to_wasm) { + view.set(wasmMemoryU8.subarray(pointer, pointer + len)); + } + else { + wasmMemoryU8.set(view, pointer); + } + return arrayBufferOrView; + } + if (ArrayBuffer.isView(arrayBufferOrView)) { + var viewPointerInfo = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false); + var latestView = viewPointerInfo.view; + var pointer = viewPointerInfo.address; + if (!pointer) + throw new Error('Unknown ArrayBuffer address'); + if (typeof len !== 'number' || len === -1) { + len = latestView.byteLength - offset; + } + len = len >>> 0; + if (len === 0) + return latestView; + view = new Uint8Array(latestView.buffer, latestView.byteOffset + offset, len); + var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); + if (!js_to_wasm) { + view.set(wasmMemoryU8.subarray(pointer, pointer + len)); + } + else { + wasmMemoryU8.set(view, pointer); + } + return latestView; + } + throw new TypeError('emnapiSyncMemory expect ArrayBuffer or ArrayBufferView as first parameter'); + } + /** + * @__sig ipippp + */ + function emnapi_sync_memory(env, js_to_wasm, arraybuffer_or_view, offset, len) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!arraybuffer_or_view) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var handleId = HEAP_DATA_VIEW.getInt32(arraybuffer_or_view, true); + var handle = envObject.ctx.handleStore.get(handleId); + if (!handle.isArrayBuffer() && !handle.isTypedArray() && !handle.isDataView()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var ret = $emnapiSyncMemory(Boolean(js_to_wasm), handle.value, offset, len); + if (handle.value !== ret) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(arraybuffer_or_view, v, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + function $emnapiGetMemoryAddress(arrayBufferOrView) { + var isArrayBuffer = arrayBufferOrView instanceof ArrayBuffer; + var isDataView = arrayBufferOrView instanceof DataView; + var isTypedArray = ArrayBuffer.isView(arrayBufferOrView) && !isDataView; + if (!isArrayBuffer && !isTypedArray && !isDataView) { + throw new TypeError('emnapiGetMemoryAddress expect ArrayBuffer or ArrayBufferView as first parameter'); + } + var info; + if (isArrayBuffer) { + info = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false); + } + else { + info = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false); + } + return { + address: info.address, + ownership: info.ownership, + runtimeAllocated: info.runtimeAllocated + }; + } + /** + * @__sig ipppp + */ + function emnapi_get_memory_address(env, arraybuffer_or_view, address, ownership, runtime_allocated) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p, runtimeAllocated, ownershipOut; + var info; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!arraybuffer_or_view) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!address && !ownership && !runtime_allocated) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var handle = envObject.ctx.handleStore.get(arraybuffer_or_view); + info = $emnapiGetMemoryAddress(handle.value); + p = info.address; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (address) { + HEAP_DATA_VIEW.setInt32(address, p, true); + } + if (ownership) { + ownershipOut = info.ownership; + HEAP_DATA_VIEW.setInt32(ownership, ownershipOut, true); + } + if (runtime_allocated) { + runtimeAllocated = info.runtimeAllocated; + HEAP_DATA_VIEW.setInt8(runtime_allocated, runtimeAllocated, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipp + */ + function emnapi_get_runtime_version(env, version) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!version) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var runtimeVersion; + try { + runtimeVersion = emnapiCtx.getRuntimeVersions().version; + } + catch (_) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var versions = runtimeVersion.split('.') + .map(function (n) { return Number(n); }); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(version, versions[0], true); + HEAP_DATA_VIEW.setUint32(version + 4, versions[1], true); + HEAP_DATA_VIEW.setUint32(version + 8, versions[2], true); + return envObject.clearLastError(); + } + var emnapiMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + $emnapiGetMemoryAddress: $emnapiGetMemoryAddress, + $emnapiSyncMemory: $emnapiSyncMemory, + emnapi_create_memory_view: emnapi_create_memory_view, + emnapi_get_memory_address: emnapi_get_memory_address, + emnapi_get_runtime_version: emnapi_get_runtime_version, + emnapi_is_node_binding_available: emnapi_is_node_binding_available, + emnapi_is_support_bigint: emnapi_is_support_bigint, + emnapi_is_support_weakref: emnapi_is_support_weakref, + emnapi_sync_memory: emnapi_sync_memory + }); + /** + * @__sig ipp + */ + function napi_create_array(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope([]).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_create_array_with_length(env, length, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + length = length >>> 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(new Array(length)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + function emnapiCreateArrayBuffer(byte_length, data) { + byte_length = byte_length >>> 0; + var arrayBuffer = new ArrayBuffer(byte_length); + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getArrayBufferPointer(arrayBuffer, true).address; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(data, p, true); + } + return arrayBuffer; + } + /** + * @__sig ipppp + */ + function napi_create_arraybuffer(env, byte_length, data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data); + value = emnapiCtx.addToCurrentScope(arrayBuffer).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipdp + */ + function napi_create_date(env, time, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(new Date(time)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ippppp + */ + function napi_create_external(env, data, finalize_cb, finalize_hint, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError('napi_create_external', 'Parameter "finalize_cb" must be 0(NULL)'); + } + var externalHandle = emnapiCtx.getCurrentScope().addExternal(envObject, data); + if (finalize_cb) { + emnapiCtx.createReference(envObject, externalHandle.id, 0, 0 /* Ownership.kRuntime */, finalize_cb, data, finalize_hint); + } + value = externalHandle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppppp + */ + function napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + if (!external_data) { + byte_length = 0; + } + if ((external_data + byte_length) > wasmMemory.buffer.byteLength) { + throw new RangeError('Memory out of range'); + } + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError('napi_create_external_arraybuffer', 'Parameter "finalize_cb" must be 0(NULL)'); + } + var arrayBuffer = new ArrayBuffer(byte_length); + if (byte_length === 0) { + try { + var MessageChannel_1 = emnapiCtx.feature.MessageChannel; + var messageChannel = new MessageChannel_1(); + messageChannel.port1.postMessage(arrayBuffer, [arrayBuffer]); + } + catch (_) { } + } + else { + var u8arr = new Uint8Array(arrayBuffer); + u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length)); + emnapiExternalMemory.table.set(arrayBuffer, { + address: external_data, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0 + }); + } + var handle = emnapiCtx.addToCurrentScope(arrayBuffer); + if (finalize_cb) { + var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0); + if (status_1 === 10 /* napi_status.napi_pending_exception */) { + var err = envObject.tryCatch.extractException(); + envObject.clearLastError(); + throw err; + } + else if (status_1 !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(status_1); + } + } + value = handle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipp + */ + function napi_create_object(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope({}).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_create_symbol(env, description, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!description) { + // eslint-disable-next-line symbol-description, @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(Symbol()).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + } + else { + var handle = emnapiCtx.handleStore.get(description); + var desc = handle.value; + if (typeof desc !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(Symbol(desc)).id; + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipipppp + */ + function napi_create_typedarray(env, type, length, arraybuffer, byte_offset, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(arraybuffer); + var buffer = handle.value; + if (!(buffer instanceof ArrayBuffer)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var createTypedArray = function (envObject, Type, size_of_element, buffer, byte_offset, length) { + var _a; + byte_offset = byte_offset >>> 0; + length = length >>> 0; + if (size_of_element > 1) { + if ((byte_offset) % (size_of_element) !== 0) { + var err = new RangeError("start offset of ".concat((_a = Type.name) !== null && _a !== void 0 ? _a : '', " should be a multiple of ").concat(size_of_element)); + err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT'; + envObject.tryCatch.setError(err); + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + } + if (((length * size_of_element) + byte_offset) > buffer.byteLength) { + var err = new RangeError('Invalid typed array length'); + err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_LENGTH'; + envObject.tryCatch.setError(err); + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + var out = new Type(buffer, byte_offset, length); + if (buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) { + emnapiExternalMemory.wasmMemoryViewTable.set(out, { + Ctor: Type, + address: byte_offset, + length: length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0 + }); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(out).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + }; + switch (type) { + case 0 /* napi_typedarray_type.napi_int8_array */: + return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length); + case 1 /* napi_typedarray_type.napi_uint8_array */: + return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length); + case 2 /* napi_typedarray_type.napi_uint8_clamped_array */: + return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length); + case 3 /* napi_typedarray_type.napi_int16_array */: + return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length); + case 4 /* napi_typedarray_type.napi_uint16_array */: + return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length); + case 5 /* napi_typedarray_type.napi_int32_array */: + return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length); + case 6 /* napi_typedarray_type.napi_uint32_array */: + return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length); + case 7 /* napi_typedarray_type.napi_float32_array */: + return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length); + case 8 /* napi_typedarray_type.napi_float64_array */: + return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length); + case 9 /* napi_typedarray_type.napi_bigint64_array */: + return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length); + case 10 /* napi_typedarray_type.napi_biguint64_array */: + return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length); + default: + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__deps malloc + * @__sig ippp + */ + function napi_create_buffer(env, size, data, result) { + var _a; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value, pointer; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Buffer = emnapiCtx.feature.Buffer; + if (!Buffer) { + throw emnapiCtx.createNotSupportBufferError('napi_create_buffer', ''); + } + var buffer = void 0; + size = size >>> 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!data || (size === 0)) { + buffer = Buffer.alloc(size); + value = emnapiCtx.addToCurrentScope(buffer).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + } + else { + pointer = _malloc(size); + if (!pointer) + throw new Error('Out of memory'); + new Uint8Array(wasmMemory.buffer).subarray(pointer, pointer + size).fill(0); + var buffer_1 = Buffer.from(wasmMemory.buffer, pointer, size); + var viewDescriptor = { + Ctor: Buffer, + address: pointer, + length: size, + ownership: emnapiExternalMemory.registry ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */, + runtimeAllocated: 1 + }; + emnapiExternalMemory.wasmMemoryViewTable.set(buffer_1, viewDescriptor); + (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(viewDescriptor, pointer); + value = emnapiCtx.addToCurrentScope(buffer_1).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + HEAP_DATA_VIEW.setInt32(data, pointer, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ippppp + */ + function napi_create_buffer_copy(env, length, data, result_data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Buffer = emnapiCtx.feature.Buffer; + if (!Buffer) { + throw emnapiCtx.createNotSupportBufferError('napi_create_buffer_copy', ''); + } + var arrayBuffer = emnapiCreateArrayBuffer(length, result_data); + var buffer = Buffer.from(arrayBuffer); + buffer.set(new Uint8Array(wasmMemory.buffer).subarray(data, data + length)); + value = emnapiCtx.addToCurrentScope(buffer).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppppp + */ + function napi_create_external_buffer(env, length, data, finalize_cb, finalize_hint, result) { + return emnapi_create_memory_view(env, -2 /* emnapi_memory_view_type.emnapi_buffer */, data, length, finalize_cb, finalize_hint, result); + } + /** + * @__sig ippppp + */ + function napi_create_dataview(env, byte_length, arraybuffer, byte_offset, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + byte_offset = byte_offset >>> 0; + var handle = emnapiCtx.handleStore.get(arraybuffer); + var buffer = handle.value; + if (!(buffer instanceof ArrayBuffer)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if ((byte_length + byte_offset) > buffer.byteLength) { + var err = new RangeError('byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in'); + err.code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS'; + throw err; + } + var dataview = new DataView(buffer, byte_offset, byte_length); + if (buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(dataview)) { + emnapiExternalMemory.wasmMemoryViewTable.set(dataview, { + Ctor: DataView, + address: byte_offset, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0 + }); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(dataview).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** + * @__sig ipppp + */ + function node_api_symbol_for(env, utf8description, length, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!utf8description) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!(autoLength || (sizelength <= 2147483647))) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var descriptionString = emnapiString.UTF8ToString(utf8description, length); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(Symbol.for(descriptionString)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var createMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_array: napi_create_array, + napi_create_array_with_length: napi_create_array_with_length, + napi_create_arraybuffer: napi_create_arraybuffer, + napi_create_buffer: napi_create_buffer, + napi_create_buffer_copy: napi_create_buffer_copy, + napi_create_dataview: napi_create_dataview, + napi_create_date: napi_create_date, + napi_create_external: napi_create_external, + napi_create_external_arraybuffer: napi_create_external_arraybuffer, + napi_create_external_buffer: napi_create_external_buffer, + napi_create_object: napi_create_object, + napi_create_symbol: napi_create_symbol, + napi_create_typedarray: napi_create_typedarray, + node_api_symbol_for: node_api_symbol_for + }); + /** @__sig ipip */ + function napi_get_boolean(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = value === 0 ? 3 /* GlobalHandle.FALSE */ : 4 /* GlobalHandle.TRUE */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_global(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 5 /* GlobalHandle.GLOBAL */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_null(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 2 /* GlobalHandle.NULL */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_undefined(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 1 /* GlobalHandle.UNDEFINED */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var globalMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_boolean: napi_get_boolean, + napi_get_global: napi_get_global, + napi_get_null: napi_get_null, + napi_get_undefined: napi_get_undefined + }); + /** @__sig ipppp */ + function napi_set_instance_data(env, data, finalize_cb, finalize_hint) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + envObject.setInstanceData(data, finalize_cb, finalize_hint); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_instance_data(env, data) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!data) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = envObject.getInstanceData(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(data, value, true); + return envObject.clearLastError(); + } + var envMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_instance_data: napi_get_instance_data, + napi_set_instance_data: napi_set_instance_data + }); + /** @__sig vpppp */ + function _emnapi_get_last_error_info(env, error_code, engine_error_code, engine_reserved) { + var envObject = emnapiCtx.envStore.get(env); + var lastError = envObject.lastError; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var errorCode = lastError.errorCode; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var engineErrorCode = lastError.engineErrorCode >>> 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var engineReserved = lastError.engineReserved; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(error_code, errorCode, true); + HEAP_DATA_VIEW.setUint32(engine_error_code, engineErrorCode, true); + HEAP_DATA_VIEW.setInt32(engine_reserved, engineReserved, true); + } + /** @__sig ipp */ + function napi_throw(env, error) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!error) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + envObject.tryCatch.setError(emnapiCtx.handleStore.get(error).value); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_throw_error(env, code, msg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new Error(emnapiString.UTF8ToString(msg, -1)); + if (code) + error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_throw_type_error(env, code, msg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new TypeError(emnapiString.UTF8ToString(msg, -1)); + if (code) + error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_throw_range_error(env, code, msg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new RangeError(emnapiString.UTF8ToString(msg, -1)); + if (code) + error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function node_api_throw_syntax_error(env, code, msg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new SyntaxError(emnapiString.UTF8ToString(msg, -1)); + if (code) + error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipp */ + function napi_is_exception_pending(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = envObject.tryCatch.hasCaught(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_error(env, code, msg, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new Error(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_type_error(env, code, msg, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new TypeError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_range_error(env, code, msg, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new RangeError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function node_api_create_syntax_error(env, code, msg, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new SyntaxError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_and_clear_last_exception(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!envObject.tryCatch.hasCaught()) { + HEAP_DATA_VIEW.setInt32(result, 1, true); // ID_UNDEFINED + return envObject.clearLastError(); + } + else { + var err = envObject.tryCatch.exception(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = envObject.ensureHandleId(err); + HEAP_DATA_VIEW.setInt32(result, value, true); + envObject.tryCatch.reset(); + } + return envObject.clearLastError(); + } + /** @__sig vpppp */ + function napi_fatal_error(location, location_len, message, message_len) { + var locationStr = emnapiString.UTF8ToString(location, location_len); + var messageStr = emnapiString.UTF8ToString(message, message_len); + if (emnapiNodeBinding) { + emnapiNodeBinding.napi.fatalError(locationStr, messageStr); + } + else { + abort('FATAL ERROR: ' + locationStr + ' ' + messageStr); + } + } + /** @__sig ipp */ + function napi_fatal_exception(env, err) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!err) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = envObject.ctx.handleStore.get(err); + try { + envObject.triggerFatalException(error.value); + } + catch (_) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + var errorMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_get_last_error_info: _emnapi_get_last_error_info, + napi_create_error: napi_create_error, + napi_create_range_error: napi_create_range_error, + napi_create_type_error: napi_create_type_error, + napi_fatal_error: napi_fatal_error, + napi_fatal_exception: napi_fatal_exception, + napi_get_and_clear_last_exception: napi_get_and_clear_last_exception, + napi_is_exception_pending: napi_is_exception_pending, + napi_throw: napi_throw, + napi_throw_error: napi_throw_error, + napi_throw_range_error: napi_throw_range_error, + napi_throw_type_error: napi_throw_type_error, + node_api_create_syntax_error: node_api_create_syntax_error, + node_api_throw_syntax_error: node_api_throw_syntax_error + }); + /** @__sig ipppppp */ + function napi_create_function(env, utf8name, length, cb, data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data); + if (fresult.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(fresult.status); + var f = fresult.f; + var valueHandle = emnapiCtx.addToCurrentScope(f); + value = valueHandle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppppp */ + function napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!cbinfo) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (argv) { + if (!argc) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var argcValue = HEAP_DATA_VIEW.getUint32(argc, true); + var len = cbinfoValue.args.length; + var arrlen = argcValue < len ? argcValue : len; + var i = 0; + for (; i < arrlen; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var argVal = envObject.ensureHandleId(cbinfoValue.args[i]); + HEAP_DATA_VIEW.setInt32(argv + i * 4, argVal, true); + } + if (i < argcValue) { + for (; i < argcValue; i++) { + HEAP_DATA_VIEW.setInt32(argv + i * 4, 1, true); + } + } + } + if (argc) { + HEAP_DATA_VIEW.setUint32(argc, cbinfoValue.args.length, true); + } + if (this_arg) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = envObject.ensureHandleId(cbinfoValue.thiz); + HEAP_DATA_VIEW.setInt32(this_arg, v, true); + } + if (data) { + HEAP_DATA_VIEW.setInt32(data, cbinfoValue.data, true); + } + return envObject.clearLastError(); + } + /** @__sig ipppppp */ + function napi_call_function(env, recv, func, argc, argv, result) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!recv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + argc = argc >>> 0; + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v8recv = emnapiCtx.handleStore.get(recv).value; + if (!func) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v8func = emnapiCtx.handleStore.get(func).value; + if (typeof v8func !== 'function') + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var args = []; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + args.push(emnapiCtx.handleStore.get(argVal).value); + } + var ret = v8func.apply(v8recv, args); + if (result) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.clearLastError(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippppp */ + function napi_new_instance(env, constructor, argc, argv, result) { + var i; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + argc = argc >>> 0; + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Ctor = emnapiCtx.handleStore.get(constructor).value; + if (typeof Ctor !== 'function') + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var ret = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (emnapiCtx.feature.supportReflect) { + var argList = Array(argc); + for (i = 0; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + argList[i] = emnapiCtx.handleStore.get(argVal).value; + } + ret = Reflect.construct(Ctor, argList, Ctor); + } + else { + var args = Array(argc + 1); + args[0] = undefined; + for (i = 0; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + args[i + 1] = emnapiCtx.handleStore.get(argVal).value; + } + var BoundCtor = Ctor.bind.apply(Ctor, args); + ret = new BoundCtor(); + } + if (result) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_get_new_target(env, cbinfo, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!cbinfo) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = cbinfoValue.getNewTarget(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var functionMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_call_function: napi_call_function, + napi_create_function: napi_create_function, + napi_get_cb_info: napi_get_cb_info, + napi_get_new_target: napi_get_new_target, + napi_new_instance: napi_new_instance + }); + /** @__sig ipp */ + function napi_open_handle_scope(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var scope = emnapiCtx.openScope(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, scope.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_close_handle_scope(env, scope) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if ((envObject.openHandleScopes === 0)) { + return 13 /* napi_status.napi_handle_scope_mismatch */; + } + emnapiCtx.closeScope(envObject); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_open_escapable_handle_scope(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var scope = emnapiCtx.openScope(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, scope.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_close_escapable_handle_scope(env, scope) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if ((envObject.openHandleScopes === 0)) { + return 13 /* napi_status.napi_handle_scope_mismatch */; + } + emnapiCtx.closeScope(envObject); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_escape_handle(env, scope, escapee, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!escapee) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var scopeObject = emnapiCtx.scopeStore.get(scope); + if (!scopeObject.escapeCalled()) { + var newHandle = scopeObject.escape(escapee); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = newHandle ? newHandle.id : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + return envObject.setLastError(12 /* napi_status.napi_escape_called_twice */); + } + /** @__sig ippip */ + function napi_create_reference(env, value, initial_refcount, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (envObject.moduleApiVersion !== 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */) { + if (!(handle.isObject() || handle.isFunction() || handle.isSymbol())) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, 1 /* Ownership.kUserland */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, ref.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_delete_reference(env, ref) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.refStore.get(ref).dispose(); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_reference_ref(env, ref, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var count = emnapiCtx.refStore.get(ref).ref(); + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, count, true); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_reference_unref(env, ref, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var reference = emnapiCtx.refStore.get(ref); + var refcount = reference.refCount(); + if (refcount === 0) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var count = reference.unref(); + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, count, true); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_get_reference_value(env, ref, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var reference = emnapiCtx.refStore.get(ref); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var handleId = reference.get(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, handleId, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_add_env_cleanup_hook(env, fun, arg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!fun) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.addCleanupHook(envObject, fun, arg); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ippp */ + function napi_remove_env_cleanup_hook(env, fun, arg) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!fun) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.removeCleanupHook(envObject, fun, arg); + return 0 /* napi_status.napi_ok */; + } + /** @__sig vp */ + function _emnapi_env_ref(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.ref(); + } + /** @__sig vp */ + function _emnapi_env_unref(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.unref(); + } + var lifeMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_env_ref: _emnapi_env_ref, + _emnapi_env_unref: _emnapi_env_unref, + napi_add_env_cleanup_hook: napi_add_env_cleanup_hook, + napi_close_escapable_handle_scope: napi_close_escapable_handle_scope, + napi_close_handle_scope: napi_close_handle_scope, + napi_create_reference: napi_create_reference, + napi_delete_reference: napi_delete_reference, + napi_escape_handle: napi_escape_handle, + napi_get_reference_value: napi_get_reference_value, + napi_open_escapable_handle_scope: napi_open_escapable_handle_scope, + napi_open_handle_scope: napi_open_handle_scope, + napi_reference_ref: napi_reference_ref, + napi_reference_unref: napi_reference_unref, + napi_remove_env_cleanup_hook: napi_remove_env_cleanup_hook + }); + /** @__sig ippi */ + function _emnapi_get_filename(env, buf, len) { + var envObject = emnapiCtx.envStore.get(env); + var filename = envObject.filename; + if (!buf) { + return emnapiString.lengthBytesUTF8(filename); + } + return emnapiString.stringToUTF8(filename, buf, len); + } + var miscellaneousMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_get_filename: _emnapi_get_filename + }); + /** @__sig ippp */ + function napi_create_promise(env, deferred, promise) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var deferredObjectId, value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!promise) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var p = new Promise(function (resolve, reject) { + var deferredObject = emnapiCtx.createDeferred({ resolve: resolve, reject: reject }); + deferredObjectId = deferredObject.id; + HEAP_DATA_VIEW.setInt32(deferred, deferredObjectId, true); + }); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(p).id; + HEAP_DATA_VIEW.setInt32(promise, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_resolve_deferred(env, deferred, resolution) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!resolution) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var deferredObject = emnapiCtx.deferredStore.get(deferred); + deferredObject.resolve(emnapiCtx.handleStore.get(resolution).value); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_reject_deferred(env, deferred, resolution) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!resolution) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var deferredObject = emnapiCtx.deferredStore.get(deferred); + deferredObject.reject(emnapiCtx.handleStore.get(resolution).value); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_is_promise(env, value, is_promise) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!is_promise) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isPromise() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(is_promise, r, true); + return envObject.clearLastError(); + } + var promiseMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_promise: napi_create_promise, + napi_is_promise: napi_is_promise, + napi_reject_deferred: napi_reject_deferred, + napi_resolve_deferred: napi_resolve_deferred + }); + /** @__sig ippiiip */ + function napi_get_all_property_names(env, object, key_mode, key_filter, key_conversion, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var obj = void 0; + try { + obj = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + if (key_mode !== 0 /* napi_key_collection_mode.napi_key_include_prototypes */ && key_mode !== 1 /* napi_key_collection_mode.napi_key_own_only */) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (key_conversion !== 0 /* napi_key_conversion.napi_key_keep_numbers */ && key_conversion !== 1 /* napi_key_conversion.napi_key_numbers_to_strings */) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var props = []; + var names = void 0; + var symbols = void 0; + var i = void 0; + var own = true; + var integerIndiceRegex = /^(0|[1-9][0-9]*)$/; + do { + names = Object.getOwnPropertyNames(obj); + symbols = Object.getOwnPropertySymbols(obj); + for (i = 0; i < names.length; i++) { + props.push({ + name: integerIndiceRegex.test(names[i]) ? Number(names[i]) : names[i], + desc: Object.getOwnPropertyDescriptor(obj, names[i]), + own: own + }); + } + for (i = 0; i < symbols.length; i++) { + props.push({ + name: symbols[i], + desc: Object.getOwnPropertyDescriptor(obj, symbols[i]), + own: own + }); + } + if (key_mode === 1 /* napi_key_collection_mode.napi_key_own_only */) { + break; + } + obj = Object.getPrototypeOf(obj); + own = false; + } while (obj); + var ret = []; + var addName = function (ret, name, key_filter, conversion_mode) { + if (ret.indexOf(name) !== -1) + return; + if (conversion_mode === 0 /* napi_key_conversion.napi_key_keep_numbers */) { + ret.push(name); + } + else if (conversion_mode === 1 /* napi_key_conversion.napi_key_numbers_to_strings */) { + var realName = typeof name === 'number' ? String(name) : name; + if (typeof realName === 'string') { + if (!(key_filter & 8 /* napi_key_filter.napi_key_skip_strings */)) { + ret.push(realName); + } + } + else { + ret.push(realName); + } + } + }; + for (i = 0; i < props.length; i++) { + var prop = props[i]; + var name_1 = prop.name; + var desc = prop.desc; + if (key_filter === 0 /* napi_key_filter.napi_key_all_properties */) { + addName(ret, name_1, key_filter, key_conversion); + } + else { + if (key_filter & 8 /* napi_key_filter.napi_key_skip_strings */ && typeof name_1 === 'string') { + continue; + } + if (key_filter & 16 /* napi_key_filter.napi_key_skip_symbols */ && typeof name_1 === 'symbol') { + continue; + } + var shouldAdd = true; + switch (key_filter & 7) { + case 1 /* napi_key_filter.napi_key_writable */: { + shouldAdd = Boolean(desc.writable); + break; + } + case 2 /* napi_key_filter.napi_key_enumerable */: { + shouldAdd = Boolean(desc.enumerable); + break; + } + case (1 /* napi_key_filter.napi_key_writable */ | 2 /* napi_key_filter.napi_key_enumerable */): { + shouldAdd = Boolean(desc.writable && desc.enumerable); + break; + } + case 4 /* napi_key_filter.napi_key_configurable */: { + shouldAdd = Boolean(desc.configurable); + break; + } + case (4 /* napi_key_filter.napi_key_configurable */ | 1 /* napi_key_filter.napi_key_writable */): { + shouldAdd = Boolean(desc.configurable && desc.writable); + break; + } + case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */): { + shouldAdd = Boolean(desc.configurable && desc.enumerable); + break; + } + case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */ | 1 /* napi_key_filter.napi_key_writable */): { + shouldAdd = Boolean(desc.configurable && desc.enumerable && desc.writable); + break; + } + } + if (shouldAdd) { + addName(ret, name_1, key_filter, key_conversion); + } + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(ret).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_get_property_names(env, object, result) { + return napi_get_all_property_names(env, object, 0 /* napi_key_collection_mode.napi_key_include_prototypes */, 2 /* napi_key_filter.napi_key_enumerable */ | 16 /* napi_key_filter.napi_key_skip_symbols */, 1 /* napi_key_conversion.napi_key_numbers_to_strings */, result); + } + /** @__sig ipppp */ + function napi_set_property(env, object, key, value) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + h.value[emnapiCtx.handleStore.get(key).value] = emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_has_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + r = (emnapiCtx.handleStore.get(key).value in v) ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_get_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(v[emnapiCtx.handleStore.get(key).value]); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_delete_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + var propertyKey = emnapiCtx.handleStore.get(key).value; + if (emnapiCtx.feature.supportReflect) { + r = Reflect.deleteProperty(h.value, propertyKey); + } + else { + try { + r = delete h.value[propertyKey]; + } + catch (_) { + r = false; + } + } + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_has_own_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + var prop = emnapiCtx.handleStore.get(key).value; + if (typeof prop !== 'string' && typeof prop !== 'symbol') { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + r = Object.prototype.hasOwnProperty.call(v, emnapiCtx.handleStore.get(key).value); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_set_named_property(env, object, cname, value) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + if (!cname) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + emnapiCtx.handleStore.get(object).value[emnapiString.UTF8ToString(cname, -1)] = emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_has_named_property(env, object, utf8name, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!utf8name) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + r = emnapiString.UTF8ToString(utf8name, -1) in v; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_get_named_property(env, object, utf8name, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!utf8name) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(v[emnapiString.UTF8ToString(utf8name, -1)]); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippip */ + function napi_set_element(env, object, index, value) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + h.value[index >>> 0] = emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippip */ + function napi_has_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + r = ((index >>> 0) in v) ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippip */ + function napi_get_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } + catch (_) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(v[index >>> 0]); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippip */ + function napi_delete_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + if (emnapiCtx.feature.supportReflect) { + r = Reflect.deleteProperty(h.value, index >>> 0); + } + else { + try { + r = delete h.value[index >>> 0]; + } + catch (_) { + r = false; + } + } + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_define_properties(env, object, property_count, properties) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var propPtr, attributes; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + property_count = property_count >>> 0; + if (property_count > 0) { + if (!properties) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + var propertyName = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < property_count; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + propPtr = properties + (i * (4 * 8)); + var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); + var name_2 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); + var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); + var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); + var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); + var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); + attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); + var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); + if (utf8Name) { + propertyName = emnapiString.UTF8ToString(utf8Name, -1); + } + else { + if (!name_2) { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + propertyName = emnapiCtx.handleStore.get(name_2).value; + if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + } + emnapiDefineProperty(envObject, maybeObject, propertyName, method, getter, setter, value, attributes, data); + } + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipp */ + function napi_object_freeze(env, object) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + Object.freeze(maybeObject); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipp */ + function napi_object_seal(env, object) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError(2 /* napi_status.napi_object_expected */); + } + Object.seal(maybeObject); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + var propertyMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_define_properties: napi_define_properties, + napi_delete_element: napi_delete_element, + napi_delete_property: napi_delete_property, + napi_get_all_property_names: napi_get_all_property_names, + napi_get_element: napi_get_element, + napi_get_named_property: napi_get_named_property, + napi_get_property: napi_get_property, + napi_get_property_names: napi_get_property_names, + napi_has_element: napi_has_element, + napi_has_named_property: napi_has_named_property, + napi_has_own_property: napi_has_own_property, + napi_has_property: napi_has_property, + napi_object_freeze: napi_object_freeze, + napi_object_seal: napi_object_seal, + napi_set_element: napi_set_element, + napi_set_named_property: napi_set_named_property, + napi_set_property: napi_set_property + }); + /** @__sig ippp */ + function napi_run_script(env, script, result) { + var status; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!script) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v8Script = emnapiCtx.handleStore.get(script); + if (!v8Script.isString()) { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var g = emnapiCtx.handleStore.get(5 /* GlobalHandle.GLOBAL */).value; + var ret = g.eval(v8Script.value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(ret); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + status = envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + return status; + } + var scriptMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_run_script: napi_run_script + }); + /** @__sig ippp */ + function napi_typeof(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v = emnapiCtx.handleStore.get(value); + var r; + if (v.isNumber()) { + r = 3 /* napi_valuetype.napi_number */; + } + else if (v.isBigInt()) { + r = 9 /* napi_valuetype.napi_bigint */; + } + else if (v.isString()) { + r = 4 /* napi_valuetype.napi_string */; + } + else if (v.isFunction()) { + // This test has to come before IsObject because IsFunction + // implies IsObject + r = 7 /* napi_valuetype.napi_function */; + } + else if (v.isExternal()) { + // This test has to come before IsObject because IsExternal + // implies IsObject + r = 8 /* napi_valuetype.napi_external */; + } + else if (v.isObject()) { + r = 6 /* napi_valuetype.napi_object */; + } + else if (v.isBoolean()) { + r = 2 /* napi_valuetype.napi_boolean */; + } + else if (v.isUndefined()) { + r = 0 /* napi_valuetype.napi_undefined */; + } + else if (v.isSymbol()) { + r = 5 /* napi_valuetype.napi_symbol */; + } + else if (v.isNull()) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + r = 1 /* napi_valuetype.napi_null */; + } + else { + // Should not get here unless V8 has added some new kind of value. + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_coerce_to_bool(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + v = handle.value ? 4 /* GlobalHandle.TRUE */ : 3 /* GlobalHandle.FALSE */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_coerce_to_number(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.isBigInt()) { + throw new TypeError('Cannot convert a BigInt value to a number'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = emnapiCtx.addToCurrentScope(Number(handle.value)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_coerce_to_object(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(Object(handle.value)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_coerce_to_string(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.isSymbol()) { + throw new TypeError('Cannot convert a Symbol value to a string'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = emnapiCtx.addToCurrentScope(String(handle.value)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipppp */ + function napi_instanceof(env, object, constructor, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, 0, true); + var ctor = emnapiCtx.handleStore.get(constructor); + if (!ctor.isFunction()) { + return envObject.setLastError(5 /* napi_status.napi_function_expected */); + } + var val = emnapiCtx.handleStore.get(object).value; + var ret = val instanceof ctor.value; + r = ret ? 1 : 0; + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ippp */ + function napi_is_array(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isArray() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_arraybuffer(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isArrayBuffer() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_date(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isDate() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_error(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var val = emnapiCtx.handleStore.get(value).value; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = (val instanceof Error) ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_typedarray(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isTypedArray() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_buffer(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isBuffer() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_dataview(env, value, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isDataView() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_strict_equals(env, lhs, rhs, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!lhs) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!rhs) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var lv = emnapiCtx.handleStore.get(lhs).value; + var rv = emnapiCtx.handleStore.get(rhs).value; + r = (lv === rv) ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + /** @__sig ipp */ + function napi_detach_arraybuffer(env, arraybuffer) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var value = emnapiCtx.handleStore.get(arraybuffer).value; + if (!(value instanceof ArrayBuffer)) { + if (typeof SharedArrayBuffer === 'function' && (value instanceof SharedArrayBuffer)) { + return envObject.setLastError(20 /* napi_status.napi_detachable_arraybuffer_expected */); + } + return envObject.setLastError(19 /* napi_status.napi_arraybuffer_expected */); + } + try { + var MessageChannel_1 = emnapiCtx.feature.MessageChannel; + var messageChannel = new MessageChannel_1(); + messageChannel.port1.postMessage(value, [value]); + } + catch (_) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_detached_arraybuffer(env, arraybuffer, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + if (!envObject.canCallIntoJs()) + return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(arraybuffer); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (h.isArrayBuffer() && h.value.byteLength === 0) { + try { + // eslint-disable-next-line no-new + new Uint8Array(h.value); + } + catch (_) { + HEAP_DATA_VIEW.setInt8(result, 1, true); + return envObject.getReturnStatus(); + } + } + HEAP_DATA_VIEW.setInt8(result, 0, true); + return envObject.getReturnStatus(); + } + catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError(10 /* napi_status.napi_pending_exception */); + } + } + var valueOperationMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_coerce_to_bool: napi_coerce_to_bool, + napi_coerce_to_number: napi_coerce_to_number, + napi_coerce_to_object: napi_coerce_to_object, + napi_coerce_to_string: napi_coerce_to_string, + napi_detach_arraybuffer: napi_detach_arraybuffer, + napi_instanceof: napi_instanceof, + napi_is_array: napi_is_array, + napi_is_arraybuffer: napi_is_arraybuffer, + napi_is_buffer: napi_is_buffer, + napi_is_dataview: napi_is_dataview, + napi_is_date: napi_is_date, + napi_is_detached_arraybuffer: napi_is_detached_arraybuffer, + napi_is_error: napi_is_error, + napi_is_typedarray: napi_is_typedarray, + napi_strict_equals: napi_strict_equals, + napi_typeof: napi_typeof + }); + /** @__sig ipp */ + function napi_get_version(env, result) { + if (!env) + return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var NODE_API_SUPPORTED_VERSION_MAX = 9 /* Version.NODE_API_SUPPORTED_VERSION_MAX */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, NODE_API_SUPPORTED_VERSION_MAX, true); + return envObject.clearLastError(); + } + var versionMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_version: napi_get_version + }); + emnapiAWST.init(); + emnapiExternalMemory.init(); + emnapiString.init(); + emnapiTSFN.init(); + napiModule.emnapi.syncMemory = $emnapiSyncMemory; + napiModule.emnapi.getMemoryAddress = $emnapiGetMemoryAddress; + function addImports(mod) { + var keys = Object.keys(mod); + for (var i = 0; i < keys.length; ++i) { + var k = keys[i]; + if (k.indexOf('$') === 0) + continue; + if (k.indexOf('emnapi_') === 0) { + napiModule.imports.emnapi[k] = mod[k]; + } + else if (k.indexOf('_emnapi_') === 0 || k === 'napi_set_last_error' || k === 'napi_clear_last_error') { + napiModule.imports.env[k] = mod[k]; + } + else { + napiModule.imports.napi[k] = mod[k]; + } + } + } + addImports(asyncMod); + addImports(memoryMod); + addImports(asyncWorkMod); + addImports(utilMod); + addImports(convert2cMod); + addImports(convert2napiMod); + addImports(createMod); + addImports(globalMod); + addImports(wrapMod); + addImports(envMod); + addImports(emnapiMod); + addImports(errorMod); + addImports(functionMod); + addImports(lifeMod); + addImports(miscellaneousMod); + addImports(nodeMod); + addImports(promiseMod); + addImports(propertyMod); + addImports(scriptMod); + addImports(valueOperationMod); + addImports(versionMod); + napiModule.imports.napi.napi_create_threadsafe_function = napi_create_threadsafe_function; + napiModule.imports.napi.napi_get_threadsafe_function_context = napi_get_threadsafe_function_context; + napiModule.imports.napi.napi_call_threadsafe_function = napi_call_threadsafe_function; + napiModule.imports.napi.napi_acquire_threadsafe_function = napi_acquire_threadsafe_function; + napiModule.imports.napi.napi_release_threadsafe_function = napi_release_threadsafe_function; + napiModule.imports.napi.napi_unref_threadsafe_function = napi_unref_threadsafe_function; + napiModule.imports.napi.napi_ref_threadsafe_function = napi_ref_threadsafe_function; + return napiModule; + })(); + return napiModule; +} + +function loadNapiModuleImpl(loadFn, userNapiModule, wasmInput, options) { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + options = options !== null && options !== void 0 ? options : {}; + var getMemory = options.getMemory; + var getTable = options.getTable; + var beforeInit = options.beforeInit; + if (getMemory != null && typeof getMemory !== 'function') { + throw new TypeError('options.getMemory is not a function'); + } + if (getTable != null && typeof getTable !== 'function') { + throw new TypeError('options.getTable is not a function'); + } + if (beforeInit != null && typeof beforeInit !== 'function') { + throw new TypeError('options.beforeInit is not a function'); + } + var napiModule; + { + napiModule = createNapiModule(options); + } + var wasi = options.wasi; + var importObject = { + env: napiModule.imports.env, + napi: napiModule.imports.napi, + emnapi: napiModule.imports.emnapi, + wasi: { + // eslint-disable-next-line camelcase + 'thread-spawn': function __imported_wasi_thread_spawn(startArg, errorOrTid) { + return napiModule.spawnThread(startArg, errorOrTid); + } + } + }; + if (wasi) { + Object.assign(importObject, typeof wasi.getImportObject === 'function' + ? wasi.getImportObject() + : { wasi_snapshot_preview1: wasi.wasiImport }); + } + var overwriteImports = options.overwriteImports; + if (typeof overwriteImports === 'function') { + var newImportObject = overwriteImports(importObject); + if (typeof newImportObject === 'object' && newImportObject !== null) { + importObject = newImportObject; + } + } + return loadFn(wasmInput, importObject, function (err, source) { + if (err) { + throw err; + } + var originalInstance = source.instance; + var instance = originalInstance; + var originalExports = originalInstance.exports; + var exportMemory = 'memory' in originalExports; + var importMemory = 'memory' in importObject.env; + var memory = getMemory + ? getMemory(originalExports) + : exportMemory + ? originalExports.memory + : importMemory + ? importObject.env.memory + : undefined; + if (!memory) { + throw new Error('memory is neither exported nor imported'); + } + var table = getTable ? getTable(originalExports) : originalExports.__indirect_function_table; + if (wasi && !exportMemory) { + var exports_1 = Object.create(null); + Object.assign(exports_1, originalExports, { memory: memory }); + instance = { exports: exports_1 }; + } + var module = source.module; + if (wasi) { + if (napiModule.childThread) { + // https://github.com/nodejs/help/issues/4102 + var createHandler = function (target) { + var handlers = [ + 'apply', + 'construct', + 'defineProperty', + 'deleteProperty', + 'get', + 'getOwnPropertyDescriptor', + 'getPrototypeOf', + 'has', + 'isExtensible', + 'ownKeys', + 'preventExtensions', + 'set', + 'setPrototypeOf' + ]; + var handler = {}; + var _loop_1 = function (i) { + var name_1 = handlers[i]; + handler[name_1] = function () { + var args = Array.prototype.slice.call(arguments, 1); + args.unshift(target); + return Reflect[name_1].apply(Reflect, args); + }; + }; + for (var i = 0; i < handlers.length; i++) { + _loop_1(i); + } + return handler; + }; + var handler = createHandler(originalExports); + var noop_1 = function () { }; + handler.get = function (_target, p, receiver) { + if (p === 'memory') { + return memory; + } + if (p === '_initialize') { + return noop_1; + } + return Reflect.get(originalExports, p, receiver); + }; + var exportsProxy_1 = new Proxy(Object.create(null), handler); + instance = new Proxy(instance, { + get: function (target, p, receiver) { + if (p === 'exports') { + return exportsProxy_1; + } + return Reflect.get(target, p, receiver); + } + }); + } + wasi.initialize(instance); + } + if (beforeInit) { + beforeInit({ + instance: originalInstance, + module: module + }); + } + napiModule.init({ + instance: instance, + module: module, + memory: memory, + table: table + }); + var ret = { instance: originalInstance, module: module }; + { + ret.napiModule = napiModule; + } + return ret; + }); +} +function loadCallback(wasmInput, importObject, callback) { + return load(wasmInput, importObject).then(function (source) { + return callback(null, source); + }, function (err) { + return callback(err); + }); +} +function loadSyncCallback(wasmInput, importObject, callback) { + var source; + try { + source = loadSync(wasmInput, importObject); + } + catch (err) { + return callback(err); + } + return callback(null, source); +} +/** @public */ +function instantiateNapiModule( +/** Only support `BufferSource` or `WebAssembly.Module` on Node.js */ +wasmInput, options) { + return loadNapiModuleImpl(loadCallback, undefined, wasmInput, options); +} +/** @public */ +function instantiateNapiModuleSync(wasmInput, options) { + return loadNapiModuleImpl(loadSyncCallback, undefined, wasmInput, options); +} + +/** @public */ +var MessageHandler = /*#__PURE__*/ (function () { + function MessageHandler(options) { + var onLoad = options.onLoad; + if (typeof onLoad !== 'function') { + throw new TypeError('options.onLoad is not a function'); + } + this.onLoad = onLoad; + this.instance = undefined; + // this.module = undefined + this.napiModule = undefined; + this.messagesBeforeLoad = []; + } + MessageHandler.prototype.handle = function (e) { + var _this = this; + var _a; + if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) { + var type = e.data.__emnapi__.type; + var payload_1 = e.data.__emnapi__.payload; + var onLoad = this.onLoad; + if (type === 'load') { + if (this.instance !== undefined) + return; + var source = onLoad(payload_1); + var then = source && 'then' in source ? source.then : undefined; + if (typeof then === 'function') { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + then.call(source, function (source) { onLoaded.call(_this, source); }, function (err) { throw err; }); + } + else { + onLoaded.call(this, source); + } + } + else if (type === 'start') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.startThread(payload_1.tid, payload_1.arg); + }); + } + else if (type === 'async-worker-init') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.initWorker(payload_1.arg); + }); + } + else if (type === 'async-work-execute') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.executeAsyncWork(payload_1.work); + }); + } + } + }; + return MessageHandler; +}()); +function handleAfterLoad(e, f) { + if (this.instance !== undefined) { + f.call(this, e); + } + else { + this.messagesBeforeLoad.push(e.data); + } +} +function onLoaded(source) { + if (source == null) { + throw new TypeError('onLoad should return an object'); + } + var instance = source.instance; + var napiModule = source.napiModule; + if (!instance) + throw new TypeError('onLoad should return an object which includes "instance"'); + if (!napiModule) + throw new TypeError('onLoad should return an object which includes "napiModule"'); + if (!napiModule.childThread) + throw new Error('napiModule should be created with `childThread: true`'); + this.instance = instance; + this.napiModule = napiModule; + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'loaded', + payload: {} + } + }); + var messages = this.messagesBeforeLoad; + this.messagesBeforeLoad = []; + for (var i = 0; i < messages.length; i++) { + var data = messages[i]; + this.handle({ data: data }); + } +} + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +var EMPTY_ARGS = []; +var CallbackInfo = /*#__PURE__*/ (function () { + function CallbackInfo(id, parent, child, thiz, data, args, fn) { + this.id = id; + this.parent = parent; + this.child = child; + this.thiz = thiz; + this.data = data; + this.args = args; + this.fn = fn; + } + CallbackInfo.prototype.getNewTarget = function (envObject) { + var thiz = this.thiz; + // eslint-disable-next-line @typescript-eslint/prefer-optional-chain + if (thiz == null || thiz.constructor == null) + return 0; + return thiz instanceof this.fn ? envObject.ensureHandleId(thiz.constructor) : 0; + }; + CallbackInfo.prototype.dispose = function () { + if (this.thiz !== undefined) + this.thiz = undefined; + this.args = EMPTY_ARGS; + this.fn = null; + }; + return CallbackInfo; +}()); +var ROOT_CBINFO = new CallbackInfo(0, null, null, null, 0, null, null); +var CallbackInfoStack = /*#__PURE__*/ (function () { + function CallbackInfoStack() { + this.current = ROOT_CBINFO; + } + CallbackInfoStack.prototype.get = function (id) { + if (id === 1) + return ROOT_CBINFO.child; + var info = ROOT_CBINFO; + for (var i = 0; i < id; ++i) { + info = info.child; + if (info === null) + return null; + } + return info === ROOT_CBINFO ? null : info; + }; + CallbackInfoStack.prototype.pop = function () { + var current = this.current; + if (current === ROOT_CBINFO) + return; + this.current = current.parent; + current.dispose(); + }; + CallbackInfoStack.prototype.push = function (thiz, data, args, fn) { + var info = this.current.child; + if (info) { + info.thiz = thiz; + info.data = data; + info.args = args; + info.fn = fn; + } + else { + info = new CallbackInfo(this.current.id + 1, this.current, null, thiz, data, args, fn); + this.current.child = info; + } + this.current = info; + return info.id; + }; + CallbackInfoStack.prototype.dispose = function () { + this.current = null; + }; + return CallbackInfoStack; +}()); + +var supportNewFunction = /*#__PURE__*/ (function () { + var f; + try { + f = new Function(); + } + catch (_) { + return false; + } + return typeof f === 'function'; +})(); +var _global = /*#__PURE__*/ (function () { + if (typeof globalThis !== 'undefined') + return globalThis; + var g = (function () { return this; })(); + if (!g && supportNewFunction) { + try { + g = new Function('return this')(); + } + catch (_) { } + } + if (!g) { + { + if (typeof global !== 'undefined') + return global; + } + if (typeof window !== 'undefined') + return window; + if (typeof self !== 'undefined') + return self; + } + return g; +})(); +var TryCatch = /*#__PURE__*/ (function () { + function TryCatch() { + this._exception = undefined; + this._caught = false; + } + TryCatch.prototype.isEmpty = function () { + return !this._caught; + }; + TryCatch.prototype.hasCaught = function () { + return this._caught; + }; + TryCatch.prototype.exception = function () { + return this._exception; + }; + TryCatch.prototype.setError = function (err) { + this._caught = true; + this._exception = err; + }; + TryCatch.prototype.reset = function () { + this._caught = false; + this._exception = undefined; + }; + TryCatch.prototype.extractException = function () { + var e = this._exception; + this.reset(); + return e; + }; + return TryCatch; +}()); +var canSetFunctionName = /*#__PURE__*/ (function () { + var _a; + try { + return Boolean((_a = Object.getOwnPropertyDescriptor(Function.prototype, 'name')) === null || _a === void 0 ? void 0 : _a.configurable); + } + catch (_) { + return false; + } +})(); +var supportReflect = typeof Reflect === 'object'; +var supportFinalizer = (typeof FinalizationRegistry !== 'undefined') && (typeof WeakRef !== 'undefined'); +var supportWeakSymbol = /*#__PURE__*/ (function () { + try { + // eslint-disable-next-line symbol-description + var sym = Symbol(); + // eslint-disable-next-line no-new + new WeakRef(sym); + new WeakMap().set(sym, undefined); + } + catch (_) { + return false; + } + return true; +})(); +var supportBigInt = typeof BigInt !== 'undefined'; +function isReferenceType(v) { + return (typeof v === 'object' && v !== null) || typeof v === 'function'; +} +var _require = /*#__PURE__*/ (function () { + var nativeRequire; + { + nativeRequire = (function () { + return (typeof require !== 'undefined' ? require : undefined); + })(); + } + return nativeRequire; +})(); +var _MessageChannel = typeof MessageChannel === 'function' + ? MessageChannel + : /*#__PURE__*/ (function () { + try { + return _require('worker_threads').MessageChannel; + } + catch (_) { } + return undefined; + })(); +var _setImmediate = typeof setImmediate === 'function' + ? setImmediate + : function (callback) { + if (typeof callback !== 'function') { + throw new TypeError('The "callback" argument must be of type function'); + } + if (_MessageChannel) { + var channel_1 = new _MessageChannel(); + channel_1.port1.onmessage = function () { + channel_1.port1.onmessage = null; + channel_1 = undefined; + callback(); + }; + channel_1.port2.postMessage(null); + } + else { + setTimeout(callback, 0); + } + }; +var _Buffer = typeof Buffer === 'function' + ? Buffer + : /*#__PURE__*/ (function () { + try { + return _require('buffer').Buffer; + } + catch (_) { } + return undefined; + })(); +var version = "1.1.1"; +var NODE_API_SUPPORTED_VERSION_MAX = 9 /* Version.NODE_API_SUPPORTED_VERSION_MAX */; +var NAPI_VERSION_EXPERIMENTAL = 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */; +var NODE_API_DEFAULT_MODULE_API_VERSION = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */; + +var Handle = /*#__PURE__*/ (function () { + function Handle(id, value) { + this.id = id; + this.value = value; + } + Handle.prototype.data = function (envObject) { + return envObject.getObjectBinding(this.value).data; + }; + Handle.prototype.isNumber = function () { + return typeof this.value === 'number'; + }; + Handle.prototype.isBigInt = function () { + return typeof this.value === 'bigint'; + }; + Handle.prototype.isString = function () { + return typeof this.value === 'string'; + }; + Handle.prototype.isFunction = function () { + return typeof this.value === 'function'; + }; + Handle.prototype.isExternal = function () { + return (isReferenceType(this.value) && Object.getPrototypeOf(this.value) === null); + }; + Handle.prototype.isObject = function () { + return typeof this.value === 'object' && this.value !== null; + }; + Handle.prototype.isArray = function () { + return Array.isArray(this.value); + }; + Handle.prototype.isArrayBuffer = function () { + return (this.value instanceof ArrayBuffer); + }; + Handle.prototype.isTypedArray = function () { + return (ArrayBuffer.isView(this.value)) && !(this.value instanceof DataView); + }; + Handle.prototype.isBuffer = function () { + return typeof _Buffer === 'function' && _Buffer.isBuffer(this.value); + }; + Handle.prototype.isDataView = function () { + return (this.value instanceof DataView); + }; + Handle.prototype.isDate = function () { + return (this.value instanceof Date); + }; + Handle.prototype.isPromise = function () { + return (this.value instanceof Promise); + }; + Handle.prototype.isBoolean = function () { + return typeof this.value === 'boolean'; + }; + Handle.prototype.isUndefined = function () { + return this.value === undefined; + }; + Handle.prototype.isSymbol = function () { + return typeof this.value === 'symbol'; + }; + Handle.prototype.isNull = function () { + return this.value === null; + }; + Handle.prototype.dispose = function () { + this.value = undefined; + }; + return Handle; +}()); +var ConstHandle = /*#__PURE__*/ (function (_super) { + __extends(ConstHandle, _super); + function ConstHandle(id, value) { + return _super.call(this, id, value) || this; + } + ConstHandle.prototype.dispose = function () { }; + return ConstHandle; +}(Handle)); +function External() { + Object.setPrototypeOf(this, null); +} +External.prototype = null; +var HandleStore = /*#__PURE__*/ (function () { + function HandleStore() { + this._values = [ + undefined, + HandleStore.UNDEFINED, + HandleStore.NULL, + HandleStore.FALSE, + HandleStore.TRUE, + HandleStore.GLOBAL + ]; + this._next = HandleStore.MIN_ID; + } + HandleStore.prototype.push = function (value) { + var h; + var next = this._next; + var values = this._values; + if (next < values.length) { + h = values[next]; + h.value = value; + } + else { + h = new Handle(next, value); + values[next] = h; + } + this._next++; + return h; + }; + HandleStore.prototype.erase = function (start, end) { + this._next = start; + var values = this._values; + for (var i = start; i < end; ++i) { + values[i].dispose(); + } + }; + HandleStore.prototype.get = function (id) { + return this._values[id]; + }; + HandleStore.prototype.swap = function (a, b) { + var values = this._values; + var h = values[a]; + values[a] = values[b]; + values[a].id = Number(a); + values[b] = h; + h.id = Number(b); + }; + HandleStore.prototype.dispose = function () { + this._values.length = HandleStore.MIN_ID; + this._next = HandleStore.MIN_ID; + }; + HandleStore.UNDEFINED = new ConstHandle(1 /* GlobalHandle.UNDEFINED */, undefined); + HandleStore.NULL = new ConstHandle(2 /* GlobalHandle.NULL */, null); + HandleStore.FALSE = new ConstHandle(3 /* GlobalHandle.FALSE */, false); + HandleStore.TRUE = new ConstHandle(4 /* GlobalHandle.TRUE */, true); + HandleStore.GLOBAL = new ConstHandle(5 /* GlobalHandle.GLOBAL */, _global); + HandleStore.MIN_ID = 6; + return HandleStore; +}()); + +var HandleScope = /*#__PURE__*/ (function () { + function HandleScope(handleStore, id, parentScope, start, end) { + if (end === void 0) { end = start; } + this.handleStore = handleStore; + this.id = id; + this.parent = parentScope; + this.child = null; + if (parentScope !== null) + parentScope.child = this; + this.start = start; + this.end = end; + this._escapeCalled = false; + } + HandleScope.prototype.add = function (value) { + var h = this.handleStore.push(value); + this.end++; + return h; + }; + HandleScope.prototype.addExternal = function (envObject, data) { + var value = new External(); + var h = envObject.ctx.handleStore.push(value); + var binding = envObject.initObjectBinding(value); + binding.data = data; + this.end++; + return h; + }; + HandleScope.prototype.dispose = function () { + if (this.start === this.end) + return; + this.handleStore.erase(this.start, this.end); + }; + HandleScope.prototype.escape = function (handle) { + if (this._escapeCalled) + return null; + this._escapeCalled = true; + if (handle < this.start || handle >= this.end) { + return null; + } + this.handleStore.swap(handle, this.start); + var h = this.handleStore.get(this.start); + this.start++; + this.parent.end++; + return h; + }; + HandleScope.prototype.escapeCalled = function () { + return this._escapeCalled; + }; + return HandleScope; +}()); + +var ScopeStore = /*#__PURE__*/ (function () { + function ScopeStore() { + this._rootScope = new HandleScope(null, 0, null, 1, HandleStore.MIN_ID); + this.currentScope = this._rootScope; + } + ScopeStore.prototype.get = function (id) { + id = Number(id); + var scope = this.currentScope; + while (scope !== this._rootScope) { + if (scope.id === id) { + return scope; + } + scope = scope.parent; + } + return undefined; + }; + ScopeStore.prototype.openScope = function (envObject) { + var currentScope = this.currentScope; + var scope = currentScope.child; + if (scope !== null) { + scope.start = scope.end = currentScope.end; + scope._escapeCalled = false; + } + else { + scope = new HandleScope(envObject.ctx.handleStore, currentScope.id + 1, currentScope, currentScope.end); + } + this.currentScope = scope; + envObject.openHandleScopes++; + return scope; + }; + ScopeStore.prototype.closeScope = function (envObject) { + if (envObject.openHandleScopes === 0) + return; + var scope = this.currentScope; + this.currentScope = scope.parent; + scope.dispose(); + envObject.openHandleScopes--; + }; + ScopeStore.prototype.dispose = function () { + var scope = this.currentScope; + while (scope !== null) { + scope.handleStore = null; + scope.id = 0; + scope.parent = null; + scope.start = HandleStore.MIN_ID; + scope.end = HandleStore.MIN_ID; + scope._escapeCalled = false; + var child = scope.child; + scope.child = null; + scope = child; + } + this.currentScope = null; + }; + return ScopeStore; +}()); + +var RefTracker = /*#__PURE__*/ (function () { + function RefTracker() { + this._next = null; + this._prev = null; + } + /** @virtual */ + RefTracker.prototype.finalize = function () { }; + RefTracker.prototype.link = function (list) { + this._prev = list; + this._next = list._next; + if (this._next !== null) { + this._next._prev = this; + } + list._next = this; + }; + RefTracker.prototype.unlink = function () { + if (this._prev !== null) { + this._prev._next = this._next; + } + if (this._next !== null) { + this._next._prev = this._prev; + } + this._prev = null; + this._next = null; + }; + RefTracker.finalizeAll = function (list) { + while (list._next !== null) { + list._next.finalize(); + } + }; + return RefTracker; +}()); + +var Finalizer = /*#__PURE__*/ (function () { + function Finalizer(envObject, _finalizeCallback, _finalizeData, _finalizeHint) { + if (_finalizeCallback === void 0) { _finalizeCallback = 0; } + if (_finalizeData === void 0) { _finalizeData = 0; } + if (_finalizeHint === void 0) { _finalizeHint = 0; } + this.envObject = envObject; + this._finalizeCallback = _finalizeCallback; + this._finalizeData = _finalizeData; + this._finalizeHint = _finalizeHint; + } + Finalizer.prototype.callback = function () { return this._finalizeCallback; }; + Finalizer.prototype.data = function () { return this._finalizeData; }; + Finalizer.prototype.hint = function () { return this._finalizeHint; }; + Finalizer.prototype.resetFinalizer = function () { + this._finalizeCallback = 0; + this._finalizeData = 0; + this._finalizeHint = 0; + }; + Finalizer.prototype.dispose = function () { + this.envObject = undefined; + }; + return Finalizer; +}()); + +var TrackedFinalizer = /*#__PURE__*/ (function (_super) { + __extends(TrackedFinalizer, _super); + function TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint) { + var _this = _super.call(this, envObject, finalize_callback, finalize_data, finalize_hint) || this; + _this._next = null; + _this._prev = null; + _this.link(!finalize_callback ? envObject.reflist : envObject.finalizing_reflist); + return _this; + } + TrackedFinalizer.finalizeAll = function (list) { + RefTracker.finalizeAll(list); + }; + TrackedFinalizer.prototype.link = function (list) { + RefTracker.prototype.link.call(this, list); + }; + TrackedFinalizer.prototype.unlink = function () { + RefTracker.prototype.unlink.call(this); + }; + TrackedFinalizer.create = function (envObject, finalize_callback, finalize_data, finalize_hint) { + return new TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint); + }; + TrackedFinalizer.prototype.dispose = function () { + this.unlink(); + this.envObject.dequeueFinalizer(this); + _super.prototype.dispose.call(this); + }; + TrackedFinalizer.prototype.finalize = function () { + this.finalizeCore(true); + }; + TrackedFinalizer.prototype.finalizeCore = function (deleteMe) { + var finalize_callback = this._finalizeCallback; + var finalize_data = this._finalizeData; + var finalize_hint = this._finalizeHint; + this.resetFinalizer(); + this.unlink(); + var error; + var caught = false; + if (finalize_callback) { + var fini = Number(finalize_callback); + try { + this.envObject.callFinalizer(fini, finalize_data, finalize_hint); + } + catch (err) { + caught = true; + error = err; + } + } + if (deleteMe) { + this.dispose(); + } + if (caught) { + throw error; + } + }; + return TrackedFinalizer; +}(Finalizer)); + +var RefBase = /*#__PURE__*/ (function (_super) { + __extends(RefBase, _super); + function RefBase(envObject, initial_refcount, ownership, finalize_callback, finalize_data, finalize_hint) { + var _this = _super.call(this, envObject, finalize_callback, finalize_data, finalize_hint) || this; + _this._refcount = initial_refcount; + _this._ownership = ownership; + return _this; + } + RefBase.prototype.data = function () { + return this._finalizeData; + }; + RefBase.prototype.ref = function () { + return ++this._refcount; + }; + RefBase.prototype.unref = function () { + if (this._refcount === 0) { + return 0; + } + return --this._refcount; + }; + RefBase.prototype.refCount = function () { + return this._refcount; + }; + RefBase.prototype.ownership = function () { + return this._ownership; + }; + RefBase.prototype.finalize = function () { + this.finalizeCore(this._ownership === 0 /* Ownership.kRuntime */); + }; + return RefBase; +}(TrackedFinalizer)); + +function throwNodeApiVersionError(moduleName, moduleApiVersion) { + var errorMessage = "".concat(moduleName, " requires Node-API version ").concat(moduleApiVersion, ", but this version of Node.js only supports version ").concat(NODE_API_SUPPORTED_VERSION_MAX, " add-ons."); + throw new Error(errorMessage); +} +function handleThrow(envObject, value) { + if (envObject.terminatedOrTerminating()) { + return; + } + throw value; +} +var Env = /*#__PURE__*/ (function () { + function Env(ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) { + this.ctx = ctx; + this.moduleApiVersion = moduleApiVersion; + this.makeDynCall_vppp = makeDynCall_vppp; + this.makeDynCall_vp = makeDynCall_vp; + this.abort = abort; + this.openHandleScopes = 0; + this.instanceData = null; + this.tryCatch = new TryCatch(); + this.refs = 1; + this.reflist = new RefTracker(); + this.finalizing_reflist = new RefTracker(); + this.pendingFinalizers = []; + this.lastError = { + errorCode: 0 /* napi_status.napi_ok */, + engineErrorCode: 0, + engineReserved: 0 + }; + this.inGcFinalizer = false; + this._bindingMap = new WeakMap(); + this.id = 0; + } + /** @virtual */ + Env.prototype.canCallIntoJs = function () { + return true; + }; + Env.prototype.terminatedOrTerminating = function () { + return !this.canCallIntoJs(); + }; + Env.prototype.ref = function () { + this.refs++; + }; + Env.prototype.unref = function () { + this.refs--; + if (this.refs === 0) { + this.dispose(); + } + }; + Env.prototype.ensureHandle = function (value) { + return this.ctx.ensureHandle(value); + }; + Env.prototype.ensureHandleId = function (value) { + return this.ensureHandle(value).id; + }; + Env.prototype.clearLastError = function () { + var lastError = this.lastError; + if (lastError.errorCode !== 0 /* napi_status.napi_ok */) + lastError.errorCode = 0 /* napi_status.napi_ok */; + if (lastError.engineErrorCode !== 0) + lastError.engineErrorCode = 0; + if (lastError.engineReserved !== 0) + lastError.engineReserved = 0; + return 0 /* napi_status.napi_ok */; + }; + Env.prototype.setLastError = function (error_code, engine_error_code, engine_reserved) { + if (engine_error_code === void 0) { engine_error_code = 0; } + if (engine_reserved === void 0) { engine_reserved = 0; } + var lastError = this.lastError; + if (lastError.errorCode !== error_code) + lastError.errorCode = error_code; + if (lastError.engineErrorCode !== engine_error_code) + lastError.engineErrorCode = engine_error_code; + if (lastError.engineReserved !== engine_reserved) + lastError.engineReserved = engine_reserved; + return error_code; + }; + Env.prototype.getReturnStatus = function () { + return !this.tryCatch.hasCaught() ? 0 /* napi_status.napi_ok */ : this.setLastError(10 /* napi_status.napi_pending_exception */); + }; + Env.prototype.callIntoModule = function (fn, handleException) { + if (handleException === void 0) { handleException = handleThrow; } + var openHandleScopesBefore = this.openHandleScopes; + this.clearLastError(); + var r = fn(this); + if (openHandleScopesBefore !== this.openHandleScopes) { + this.abort('open_handle_scopes != open_handle_scopes_before'); + } + if (this.tryCatch.hasCaught()) { + var err = this.tryCatch.extractException(); + handleException(this, err); + } + return r; + }; + /** @virtual */ + Env.prototype.callFinalizer = function (cb, data, hint) { + var f = this.makeDynCall_vppp(cb); + var env = this.id; + var scope = this.ctx.openScope(this); + try { + this.callIntoModule(function () { f(env, data, hint); }); + } + finally { + this.ctx.closeScope(this, scope); + } + }; + Env.prototype.invokeFinalizerFromGC = function (finalizer) { + if (this.moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) { + this.enqueueFinalizer(finalizer); + } + else { + var saved = this.inGcFinalizer; + this.inGcFinalizer = true; + try { + finalizer.finalize(); + } + finally { + this.inGcFinalizer = saved; + } + } + }; + Env.prototype.checkGCAccess = function () { + if (this.moduleApiVersion === NAPI_VERSION_EXPERIMENTAL && this.inGcFinalizer) { + this.abort('Finalizer is calling a function that may affect GC state.\n' + + 'The finalizers are run directly from GC and must not affect GC ' + + 'state.\n' + + 'Use `node_api_post_finalizer` from inside of the finalizer to work ' + + 'around this issue.\n' + + 'It schedules the call as a new task in the event loop.'); + } + }; + /** @virtual */ + Env.prototype.enqueueFinalizer = function (finalizer) { + if (this.pendingFinalizers.indexOf(finalizer) === -1) { + this.pendingFinalizers.push(finalizer); + } + }; + /** @virtual */ + Env.prototype.dequeueFinalizer = function (finalizer) { + var index = this.pendingFinalizers.indexOf(finalizer); + if (index !== -1) { + this.pendingFinalizers.splice(index, 1); + } + }; + /** @virtual */ + Env.prototype.deleteMe = function () { + RefBase.finalizeAll(this.finalizing_reflist); + RefBase.finalizeAll(this.reflist); + this.tryCatch.extractException(); + this.ctx.envStore.remove(this.id); + }; + Env.prototype.dispose = function () { + if (this.id === 0) + return; + this.deleteMe(); + this.id = 0; + }; + Env.prototype.initObjectBinding = function (value) { + var binding = { + wrapped: 0, + tag: null, + data: 0 + }; + this._bindingMap.set(value, binding); + return binding; + }; + Env.prototype.getObjectBinding = function (value) { + if (this._bindingMap.has(value)) { + return this._bindingMap.get(value); + } + return this.initObjectBinding(value); + }; + Env.prototype.setInstanceData = function (data, finalize_cb, finalize_hint) { + if (this.instanceData) { + this.instanceData.dispose(); + } + this.instanceData = new RefBase(this, 0, 0 /* Ownership.kRuntime */, finalize_cb, data, finalize_hint); + }; + Env.prototype.getInstanceData = function () { + return this.instanceData ? this.instanceData.data() : 0; + }; + return Env; +}()); +var NodeEnv = /*#__PURE__*/ (function (_super) { + __extends(NodeEnv, _super); + function NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { + var _this = _super.call(this, ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) || this; + _this.filename = filename; + _this.nodeBinding = nodeBinding; + _this.destructing = false; + _this.finalizationScheduled = false; + return _this; + } + NodeEnv.prototype.deleteMe = function () { + this.destructing = true; + this.drainFinalizerQueue(); + _super.prototype.deleteMe.call(this); + }; + NodeEnv.prototype.canCallIntoJs = function () { + return _super.prototype.canCallIntoJs.call(this) && this.ctx.canCallIntoJs(); + }; + NodeEnv.prototype.triggerFatalException = function (err) { + if (this.nodeBinding) { + this.nodeBinding.napi.fatalException(err); + } + else { + { + throw err; + } + } + }; + NodeEnv.prototype.callbackIntoModule = function (enforceUncaughtExceptionPolicy, fn) { + return this.callIntoModule(fn, function (envObject, err) { + if (envObject.terminatedOrTerminating()) { + return; + } + var hasForceFlag = false; + if (envObject.moduleApiVersion < NAPI_VERSION_EXPERIMENTAL && !hasForceFlag && !enforceUncaughtExceptionPolicy) { + var warn = function (warning, type, code) { + if (warning instanceof Error) { + console.warn(warning.toString()); + } + else { + var prefix = code ? "[".concat(code, "] ") : ''; + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + console.warn("".concat(prefix).concat(type || 'Warning', ": ").concat(warning)); + } + }; + warn('Uncaught N-API callback exception detected, please run node with option --force-node-api-uncaught-exceptions-policy=true to handle those exceptions properly.', 'DeprecationWarning', 'DEP0168'); + return; + } + envObject.triggerFatalException(err); + }); + }; + NodeEnv.prototype.callFinalizer = function (cb, data, hint) { + this.callFinalizerInternal(1, cb, data, hint); + }; + NodeEnv.prototype.callFinalizerInternal = function (forceUncaught, cb, data, hint) { + var f = this.makeDynCall_vppp(cb); + var env = this.id; + var scope = this.ctx.openScope(this); + try { + this.callbackIntoModule(Boolean(forceUncaught), function () { f(env, data, hint); }); + } + finally { + this.ctx.closeScope(this, scope); + } + }; + NodeEnv.prototype.enqueueFinalizer = function (finalizer) { + var _this = this; + _super.prototype.enqueueFinalizer.call(this, finalizer); + if (!this.finalizationScheduled && !this.destructing) { + this.finalizationScheduled = true; + this.ref(); + _setImmediate(function () { + _this.finalizationScheduled = false; + _this.unref(); + _this.drainFinalizerQueue(); + }); + } + }; + NodeEnv.prototype.drainFinalizerQueue = function () { + while (this.pendingFinalizers.length > 0) { + var refTracker = this.pendingFinalizers.shift(); + refTracker.finalize(); + } + }; + return NodeEnv; +}(Env)); +function newEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { + moduleApiVersion = typeof moduleApiVersion !== 'number' ? NODE_API_DEFAULT_MODULE_API_VERSION : moduleApiVersion; + // Validate module_api_version. + if (moduleApiVersion < NODE_API_DEFAULT_MODULE_API_VERSION) { + moduleApiVersion = NODE_API_DEFAULT_MODULE_API_VERSION; + } + else if (moduleApiVersion > NODE_API_SUPPORTED_VERSION_MAX && moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) { + throwNodeApiVersionError(filename, moduleApiVersion); + } + var env = new NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding); + ctx.envStore.add(env); + ctx.addCleanupHook(env, function () { env.unref(); }, 0); + return env; +} + +var EmnapiError = /*#__PURE__*/ (function (_super) { + __extends(EmnapiError, _super); + function EmnapiError(message) { + var _newTarget = this.constructor; + var _this = _super.call(this, message) || this; + var ErrorConstructor = _newTarget; + var proto = ErrorConstructor.prototype; + if (!(_this instanceof EmnapiError)) { + var setPrototypeOf = Object.setPrototypeOf; + if (typeof setPrototypeOf === 'function') { + setPrototypeOf.call(Object, _this, proto); + } + else { + // eslint-disable-next-line no-proto + _this.__proto__ = proto; + } + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(_this, ErrorConstructor); + } + } + return _this; + } + return EmnapiError; +}(Error)); +Object.defineProperty(EmnapiError.prototype, 'name', { + configurable: true, + writable: true, + value: 'EmnapiError' +}); +var NotSupportWeakRefError = /*#__PURE__*/ (function (_super) { + __extends(NotSupportWeakRefError, _super); + function NotSupportWeakRefError(api, message) { + return _super.call(this, "".concat(api, ": The current runtime does not support \"FinalizationRegistry\" and \"WeakRef\".").concat(message ? " ".concat(message) : '')) || this; + } + return NotSupportWeakRefError; +}(EmnapiError)); +Object.defineProperty(NotSupportWeakRefError.prototype, 'name', { + configurable: true, + writable: true, + value: 'NotSupportWeakRefError' +}); +var NotSupportBufferError = /*#__PURE__*/ (function (_super) { + __extends(NotSupportBufferError, _super); + function NotSupportBufferError(api, message) { + return _super.call(this, "".concat(api, ": The current runtime does not support \"Buffer\". Consider using buffer polyfill to make sure `globalThis.Buffer` is defined.").concat(message ? " ".concat(message) : '')) || this; + } + return NotSupportBufferError; +}(EmnapiError)); +Object.defineProperty(NotSupportBufferError.prototype, 'name', { + configurable: true, + writable: true, + value: 'NotSupportBufferError' +}); + +var StrongRef = /*#__PURE__*/ (function () { + function StrongRef(value) { + this._value = value; + } + StrongRef.prototype.deref = function () { + return this._value; + }; + StrongRef.prototype.dispose = function () { + this._value = undefined; + }; + return StrongRef; +}()); +var Persistent = /*#__PURE__*/ (function () { + function Persistent(value) { + this._ref = new StrongRef(value); + } + Persistent.prototype.setWeak = function (param, callback) { + if (!supportFinalizer || this._ref === undefined || this._ref instanceof WeakRef) + return; + var value = this._ref.deref(); + try { + Persistent._registry.register(value, this, this); + var weakRef = new WeakRef(value); + this._ref.dispose(); + this._ref = weakRef; + this._param = param; + this._callback = callback; + } + catch (err) { + if (typeof value === 'symbol') ; + else { + throw err; + } + } + }; + Persistent.prototype.clearWeak = function () { + if (!supportFinalizer || this._ref === undefined) + return; + if (this._ref instanceof WeakRef) { + try { + Persistent._registry.unregister(this); + } + catch (_) { } + this._param = undefined; + this._callback = undefined; + var value = this._ref.deref(); + if (value === undefined) { + this._ref = value; + } + else { + this._ref = new StrongRef(value); + } + } + }; + Persistent.prototype.reset = function () { + if (supportFinalizer) { + try { + Persistent._registry.unregister(this); + } + catch (_) { } + } + this._param = undefined; + this._callback = undefined; + if (this._ref instanceof StrongRef) { + this._ref.dispose(); + } + this._ref = undefined; + }; + Persistent.prototype.isEmpty = function () { + return this._ref === undefined; + }; + Persistent.prototype.deref = function () { + if (this._ref === undefined) + return undefined; + return this._ref.deref(); + }; + Persistent._registry = supportFinalizer + ? new FinalizationRegistry(function (value) { + value._ref = undefined; + var callback = value._callback; + var param = value._param; + value._callback = undefined; + value._param = undefined; + if (typeof callback === 'function') { + callback(param); + } + }) + : undefined; + return Persistent; +}()); + +function weakCallback(ref) { + ref.persistent.reset(); + ref.envObject.invokeFinalizerFromGC(ref); +} +function canBeHeldWeakly(value) { + return value.isObject() || value.isFunction() || value.isSymbol(); +} +var Reference = /*#__PURE__*/ (function (_super) { + __extends(Reference, _super); + function Reference(envObject, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { + if (finalize_callback === void 0) { finalize_callback = 0; } + if (finalize_data === void 0) { finalize_data = 0; } + if (finalize_hint === void 0) { finalize_hint = 0; } + var _this = _super.call(this, envObject, initialRefcount >>> 0, ownership, finalize_callback, finalize_data, finalize_hint) || this; + _this.id = 0; + return _this; + } + Reference.create = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { + if (finalize_callback === void 0) { finalize_callback = 0; } + if (finalize_data === void 0) { finalize_data = 0; } + if (finalize_hint === void 0) { finalize_hint = 0; } + var handle = envObject.ctx.handleStore.get(handle_id); + var ref = new Reference(envObject, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint); + envObject.ctx.refStore.add(ref); + ref.canBeWeak = canBeHeldWeakly(handle); + ref.persistent = new Persistent(handle.value); + if (initialRefcount === 0) { + ref._setWeak(); + } + return ref; + }; + Reference.prototype.ref = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var count = _super.prototype.ref.call(this); + if (count === 1 && this.canBeWeak) { + this.persistent.clearWeak(); + } + return count; + }; + Reference.prototype.unref = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var oldRefcount = this.refCount(); + var refcount = _super.prototype.unref.call(this); + if (oldRefcount === 1 && refcount === 0) { + this._setWeak(); + } + return refcount; + }; + Reference.prototype.get = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var obj = this.persistent.deref(); + var handle = this.envObject.ensureHandle(obj); + return handle.id; + }; + Reference.prototype._setWeak = function () { + if (this.canBeWeak) { + this.persistent.setWeak(this, weakCallback); + } + else { + this.persistent.reset(); + } + }; + Reference.prototype.finalize = function () { + this.persistent.reset(); + _super.prototype.finalize.call(this); + }; + Reference.prototype.dispose = function () { + if (this.id === 0) + return; + this.persistent.reset(); + this.envObject.ctx.refStore.remove(this.id); + _super.prototype.dispose.call(this); + this.id = 0; + }; + return Reference; +}(RefBase)); + +var Deferred = /*#__PURE__*/ (function () { + function Deferred(ctx, value) { + this.id = 0; + this.ctx = ctx; + this.value = value; + } + Deferred.create = function (ctx, value) { + var deferred = new Deferred(ctx, value); + ctx.deferredStore.add(deferred); + return deferred; + }; + Deferred.prototype.resolve = function (value) { + this.value.resolve(value); + this.dispose(); + }; + Deferred.prototype.reject = function (reason) { + this.value.reject(reason); + this.dispose(); + }; + Deferred.prototype.dispose = function () { + this.ctx.deferredStore.remove(this.id); + this.id = 0; + this.value = null; + this.ctx = null; + }; + return Deferred; +}()); + +var Store = /*#__PURE__*/ (function () { + function Store() { + this._values = [undefined]; + this._values.length = 4; + this._size = 1; + this._freeList = []; + } + Store.prototype.add = function (value) { + var id; + if (this._freeList.length) { + id = this._freeList.shift(); + } + else { + id = this._size; + this._size++; + var capacity = this._values.length; + if (id >= capacity) { + this._values.length = capacity + (capacity >> 1) + 16; + } + } + value.id = id; + this._values[id] = value; + }; + Store.prototype.get = function (id) { + return this._values[id]; + }; + Store.prototype.has = function (id) { + return this._values[id] !== undefined; + }; + Store.prototype.remove = function (id) { + var value = this._values[id]; + if (value) { + value.id = 0; + this._values[id] = undefined; + this._freeList.push(Number(id)); + } + }; + Store.prototype.dispose = function () { + for (var i = 1; i < this._size; ++i) { + var value = this._values[i]; + value === null || value === void 0 ? void 0 : value.dispose(); + } + this._values = [undefined]; + this._size = 1; + this._freeList = []; + }; + return Store; +}()); + +var CleanupHookCallback = /*#__PURE__*/ (function () { + function CleanupHookCallback(envObject, fn, arg, order) { + this.envObject = envObject; + this.fn = fn; + this.arg = arg; + this.order = order; + } + return CleanupHookCallback; +}()); +var CleanupQueue = /*#__PURE__*/ (function () { + function CleanupQueue() { + this._cleanupHooks = []; + this._cleanupHookCounter = 0; + } + CleanupQueue.prototype.empty = function () { + return this._cleanupHooks.length === 0; + }; + CleanupQueue.prototype.add = function (envObject, fn, arg) { + if (this._cleanupHooks.filter(function (hook) { return (hook.envObject === envObject && hook.fn === fn && hook.arg === arg); }).length > 0) { + throw new Error('Can not add same fn and arg twice'); + } + this._cleanupHooks.push(new CleanupHookCallback(envObject, fn, arg, this._cleanupHookCounter++)); + }; + CleanupQueue.prototype.remove = function (envObject, fn, arg) { + for (var i = 0; i < this._cleanupHooks.length; ++i) { + var hook = this._cleanupHooks[i]; + if (hook.envObject === envObject && hook.fn === fn && hook.arg === arg) { + this._cleanupHooks.splice(i, 1); + return; + } + } + }; + CleanupQueue.prototype.drain = function () { + var hooks = this._cleanupHooks.slice(); + hooks.sort(function (a, b) { return (b.order - a.order); }); + for (var i = 0; i < hooks.length; ++i) { + var cb = hooks[i]; + if (typeof cb.fn === 'number') { + cb.envObject.makeDynCall_vp(cb.fn)(cb.arg); + } + else { + cb.fn(cb.arg); + } + this._cleanupHooks.splice(this._cleanupHooks.indexOf(cb), 1); + } + }; + CleanupQueue.prototype.dispose = function () { + this._cleanupHooks.length = 0; + this._cleanupHookCounter = 0; + }; + return CleanupQueue; +}()); +var Context = /*#__PURE__*/ (function () { + function Context() { + this._isStopping = false; + this._canCallIntoJs = true; + this.envStore = new Store(); + this.scopeStore = new ScopeStore(); + this.refStore = new Store(); + this.deferredStore = new Store(); + this.handleStore = new HandleStore(); + this.cbinfoStack = new CallbackInfoStack(); + this.feature = { + supportReflect: supportReflect, + supportFinalizer: supportFinalizer, + supportWeakSymbol: supportWeakSymbol, + supportBigInt: supportBigInt, + supportNewFunction: supportNewFunction, + canSetFunctionName: canSetFunctionName, + setImmediate: _setImmediate, + Buffer: _Buffer, + MessageChannel: _MessageChannel + }; + this.cleanupQueue = new CleanupQueue(); + } + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + Context.prototype.getRuntimeVersions = function () { + return { + version: version, + NODE_API_SUPPORTED_VERSION_MAX: NODE_API_SUPPORTED_VERSION_MAX, + NAPI_VERSION_EXPERIMENTAL: NAPI_VERSION_EXPERIMENTAL, + NODE_API_DEFAULT_MODULE_API_VERSION: NODE_API_DEFAULT_MODULE_API_VERSION + }; + }; + Context.prototype.createNotSupportWeakRefError = function (api, message) { + return new NotSupportWeakRefError(api, message); + }; + Context.prototype.createNotSupportBufferError = function (api, message) { + return new NotSupportBufferError(api, message); + }; + Context.prototype.createReference = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { + if (finalize_callback === void 0) { finalize_callback = 0; } + if (finalize_data === void 0) { finalize_data = 0; } + if (finalize_hint === void 0) { finalize_hint = 0; } + return Reference.create(envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint); + }; + Context.prototype.createDeferred = function (value) { + return Deferred.create(this, value); + }; + Context.prototype.createEnv = function (filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { + return newEnv(this, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding); + }; + Context.prototype.createTrackedFinalizer = function (envObject, finalize_callback, finalize_data, finalize_hint) { + return TrackedFinalizer.create(envObject, finalize_callback, finalize_data, finalize_hint); + }; + Context.prototype.getCurrentScope = function () { + return this.scopeStore.currentScope; + }; + Context.prototype.addToCurrentScope = function (value) { + return this.scopeStore.currentScope.add(value); + }; + Context.prototype.openScope = function (envObject) { + return this.scopeStore.openScope(envObject); + }; + Context.prototype.closeScope = function (envObject, _scope) { + this.scopeStore.closeScope(envObject); + }; + Context.prototype.ensureHandle = function (value) { + switch (value) { + case undefined: return HandleStore.UNDEFINED; + case null: return HandleStore.NULL; + case true: return HandleStore.TRUE; + case false: return HandleStore.FALSE; + case _global: return HandleStore.GLOBAL; + } + return this.addToCurrentScope(value); + }; + Context.prototype.addCleanupHook = function (envObject, fn, arg) { + this.cleanupQueue.add(envObject, fn, arg); + }; + Context.prototype.removeCleanupHook = function (envObject, fn, arg) { + this.cleanupQueue.remove(envObject, fn, arg); + }; + Context.prototype.runCleanup = function () { + while (!this.cleanupQueue.empty()) { + this.cleanupQueue.drain(); + } + }; + Context.prototype.increaseWaitingRequestCounter = function () { + var _a; + (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.increase(); + }; + Context.prototype.decreaseWaitingRequestCounter = function () { + var _a; + (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.decrease(); + }; + Context.prototype.setCanCallIntoJs = function (value) { + this._canCallIntoJs = value; + }; + Context.prototype.setStopping = function (value) { + this._isStopping = value; + }; + Context.prototype.canCallIntoJs = function () { + return this._canCallIntoJs && !this._isStopping; + }; + Context.prototype.destroy = function () { + this.setStopping(true); + this.setCanCallIntoJs(false); + this.runCleanup(); + }; + return Context; +}()); +var defaultContext; +function createContext() { + return new Context(); +} +function getDefaultContext() { + if (!defaultContext) { + defaultContext = createContext(); + } + return defaultContext; +} + +const _WebAssembly = typeof WebAssembly !== 'undefined' + ? WebAssembly + : typeof WXWebAssembly !== 'undefined' + ? WXWebAssembly + : undefined; +if (!_WebAssembly) { + throw new Error('WebAssembly is not supported in this environment'); +} + +/* eslint-disable spaced-comment */ + +function validateObject(value, name) { + if (value === null || typeof value !== 'object') { + throw new TypeError(`${name} must be an object. Received ${value === null ? 'null' : typeof value}`); + } +} +function validateArray(value, name) { + if (!Array.isArray(value)) { + throw new TypeError(`${name} must be an array. Received ${value === null ? 'null' : typeof value}`); + } +} +function validateBoolean(value, name) { + if (typeof value !== 'boolean') { + throw new TypeError(`${name} must be a boolean. Received ${value === null ? 'null' : typeof value}`); + } +} +function validateString(value, name) { + if (typeof value !== 'string') { + throw new TypeError(`${name} must be a string. Received ${value === null ? 'null' : typeof value}`); + } +} +function validateFunction(value, name) { + if (typeof value !== 'function') { + throw new TypeError(`${name} must be a function. Received ${value === null ? 'null' : typeof value}`); + } +} +function validateUndefined(value, name) { + if (value !== undefined) { + throw new TypeError(`${name} must be undefined. Received ${value === null ? 'null' : typeof value}`); + } +} +function isPromiseLike(obj) { + return !!(obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'); +} +function unsharedSlice(view, start, end) { + return ((typeof SharedArrayBuffer === 'function' && view.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(view.buffer.constructor) === '[object SharedArrayBuffer]')) + ? view.slice(start, end) + : view.subarray(start, end); +} + +const CHAR_DOT = 46; /* . */ +const CHAR_FORWARD_SLASH = 47; /* / */ +function isPosixPathSeparator(code) { + return code === CHAR_FORWARD_SLASH; +} +function normalizeString(path, allowAboveRoot, separator, isPathSeparator) { + let res = ''; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = 0; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) { + code = path.charCodeAt(i); + } + else if (isPathSeparator(code)) { + break; + } + else { + code = CHAR_FORWARD_SLASH; + } + if (isPathSeparator(code)) { + if (lastSlash === i - 1 || dots === 1) ; + else if (dots === 2) { + if (res.length < 2 || lastSegmentLength !== 2 || + res.charCodeAt(res.length - 1) !== CHAR_DOT || + res.charCodeAt(res.length - 2) !== CHAR_DOT) { + if (res.length > 2) { + const lastSlashIndex = res.indexOf(separator); + if (lastSlashIndex === -1) { + res = ''; + lastSegmentLength = 0; + } + else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = + res.length - 1 - res.indexOf(separator); + } + lastSlash = i; + dots = 0; + continue; + } + else if (res.length !== 0) { + res = ''; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + res += res.length > 0 ? `${separator}..` : '..'; + lastSegmentLength = 2; + } + } + else { + if (res.length > 0) { + res += `${separator}${path.slice(lastSlash + 1, i)}`; + } + else { + res = path.slice(lastSlash + 1, i); + } + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } + else if (code === CHAR_DOT && dots !== -1) { + ++dots; + } + else { + dots = -1; + } + } + return res; +} +function resolve(...args) { + let resolvedPath = ''; + let resolvedAbsolute = false; + for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + const path = i >= 0 ? args[i] : '/'; + validateString(path, 'path'); + // Skip empty entries + if (path.length === 0) { + continue; + } + resolvedPath = `${path}/${resolvedPath}`; + resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + // Normalize the path + resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator); + if (resolvedAbsolute) { + return `/${resolvedPath}`; + } + return resolvedPath.length > 0 ? resolvedPath : '.'; +} + +const FD_DATASYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(0)); +const FD_READ = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(1)); +const FD_SEEK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(2)); +const FD_FDSTAT_SET_FLAGS = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(3)); +const FD_SYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(4)); +const FD_TELL = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(5)); +const FD_WRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(6)); +const FD_ADVISE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(7)); +const FD_ALLOCATE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(8)); +const PATH_CREATE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(9)); +const PATH_CREATE_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(10)); +const PATH_LINK_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(11)); +const PATH_LINK_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(12)); +const PATH_OPEN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(13)); +const FD_READDIR = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(14)); +const PATH_READLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(15)); +const PATH_RENAME_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(16)); +const PATH_RENAME_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(17)); +const PATH_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(18)); +const PATH_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(19)); +const PATH_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(20)); +const FD_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(21)); +const FD_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(22)); +const FD_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(23)); +const PATH_SYMLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(24)); +const PATH_REMOVE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(25)); +const PATH_UNLINK_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(26)); +const POLL_FD_READWRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(27)); +const SOCK_SHUTDOWN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(28)); +const SOCK_ACCEPT = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(29)); +const WasiRights = { + FD_DATASYNC, + FD_READ, + FD_SEEK, + FD_FDSTAT_SET_FLAGS, + FD_SYNC, + FD_TELL, + FD_WRITE, + FD_ADVISE, + FD_ALLOCATE, + PATH_CREATE_DIRECTORY, + PATH_CREATE_FILE, + PATH_LINK_SOURCE, + PATH_LINK_TARGET, + PATH_OPEN, + FD_READDIR, + PATH_READLINK, + PATH_RENAME_SOURCE, + PATH_RENAME_TARGET, + PATH_FILESTAT_GET, + PATH_FILESTAT_SET_SIZE, + PATH_FILESTAT_SET_TIMES, + FD_FILESTAT_GET, + FD_FILESTAT_SET_SIZE, + FD_FILESTAT_SET_TIMES, + PATH_SYMLINK, + PATH_REMOVE_DIRECTORY, + PATH_UNLINK_FILE, + POLL_FD_READWRITE, + SOCK_SHUTDOWN, + SOCK_ACCEPT +}; + +function strerror(errno) { + switch (errno) { + case 0 /* WasiErrno.ESUCCESS */: return 'Success'; + case 1 /* WasiErrno.E2BIG */: return 'Argument list too long'; + case 2 /* WasiErrno.EACCES */: return 'Permission denied'; + case 3 /* WasiErrno.EADDRINUSE */: return 'Address in use'; + case 4 /* WasiErrno.EADDRNOTAVAIL */: return 'Address not available'; + case 5 /* WasiErrno.EAFNOSUPPORT */: return 'Address family not supported by protocol'; + case 6 /* WasiErrno.EAGAIN */: return 'Resource temporarily unavailable'; + case 7 /* WasiErrno.EALREADY */: return 'Operation already in progress'; + case 8 /* WasiErrno.EBADF */: return 'Bad file descriptor'; + case 9 /* WasiErrno.EBADMSG */: return 'Bad message'; + case 10 /* WasiErrno.EBUSY */: return 'Resource busy'; + case 11 /* WasiErrno.ECANCELED */: return 'Operation canceled'; + case 12 /* WasiErrno.ECHILD */: return 'No child null'; + case 13 /* WasiErrno.ECONNABORTED */: return 'Connection aborted'; + case 14 /* WasiErrno.ECONNREFUSED */: return 'Connection refused'; + case 15 /* WasiErrno.ECONNRESET */: return 'Connection reset by peer'; + case 16 /* WasiErrno.EDEADLK */: return 'Resource deadlock would occur'; + case 17 /* WasiErrno.EDESTADDRREQ */: return 'Destination address required'; + case 18 /* WasiErrno.EDOM */: return 'Domain error'; + case 19 /* WasiErrno.EDQUOT */: return 'Quota exceeded'; + case 20 /* WasiErrno.EEXIST */: return 'File exists'; + case 21 /* WasiErrno.EFAULT */: return 'Bad address'; + case 22 /* WasiErrno.EFBIG */: return 'File too large'; + case 23 /* WasiErrno.EHOSTUNREACH */: return 'Host is unreachable'; + case 24 /* WasiErrno.EIDRM */: return 'Identifier removed'; + case 25 /* WasiErrno.EILSEQ */: return 'Illegal byte sequence'; + case 26 /* WasiErrno.EINPROGRESS */: return 'Operation in progress'; + case 27 /* WasiErrno.EINTR */: return 'Interrupted system call'; + case 28 /* WasiErrno.EINVAL */: return 'Invalid argument'; + case 29 /* WasiErrno.EIO */: return 'I/O error'; + case 30 /* WasiErrno.EISCONN */: return 'Socket is connected'; + case 31 /* WasiErrno.EISDIR */: return 'Is a directory'; + case 32 /* WasiErrno.ELOOP */: return 'Symbolic link loop'; + case 33 /* WasiErrno.EMFILE */: return 'No file descriptors available'; + case 34 /* WasiErrno.EMLINK */: return 'Too many links'; + case 35 /* WasiErrno.EMSGSIZE */: return 'Message too large'; + case 36 /* WasiErrno.EMULTIHOP */: return 'Multihop attempted'; + case 37 /* WasiErrno.ENAMETOOLONG */: return 'Filename too long'; + case 38 /* WasiErrno.ENETDOWN */: return 'Network is down'; + case 39 /* WasiErrno.ENETRESET */: return 'Connection reset by network'; + case 40 /* WasiErrno.ENETUNREACH */: return 'Network unreachable'; + case 41 /* WasiErrno.ENFILE */: return 'Too many files open in system'; + case 42 /* WasiErrno.ENOBUFS */: return 'No buffer space available'; + case 43 /* WasiErrno.ENODEV */: return 'No such device'; + case 44 /* WasiErrno.ENOENT */: return 'No such file or directory'; + case 45 /* WasiErrno.ENOEXEC */: return 'Exec format error'; + case 46 /* WasiErrno.ENOLCK */: return 'No locks available'; + case 47 /* WasiErrno.ENOLINK */: return 'Link has been severed'; + case 48 /* WasiErrno.ENOMEM */: return 'Out of memory'; + case 49 /* WasiErrno.ENOMSG */: return 'No message of the desired type'; + case 50 /* WasiErrno.ENOPROTOOPT */: return 'Protocol not available'; + case 51 /* WasiErrno.ENOSPC */: return 'No space left on device'; + case 52 /* WasiErrno.ENOSYS */: return 'Function not implemented'; + case 53 /* WasiErrno.ENOTCONN */: return 'Socket not connected'; + case 54 /* WasiErrno.ENOTDIR */: return 'Not a directory'; + case 55 /* WasiErrno.ENOTEMPTY */: return 'Directory not empty'; + case 56 /* WasiErrno.ENOTRECOVERABLE */: return 'State not recoverable'; + case 57 /* WasiErrno.ENOTSOCK */: return 'Not a socket'; + case 58 /* WasiErrno.ENOTSUP */: return 'Not supported'; + case 59 /* WasiErrno.ENOTTY */: return 'Not a tty'; + case 60 /* WasiErrno.ENXIO */: return 'No such device or address'; + case 61 /* WasiErrno.EOVERFLOW */: return 'Value too large for data type'; + case 62 /* WasiErrno.EOWNERDEAD */: return 'Previous owner died'; + case 63 /* WasiErrno.EPERM */: return 'Operation not permitted'; + case 64 /* WasiErrno.EPIPE */: return 'Broken pipe'; + case 65 /* WasiErrno.EPROTO */: return 'Protocol error'; + case 66 /* WasiErrno.EPROTONOSUPPORT */: return 'Protocol not supported'; + case 67 /* WasiErrno.EPROTOTYPE */: return 'Protocol wrong type for socket'; + case 68 /* WasiErrno.ERANGE */: return 'Result not representable'; + case 69 /* WasiErrno.EROFS */: return 'Read-only file system'; + case 70 /* WasiErrno.ESPIPE */: return 'Invalid seek'; + case 71 /* WasiErrno.ESRCH */: return 'No such null'; + case 72 /* WasiErrno.ESTALE */: return 'Stale file handle'; + case 73 /* WasiErrno.ETIMEDOUT */: return 'Operation timed out'; + case 74 /* WasiErrno.ETXTBSY */: return 'Text file busy'; + case 75 /* WasiErrno.EXDEV */: return 'Cross-device link'; + case 76 /* WasiErrno.ENOTCAPABLE */: return 'Capabilities insufficient'; + default: return 'Unknown error'; + } +} +class WasiError extends Error { + constructor(message, errno) { + super(message); + this.errno = errno; + } + getErrorMessage() { + return strerror(this.errno); + } +} +Object.defineProperty(WasiError.prototype, 'name', { + configurable: true, + writable: true, + value: 'WasiError' +}); + +const RIGHTS_ALL = WasiRights.FD_DATASYNC | + WasiRights.FD_READ | + WasiRights.FD_SEEK | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_TELL | + WasiRights.FD_WRITE | + WasiRights.FD_ADVISE | + WasiRights.FD_ALLOCATE | + WasiRights.PATH_CREATE_DIRECTORY | + WasiRights.PATH_CREATE_FILE | + WasiRights.PATH_LINK_SOURCE | + WasiRights.PATH_LINK_TARGET | + WasiRights.PATH_OPEN | + WasiRights.FD_READDIR | + WasiRights.PATH_READLINK | + WasiRights.PATH_RENAME_SOURCE | + WasiRights.PATH_RENAME_TARGET | + WasiRights.PATH_FILESTAT_GET | + WasiRights.PATH_FILESTAT_SET_SIZE | + WasiRights.PATH_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_SET_SIZE | + WasiRights.PATH_SYMLINK | + WasiRights.PATH_UNLINK_FILE | + WasiRights.PATH_REMOVE_DIRECTORY | + WasiRights.POLL_FD_READWRITE | + WasiRights.SOCK_SHUTDOWN | + WasiRights.SOCK_ACCEPT; +const BLOCK_DEVICE_BASE = RIGHTS_ALL; +const BLOCK_DEVICE_INHERITING = RIGHTS_ALL; +const CHARACTER_DEVICE_BASE = RIGHTS_ALL; +const CHARACTER_DEVICE_INHERITING = RIGHTS_ALL; +const REGULAR_FILE_BASE = WasiRights.FD_DATASYNC | + WasiRights.FD_READ | + WasiRights.FD_SEEK | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_TELL | + WasiRights.FD_WRITE | + WasiRights.FD_ADVISE | + WasiRights.FD_ALLOCATE | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_SIZE | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.POLL_FD_READWRITE; +const REGULAR_FILE_INHERITING = /*#__PURE__*/ BigInt(0); +const DIRECTORY_BASE = WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_ADVISE | + WasiRights.PATH_CREATE_DIRECTORY | + WasiRights.PATH_CREATE_FILE | + WasiRights.PATH_LINK_SOURCE | + WasiRights.PATH_LINK_TARGET | + WasiRights.PATH_OPEN | + WasiRights.FD_READDIR | + WasiRights.PATH_READLINK | + WasiRights.PATH_RENAME_SOURCE | + WasiRights.PATH_RENAME_TARGET | + WasiRights.PATH_FILESTAT_GET | + WasiRights.PATH_FILESTAT_SET_SIZE | + WasiRights.PATH_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.PATH_SYMLINK | + WasiRights.PATH_UNLINK_FILE | + WasiRights.PATH_REMOVE_DIRECTORY | + WasiRights.POLL_FD_READWRITE; +const DIRECTORY_INHERITING = DIRECTORY_BASE | REGULAR_FILE_BASE; +const SOCKET_BASE = (WasiRights.FD_READ | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_WRITE | + WasiRights.FD_FILESTAT_GET | + WasiRights.POLL_FD_READWRITE | + WasiRights.SOCK_SHUTDOWN); +const SOCKET_INHERITING = RIGHTS_ALL; +const TTY_BASE = WasiRights.FD_READ | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_WRITE | + WasiRights.FD_FILESTAT_GET | + WasiRights.POLL_FD_READWRITE; +const TTY_INHERITING = /*#__PURE__*/ BigInt(0); +function getRights(stdio, fd, flags, type) { + const ret = { + base: BigInt(0), + inheriting: BigInt(0) + }; + if (type === 0 /* WasiFileType.UNKNOWN */) { + throw new WasiError('Unknown file type', 28 /* WasiErrno.EINVAL */); + } + switch (type) { + case 4 /* WasiFileType.REGULAR_FILE */: + ret.base = REGULAR_FILE_BASE; + ret.inheriting = REGULAR_FILE_INHERITING; + break; + case 3 /* WasiFileType.DIRECTORY */: + ret.base = DIRECTORY_BASE; + ret.inheriting = DIRECTORY_INHERITING; + break; + case 6 /* WasiFileType.SOCKET_STREAM */: + case 5 /* WasiFileType.SOCKET_DGRAM */: + ret.base = SOCKET_BASE; + ret.inheriting = SOCKET_INHERITING; + break; + case 2 /* WasiFileType.CHARACTER_DEVICE */: + if (stdio.indexOf(fd) !== -1) { + ret.base = TTY_BASE; + ret.inheriting = TTY_INHERITING; + } + else { + ret.base = CHARACTER_DEVICE_BASE; + ret.inheriting = CHARACTER_DEVICE_INHERITING; + } + break; + case 1 /* WasiFileType.BLOCK_DEVICE */: + ret.base = BLOCK_DEVICE_BASE; + ret.inheriting = BLOCK_DEVICE_INHERITING; + break; + default: + ret.base = BigInt(0); + ret.inheriting = BigInt(0); + } + /* Disable read/write bits depending on access mode. */ + const read_or_write_only = flags & (0 | 1 | 2); + if (read_or_write_only === 0) { + ret.base &= ~WasiRights.FD_WRITE; + } + else if (read_or_write_only === 1) { + ret.base &= ~WasiRights.FD_READ; + } + return ret; +} + +function concatBuffer(buffers, size) { + let total = 0; + { + for (let i = 0; i < buffers.length; i++) { + const buffer = buffers[i]; + total += buffer.length; + } + } + let pos = 0; + const ret = new Uint8Array(total); + for (let i = 0; i < buffers.length; i++) { + const buffer = buffers[i]; + ret.set(buffer, pos); + pos += buffer.length; + } + return ret; +} +class FileDescriptor { + constructor(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) { + this.id = id; + this.fd = fd; + this.path = path; + this.realPath = realPath; + this.type = type; + this.rightsBase = rightsBase; + this.rightsInheriting = rightsInheriting; + this.preopen = preopen; + this.pos = BigInt(0); + this.size = BigInt(0); + } + seek(offset, whence) { + if (whence === 0 /* WasiWhence.SET */) { + this.pos = BigInt(offset); + } + else if (whence === 1 /* WasiWhence.CUR */) { + this.pos += BigInt(offset); + } + else if (whence === 2 /* WasiWhence.END */) { + this.pos = BigInt(this.size) - BigInt(offset); + } + else { + throw new WasiError('Unknown whence', 29 /* WasiErrno.EIO */); + } + return this.pos; + } +} +class StandardOutput extends FileDescriptor { + constructor(log, id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) { + super(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen); + this._log = log; + this._buf = null; + } + write(buffer) { + const originalBuffer = buffer; + if (this._buf) { + buffer = concatBuffer([this._buf, buffer]); + this._buf = null; + } + if (buffer.indexOf(10) === -1) { + this._buf = buffer; + return originalBuffer.byteLength; + } + let written = 0; + let lastBegin = 0; + let index; + while ((index = buffer.indexOf(10, written)) !== -1) { + const str = new TextDecoder().decode(buffer.subarray(lastBegin, index)); + this._log(str); + written += index - lastBegin + 1; + lastBegin = index + 1; + } + if (written < buffer.length) { + this._buf = buffer.slice(written); + } + return originalBuffer.byteLength; + } +} +function toFileType(stat) { + if (stat.isBlockDevice()) + return 1 /* WasiFileType.BLOCK_DEVICE */; + if (stat.isCharacterDevice()) + return 2 /* WasiFileType.CHARACTER_DEVICE */; + if (stat.isDirectory()) + return 3 /* WasiFileType.DIRECTORY */; + if (stat.isSocket()) + return 6 /* WasiFileType.SOCKET_STREAM */; + if (stat.isFile()) + return 4 /* WasiFileType.REGULAR_FILE */; + if (stat.isSymbolicLink()) + return 7 /* WasiFileType.SYMBOLIC_LINK */; + return 0 /* WasiFileType.UNKNOWN */; +} +function toFileStat(view, buf, stat) { + view.setBigUint64(buf, stat.dev, true); + view.setBigUint64(buf + 8, stat.ino, true); + view.setBigUint64(buf + 16, BigInt(toFileType(stat)), true); + view.setBigUint64(buf + 24, stat.nlink, true); + view.setBigUint64(buf + 32, stat.size, true); + view.setBigUint64(buf + 40, stat.atimeMs * BigInt(1000000), true); + view.setBigUint64(buf + 48, stat.mtimeMs * BigInt(1000000), true); + view.setBigUint64(buf + 56, stat.ctimeMs * BigInt(1000000), true); +} +class FileDescriptorTable { + constructor(options) { + this.used = 0; + this.size = options.size; + this.fds = Array(options.size); + this.stdio = [options.in, options.out, options.err]; + this.print = options.print; + this.printErr = options.printErr; + this.insertStdio(options.in, 0, ''); + this.insertStdio(options.out, 1, ''); + this.insertStdio(options.err, 2, ''); + } + insertStdio(fd, expected, name) { + const type = 2 /* WasiFileType.CHARACTER_DEVICE */; + const { base, inheriting } = getRights(this.stdio, fd, 2 /* FileControlFlag.O_RDWR */, type); + const wrap = this.insert(fd, name, name, type, base, inheriting, 0); + if (wrap.id !== expected) { + throw new WasiError(`id: ${wrap.id} !== expected: ${expected}`, 8 /* WasiErrno.EBADF */); + } + return wrap; + } + insert(fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen) { + var _a, _b; + let index = -1; + if (this.used >= this.size) { + const newSize = this.size * 2; + this.fds.length = newSize; + index = this.size; + this.size = newSize; + } + else { + for (let i = 0; i < this.size; ++i) { + if (this.fds[i] == null) { + index = i; + break; + } + } + } + let entry; + if (mappedPath === '') { + entry = new StandardOutput((_a = this.print) !== null && _a !== void 0 ? _a : console.log, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); + } + else if (mappedPath === '') { + entry = new StandardOutput((_b = this.printErr) !== null && _b !== void 0 ? _b : console.error, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); + } + else { + entry = new FileDescriptor(index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); + } + this.fds[index] = entry; + this.used++; + return entry; + } + get(id, base, inheriting) { + if (id >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const entry = this.fds[id]; + if (!entry || entry.id !== id) { + throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); + } + /* Validate that the fd has the necessary rights. */ + if ((~entry.rightsBase & base) !== BigInt(0) || (~entry.rightsInheriting & inheriting) !== BigInt(0)) { + throw new WasiError('Capabilities insufficient', 76 /* WasiErrno.ENOTCAPABLE */); + } + return entry; + } + remove(id) { + if (id >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const entry = this.fds[id]; + if (!entry || entry.id !== id) { + throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); + } + this.fds[id] = undefined; + this.used--; + } +} +class SyncTable extends FileDescriptorTable { + constructor(options) { + super(options); + this.fs = options.fs; + } + getFileTypeByFd(fd) { + const stats = this.fs.fstatSync(fd, { bigint: true }); + return toFileType(stats); + } + insertPreopen(fd, mappedPath, realPath) { + const type = this.getFileTypeByFd(fd); + if (type !== 3 /* WasiFileType.DIRECTORY */) { + throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */); + } + const result = getRights(this.stdio, fd, 0, type); + return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1); + } + renumber(dst, src) { + if (dst === src) + return; + if (dst >= this.size || src >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const dstEntry = this.fds[dst]; + const srcEntry = this.fds[src]; + if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + this.fs.closeSync(dstEntry.fd); + this.fds[dst] = this.fds[src]; + this.fds[dst].id = dst; + this.fds[src] = undefined; + this.used--; + } +} +class AsyncTable extends FileDescriptorTable { + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(options) { + super(options); + } + async getFileTypeByFd(fd) { + const stats = await fd.stat({ bigint: true }); + return toFileType(stats); + } + async insertPreopen(fd, mappedPath, realPath) { + const type = await this.getFileTypeByFd(fd); + if (type !== 3 /* WasiFileType.DIRECTORY */) { + throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */); + } + const result = getRights(this.stdio, fd.fd, 0, type); + return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1); + } + async renumber(dst, src) { + if (dst === src) + return; + if (dst >= this.size || src >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const dstEntry = this.fds[dst]; + const srcEntry = this.fds[src]; + if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + await dstEntry.fd.close(); + this.fds[dst] = this.fds[src]; + this.fds[dst].id = dst; + this.fds[src] = undefined; + this.used--; + } +} + +/** @public */ +const WebAssemblyMemory = /*#__PURE__*/ (function () { return _WebAssembly.Memory; })(); +/** @public */ +class Memory extends WebAssemblyMemory { + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(descriptor) { + super(descriptor); + } + get HEAP8() { return new Int8Array(super.buffer); } + get HEAPU8() { return new Uint8Array(super.buffer); } + get HEAP16() { return new Int16Array(super.buffer); } + get HEAPU16() { return new Uint16Array(super.buffer); } + get HEAP32() { return new Int32Array(super.buffer); } + get HEAPU32() { return new Uint32Array(super.buffer); } + get HEAP64() { return new BigInt64Array(super.buffer); } + get HEAPU64() { return new BigUint64Array(super.buffer); } + get HEAPF32() { return new Float32Array(super.buffer); } + get HEAPF64() { return new Float64Array(super.buffer); } + get view() { return new DataView(super.buffer); } +} +/** @public */ +function extendMemory(memory) { + if (Object.getPrototypeOf(memory) === _WebAssembly.Memory.prototype) { + Object.setPrototypeOf(memory, Memory.prototype); + } + return memory; +} + +function checkWebAssemblyFunction() { + const WebAssemblyFunction = _WebAssembly.Function; + if (typeof WebAssemblyFunction !== 'function') { + throw new Error('WebAssembly.Function is not supported in this environment.' + + ' If you are using V8 based browser like Chrome, try to specify' + + ' --js-flags="--wasm-staging --experimental-wasm-stack-switching"'); + } + return WebAssemblyFunction; +} +/** @public */ +function wrapAsyncImport(f, parameterType, returnType) { + const WebAssemblyFunction = checkWebAssemblyFunction(); + if (typeof f !== 'function') { + throw new TypeError('Function required'); + } + const parameters = parameterType.slice(0); + parameters.unshift('externref'); + return new WebAssemblyFunction({ parameters, results: returnType }, f, { suspending: 'first' }); +} + +function copyMemory(targets, src) { + if (targets.length === 0 || src.length === 0) + return 0; + let copied = 0; + let left = src.length - copied; + for (let i = 0; i < targets.length; ++i) { + const target = targets[i]; + if (left < target.length) { + target.set(src.subarray(copied, copied + left), 0); + copied += left; + left = 0; + return copied; + } + target.set(src.subarray(copied, copied + target.length), 0); + copied += target.length; + left -= target.length; + } + return copied; +} +const _memory = new WeakMap(); +const _wasi = new WeakMap(); +const _fs = new WeakMap(); +function getMemory(wasi) { + return _memory.get(wasi); +} +function getFs(wasi) { + const fs = _fs.get(wasi); + if (!fs) + throw new Error('filesystem is unavailable'); + return fs; +} +function handleError(err) { + if (err instanceof WasiError) { + return err.errno; + } + switch (err.code) { + case 'ENOENT': return 44 /* WasiErrno.ENOENT */; + case 'EBADF': return 8 /* WasiErrno.EBADF */; + case 'EINVAL': return 28 /* WasiErrno.EINVAL */; + case 'EPERM': return 63 /* WasiErrno.EPERM */; + case 'EPROTO': return 65 /* WasiErrno.EPROTO */; + case 'EEXIST': return 20 /* WasiErrno.EEXIST */; + case 'ENOTDIR': return 54 /* WasiErrno.ENOTDIR */; + case 'EMFILE': return 33 /* WasiErrno.EMFILE */; + case 'EACCES': return 2 /* WasiErrno.EACCES */; + case 'EISDIR': return 31 /* WasiErrno.EISDIR */; + case 'ENOTEMPTY': return 55 /* WasiErrno.ENOTEMPTY */; + case 'ENOSYS': return 52 /* WasiErrno.ENOSYS */; + } + throw err; +} +function defineName(name, f) { + Object.defineProperty(f, 'name', { value: name }); + return f; +} +function syscallWrap(self, name, f) { + return defineName(name, function () { + let r; + try { + r = f.apply(self, arguments); + } + catch (err) { + return handleError(err); + } + if (isPromiseLike(r)) { + return r.then(_ => _, handleError); + } + return r; + }); +} +function resolvePathSync(fs, fileDescriptor, path, flags) { + let resolvedPath = resolve(fileDescriptor.realPath, path); + if ((flags & 1) === 1) { + try { + resolvedPath = fs.readlinkSync(resolvedPath); + } + catch (err) { + if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { + throw err; + } + } + } + return resolvedPath; +} +async function resolvePathAsync(fs, fileDescriptor, path, flags) { + let resolvedPath = resolve(fileDescriptor.realPath, path); + if ((flags & 1) === 1) { + try { + resolvedPath = await fs.promises.readlink(resolvedPath); + } + catch (err) { + if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { + throw err; + } + } + } + return resolvedPath; +} +// eslint-disable-next-line spaced-comment +const encoder = /*#__PURE__*/ new TextEncoder(); +// eslint-disable-next-line spaced-comment +const decoder = /*#__PURE__*/ new TextDecoder(); +const INT64_MAX = (BigInt(1) << BigInt(63)) - BigInt(1); +function readStdin() { + const value = window.prompt(); + if (value === null) + return new Uint8Array(); + const buffer = new TextEncoder().encode(value + '\n'); + return buffer; +} +function validateFstFlagsOrReturn(flags) { + return (Boolean((flags) & ~(1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */ | + 4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) || + ((flags) & (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */)) === + (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */) || + ((flags) & (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) === + (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)); +} +class WASI$1 { + constructor(args, env, fds, asyncFs, fs, asyncify) { + this.args_get = syscallWrap(this, 'args_get', function (argv, argv_buf) { + argv = Number(argv); + argv_buf = Number(argv_buf); + if (argv === 0 || argv_buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const args = wasi.args; + for (let i = 0; i < args.length; ++i) { + const arg = args[i]; + view.setInt32(argv, argv_buf, true); + argv += 4; + const data = encoder.encode(arg + '\0'); + HEAPU8.set(data, argv_buf); + argv_buf += data.length; + } + return 0 /* WasiErrno.ESUCCESS */; + }); + this.args_sizes_get = syscallWrap(this, 'args_sizes_get', function (argc, argv_buf_size) { + argc = Number(argc); + argv_buf_size = Number(argv_buf_size); + if (argc === 0 || argv_buf_size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + const wasi = _wasi.get(this); + const args = wasi.args; + view.setUint32(argc, args.length, true); + view.setUint32(argv_buf_size, encoder.encode(args.join('\0') + '\0').length, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.environ_get = syscallWrap(this, 'environ_get', function (environ, environ_buf) { + environ = Number(environ); + environ_buf = Number(environ_buf); + if (environ === 0 || environ_buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const env = wasi.env; + for (let i = 0; i < env.length; ++i) { + const pair = env[i]; + view.setInt32(environ, environ_buf, true); + environ += 4; + const data = encoder.encode(pair + '\0'); + HEAPU8.set(data, environ_buf); + environ_buf += data.length; + } + return 0 /* WasiErrno.ESUCCESS */; + }); + this.environ_sizes_get = syscallWrap(this, 'environ_sizes_get', function (len, buflen) { + len = Number(len); + buflen = Number(buflen); + if (len === 0 || buflen === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + const wasi = _wasi.get(this); + view.setUint32(len, wasi.env.length, true); + view.setUint32(buflen, encoder.encode(wasi.env.join('\0') + '\0').length, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.clock_res_get = syscallWrap(this, 'clock_res_get', function (id, resolution) { + resolution = Number(resolution); + if (resolution === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + switch (id) { + case 0 /* WasiClockid.REALTIME */: + view.setBigUint64(resolution, BigInt(1000000), true); + return 0 /* WasiErrno.ESUCCESS */; + case 1 /* WasiClockid.MONOTONIC */: + case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: + case 3 /* WasiClockid.THREAD_CPUTIME_ID */: + view.setBigUint64(resolution, BigInt(1000), true); + return 0 /* WasiErrno.ESUCCESS */; + default: return 28 /* WasiErrno.EINVAL */; + } + }); + this.clock_time_get = syscallWrap(this, 'clock_time_get', function (id, _percision, time) { + time = Number(time); + if (time === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + switch (id) { + case 0 /* WasiClockid.REALTIME */: + view.setBigUint64(time, BigInt(Date.now()) * BigInt(1000000), true); + return 0 /* WasiErrno.ESUCCESS */; + case 1 /* WasiClockid.MONOTONIC */: + case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: + case 3 /* WasiClockid.THREAD_CPUTIME_ID */: { + const t = performance.now(); + const s = Math.trunc(t); + const ms = Math.floor((t - s) * 1000); + const result = BigInt(s) * BigInt(1000000000) + BigInt(ms) * BigInt(1000000); + view.setBigUint64(time, result, true); + return 0 /* WasiErrno.ESUCCESS */; + } + default: return 28 /* WasiErrno.EINVAL */; + } + }); + this.fd_advise = syscallWrap(this, 'fd_advise', function (_fd, _offset, _len, _advice) { + return 52 /* WasiErrno.ENOSYS */; + }); + this.fd_fdstat_get = syscallWrap(this, 'fd_fdstat_get', function (fd, fdstat) { + fdstat = Number(fdstat); + if (fdstat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + const { view } = getMemory(this); + view.setUint16(fdstat, fileDescriptor.type, true); + view.setUint16(fdstat + 2, 0, true); + view.setBigUint64(fdstat + 8, fileDescriptor.rightsBase, true); + view.setBigUint64(fdstat + 16, fileDescriptor.rightsInheriting, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.fd_fdstat_set_flags = syscallWrap(this, 'fd_fdstat_set_flags', function (_fd, _flags) { + return 52 /* WasiErrno.ENOSYS */; + }); + this.fd_fdstat_set_rights = syscallWrap(this, 'fd_fdstat_set_rights', function (fd, rightsBase, rightsInheriting) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + if ((rightsBase | fileDescriptor.rightsBase) > fileDescriptor.rightsBase) { + return 76 /* WasiErrno.ENOTCAPABLE */; + } + if ((rightsInheriting | fileDescriptor.rightsInheriting) > + fileDescriptor.rightsInheriting) { + return 76 /* WasiErrno.ENOTCAPABLE */; + } + fileDescriptor.rightsBase = rightsBase; + fileDescriptor.rightsInheriting = rightsInheriting; + return 0 /* WasiErrno.ESUCCESS */; + }); + this.fd_prestat_get = syscallWrap(this, 'fd_prestat_get', function (fd, prestat) { + prestat = Number(prestat); + if (prestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let fileDescriptor; + try { + fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + } + catch (err) { + if (err instanceof WasiError) + return err.errno; + throw err; + } + if (fileDescriptor.preopen !== 1) + return 28 /* WasiErrno.EINVAL */; + const { view } = getMemory(this); + // preopen type is dir(0) + view.setUint32(prestat, 0, true); + view.setUint32(prestat + 4, encoder.encode(fileDescriptor.path).length, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.fd_prestat_dir_name = syscallWrap(this, 'fd_prestat_dir_name', function (fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + if (fileDescriptor.preopen !== 1) + return 8 /* WasiErrno.EBADF */; + const buffer = encoder.encode(fileDescriptor.path); + const size = buffer.length; + if (size > path_len) + return 42 /* WasiErrno.ENOBUFS */; + const { HEAPU8 } = getMemory(this); + HEAPU8.set(buffer, path); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.fd_seek = syscallWrap(this, 'fd_seek', function (fd, offset, whence, newOffset) { + newOffset = Number(newOffset); + if (newOffset === 0) { + return 28 /* WasiErrno.EINVAL */; + } + if (fd === 0 || fd === 1 || fd === 2) + return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SEEK, BigInt(0)); + const r = fileDescriptor.seek(offset, whence); + const { view } = getMemory(this); + view.setBigUint64(newOffset, r, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.fd_tell = syscallWrap(this, 'fd_tell', function (fd, offset) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_TELL, BigInt(0)); + const pos = BigInt(fileDescriptor.pos); + const { view } = getMemory(this); + view.setBigUint64(Number(offset), pos, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.poll_oneoff = syscallWrap(this, 'poll_oneoff', function (in_ptr, out_ptr, nsubscriptions, nevents) { + in_ptr = Number(in_ptr); + out_ptr = Number(out_ptr); + nevents = Number(nevents); + nsubscriptions = Number(nsubscriptions); + nsubscriptions = nsubscriptions >>> 0; + if (in_ptr === 0 || out_ptr === 0 || nsubscriptions === 0 || nevents === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + view.setUint32(nevents, 0, true); + let i = 0; + let timer_userdata = BigInt(0); + let cur_timeout = BigInt(0); + let has_timeout = 0; + let min_timeout = BigInt(0); + let sub; + const subscriptions = Array(nsubscriptions); + for (i = 0; i < nsubscriptions; i++) { + sub = in_ptr + i * 48; + const userdata = view.getBigUint64(sub, true); + const type = view.getUint8(sub + 8); + const clockIdOrFd = view.getUint32(sub + 16, true); + const timeout = view.getBigUint64(sub + 24, true); + const precision = view.getBigUint64(sub + 32, true); + const flags = view.getUint16(sub + 40, true); + subscriptions[i] = { + userdata, + type, + u: { + clock: { + clock_id: clockIdOrFd, + timeout, + precision, + flags + }, + fd_readwrite: { + fd: clockIdOrFd + } + } + }; + } + const fdevents = []; + for (i = 0; i < nsubscriptions; i++) { + sub = subscriptions[i]; + switch (sub.type) { + case 0 /* WasiEventType.CLOCK */: { + if (sub.u.clock.flags === 1 /* WasiSubclockflags.ABSTIME */) { + /* Convert absolute time to relative delay. */ + const now = BigInt(Date.now()) * BigInt(1000000); + cur_timeout = sub.u.clock.timeout - now; + } + else { + cur_timeout = sub.u.clock.timeout; + } + if (has_timeout === 0 || cur_timeout < min_timeout) { + min_timeout = cur_timeout; + timer_userdata = sub.userdata; + has_timeout = 1; + } + break; + } + case 1 /* WasiEventType.FD_READ */: + case 2 /* WasiEventType.FD_WRITE */: + fdevents.push(sub); + break; + default: return 28 /* WasiErrno.EINVAL */; + } + } + if (fdevents.length > 0) { + for (i = 0; i < fdevents.length; i++) { + const fdevent = fdevents[i]; + const event = out_ptr + 32 * i; + view.setBigUint64(event, fdevent.userdata, true); + view.setUint32(event + 8, 52 /* WasiErrno.ENOSYS */, true); + view.setUint32(event + 12, fdevent.type, true); + view.setBigUint64(event + 16, BigInt(0), true); + view.setUint16(event + 24, 0, true); + view.setUint32(nevents, 1, true); + } + view.setUint32(nevents, fdevents.length, true); + return 0 /* WasiErrno.ESUCCESS */; + } + if (has_timeout) { + Number(min_timeout / BigInt(1000000)); + // } else { + // const buf = new SharedArrayBuffer(4) + // const arr = new Int32Array(buf) + // postMsg({ + // __tybys_wasm_util_wasi__: { + // type: 'set-timeout', + // payload: { + // buffer: buf, + // delay + // } + // } + // }) + // Atomics.wait(arr, 0, 0) + // } + const event = out_ptr; + view.setBigUint64(event, timer_userdata, true); + view.setUint32(event + 8, 0 /* WasiErrno.ESUCCESS */, true); + view.setUint32(event + 12, 0 /* WasiEventType.CLOCK */, true); + view.setUint32(nevents, 1, true); + } + return 0 /* WasiErrno.ESUCCESS */; + }); + this.proc_exit = syscallWrap(this, 'proc_exit', function (rval) { + return 0 /* WasiErrno.ESUCCESS */; + }); + this.proc_raise = syscallWrap(this, 'proc_raise', function (_sig) { + return 52 /* WasiErrno.ENOSYS */; + }); + this.sched_yield = syscallWrap(this, 'sched_yield', function () { + return 0 /* WasiErrno.ESUCCESS */; + }); + this.random_get = typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function' + ? syscallWrap(this, 'random_get', function (buf, buf_len) { + buf = Number(buf); + if (buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + buf_len = Number(buf_len); + const { HEAPU8, view } = getMemory(this); + if ((typeof SharedArrayBuffer === 'function' && HEAPU8.buffer instanceof SharedArrayBuffer) || + (Object.prototype.toString.call(HEAPU8.buffer) === '[object SharedArrayBuffer]')) { + for (let i = buf; i < buf + buf_len; ++i) { + view.setUint8(i, Math.floor(Math.random() * 256)); + } + return 0 /* WasiErrno.ESUCCESS */; + } + let pos; + const stride = 65536; + for (pos = 0; pos + stride < buf_len; pos += stride) { + crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + pos + stride)); + } + crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + buf_len)); + return 0 /* WasiErrno.ESUCCESS */; + }) + : syscallWrap(this, 'random_get', function (buf, buf_len) { + buf = Number(buf); + if (buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + buf_len = Number(buf_len); + const { view } = getMemory(this); + for (let i = buf; i < buf + buf_len; ++i) { + view.setUint8(i, Math.floor(Math.random() * 256)); + } + return 0 /* WasiErrno.ESUCCESS */; + }); + this.sock_recv = syscallWrap(this, 'sock_recv', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_send = syscallWrap(this, 'sock_send', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_shutdown = syscallWrap(this, 'sock_shutdown', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_accept = syscallWrap(this, 'sock_accept', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + _wasi.set(this, { + fds, + args, + env + }); + if (fs) + _fs.set(this, fs); + // eslint-disable-next-line @typescript-eslint/no-this-alias + const _this = this; + function defineImport(name, syncVersion, asyncVersion, parameterType, returnType) { + if (asyncFs) { + if (asyncify) { + _this[name] = asyncify.wrapImportFunction(syscallWrap(_this, name, asyncVersion)); + } + else { + _this[name] = wrapAsyncImport(syscallWrap(_this, name, asyncVersion), parameterType, returnType); + } + } + else { + _this[name] = syscallWrap(_this, name, syncVersion); + } + } + defineImport('fd_allocate', function fd_allocate(fd, offset, len) { + const wasi = _wasi.get(this); + const fs = getFs(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0)); + const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); + if (stat.size < offset + len) { + fs.ftruncateSync(fileDescriptor.fd, Number(offset + len)); + } + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_allocate(fd, offset, len) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0)); + const h = fileDescriptor.fd; + const stat = await h.stat({ bigint: true }); + if (stat.size < offset + len) { + await h.truncate(Number(offset + len)); + } + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i64', 'f64'], ['i32']); + defineImport('fd_close', function fd_close(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + const fs = getFs(this); + fs.closeSync(fileDescriptor.fd); + wasi.fds.remove(fd); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_close(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + await fileDescriptor.fd.close(); + wasi.fds.remove(fd); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32'], ['i32']); + defineImport('fd_datasync', function fd_datasync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0)); + const fs = getFs(this); + fs.fdatasyncSync(fileDescriptor.fd); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_datasync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0)); + await fileDescriptor.fd.datasync(); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32'], ['i32']); + defineImport('fd_filestat_get', function fd_filestat_get(fd, buf) { + buf = Number(buf); + if (buf === 0) + return 28 /* WasiErrno.EINVAL */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0)); + const fs = getFs(this); + const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); + const { view } = getMemory(this); + toFileStat(view, buf, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_filestat_get(fd, buf) { + buf = Number(buf); + if (buf === 0) + return 28 /* WasiErrno.EINVAL */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0)); + const h = fileDescriptor.fd; + const stat = await h.stat({ bigint: true }); + const { view } = getMemory(this); + toFileStat(view, buf, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32'], ['i32']); + defineImport('fd_filestat_set_size', function fd_filestat_set_size(fd, size) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0)); + const fs = getFs(this); + fs.ftruncateSync(fileDescriptor.fd, Number(size)); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_filestat_set_size(fd, size) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0)); + const h = fileDescriptor.fd; + await h.truncate(Number(size)); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i64'], ['i32']); + function fdFilestatGetTimes(fd, atim, mtim, flags) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_TIMES, BigInt(0)); + if ((flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { + atim = BigInt(Date.now() * 1000000); + } + if ((flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { + mtim = BigInt(Date.now() * 1000000); + } + return { fileDescriptor, atim, mtim }; + } + defineImport('fd_filestat_set_times', function fd_filestat_set_times(fd, atim, mtim, flags) { + if (validateFstFlagsOrReturn(flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); + const fs = getFs(this); + fs.futimesSync(fileDescriptor.fd, Number(atimRes), Number(mtimRes)); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_filestat_set_times(fd, atim, mtim, flags) { + if (validateFstFlagsOrReturn(flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); + const h = fileDescriptor.fd; + await h.utimes(Number(atimRes), Number(mtimRes)); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i64', 'i64', 'i32'], ['i32']); + defineImport('fd_pread', function fd_pread(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let nread = 0; + const buffer = (() => { + try { + return new Uint8Array(new SharedArrayBuffer(totalSize)); + } + catch (_) { + return new Uint8Array(totalSize); + } + })(); + buffer._isBuffer = true; + const fs = getFs(this); + const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset)); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function (fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let nread = 0; + const buffer = new Uint8Array(totalSize); + buffer._isBuffer = true; + const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(offset)); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); + defineImport('fd_pwrite', function fd_pwrite(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + })); + const fs = getFs(this); + const nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset)); + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_pwrite(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + })); + const { bytesWritten } = await fileDescriptor.fd.write(buffer, 0, buffer.length, Number(offset)); + view.setUint32(size, bytesWritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); + defineImport('fd_read', function fd_read(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let buffer; + let nread = 0; + if (fd === 0) { + if (typeof window === 'undefined' || typeof window.prompt !== 'function') { + return 58 /* WasiErrno.ENOTSUP */; + } + buffer = readStdin(); + nread = buffer ? copyMemory(ioVecs, buffer) : 0; + } + else { + buffer = (() => { + try { + return new Uint8Array(new SharedArrayBuffer(totalSize)); + } + catch (_) { + return new Uint8Array(totalSize); + } + })(); + buffer._isBuffer = true; + const fs = getFs(this); + const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos)); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + fileDescriptor.pos += BigInt(nread); + } + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_read(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let buffer; + let nread = 0; + if (fd === 0) { + if (typeof window === 'undefined' || typeof window.prompt !== 'function') { + return 58 /* WasiErrno.ENOTSUP */; + } + buffer = readStdin(); + nread = buffer ? copyMemory(ioVecs, buffer) : 0; + } + else { + buffer = new Uint8Array(totalSize); + buffer._isBuffer = true; + const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(fileDescriptor.pos)); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + fileDescriptor.pos += BigInt(nread); + } + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('fd_readdir', function fd_readdir(fd, buf, buf_len, cookie, bufused) { + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (buf === 0 || bufused === 0) + return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0)); + const fs = getFs(this); + const entries = fs.readdirSync(fileDescriptor.realPath, { withFileTypes: true }); + const { HEAPU8, view } = getMemory(this); + let bufferUsed = 0; + for (let i = Number(cookie); i < entries.length; i++) { + const nameData = encoder.encode(entries[i].name); + const entryInfo = fs.statSync(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true }); + const entryData = new Uint8Array(24 + nameData.byteLength); + const entryView = new DataView(entryData.buffer); + entryView.setBigUint64(0, BigInt(i + 1), true); + entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true); + entryView.setUint32(16, nameData.byteLength, true); + let type; + if (entries[i].isFile()) { + type = 4 /* WasiFileType.REGULAR_FILE */; + } + else if (entries[i].isDirectory()) { + type = 3 /* WasiFileType.DIRECTORY */; + } + else if (entries[i].isSymbolicLink()) { + type = 7 /* WasiFileType.SYMBOLIC_LINK */; + } + else if (entries[i].isCharacterDevice()) { + type = 2 /* WasiFileType.CHARACTER_DEVICE */; + } + else if (entries[i].isBlockDevice()) { + type = 1 /* WasiFileType.BLOCK_DEVICE */; + } + else if (entries[i].isSocket()) { + type = 6 /* WasiFileType.SOCKET_STREAM */; + } + else { + type = 0 /* WasiFileType.UNKNOWN */; + } + entryView.setUint8(20, type); + entryData.set(nameData, 24); + const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed)); + HEAPU8.set(data, buf + bufferUsed); + bufferUsed += data.byteLength; + } + view.setUint32(bufused, bufferUsed, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_readdir(fd, buf, buf_len, cookie, bufused) { + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (buf === 0 || bufused === 0) + return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0)); + const fs = getFs(this); + const entries = await fs.promises.readdir(fileDescriptor.realPath, { withFileTypes: true }); + const { HEAPU8, view } = getMemory(this); + let bufferUsed = 0; + for (let i = Number(cookie); i < entries.length; i++) { + const nameData = encoder.encode(entries[i].name); + const entryInfo = await fs.promises.stat(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true }); + const entryData = new Uint8Array(24 + nameData.byteLength); + const entryView = new DataView(entryData.buffer); + entryView.setBigUint64(0, BigInt(i + 1), true); + entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true); + entryView.setUint32(16, nameData.byteLength, true); + let type; + if (entries[i].isFile()) { + type = 4 /* WasiFileType.REGULAR_FILE */; + } + else if (entries[i].isDirectory()) { + type = 3 /* WasiFileType.DIRECTORY */; + } + else if (entries[i].isSymbolicLink()) { + type = 7 /* WasiFileType.SYMBOLIC_LINK */; + } + else if (entries[i].isCharacterDevice()) { + type = 2 /* WasiFileType.CHARACTER_DEVICE */; + } + else if (entries[i].isBlockDevice()) { + type = 1 /* WasiFileType.BLOCK_DEVICE */; + } + else if (entries[i].isSocket()) { + type = 6 /* WasiFileType.SOCKET_STREAM */; + } + else { + type = 0 /* WasiFileType.UNKNOWN */; + } + entryView.setUint8(20, type); + entryData.set(nameData, 24); + const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed)); + HEAPU8.set(data, buf + bufferUsed); + bufferUsed += data.byteLength; + } + view.setUint32(bufused, bufferUsed, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); + defineImport('fd_renumber', function fd_renumber(from, to) { + const wasi = _wasi.get(this); + wasi.fds.renumber(to, from); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_renumber(from, to) { + const wasi = _wasi.get(this); + await wasi.fds.renumber(to, from); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32'], ['i32']); + defineImport('fd_sync', function fd_sync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); + const fs = getFs(this); + fs.fsyncSync(fileDescriptor.fd); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_sync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); + await fileDescriptor.fd.sync(); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32'], ['i32']); + defineImport('fd_write', function fd_write(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + })); + let nwritten; + if (fd === 1 || fd === 2) { + nwritten = fileDescriptor.write(buffer); + } + else { + const fs = getFs(this); + nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos)); + fileDescriptor.pos += BigInt(nwritten); + } + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function fd_write(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + (i * 8); + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + })); + let nwritten; + if (fd === 1 || fd === 2) { + nwritten = fileDescriptor.write(buffer); + } + else { + nwritten = await (await (fileDescriptor.fd.write(buffer, 0, buffer.length, Number(fileDescriptor.pos)))).bytesWritten; + fileDescriptor.pos += BigInt(nwritten); + } + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('path_create_directory', function path_create_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.mkdirSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_create_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.mkdir(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32'], ['i32']); + defineImport('path_filestat_get', function path_filestat_get(fd, flags, path, path_len, filestat) { + path = Number(path); + path_len = Number(path_len); + filestat = Number(filestat); + if (path === 0 || filestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + const fs = getFs(this); + pathString = resolve(fileDescriptor.realPath, pathString); + let stat; + if ((flags & 1) === 1) { + stat = fs.statSync(pathString, { bigint: true }); + } + else { + stat = fs.lstatSync(pathString, { bigint: true }); + } + toFileStat(view, filestat, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_filestat_get(fd, flags, path, path_len, filestat) { + path = Number(path); + path_len = Number(path_len); + filestat = Number(filestat); + if (path === 0 || filestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + const fs = getFs(this); + pathString = resolve(fileDescriptor.realPath, pathString); + let stat; + if ((flags & 1) === 1) { + stat = await fs.promises.stat(pathString, { bigint: true }); + } + else { + stat = await fs.promises.lstat(pathString, { bigint: true }); + } + toFileStat(view, filestat, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('path_filestat_set_times', function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) + return 28 /* WasiErrno.EINVAL */; + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0)); + if (validateFstFlagsOrReturn(fst_flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const fs = getFs(this); + const resolvedPath = resolvePathSync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags); + if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { + atim = BigInt(Date.now() * 1000000); + } + if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { + mtim = BigInt(Date.now() * 1000000); + } + fs.utimesSync(resolvedPath, Number(atim), Number(mtim)); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) + return 28 /* WasiErrno.EINVAL */; + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0)); + if (validateFstFlagsOrReturn(fst_flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const fs = getFs(this); + const resolvedPath = await resolvePathAsync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags); + if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { + atim = BigInt(Date.now() * 1000000); + } + if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { + mtim = BigInt(Date.now() * 1000000); + } + await fs.promises.utimes(resolvedPath, Number(atim), Number(mtim)); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32'], ['i32']); + defineImport('path_link', function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0)); + } + else { + oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0)); + newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0)); + } + const { HEAPU8 } = getMemory(this); + const fs = getFs(this); + const resolvedOldPath = resolvePathSync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags); + const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); + fs.linkSync(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0)); + } + else { + oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0)); + newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0)); + } + const { HEAPU8 } = getMemory(this); + const fs = getFs(this); + const resolvedOldPath = await resolvePathAsync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags); + const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); + await fs.promises.link(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); + function pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags) { + const read = (fs_rights_base & (WasiRights.FD_READ | + WasiRights.FD_READDIR)) !== BigInt(0); + const write = (fs_rights_base & (WasiRights.FD_DATASYNC | + WasiRights.FD_WRITE | + WasiRights.FD_ALLOCATE | + WasiRights.FD_FILESTAT_SET_SIZE)) !== BigInt(0); + let flags = write ? read ? 2 /* FileControlFlag.O_RDWR */ : 1 /* FileControlFlag.O_WRONLY */ : 0 /* FileControlFlag.O_RDONLY */; + let needed_base = WasiRights.PATH_OPEN; + let needed_inheriting = fs_rights_base | fs_rights_inheriting; + if ((o_flags & 1 /* WasiFileControlFlag.O_CREAT */) !== 0) { + flags |= 64 /* FileControlFlag.O_CREAT */; + needed_base |= WasiRights.PATH_CREATE_FILE; + } + if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0) { + flags |= 65536 /* FileControlFlag.O_DIRECTORY */; + } + if ((o_flags & 4 /* WasiFileControlFlag.O_EXCL */) !== 0) { + flags |= 128 /* FileControlFlag.O_EXCL */; + } + if ((o_flags & 8 /* WasiFileControlFlag.O_TRUNC */) !== 0) { + flags |= 512 /* FileControlFlag.O_TRUNC */; + needed_base |= WasiRights.PATH_FILESTAT_SET_SIZE; + } + if ((fs_flags & 1 /* WasiFdFlag.APPEND */) !== 0) { + flags |= 1024 /* FileControlFlag.O_APPEND */; + } + if ((fs_flags & 2 /* WasiFdFlag.DSYNC */) !== 0) { + // flags |= FileControlFlag.O_DSYNC; + needed_inheriting |= WasiRights.FD_DATASYNC; + } + if ((fs_flags & 4 /* WasiFdFlag.NONBLOCK */) !== 0) { + flags |= 2048 /* FileControlFlag.O_NONBLOCK */; + } + if ((fs_flags & 8 /* WasiFdFlag.RSYNC */) !== 0) { + flags |= 1052672 /* FileControlFlag.O_SYNC */; + needed_inheriting |= WasiRights.FD_SYNC; + } + if ((fs_flags & 16 /* WasiFdFlag.SYNC */) !== 0) { + flags |= 1052672 /* FileControlFlag.O_SYNC */; + needed_inheriting |= WasiRights.FD_SYNC; + } + if (write && (flags & (1024 /* FileControlFlag.O_APPEND */ | 512 /* FileControlFlag.O_TRUNC */)) === 0) { + needed_inheriting |= WasiRights.FD_SEEK; + } + return { flags, needed_base, needed_inheriting }; + } + defineImport('path_open', function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { + path = Number(path); + fd = Number(fd); + if (path === 0 || fd === 0) { + return 28 /* WasiErrno.EINVAL */; + } + path_len = Number(path_len); + fs_rights_base = BigInt(fs_rights_base); + fs_rights_inheriting = BigInt(fs_rights_inheriting); + const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting); + const memory = getMemory(this); + const HEAPU8 = memory.HEAPU8; + const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + const fs = getFs(this); + const resolved_path = resolvePathSync(fs, fileDescriptor, pathString, dirflags); + const r = fs.openSync(resolved_path, flagsRes, 0o666); + const filetype = wasi.fds.getFileTypeByFd(r); + if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) { + return 54 /* WasiErrno.ENOTDIR */; + } + const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r, flagsRes, filetype); + const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0); + const stat = fs.fstatSync(r, { bigint: true }); + if (stat.isFile()) { + wrap.size = stat.size; + if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) { + wrap.pos = stat.size; + } + } + const view = memory.view; + view.setInt32(fd, wrap.id, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { + path = Number(path); + fd = Number(fd); + if (path === 0 || fd === 0) { + return 28 /* WasiErrno.EINVAL */; + } + path_len = Number(path_len); + fs_rights_base = BigInt(fs_rights_base); + fs_rights_inheriting = BigInt(fs_rights_inheriting); + const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting); + const memory = getMemory(this); + const HEAPU8 = memory.HEAPU8; + const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + const fs = getFs(this); + const resolved_path = await resolvePathAsync(fs, fileDescriptor, pathString, dirflags); + const r = await fs.promises.open(resolved_path, flagsRes, 0o666); + const filetype = await wasi.fds.getFileTypeByFd(r); + if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) { + return 54 /* WasiErrno.ENOTDIR */; + } + const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r.fd, flagsRes, filetype); + const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0); + const stat = await r.stat({ bigint: true }); + if (stat.isFile()) { + wrap.size = stat.size; + if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) { + wrap.pos = stat.size; + } + } + const view = memory.view; + view.setInt32(fd, wrap.id, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32', 'i32'], ['i32']); + defineImport('path_readlink', function path_readlink(fd, path, path_len, buf, buf_len, bufused) { + path = Number(path); + path_len = Number(path_len); + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (path === 0 || buf === 0 || bufused === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + const link = fs.readlinkSync(pathString); + const linkData = encoder.encode(link); + const len = Math.min(linkData.length, buf_len); + if (len >= buf_len) + return 42 /* WasiErrno.ENOBUFS */; + HEAPU8.set(linkData.subarray(0, len), buf); + HEAPU8[buf + len] = 0; + view.setUint32(bufused, len, true); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_readlink(fd, path, path_len, buf, buf_len, bufused) { + path = Number(path); + path_len = Number(path_len); + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (path === 0 || buf === 0 || bufused === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + const link = await fs.promises.readlink(pathString); + const linkData = encoder.encode(link); + const len = Math.min(linkData.length, buf_len); + if (len >= buf_len) + return 42 /* WasiErrno.ENOBUFS */; + HEAPU8.set(linkData.subarray(0, len), buf); + HEAPU8[buf + len] = 0; + view.setUint32(bufused, len, true); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('path_remove_directory', function path_remove_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.rmdirSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_remove_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.rmdir(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32'], ['i32']); + defineImport('path_rename', function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0)); + } + else { + oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0)); + newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0)); + } + const { HEAPU8 } = getMemory(this); + const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len))); + const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); + const fs = getFs(this); + fs.renameSync(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0)); + } + else { + oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0)); + newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0)); + } + const { HEAPU8 } = getMemory(this); + const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len))); + const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); + const fs = getFs(this); + await fs.promises.rename(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('path_symlink', function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0)); + const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)); + let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)); + newPath = resolve(fileDescriptor.realPath, newPath); + const fs = getFs(this); + fs.symlinkSync(oldPath, newPath); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0)); + const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)); + let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)); + newPath = resolve(fileDescriptor.realPath, newPath); + const fs = getFs(this); + await fs.promises.symlink(oldPath, newPath); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); + defineImport('path_unlink_file', function path_unlink_file(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.unlinkSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, async function path_unlink_file(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0)); + let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.unlink(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, ['i32', 'i32', 'i32'], ['i32']); + this._setMemory = function setMemory(m) { + if (!(m instanceof _WebAssembly.Memory)) { + throw new TypeError('"instance.exports.memory" property must be a WebAssembly.Memory'); + } + _memory.set(_this, extendMemory(m)); + }; + } + static createSync(args, env, preopens, stdio, fs, print, printErr) { + const fds = new SyncTable({ + size: 3, + in: stdio[0], + out: stdio[1], + err: stdio[2], + fs, + print, + printErr + }); + const _this = new WASI$1(args, env, fds, false, fs); + if (preopens.length > 0) { + for (let i = 0; i < preopens.length; ++i) { + const realPath = fs.realpathSync(preopens[i].realPath, 'utf8'); + const fd = fs.openSync(realPath, 'r', 0o666); + fds.insertPreopen(fd, preopens[i].mappedPath, realPath); + } + } + return _this; + } + static async createAsync(args, env, preopens, stdio, fs, print, printErr, asyncify) { + const fds = new AsyncTable({ + size: 3, + in: stdio[0], + out: stdio[1], + err: stdio[2], + print, + printErr + }); + const _this = new WASI$1(args, env, fds, true, fs, asyncify); + if (preopens.length > 0) { + for (let i = 0; i < preopens.length; ++i) { + const entry = preopens[i]; + const realPath = await fs.promises.realpath(entry.realPath); + const fd = await fs.promises.open(realPath, 'r', 0o666); + await fds.insertPreopen(fd, entry.mappedPath, realPath); + } + } + return _this; + } +} + +// eslint-disable-next-line spaced-comment +const kEmptyObject = /*#__PURE__*/ Object.freeze(/*#__PURE__*/ Object.create(null)); +const kExitCode = Symbol('kExitCode'); +const kSetMemory = Symbol('kSetMemory'); +const kStarted = Symbol('kStarted'); +const kInstance = Symbol('kInstance'); +const kBindingName = Symbol('kBindingName'); +function setupInstance(self, instance) { + validateObject(instance, 'instance'); + validateObject(instance.exports, 'instance.exports'); + self[kInstance] = instance; + self[kSetMemory](instance.exports.memory); +} +function validateOptions(options) { + var _a; + validateObject(options, 'options'); + let _WASI; + if (options.version !== undefined) { + validateString(options.version, 'options.version'); + switch (options.version) { + case 'unstable': + _WASI = WASI$1; + this[kBindingName] = 'wasi_unstable'; + break; + case 'preview1': + _WASI = WASI$1; + this[kBindingName] = 'wasi_snapshot_preview1'; + break; + default: + throw new TypeError(`unsupported WASI version "${options.version}"`); + } + } + else { + _WASI = WASI$1; + this[kBindingName] = 'wasi_snapshot_preview1'; + } + if (options.args !== undefined) { + validateArray(options.args, 'options.args'); + } + const args = ((_a = options.args) !== null && _a !== void 0 ? _a : []).map(String); + const env = []; + if (options.env !== undefined) { + validateObject(options.env, 'options.env'); + Object.entries(options.env).forEach(({ 0: key, 1: value }) => { + if (value !== undefined) { + env.push(`${key}=${value}`); + } + }); + } + const preopens = []; + if (options.preopens !== undefined) { + validateObject(options.preopens, 'options.preopens'); + Object.entries(options.preopens).forEach(({ 0: key, 1: value }) => preopens.push({ mappedPath: String(key), realPath: String(value) })); + } + if (preopens.length > 0) { + if (options.fs === undefined) { + throw new Error('filesystem is disabled, can not preopen directory'); + } + try { + validateObject(options.fs, 'options.fs'); + } + catch (_) { + throw new TypeError('Node.js fs like implementation is not provided'); + } + } + // if (options.filesystem !== undefined) { + // validateObject(options.filesystem, 'options.filesystem') + // validateString(options.filesystem.type, 'options.filesystem.type') + // if (options.filesystem.type !== 'memfs' && options.filesystem.type !== 'file-system-access-api') { + // throw new Error(`Filesystem type ${(options.filesystem as any).type as string} is not supported, only "memfs" and "file-system-access-api" is supported currently`) + // } + // try { + // validateObject(options.filesystem.fs, 'options.filesystem.fs') + // } catch (_) { + // throw new Error('Node.js fs like implementation is not provided') + // } + // } + if (options.print !== undefined) + validateFunction(options.print, 'options.print'); + if (options.printErr !== undefined) + validateFunction(options.printErr, 'options.printErr'); + if (options.returnOnExit !== undefined) { + validateBoolean(options.returnOnExit, 'options.returnOnExit'); + } + // const { stdin = 0, stdout = 1, stderr = 2 } = options + // validateInt32(stdin, 'options.stdin', 0) + // validateInt32(stdout, 'options.stdout', 0) + // validateInt32(stderr, 'options.stderr', 0) + // const stdio = [stdin, stdout, stderr] as const + const stdio = [0, 1, 2]; + return { + args, + env, + preopens, + stdio, + _WASI + }; +} +function initWASI(setMemory, wrap) { + this[kSetMemory] = setMemory; + this.wasiImport = wrap; + this[kStarted] = false; + this[kExitCode] = 0; + this[kInstance] = undefined; +} +/** @public */ +class WASI { + constructor(options = kEmptyObject) { + const { args, env, preopens, stdio, _WASI } = validateOptions.call(this, options); + const wrap = _WASI.createSync(args, env, preopens, stdio, options.fs, options.print, options.printErr); + const setMemory = wrap._setMemory; + delete wrap._setMemory; + initWASI.call(this, setMemory, wrap); + if (options.returnOnExit) { + wrap.proc_exit = wasiReturnOnProcExit.bind(this); + } + } + // Must not export _initialize, must export _start + start(instance) { + if (this[kStarted]) { + throw new Error('WASI instance has already started'); + } + this[kStarted] = true; + setupInstance(this, instance); + const { _start, _initialize } = this[kInstance].exports; + validateFunction(_start, 'instance.exports._start'); + validateUndefined(_initialize, 'instance.exports._initialize'); + let ret; + try { + ret = _start(); + } + catch (err) { + if (err !== kExitCode) { + throw err; + } + } + if (ret instanceof Promise) { + return ret.then(() => this[kExitCode], (err) => { + if (err !== kExitCode) { + throw err; + } + return this[kExitCode]; + }); + } + return this[kExitCode]; + } + // Must not export _start, may optionally export _initialize + initialize(instance) { + if (this[kStarted]) { + throw new Error('WASI instance has already started'); + } + this[kStarted] = true; + setupInstance(this, instance); + const { _start, _initialize } = this[kInstance].exports; + validateUndefined(_start, 'instance.exports._start'); + if (_initialize !== undefined) { + validateFunction(_initialize, 'instance.exports._initialize'); + return _initialize(); + } + } + getImportObject() { + return { [this[kBindingName]]: this.wasiImport }; + } +} +function wasiReturnOnProcExit(rval) { + this[kExitCode] = rval; + // eslint-disable-next-line @typescript-eslint/no-throw-literal + throw kExitCode; +} + +// @ts-check + +/** + * @param {unknown} value + */ +const getType = (value) => { + if (value === undefined) return 0 + if (value === null) return 1 + const t = typeof value; + if (t === 'boolean') return 2 + if (t === 'number') return 3 + if (t === 'string') return 4 + if (t === 'object') return 6 + if (t === 'bigint') return 9 + return -1 +}; + +/** + * @param {import('memfs').IFs} memfs + * @param {any} value + * @param {ReturnType} type + * @returns {Uint8Array} + */ +const encodeValue = (memfs, value, type) => { + switch (type) { + case 0: + case 1: + return new Uint8Array(0) + case 2: { + const view = new Int32Array(1); + view[0] = value ? 1 : 0; + return new Uint8Array(view.buffer) + } + case 3: { + const view = new Float64Array(1); + view[0] = value; + return new Uint8Array(view.buffer) + } + case 4: { + const view = new TextEncoder().encode(value); + return view + } + case 6: { + const [entry] = Object.entries(memfs).filter(([_, v]) => v === value.constructor)[0] ?? []; + if (entry) { + Object.defineProperty(value, '__constructor__', { + configurable: true, + writable: true, + enumerable: true, + value: entry + }); + } + + const json = JSON.stringify(value, (_, value) => { + if (typeof value === 'bigint') { + return `BigInt(${String(value)})` + } + return value + }); + const view = new TextEncoder().encode(json); + return view + } + case 9: { + const view = new BigInt64Array(1); + view[0] = value; + return new Uint8Array(view.buffer) + } + case -1: + default: + throw new Error('unsupported data') + } +}; + +/** + * @param {import('memfs').IFs} fs + * @returns {(e: { data: { __fs__: { sab: Int32Array, type: keyof import('memfs').IFs, payload: any[] } } }) => void} + */ +var createOnMessage = (fs) => function onMessage(e) { + if (e.data.__fs__) { + /** + * 0..4 status(int32_t): 21(waiting) 0(success) 1(error) + * 5..8 type(napi_valuetype): 0(undefined) 1(null) 2(boolean) 3(number) 4(string) 6(jsonstring) 9(bigint) -1(unsupported) + * 9..16 payload_size(uint32_t) <= 1024 + * 16..16 + payload_size payload_content + */ + const { sab, type, payload } = e.data.__fs__; + const fn = fs[type]; + const args = payload ? payload.map((value) => { + if (value instanceof Uint8Array) { + // buffer polyfill bug + // @ts-expect-error + value._isBuffer = true; + } + return value + }) : payload; + try { + const ret = fn.apply(fs, args); + const t = getType(ret); + const v = encodeValue(fs, ret, t); + Atomics.store(sab, 0, 0); + Atomics.store(sab, 1, t); + Atomics.store(sab, 2, v.length); + new Uint8Array(sab.buffer).set(v, 16); + + } catch (/** @type {any} */ err) { + Atomics.store(sab, 0, 1); + Atomics.store(sab, 1, 6); + const payloadContent = new TextEncoder().encode(JSON.stringify({ + ...err, + message: err.message, + stack: err.stack + })); + Atomics.store(sab, 2, payloadContent.length); + new Uint8Array(sab.buffer).set(payloadContent, 16); + } finally { + Atomics.notify(sab, 0); + } + } +}; + +/** + * @param {import('memfs').IFs} memfs + */ +var createFsProxy = (memfs) => new Proxy({}, { + get (_target, p, _receiver) { + /** + * @param {any[]} args + */ + return function (...args) { + const sab = new SharedArrayBuffer(16 + 1024); + const i32arr = new Int32Array(sab); + Atomics.store(i32arr, 0, 21); + + // @ts-expect-error + postMessage({ + __fs__: { + sab: i32arr, + type: p, + payload: args + } + }); + + Atomics.wait(i32arr, 0, 21); + + const status = Atomics.load(i32arr, 0); + const type = Atomics.load(i32arr, 1); + const size = Atomics.load(i32arr, 2); + const content = new Uint8Array(sab, 16, size); + if (status === 1) { + const errobj = JSON.parse(new TextDecoder().decode(content.slice())); + const err = new Error(errobj.message); + Object.defineProperty(err, 'stack', { + configurable: true, + enumerable: false, + writable: true, + value: errobj.stack + }); + for (const [k, v] of Object.entries(errobj)) { + if (k === 'message' || k === 'stack') continue + // @ts-expect-error + err[k] = v; + } + throw err + } + if (type === 0) return undefined + if (type === 1) return null + if (type === 2) return Boolean(content[0]) + if (type === 3) return new Float64Array(sab, 16, 1)[0] + if (type === 4) return new TextDecoder().decode(content.slice()) + if (type === 6) { + const obj = JSON.parse(new TextDecoder().decode(content.slice()), (_key, value) => { + if (typeof value === 'string') { + const matched = value.match(/^BigInt\((-?\d+)\)$/); + if (matched && matched[1]) { + return BigInt(matched[1]) + } + } + return value + }); + if (obj.__constructor__) { + const ctor = obj.__constructor__; + delete obj.__constructor__; + // @ts-expect-error + Object.setPrototypeOf(obj, memfs[ctor].prototype); + } + return obj + } + if (type === 9) return new BigInt64Array(sab, 16, 1)[0] + throw new Error('unsupported data') + } + } +}); + +export { MessageHandler, WASI, createFsProxy, createOnMessage, getDefaultContext, instantiateNapiModule, instantiateNapiModuleSync }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BlbW5hcGkvY29yZS9kaXN0L2VtbmFwaS1jb3JlLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9ydW50aW1lL2Rpc3QvZW1uYXBpLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0eWJ5cy93YXNtLXV0aWwvZGlzdC93YXNtLXV0aWwuZXNtLWJ1bmRsZXIuanMiLCIuLi9mcy1wcm94eS5janMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbnZhciBfV2ViQXNzZW1ibHkgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgPyBXZWJBc3NlbWJseVxuICAgIDogdHlwZW9mIFdYV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gV1hXZWJBc3NlbWJseVxuICAgICAgICA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKSB7XG4gICAgaWYgKGltcG9ydHMgJiYgdHlwZW9mIGltcG9ydHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltcG9ydHMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbG9hZCh3YXNtSW5wdXQsIGltcG9ydHMpIHtcbiAgICBpZiAoIXdhc21JbnB1dClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgLy8gUHJvbWlzZTxzdHJpbmcgfCBVUkwgfCBSZXNwb25zZSB8IEJ1ZmZlclNvdXJjZSB8IFdlYkFzc2VtYmx5Lk1vZHVsZT5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdGhlbiA9IHR5cGVvZiB3YXNtSW5wdXQgPT09ICdvYmplY3QnICYmIHdhc21JbnB1dCAhPT0gbnVsbCAmJiAndGhlbicgaW4gd2FzbUlucHV0ID8gd2FzbUlucHV0LnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoZW4uY2FsbCh3YXNtSW5wdXQsIGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gbG9hZChpbnB1dCwgaW1wb3J0cyk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfKSB7IH1cbiAgICAvLyBCdWZmZXJTb3VyY2VcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgIH1cbiAgICAvLyBXZWJBc3NlbWJseS5Nb2R1bGVcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cykudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiB3YXNtSW5wdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFJlc3BvbnNlXG4gICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHdhc21JbnB1dC5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShidWZmZXIsIGltcG9ydHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gc3RyaW5nIHwgVVJMXG4gICAgdmFyIGlucHV0SXNTdHJpbmcgPSB0eXBlb2Ygd2FzbUlucHV0ID09PSAnc3RyaW5nJztcbiAgICBpZiAoaW5wdXRJc1N0cmluZyB8fCAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAgICBpZiAoaW5wdXRJc1N0cmluZyAmJiB0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc20gc291cmNlIGNhbiBub3QgYmUgYSBzdHJpbmcgb3IgVVJMIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xufVxuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgaWYgKCF3YXNtSW5wdXQpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIHZhciBtb2R1bGU7XG4gICAgaWYgKCh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgbW9kdWxlID0gbmV3IF9XZWJBc3NlbWJseS5Nb2R1bGUod2FzbUlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZSA9IHdhc21JbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB9XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IF9XZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpO1xuICAgIHZhciBzb3VyY2UgPSB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpIHtcbiAgICB2YXIgbmFwaU1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgdmFyIHJldXNlV29ya2VyID0gQm9vbGVhbihvcHRpb25zLnJldXNlV29ya2VyKTtcbiAgICAgICAgdmFyIHdhc21JbnN0YW5jZTtcbiAgICAgICAgdmFyIHdhc21Nb2R1bGU7XG4gICAgICAgIHZhciB3YXNtTWVtb3J5O1xuICAgICAgICB2YXIgd2FzbVRhYmxlO1xuICAgICAgICB2YXIgX21hbGxvYztcbiAgICAgICAgdmFyIF9mcmVlO1xuICAgICAgICBmdW5jdGlvbiBhYm9ydChtc2cpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBfV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYXBpTW9kdWxlID0ge1xuICAgICAgICAgICAgaW1wb3J0czoge1xuICAgICAgICAgICAgICAgIGVudjoge30sXG4gICAgICAgICAgICAgICAgbmFwaToge30sXG4gICAgICAgICAgICAgICAgZW1uYXBpOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cG9ydHM6IHt9LFxuICAgICAgICAgICAgZW1uYXBpOiB7fSxcbiAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICBmaWxlbmFtZTogJycsXG4gICAgICAgICAgICBjaGlsZFRocmVhZDogQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKSxcbiAgICAgICAgICAgIHNwYXduVGhyZWFkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGFydFRocmVhZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdFdvcmtlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXhlY3V0ZUFzeW5jV29yazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFwaU1vZHVsZS5sb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5hcGkgaW5pdCBvcHRpb25zJyk7XG4gICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gb3B0aW9ucy5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZSA9PT0gbnVsbCB8fCBpbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5zdGFuY2UuZXhwb3J0cykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIHdhc21JbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gb3B0aW9ucy5tb2R1bGU7XG4gICAgICAgICAgICAgICAgdmFyIG1lbW9yeSA9IG9wdGlvbnMubWVtb3J5IHx8IGV4cG9ydHMubWVtb3J5O1xuICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IG9wdGlvbnMudGFibGUgfHwgZXhwb3J0cy5fX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlO1xuICAgICAgICAgICAgICAgIGlmICghKG1vZHVsZSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5Nb2R1bGUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gbW9kdWxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKCEobWVtb3J5IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1lbW9yeSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBpZiAoISh0YWJsZSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5UYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSB0YWJsZScpO1xuICAgICAgICAgICAgICAgIHdhc21Nb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IG1lbW9yeTtcbiAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSB0YWJsZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMubWFsbG9jICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxsb2MgaXMgbm90IGV4cG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzLmZyZWUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZyZWUgaXMgbm90IGV4cG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgX21hbGxvYyA9IGV4cG9ydHMubWFsbG9jO1xuICAgICAgICAgICAgICAgIF9mcmVlID0gZXhwb3J0cy5mcmVlO1xuICAgICAgICAgICAgICAgIGlmICghbmFwaU1vZHVsZS5jaGlsZFRocmVhZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWluIHRocmVhZCBvbmx5XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVBcGlWZXJzaW9uID0gOCAvKiBWZXJzaW9uLk5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OICovO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MSA9IGluc3RhbmNlLmV4cG9ydHMubm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcGlWZXJzaW9uID0gbm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gbmFwaU1vZHVsZS5lbnZPYmplY3QgfHwgKG5hcGlNb2R1bGUuZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmNyZWF0ZUVudihuYXBpTW9kdWxlLmZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBmdW5jdGlvbiAoY2IpIHsgcmV0dXJuICh3YXNtVGFibGUuZ2V0KGNiKSk7IH0sIGZ1bmN0aW9uIChjYikgeyByZXR1cm4gKHdhc21UYWJsZS5nZXQoY2IpKTsgfSwgYWJvcnQsIGVtbmFwaU5vZGVCaW5kaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY29wZV8xID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxJbnRvTW9kdWxlKGZ1bmN0aW9uIChfZW52T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHNIYW5kbGUgPSBzY29wZV8xLmFkZChleHBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFwaV9yZWdpc3Rlcl93YXNtX3YxID0gaW5zdGFuY2UuZXhwb3J0cy5uYXBpX3JlZ2lzdGVyX3dhc21fdjE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9IG5hcGlfcmVnaXN0ZXJfd2FzbV92MShfZW52T2JqZWN0LmlkLCBleHBvcnRzSGFuZGxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXBpTW9kdWxlLmV4cG9ydHMgPSAoIW5hcGlWYWx1ZSkgPyBleHBvcnRzIDogZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYXBpVmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5hcGlNb2R1bGUuZW52T2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFwaU1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGVtbmFwaUN0eDtcbiAgICAgICAgdmFyIGVtbmFwaU5vZGVCaW5kaW5nO1xuICAgICAgICB2YXIgb25DcmVhdGVXb3JrZXI7XG4gICAgICAgIHZhciBlcnI7XG4gICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnIHx8IGNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBgb3B0aW9ucy5jb250ZXh0YC4gVXNlIGBpbXBvcnQgeyBnZXREZWZhdWx0Q29udGV4dCB9IGZyb20gJ0BlbW5hcGkvcnVudGltZSdgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4ID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHBvc3RNc2cgPSB0eXBlb2Ygb3B0aW9ucy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5wb3N0TWVzc2FnZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIHBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgID8gcG9zdE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBvc3RNc2cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBwb3N0TWVzc2FnZSBmb3VuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFwaU1vZHVsZS5wb3N0TWVzc2FnZSA9IHBvc3RNc2c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbmFwaU1vZHVsZS5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ3JlYXRlV29ya2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbkNyZWF0ZVdvcmtlciA9IG9wdGlvbnMub25DcmVhdGVXb3JrZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnByaW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJpbnRFcnIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGVyciA9IG9wdGlvbnMucHJpbnRFcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ25vZGVCaW5kaW5nJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJpbmRpbmcgPSBvcHRpb25zLm5vZGVCaW5kaW5nO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlQmluZGluZyAhPT0gJ29iamVjdCcgfHwgbm9kZUJpbmRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGBvcHRpb25zLm5vZGVCaW5kaW5nYC4gVXNlIEBlbW5hcGkvbm9kZS1iaW5kaW5nIHBhY2thZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nID0gbm9kZUJpbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gMDtcbiAgICAgICAgaWYgKCdhc3luY1dvcmtQb29sU2l6ZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFzeW5jV29ya1Bvb2xTaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuYXN5bmNXb3JrUG9vbFNpemUgbXVzdCBiZSBhIGludGVnZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gb3B0aW9ucy5hc3luY1dvcmtQb29sU2l6ZSA+PiAwO1xuICAgICAgICAgICAgaWYgKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID4gMTAyNCkge1xuICAgICAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gMTAyNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplIDwgLTEwMjQpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSA9IC0xMDI0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzaW5nbGVUaHJlYWRBc3luY1dvcmsgPSBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID8gZmFsc2UgOiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPD0gMCk7XG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYXN5bmNfd29ya19wb29sX3NpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYuX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSA9IF9lbW5hcGlfYXN5bmNfd29ya19wb29sX3NpemU7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQWRkU2VuZExpc3RlbmVyKHdvcmtlcikge1xuICAgICAgICAgICAgaWYgKCF3b3JrZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgdmFyIF9fZW1uYXBpX18gPSBkYXRhLl9fZW1uYXBpX187XG4gICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18gJiYgX19lbW5hcGlfXy50eXBlID09PSAnYXN5bmMtc2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlXzEoeyBfX2VtbmFwaV9fOiBfX2VtbmFwaV9fIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX19lbW5hcGlfXy5wYXlsb2FkLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShfX2VtbmFwaV9fLnBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaVNlbmRMaXN0ZW5lcjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3b3JrZXIuX2VtbmFwaVNlbmRMaXN0ZW5lciA9IHsgaGFuZGxlcjogaGFuZGxlciwgZGlzcG9zZTogZGlzcG9zZSB9O1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuYWRkU2VuZExpc3RlbmVyID0gZW1uYXBpQWRkU2VuZExpc3RlbmVyO1xuICAgICAgICBmdW5jdGlvbiB0ZXJtaW5hdGVXb3JrZXIod29ya2VyKSB7XG4gICAgICAgICAgICB2YXIgdGlkID0gd29ya2VyLl9fZW1uYXBpX3RpZDtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgICAgICBlcnIoJ3JlY2VpdmVkIFwiJyArIGUuZGF0YS5fX2VtbmFwaV9fLnR5cGUgKyAnXCIgY29tbWFuZCBmcm9tIHRlcm1pbmF0ZWQgd29ya2VyOiAnICsgdGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNwYXduVGhyZWFkKHN0YXJ0QXJnLCBlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICB2YXIgaXNOZXdBQkkgPSBlcnJvck9yVGlkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIWlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JPclRpZCA9IF9tYWxsb2MoOCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtNDg7IC8qIEVOT01FTSAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJ1Y3QgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgZXJyb3JPclRpZCwgMik7XG4gICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMCwgMCk7XG4gICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMSwgMCk7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8yID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwYXduLXRocmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBcmc6IHN0YXJ0QXJnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yT3JUaWQ6IGVycm9yT3JUaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChzdHJ1Y3QsIDEsIDApO1xuICAgICAgICAgICAgICAgIHZhciBpc0Vycm9yID0gQXRvbWljcy5sb2FkKHN0cnVjdCwgMCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEF0b21pY3MubG9hZChzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2ZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3IgPyAtcmVzdWx0IDogcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdvcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd29ya2VyID0gUFRocmVhZC5nZXROZXdXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgbmV3IHdvcmtlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIEVBR0FJTiA9IDY7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDEpO1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0LCAxLCBFQUdBSU4pO1xuICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KHN0cnVjdCwgMSk7XG4gICAgICAgICAgICAgICAgZXJyKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0aWQgPSBQVGhyZWFkLm5leHRXb3JrZXJJRCArIDQzO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIHRpZCk7XG4gICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgdmFyIFdBU0lfVEhSRUFEU19NQVhfVElEID0gMHgxRkZGRkZGRjtcbiAgICAgICAgICAgIFBUaHJlYWQubmV4dFdvcmtlcklEID0gKFBUaHJlYWQubmV4dFdvcmtlcklEICsgMSkgJSAoV0FTSV9USFJFQURTX01BWF9USUQgLSA0Mik7XG4gICAgICAgICAgICBQVGhyZWFkLnB0aHJlYWRzW3RpZF0gPSB3b3JrZXI7XG4gICAgICAgICAgICB3b3JrZXIuX19lbW5hcGlfdGlkID0gdGlkO1xuICAgICAgICAgICAgUFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWQ6IHRpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogc3RhcnRBcmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgIHJldHVybiB0aWQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc3RhcnRUaHJlYWQodGlkLCBzdGFydEFyZykge1xuICAgICAgICAgICAgaWYgKG5hcGlNb2R1bGUuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdhc21JbnN0YW5jZS5leHBvcnRzLndhc2lfdGhyZWFkX3N0YXJ0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc2lfdGhyZWFkX3N0YXJ0IGlzIG5vdCBleHBvcnRlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VfMyA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQodGlkLCBzdGFydEFyZyk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMyh7XG4gICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGVhbnVwLXRocmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkOiB0aWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydFRocmVhZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBjaGlsZCB0aHJlYWRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5zcGF3blRocmVhZCA9IHNwYXduVGhyZWFkO1xuICAgICAgICBuYXBpTW9kdWxlLnN0YXJ0VGhyZWFkID0gc3RhcnRUaHJlYWQ7XG4gICAgICAgIHZhciBQVGhyZWFkID0ge1xuICAgICAgICAgICAgdW51c2VkV29ya2VyczogW10sXG4gICAgICAgICAgICBydW5uaW5nV29ya2VyczogW10sXG4gICAgICAgICAgICBwdGhyZWFkczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5leHRXb3JrZXJJRDogMCxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgICAgIHJldHVybldvcmtlclRvUG9vbDogZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICAgICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBQVGhyZWFkLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRXYXNtTW9kdWxlVG9Xb3JrZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyLndoZW5Mb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIud2hlbkxvYWRlZDtcbiAgICAgICAgICAgICAgICB3b3JrZXIud2hlbkxvYWRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGUuZGF0YS5fX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUgJiYgIXdvcmtlci5fX2VtbmFwaV90aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHBheWxvYWQuZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZXJyKCdmYWlsZWQgdG8gbG9hZCBpbiBjaGlsZCB0aHJlYWQ6ICcgKyAocGF5bG9hZC5lcnIubWVzc2FnZSB8fCBwYXlsb2FkLmVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3NwYXduLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25UaHJlYWQocGF5bG9hZC5zdGFydEFyZywgcGF5bG9hZC5lcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2NsZWFudXAtdGhyZWFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV1c2VXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgUFRocmVhZC5wdGhyZWFkc1twYXlsb2FkLnRpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXb3JrZXIod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9ICd3b3JrZXIgc2VudCBhbiBlcnJvciEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHdvcmtlci5wdGhyZWFkX3B0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBtZXNzYWdlID0gJ1B0aHJlYWQgJyArIHB0clRvU3RyaW5nKHdvcmtlci5wdGhyZWFkX3B0cikgKyAnIHNlbnQgYW4gZXJyb3IhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyKG1lc3NhZ2UgKyAnICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignZGV0YWNoZWRFeGl0JywgZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBuYXBpTW9kdWxlLmVtbmFwaS5hZGRTZW5kTGlzdGVuZXIod29ya2VyKVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBZGRTZW5kTGlzdGVuZXIod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBlbW5hcGlUU0ZOICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIod29ya2VyKVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtTW9kdWxlOiB3YXNtTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeTogd2FzbU1lbW9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgfHwgISh3YXNtTWVtb3J5LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGl0aHJlYWQgZmVhdHVyZXMgcmVxdWlyZSBzaGFyZWQgd2FzbSBtZW1vcnkuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJ5IHRvIGNvbXBpbGUgd2l0aCBgLW1hdG9taWNzIC1tYnVsay1tZW1vcnlgIGFuZCB1c2UgYC0taW1wb3J0LW1lbW9yeSAtLXNoYXJlZC1tZW1vcnlgIGR1cmluZyBsaW5raW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLndoZW5Mb2FkZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWxsb2NhdGVVbnVzZWRXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ3JlYXRlV29ya2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IG9uQ3JlYXRlV29ya2VyKHsgdHlwZTogJ3RocmVhZCcgfSk7XG4gICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE5ld1dvcmtlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlcl8xID0gUFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFRocmVhZC51bnVzZWRXb3JrZXJzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gUFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAgICAgICAgIFBUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3b3JrZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpaXBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X2xhc3RfZXJyb3IoZW52LCBlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZXJyb3JfY29kZSwgZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZV9yZXNlcnZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jbGVhcl9sYXN0X2Vycm9yKGVudikge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X25vZGVfdmVyc2lvbihtYWpvciwgbWlub3IsIHBhdGNoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmVyc2lvbnMgPSAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgID8gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uIChuKSB7IHJldHVybiBOdW1iZXIobik7IH0pXG4gICAgICAgICAgICAgICAgOiBbMCwgMCwgMF07XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKG1ham9yLCB2ZXJzaW9uc1swXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIobWlub3IsIHZlcnNpb25zWzFdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihwYXRjaCwgdmVyc2lvbnNbMl0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKiBAX19kZXBzICRydW50aW1lS2VlcGFsaXZlUHVzaFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wdXNoKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKiBAX19kZXBzICRydW50aW1lS2VlcGFsaXZlUG9wXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3BvcCgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9zZXRfaW1tZWRpYXRlKGNhbGxiYWNrLCBkYXRhKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9uZXh0X3RpY2soY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZpcHBwaVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZShmb3JjZVVuY2F1Z2h0LCBlbnYsIGNhbGxiYWNrLCBkYXRhLCBjbG9zZV9zY29wZV9pZl90aHJvdykge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZShCb29sZWFuKGZvcmNlVW5jYXVnaHQpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2Vfc2NvcGVfaWZfdGhyb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2aXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfY2FsbF9maW5hbGl6ZXIoZm9yY2VVbmNhdWdodCwgZW52LCBjYWxsYmFjaywgZGF0YSwgaGludCkge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jYWxsRmluYWxpemVySW50ZXJuYWwoZm9yY2VVbmNhdWdodCwgY2FsbGJhY2ssIGRhdGEsIGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jdHhfaW5jcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXIoKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguaW5jcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyKCkge1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gJGVtbmFwaVNldFZhbHVlSTY0KHJlc3VsdCwgbnVtYmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wRG91YmxlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHRlbXBJNjQgPSBbXG4gICAgICAgICAgICAgICAgbnVtYmVyVmFsdWUgPj4+IDAsXG4gICAgICAgICAgICAgICAgKHRlbXBEb3VibGUgPSBudW1iZXJWYWx1ZSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/IChNYXRoLm1pbigrTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NiksIDQyOTQ5NjcyOTUpIHwgMCkgPj4+IDAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAgOiAwKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHRlbXBJNjRbMF0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgdGVtcEk2NFsxXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHV0aWxNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0OiAkZW1uYXBpU2V0VmFsdWVJNjQsXG4gICAgICAgICAgICBfZW1uYXBpX2NhbGxfZmluYWxpemVyOiBfZW1uYXBpX2NhbGxfZmluYWxpemVyLFxuICAgICAgICAgICAgX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZTogX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZSxcbiAgICAgICAgICAgIF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyOiBfZW1uYXBpX2N0eF9kZWNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcixcbiAgICAgICAgICAgIF9lbW5hcGlfY3R4X2luY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyOiBfZW1uYXBpX2N0eF9pbmNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcixcbiAgICAgICAgICAgIF9lbW5hcGlfZ2V0X25vZGVfdmVyc2lvbjogX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uLFxuICAgICAgICAgICAgX2VtbmFwaV9uZXh0X3RpY2s6IF9lbW5hcGlfbmV4dF90aWNrLFxuICAgICAgICAgICAgX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wb3A6IF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcG9wLFxuICAgICAgICAgICAgX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wdXNoOiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2gsXG4gICAgICAgICAgICBfZW1uYXBpX3NldF9pbW1lZGlhdGU6IF9lbW5hcGlfc2V0X2ltbWVkaWF0ZSxcbiAgICAgICAgICAgIG5hcGlfY2xlYXJfbGFzdF9lcnJvcjogbmFwaV9jbGVhcl9sYXN0X2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9zZXRfbGFzdF9lcnJvcjogbmFwaV9zZXRfbGFzdF9lcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpR2V0V29ya2VyQnlQdGhyZWFkUHRyKHB0aHJlYWRQdHIpIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogd2FzaS1zZGstMjAuMCt0aHJlYWRzXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogc3RydWN0IHB0aHJlYWQge1xuICAgICAgICAgICAgICogICBzdHJ1Y3QgcHRocmVhZCAqc2VsZjsgICAgICAgIC8vIDBcbiAgICAgICAgICAgICAqICAgc3RydWN0IHB0aHJlYWQgKnByZXYsICpuZXh0OyAvLyA0LCA4XG4gICAgICAgICAgICAgKiAgIHVpbnRwdHJfdCBzeXNpbmZvOyAgICAgICAgICAgLy8gMTJcbiAgICAgICAgICAgICAqICAgdWludHB0cl90IGNhbmFyeTsgICAgICAgICAgICAvLyAxNlxuICAgICAgICAgICAgICogICBpbnQgdGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDIwXG4gICAgICAgICAgICAgKiAgIC8vIC4uLlxuICAgICAgICAgICAgICogfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgdGlkT2Zmc2V0ID0gMjA7XG4gICAgICAgICAgICB2YXIgdGlkID0gdmlldy5nZXRJbnQzMihwdGhyZWFkUHRyICsgdGlkT2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBQVGhyZWFkLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV93b3JrZXJfdW5yZWYocHRocmVhZFB0cikge1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IGVtbmFwaUdldFdvcmtlckJ5UHRocmVhZFB0cihwdGhyZWFkUHRyKTtcbiAgICAgICAgICAgIGlmICh3b3JrZXIgJiYgdHlwZW9mIHdvcmtlci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdmlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX3NlbmRfanModHlwZSwgY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzEgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlXzEoe1xuICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfc2V0X2ltbWVkaWF0ZShjYWxsYmFjaywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9uZXh0X3RpY2soY2FsbGJhY2ssIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZ1bmN0aW9uIHB0clRvU3RyaW5nIChwdHI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vICAgcmV0dXJuICcweCcgKyAoJzAwMDAwMDAwJyArIHB0ci50b1N0cmluZygxNikpLnNsaWNlKC04KVxuICAgICAgICAvLyB9XG4gICAgICAgIHZhciB1dlRocmVhZHBvb2xSZWFkeVJlc29sdmU7XG4gICAgICAgIHZhciB1dlRocmVhZHBvb2xSZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICB1dlRocmVhZHBvb2xSZWFkeVJlc29sdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXZUaHJlYWRwb29sUmVhZHkucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB1dlRocmVhZHBvb2xSZWFkeS5yZWFkeSA9IGZhbHNlO1xuICAgICAgICAvKiogQF9fc2lnIGkgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9pc19tYWluX2Jyb3dzZXJfdGhyZWFkKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFTlZJUk9OTUVOVF9JU19OT0RFKSA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBwaSAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeShjYWxsYmFjaywgcSwgdHlwZSkge1xuICAgICAgICAgICAgaWYgKHV2VGhyZWFkcG9vbFJlYWR5LnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShxLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKHEsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2wodGhyZWFkcywgc2l6ZSkge1xuICAgICAgICAgICAgdmFyIHAgPSBbXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHB0aHJlYWRQdHIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMih0aHJlYWRzICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciB3b3JrZXIgPSBlbW5hcGlHZXRXb3JrZXJCeVB0aHJlYWRQdHIocHRocmVhZFB0cik7XG4gICAgICAgICAgICAgICAgcC5wdXNoKG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2VtbmFwaV9fICYmIF9fZW1uYXBpX18udHlwZSA9PT0gJ2FzeW5jLXRocmVhZC1yZWFkeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB0eXBlb2Ygd29ya2VyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIub2ZmKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwKS50aGVuKHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2ICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHkoKSB7XG4gICAgICAgICAgICBpZiAoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhc3luYy10aHJlYWQtcmVhZHknLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhc3luY01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeTogX2VtbmFwaV9hZnRlcl91dnRocmVhZHBvb2xfcmVhZHksXG4gICAgICAgICAgICBfZW1uYXBpX2FzeW5jX3NlbmRfanM6IF9lbW5hcGlfYXN5bmNfc2VuZF9qcyxcbiAgICAgICAgICAgIF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHk6IF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHksXG4gICAgICAgICAgICBfZW1uYXBpX2lzX21haW5fYnJvd3Nlcl90aHJlYWQ6IF9lbW5hcGlfaXNfbWFpbl9icm93c2VyX3RocmVhZCxcbiAgICAgICAgICAgIF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2w6IF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2wsXG4gICAgICAgICAgICBfZW1uYXBpX3dvcmtlcl91bnJlZjogX2VtbmFwaV93b3JrZXJfdW5yZWZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbiAgICAgICAgLyoqIEBfX3NpZyBpcGpwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfYWRqdXN0X2V4dGVybmFsX21lbW9yeShlbnYsIGNoYW5nZV9pbl9ieXRlcywgYWRqdXN0ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFhZGp1c3RlZF92YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGNoYW5nZV9pbl9ieXRlc19udW1iZXIgPSBOdW1iZXIoY2hhbmdlX2luX2J5dGVzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VfaW5fYnl0ZXNfbnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb2xkX3NpemUgPSB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgdmFyIG5ld19zaXplID0gb2xkX3NpemUgKyBjaGFuZ2VfaW5fYnl0ZXNfbnVtYmVyO1xuICAgICAgICAgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSArICgoNjU1MzYgLSBuZXdfc2l6ZSAlIDY1NTM2KSAlIDY1NTM2KTtcbiAgICAgICAgICAgIGlmICh3YXNtTWVtb3J5Lmdyb3coKG5ld19zaXplIC0gb2xkX3NpemUgKyA2NTUzNSkgPj4gMTYpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEJpZ0ludDY0KGFkanVzdGVkX3ZhbHVlLCBCaWdJbnQod2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0KGFkanVzdGVkX3ZhbHVlLCB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWVtb3J5TW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfYWRqdXN0X2V4dGVybmFsX21lbW9yeTogbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5XG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpQVdTVC5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUFXU1QgPSB7XG4gICAgICAgICAgICBpZEdlbjoge30sXG4gICAgICAgICAgICB2YWx1ZXM6IFt1bmRlZmluZWRdLFxuICAgICAgICAgICAgcXVldWVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWRHZW4gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRHZW4ubGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGlkR2VuLmxpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaWRHZW4ubmV4dElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkR2VuLm5leHRJZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXVzZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZEdlbi5saXN0LnB1c2goaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmlkR2VuID0gaWRHZW47XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXMgPSBbdW5kZWZpbmVkXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZU5hbWUsIGV4ZWN1dGUsIGNvbXBsZXRlLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0NvbnRleHQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmVtaXRBc3luY0luaXQocmVzb3VyY2UsIHJlc291cmNlTmFtZSwgLTEpO1xuICAgICAgICAgICAgICAgICAgICBhc3luY0lkID0gYXN5bmNDb250ZXh0LmFzeW5jSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkID0gYXN5bmNDb250ZXh0LnRyaWdnZXJBc3luY0lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbW5hcGlBV1NULmlkR2VuLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBlbnY6IGVudixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZTogcmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyQXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBleGVjdXRlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogY29tcGxldGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWxsQ29tcGxldGU6IGZ1bmN0aW9uICh3b3JrLCBzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gd29yay5jb21wbGV0ZTtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gd29yay5lbnY7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB3b3JrLmRhdGE7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBsZXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2NvcGUgPSBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbGJhY2tJbnRvTW9kdWxlKHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayh3b3JrLnJlc291cmNlLCBjYWxsYmFjaywgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IHdvcmsuYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB3b3JrLnRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVldWU6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdTVC52YWx1ZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrLnN0YXR1cyA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlBV1NULnF1ZXVlZC5zaXplID49IChNYXRoLmFicyhlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSkgfHwgNCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZC5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52XzEgPSB3b3JrLmVudjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFfMSA9IHdvcmsuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0ZSA9IHdvcmsuZXhlY3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgd29yay5zdGF0dXMgPSAyO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoZXhlY3V0ZSkpKGVudl8xLCBkYXRhXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5xdWV1ZWQuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuc3RhdHVzID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5jYWxsQ29tcGxldGUod29yaywgMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUFXU1QucGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRXb3JrSWQgPSBlbW5hcGlBV1NULnBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tuZXh0V29ya0lkXS5zdGF0dXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWUobmV4dFdvcmtJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGVtbmFwaUFXU1QucGVuZGluZy5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrXzEgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3b3JrXzEgJiYgKHdvcmtfMS5zdGF0dXMgPT09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrXzEuc3RhdHVzID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmNhbGxDb21wbGV0ZSh3b3JrXzEsIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmsgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jRGVzdHJveSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luY0lkOiB3b3JrLmFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogd29yay50cmlnZ2VyQXN5bmNJZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXNbaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuaWRHZW4ucmV1c2UoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIHZwcGRwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQoYXN5bmNfcmVzb3VyY2UsIGFzeW5jX3Jlc291cmNlX25hbWUsIHRyaWdnZXJfYXN5bmNfaWQsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZV9uYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBhc3luY0NvbnRleHQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmVtaXRBc3luY0luaXQocmVzb3VyY2UsIHJlc291cmNlX25hbWUsIHRyaWdnZXJfYXN5bmNfaWQpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSBhc3luY0NvbnRleHQuYXN5bmNJZDtcbiAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IGFzeW5jQ29udGV4dC50cmlnZ2VyQXN5bmNJZDtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCBhc3luY0lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRGbG9hdDY0KHJlc3VsdCArIDgsIHRyaWdnZXJBc3luY0lkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZkZCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19kZXN0cm95KGFzeW5jX2lkLCB0cmlnZ2VyX2FzeW5jX2lkKSB7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jRGVzdHJveSh7XG4gICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qIHZwZGRwIGV4cG9ydCBmdW5jdGlvbiBfZW1uYXBpX25vZGVfb3Blbl9jYWxsYmFja19zY29wZSAoYXN5bmNfcmVzb3VyY2U6IG5hcGlfdmFsdWUsIGFzeW5jX2lkOiBkb3VibGUsIHRyaWdnZXJfYXN5bmNfaWQ6IGRvdWJsZSwgcmVzdWx0OiBQb2ludGVyPGludDY0X3Q+KTogdm9pZCB7XG4gICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZyB8fCAhcmVzdWx0KSByZXR1cm5cbiAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpIS52YWx1ZVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjb25zdCBuYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlciA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUub3BlbkNhbGxiYWNrU2NvcGUocmVzb3VyY2UsIHtcbiAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jX2lkLFxuICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICB9KVxuICAgIFxuICAgICAgICAgIGZyb202NCgncmVzdWx0JylcbiAgICAgICAgICAkX1RPRE9fbWFrZVNldFZhbHVlKCdyZXN1bHQnLCAwLCAnbmF0aXZlQ2FsbGJhY2tTY29wZVBvaW50ZXInLCAnaTY0JylcbiAgICAgICAgfVxuICAgIFxuICAgICAgICB2cFxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gX2VtbmFwaV9ub2RlX2Nsb3NlX2NhbGxiYWNrX3Njb3BlIChzY29wZTogUG9pbnRlcjxpbnQ2NF90Pik6IHZvaWQge1xuICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcgfHwgIXNjb3BlKSByZXR1cm5cbiAgICAgICAgICBmcm9tNjQoJ3Njb3BlJylcbiAgICAgICAgICBjb25zdCBuYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlciA9ICRfVE9ET19tYWtlR2V0VmFsdWUoJ3Njb3BlJywgMCwgJ2k2NCcpXG4gICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5jbG9zZUNhbGxiYWNrU2NvcGUoQmlnSW50KG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyKSlcbiAgICAgICAgfSAqL1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcGRkcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25vZGVfbWFrZV9jYWxsYmFjayhlbnYsIGFzeW5jX3Jlc291cmNlLCBjYiwgYXJndiwgc2l6ZSwgYXN5bmNfaWQsIHRyaWdnZXJfYXN5bmNfaWQsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjYikudmFsdWU7XG4gICAgICAgICAgICBzaXplID0gc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheShzaXplKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGFycltpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJnVmFsKS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZSwgY2FsbGJhY2ssIGFyciwge1xuICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jX2lkLFxuICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyX2FzeW5jX2lkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY19pbml0X2pzKGFzeW5jX3Jlc291cmNlLCBhc3luY19yZXNvdXJjZV9uYW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvdXJjZTtcbiAgICAgICAgICAgIGlmIChhc3luY19yZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHJlc291cmNlID0gT2JqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5uYXBpLmFzeW5jSW5pdChyZXNvdXJjZSwgbmFtZSk7XG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnN0YXR1cztcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IHJldC52YWx1ZTtcbiAgICAgICAgICAgIGlmICghKChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KC0xKSAqIChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSAmJiAobnVtYmVyVmFsdWUgPCAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBsb3csIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY19kZXN0cm95X2pzKGFzeW5jX2NvbnRleHQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICB2YXIgbG93ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB2YXIgaGlnaCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciBwb2ludGVyID0gQmlnSW50KGxvdyA+Pj4gMCkgfCAoQmlnSW50KGhpZ2gpIDw8IEJpZ0ludCgzMikpO1xuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuYXN5bmNEZXN0cm95KHBvaW50ZXIpO1xuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgIT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldC5zdGF0dXM7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS1hZGRvbi1hcGkvcHVsbC8xMjgzXG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9vcGVuX2NhbGxiYWNrX3Njb3BlKGVudiwgaWdub3JlZCwgYXN5bmNfY29udGV4dF9oYW5kbGUsIHJlc3VsdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpX29wZW5fY2FsbGJhY2tfc2NvcGUgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfY2FsbGJhY2tfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfbWFrZV9jYWxsYmFjayhlbnYsIGFzeW5jX2NvbnRleHQsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZWN2KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdjhyZWN2ID0gT2JqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVjdikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhciB2OGZ1bmMgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGZ1bmMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdjhmdW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIGxvdyA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSBCaWdJbnQobG93ID4+PiAwKSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IEFycmF5KGFyZ2MpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhcnJbaV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5uYXBpLm1ha2VDYWxsYmFjayhjdHgsIHY4cmVjdiwgdjhmdW5jLCBhcnIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmV0LmVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihyZXQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9lbnZfY2hlY2tfZ2NfYWNjZXNzKGVudikge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9hc3luY19kZXN0cm95X2pzOiBfZW1uYXBpX2FzeW5jX2Rlc3Ryb3lfanMsXG4gICAgICAgICAgICBfZW1uYXBpX2FzeW5jX2luaXRfanM6IF9lbW5hcGlfYXN5bmNfaW5pdF9qcyxcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzczogX2VtbmFwaV9lbnZfY2hlY2tfZ2NfYWNjZXNzLFxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveTogX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveSxcbiAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQ6IF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQsXG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfbWFrZV9jYWxsYmFjazogX2VtbmFwaV9ub2RlX21ha2VfY2FsbGJhY2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlOiBuYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9tYWtlX2NhbGxiYWNrOiBuYXBpX21ha2VfY2FsbGJhY2ssXG4gICAgICAgICAgICBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGU6IG5hcGlfb3Blbl9jYWxsYmFja19zY29wZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlUU0ZOLmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpVFNGTiA9IHtcbiAgICAgICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgICAgIC8qIG5hcGlfcmVmICovIHJlc291cmNlOiAwLFxuICAgICAgICAgICAgICAgIC8qIGRvdWJsZSAqLyBhc3luY19pZDogOCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gdHJpZ2dlcl9hc3luY19pZDogMTYsXG4gICAgICAgICAgICAgICAgLyogc2l6ZV90ICovIHF1ZXVlX3NpemU6IDI0LFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIHF1ZXVlOiAxICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyB0aHJlYWRfY291bnQ6IDIgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogYm9vbCAqLyBpc19jbG9zaW5nOiAzICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIGF0b21pY191Y2hhciAqLyBkaXNwYXRjaF9zdGF0ZTogMyAqIDQgKyAyOCxcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBjb250ZXh0OiAzICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyBtYXhfcXVldWVfc2l6ZTogNCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZWY6IDUgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9lbnYgKi8gZW52OiA2ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIGZpbmFsaXplX2RhdGE6IDcgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9maW5hbGl6ZSAqLyBmaW5hbGl6ZV9jYjogOCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3RocmVhZHNhZmVfZnVuY3Rpb25fY2FsbF9qcyAqLyBjYWxsX2pzX2NiOiA5ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIGJvb2wgKi8gaGFuZGxlc19jbG9zaW5nOiAxMCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBib29sICovIGFzeW5jX3JlZjogMTAgKiA0ICsgMzYsXG4gICAgICAgICAgICAgICAgLyogaW50MzJfdCAqLyBtdXRleDogMTAgKiA0ICsgNDAsXG4gICAgICAgICAgICAgICAgLyogaW50MzJfdCAqLyBjb25kOiAxMCAqIDQgKyA0NCxcbiAgICAgICAgICAgICAgICBlbmQ6IDEwICogNCArIDQ4XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgUFRocmVhZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLmZvckVhY2goZW1uYXBpVFNGTi5hZGRMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQucnVubmluZ1dvcmtlcnMuZm9yRWFjaChlbW5hcGlUU0ZOLmFkZExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9fb3JpZ2luYWxfZ2V0TmV3V29ya2VyXzEgPSBQVGhyZWFkLmdldE5ld1dvcmtlcjtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5nZXROZXdXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9fb3JpZ2luYWxfZ2V0TmV3V29ya2VyXzEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIocik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXIuX2VtbmFwaVRTRk5MaXN0ZW5lcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEVOVklST05NRU5UX0lTX05PREUgPyBlIDogZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBfX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RzZm4tc2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRpc3BhdGNoKHBheWxvYWQudHNmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBkaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpVFNGTkxpc3RlbmVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd29ya2VyLl9lbW5hcGlUU0ZOTGlzdGVuZXIgPSB7IGhhbmRsZXI6IGhhbmRsZXIsIGRpc3Bvc2U6IGRpc3Bvc2UgfTtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSAyICogNDtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgIGlmICghcXVldWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgcXVldWUsIHNpemUpLmZpbGwoMCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlLCBxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3lRdWV1ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfZnJlZShxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1c2hRdWV1ZTogZnVuY3Rpb24gKGZ1bmMsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciB0YWlsID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSAyICogNDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9tYWxsb2Moc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09PTScpO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKG5vZGUsIGRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShub2RlICsgNCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkID09PSAwICYmIHRhaWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZSh0YWlsICsgNCwgbm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5hZGRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hpZnRRdWV1ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGhlYWQ7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGhlYWQgKyA0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUsIG5leHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUobm9kZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBfZnJlZShub2RlKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlF1ZXVlU2l6ZShmdW5jKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGZ1bmMsIGRhdGEsIG1vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBjb25kID0gZW1uYXBpVFNGTi5nZXRDb25kKGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciB3YWl0Q29uZGl0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcXVldWVTaXplID0gZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhTaXplID0gZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmcgPSBlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlU2l6ZSA+PSBtYXhTaXplICYmIG1heFNpemUgPiAwICYmICFpc0Nsb3Npbmc7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgaXNCcm93c2VyTWFpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4LmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2FpdENvbmRpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gMCAvKiBuYXBpX3RocmVhZHNhZmVfZnVuY3Rpb25fY2FsbF9tb2RlLm5hcGlfdHNmbl9ub25ibG9ja2luZyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNSAvKiBuYXBpX3N0YXR1cy5uYXBpX3F1ZXVlX2Z1bGwgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEJyb3dzZXIgSlMgbWFpbiB0aHJlYWQgY2FuIG5vdCB1c2UgYEF0b21pY3Mud2FpdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxhdGVkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzI2ODlcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNDUzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXJNYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxIC8qIG5hcGlfc3RhdHVzLm5hcGlfd291bGRfZGVhZGxvY2sgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kLndhaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRJc0Nsb3NpbmcoZnVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3ViVGhyZWFkQ291bnQoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2IC8qIG5hcGlfc3RhdHVzLm5hcGlfY2xvc2luZyAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4ucHVzaFF1ZXVlKGZ1bmMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZW5kKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE11dGV4OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5tdXRleDtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0Jyb3dzZXJNYWluID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRU5WSVJPTk1FTlRfSVNfTk9ERTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXJNYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8qIGxvY2tBc3luYyAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWdhaW4gPSAoKTogdm9pZCA9PiB7IGZuKCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKEF0b21pY3MgYXMgYW55KS53YWl0QXN5bmMoaTMyYSwgMCwgMSkudmFsdWUudGhlbihhZ2FpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZuKClcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LCAqL1xuICAgICAgICAgICAgICAgICAgICB1bmxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDEsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byB1bmxvY2sgd2hpbGUgbm90IGhvbGRpbmcgdGhlIG11dGV4Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgudW5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLyogLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlQXN5bmM8VD4gKGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4LmxvY2tBc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gclxuICAgICAgICAgICAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9ICovXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXV0ZXg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0Q29uZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuY29uZDtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBjb25kID0ge1xuICAgICAgICAgICAgICAgICAgICB3YWl0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBBdG9taWNzLmxvYWQoaTMyYSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChpMzJhLCAwLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8qIHdhaXRBc3luYyAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEF0b21pY3MubG9hZChpMzJhLCAwKVxuICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jayA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IG11dGV4LmxvY2tBc3luYygpXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQXRvbWljcyBhcyBhbnkpLndhaXRBc3luYyhpMzJhLCAwLCB2YWx1ZSkudmFsdWUudGhlbihsb2NrLCBsb2NrKVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgKi9cbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLmFkZChpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KGkzMmEsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlX3NpemUsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFkZFF1ZXVlU2l6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQucXVldWVfc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3ViUXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZV9zaXplO1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN1YihhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50O1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLmFkZChhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50O1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN1YihhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRJc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaXNfY2xvc2luZykgPj4gMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0SXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYywgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKSwgKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5pc19jbG9zaW5nKSA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0SGFuZGxlc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaGFuZGxlc19jbG9zaW5nKSA+PiAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRIYW5kbGVzQ2xvc2luZzogZnVuY3Rpb24gKGZ1bmMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaGFuZGxlc19jbG9zaW5nKSA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RGlzcGF0Y2hTdGF0ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQXRvbWljcy5sb2FkKG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRNYXhRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0Lm1heF9xdWV1ZV9zaXplLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENhbGxKU0NiOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5jYWxsX2pzX2NiLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVmOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5yZWYsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRSZXNvdXJjZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucmVzb3VyY2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRGaW5hbGl6ZUNiOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5maW5hbGl6ZV9jYiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEZpbmFsaXplRGF0YTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRTaXplVHlwZVZhbHVlOiBmdW5jdGlvbiAob2Zmc2V0LCB1bnNpZ25lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGFycjtcbiAgICAgICAgICAgICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQXRvbWljcy5sb2FkKGFyciwgb2Zmc2V0ID4+IDIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBBdG9taWNzLmxvYWQoYXJyLCBvZmZzZXQgPj4gMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0b3JlU2l6ZVR5cGVWYWx1ZTogZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFycjtcbiAgICAgICAgICAgICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShhcnIsIG9mZnNldCA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBvZmZzZXQgPj4gMiwgdmFsdWUgPj4+IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGVzdHJveVF1ZXVlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnYgPSBlbW5hcGlUU0ZOLmdldEVudihmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlUU0ZOLmdldFJlZihmdW5jKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVmKS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZW1vdmVDbGVhbnVwSG9vayhlbnZPYmplY3QsIGVtbmFwaVRTRk4uY2xlYW51cCwgZnVuYyk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoQXRvbWljcy5sb2FkKGFyciwgYXN5bmNSZWZPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZ2dlckFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRyaWdnZXJfYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19kZXN0cm95KGFzeW5jSWQsIHRyaWdnZXJBc3luY0lkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2ZyZWUoZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW1wdHlRdWV1ZUFuZERlbGV0ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbEpzQ2IgPSBlbW5hcGlUU0ZOLmdldENhbGxKU0NiKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVtbmFwaVRTRk4uc2hpZnRRdWV1ZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxKc0NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsSnNDYikpKDAsIDAsIGNvbnRleHQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGVzdHJveShmdW5jKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsaXplID0gZW1uYXBpVFNGTi5nZXRGaW5hbGl6ZUNiKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGVtbmFwaVRTRk4uZ2V0RmluYWxpemVEYXRhKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgwLCBmaW5hbGl6ZSwgZGF0YSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaVRTRk4uZ2V0UmVzb3VyY2UoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlX3ZhbHVlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvdXJjZV92YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC50cmlnZ2VyX2FzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgZiwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5lbXB0eVF1ZXVlQW5kRGVsZXRlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYW51cDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlKGZ1bmMsIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlOiBmdW5jdGlvbiAoZnVuYywgc2V0X2Nsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldF9jbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpLmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SXNDbG9zaW5nKGZ1bmMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldE1heFF1ZXVlU2l6ZShmdW5jKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5nZXRDb25kKGZ1bmMpLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldEhhbmRsZXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRIYW5kbGVzQ2xvc2luZyhmdW5jLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZmluYWxpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2hPbmU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgcG9wcGVkX3ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGhhc19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgICAgICBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlKGZ1bmMsIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSBlbW5hcGlUU0ZOLmdldFF1ZXVlU2l6ZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbW5hcGlUU0ZOLnNoaWZ0UXVldWUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wcGVkX3ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4UXVldWVTaXplID0gZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT09IG1heFF1ZXVlU2l6ZSAmJiBtYXhRdWV1ZVNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0VGhyZWFkQ291bnQoZnVuYykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRJc0Nsb3NpbmcoZnVuYywgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldE1heFF1ZXVlU2l6ZShmdW5jKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocG9wcGVkX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSBlbW5hcGlUU0ZOLmdldEVudihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdF8xID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdF8xKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3RfMS5jYWxsYmFja0ludG9Nb2R1bGUoZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEpzQ2IgPSBlbW5hcGlUU0ZOLmdldENhbGxKU0NiKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlUU0ZOLmdldFJlZihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganNfY2FsbGJhY2sgPSByZWYgPyBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikuZ2V0KCkgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSnNDYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gZW1uYXBpVFNGTi5nZXRDb250ZXh0KGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsSnNDYikpKGVudiwganNfY2FsbGJhY2ssIGNvbnRleHQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzQ2FsbGJhY2sgPSBqc19jYWxsYmFjayA/IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoanNfY2FsbGJhY2spLnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc0NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaVRTRk4uZ2V0UmVzb3VyY2UoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlX3ZhbHVlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvdXJjZV92YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHJlc291cmNlT2JqZWN0LCBmLCBbXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY0lkOiB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdF8xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFzX21vcmU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhc19tb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0aW9uc19sZWZ0ID0gMTAwMDtcbiAgICAgICAgICAgICAgICB2YXIgdWkzMmEgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGhhc19tb3JlICYmIC0taXRlcmF0aW9uc19sZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUodWkzMmEsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSBlbW5hcGlUU0ZOLmRpc3BhdGNoT25lKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXRvbWljcy5leGNoYW5nZSh1aTMyYSwgaW5kZXgsIDApICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhhc19tb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudF9zdGF0ZSA9IEF0b21pY3Mub3IobmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKSwgKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5kaXNwYXRjaF9zdGF0ZSkgPj4gMiwgMSA8PCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRfc3RhdGUgJiAxKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIEVOVklST05NRU5UX0lTX1BUSFJFQUQgIT09ICd1bmRlZmluZWQnKSAmJiBFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndHNmbi1zZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZm46IGZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGlzcGF0Y2goZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdGhyZWFkc2FmZV9mdW5jdGlvbihlbnYsIGZ1bmMsIGFzeW5jX3Jlc291cmNlLCBhc3luY19yZXNvdXJjZV9uYW1lLCBtYXhfcXVldWVfc2l6ZSwgaW5pdGlhbF90aHJlYWRfY291bnQsIHRocmVhZF9maW5hbGl6ZV9kYXRhLCB0aHJlYWRfZmluYWxpemVfY2IsIGNvbnRleHQsIGNhbGxfanNfY2IsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFhc3luY19yZXNvdXJjZV9uYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBtYXhfcXVldWVfc2l6ZSA9IG1heF9xdWV1ZV9zaXplID4+PiAwO1xuICAgICAgICAgICAgaW5pdGlhbF90aHJlYWRfY291bnQgPSBpbml0aWFsX3RocmVhZF9jb3VudCA+Pj4gMDtcbiAgICAgICAgICAgIGlmIChpbml0aWFsX3RocmVhZF9jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHJlZiA9IDA7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxfanNfY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnVuY1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmNWYWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgcmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGZ1bmMsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLykuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXN5bmNSZXNvdXJjZU9iamVjdDtcbiAgICAgICAgICAgIGlmIChhc3luY19yZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jUmVzb3VyY2VPYmplY3QgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYXN5bmNSZXNvdXJjZU9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3luY1Jlc291cmNlT2JqZWN0ID0gT2JqZWN0KGFzeW5jUmVzb3VyY2VPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGFzeW5jUmVzb3VyY2VPYmplY3QpO1xuICAgICAgICAgICAgdmFyIGFzeW5jUmVzb3VyY2VOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNSZXNvdXJjZU5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3luY1Jlc291cmNlTmFtZSA9IFN0cmluZyhhc3luY1Jlc291cmNlTmFtZSk7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VfbmFtZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChhc3luY1Jlc291cmNlTmFtZSk7XG4gICAgICAgICAgICAvLyB0c2ZuIGNyZWF0ZVxuICAgICAgICAgICAgdmFyIHNpemVvZlRTRk4gPSBlbW5hcGlUU0ZOLm9mZnNldC5lbmQ7XG4gICAgICAgICAgICB2YXIgdHNmbiA9IF9tYWxsb2Moc2l6ZW9mVFNGTik7XG4gICAgICAgICAgICBpZiAoIXRzZm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkodHNmbiwgdHNmbiArIHNpemVvZlRTRk4pLmZpbGwoMCk7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VSZWYgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgcmVzb3VyY2UsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VfID0gcmVzb3VyY2VSZWYuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiwgcmVzb3VyY2VfLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpVFNGTi5pbml0UXVldWUodHNmbikpIHtcbiAgICAgICAgICAgICAgICBfZnJlZSh0c2ZuKTtcbiAgICAgICAgICAgICAgICByZXNvdXJjZVJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0KHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCAtMSwgdHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50LCBpbml0aWFsX3RocmVhZF9jb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuY29udGV4dCwgY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0Lm1heF9xdWV1ZV9zaXplLCBtYXhfcXVldWVfc2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQucmVmLCByZWYsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmVudiwgZW52LCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5maW5hbGl6ZV9kYXRhLCB0aHJlYWRfZmluYWxpemVfZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfY2IsIHRocmVhZF9maW5hbGl6ZV9jYiwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuY2FsbF9qc19jYiwgY2FsbF9qc19jYiwgdHJ1ZSk7XG4gICAgICAgICAgICBlbW5hcGlDdHguYWRkQ2xlYW51cEhvb2soZW52T2JqZWN0LCBlbW5hcGlUU0ZOLmNsZWFudXAsIHRzZm4pO1xuICAgICAgICAgICAgZW52T2JqZWN0LnJlZigpO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmluY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmLCAxLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdHNmbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdGhyZWFkc2FmZV9mdW5jdGlvbl9jb250ZXh0KGZ1bmMsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFmdW5jIHx8ICFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGkgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb24oZnVuYywgZGF0YSwgbW9kZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ucHVzaChmdW5jLCBkYXRhLCBtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfYWNxdWlyZV90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICByZXR1cm4gbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNiAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nsb3NpbmcgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkVGhyZWFkQ291bnQoZnVuYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBpICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVsZWFzZV90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMsIG1vZGUpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgIHJldHVybiBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwIHx8IG1vZGUgPT09IDEgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX3JlbGVhc2VfbW9kZS5uYXBpX3RzZm5fYWJvcnQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ2xvc2luZyA9IGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2xvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ2xvc2luZ1ZhbHVlID0gKG1vZGUgPT09IDEgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX3JlbGVhc2VfbW9kZS5uYXBpX3RzZm5fYWJvcnQgKi8pID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNldElzQ2xvc2luZyhmdW5jLCBpc0Nsb3NpbmdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbG9zaW5nVmFsdWUgJiYgZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZC5zaWduYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uKGVudiwgZnVuYykge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKEF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmX3RocmVhZHNhZmVfZnVuY3Rpb24oZW52LCBmdW5jKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXN5bmNSZWZPZmZzZXQgPSAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX3JlZikgPj4gMjtcbiAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIUF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmluY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbW5hcGlBV01UID0ge1xuICAgICAgICAgICAgdW51c2VkV29ya2VyczogW10sXG4gICAgICAgICAgICBydW5uaW5nV29ya2VyczogW10sXG4gICAgICAgICAgICB3b3JrUXVldWU6IFtdLFxuICAgICAgICAgICAgd29ya2VyUmVhZHk6IG51bGwsXG4gICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZXNvdXJjZTogMCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gYXN5bmNfaWQ6IDgsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIHRyaWdnZXJfYXN5bmNfaWQ6IDE2LFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZW52ICovIGVudjogMjQsXG4gICAgICAgICAgICAgICAgLyogdm9pZCogKi8gZGF0YTogMSAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2FzeW5jX2V4ZWN1dGVfY2FsbGJhY2sgKi8gZXhlY3V0ZTogMiAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2FzeW5jX2NvbXBsZXRlX2NhbGxiYWNrICovIGNvbXBsZXRlOiAzICogNCArIDI0LFxuICAgICAgICAgICAgICAgIGVuZDogNCAqIDQgKyAyNFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnVudXNlZFdvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5ID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICAgICAgICAgIGlmICghd29ya2VyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfX2VtbmFwaV9fID0gZGF0YS5fX2VtbmFwaV9fO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBfX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IF9fZW1uYXBpX18ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzLnNwbGljZShlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHBheWxvYWQud29yaywgMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdhc3luYy13b3JrLXF1ZXVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHBheWxvYWQud29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1jYW5jZWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jYW5jZWxXb3JrKHBheWxvYWQud29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBkaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd29ya2VyLl9lbW5hcGlBV01UTGlzdGVuZXIgPSB7IGhhbmRsZXI6IGhhbmRsZXIsIGRpc3Bvc2U6IGRpc3Bvc2UgfTtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0V29ya2VyczogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUFXTVQud29ya2VyUmVhZHkgfHwgKGVtbmFwaUFXTVQud29ya2VyUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlBV01ULndvcmtlclJlYWR5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ3JlYXRlV29ya2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICghKCdlbW5hcGlfYXN5bmNfd29ya2VyX2NyZWF0ZScgaW4gd2FzbUluc3RhbmNlLmV4cG9ydHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BlbW5hcGlfYXN5bmNfd29ya2VyX2NyZWF0ZWAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGVgIHRvIGxpbmtlciBmbGFncycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3b3JrZXIgPSBvbkNyZWF0ZVdvcmtlcih7IHR5cGU6ICdhc3luYy13b3JrJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmFkZExpc3RlbmVyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRocmVhZEJsb2NrQmFzZSA9IGFyZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29ya2VyLWluaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFyZzogYXJnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZnJlZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja0lkbGVXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLmxlbmd0aCA+IDAgJiYgZW1uYXBpQVdNVC53b3JrUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdNVC53b3JrUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstZXhlY3V0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyB3b3JrOiB3b3JrIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc291cmNlOiBmdW5jdGlvbiAod29yaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5yZXNvdXJjZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEV4ZWN1dGU6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmV4ZWN1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZSh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQuY29tcGxldGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2hlZHVsZVdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlLnB1c2god29yayk7XG4gICAgICAgICAgICAgICAgaWYgKChfYSA9IGVtbmFwaUFXTVQud29ya2VyUmVhZHkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuaW5pdFdvcmtlcnMoX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5LnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbFdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzIgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBlbW5hcGlBV01ULndvcmtRdWV1ZS5pbmRleE9mKHdvcmspO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHdvcmssIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZSA9IGVtbmFwaUFXTVQuZ2V0Q29tcGxldGUod29yayk7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZW1uYXBpQVdNVC5nZXREYXRhKHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZSh0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VfdmFsdWUgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgY2FsbGJhY2ssIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIHZhciBuYXBpX2NyZWF0ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlTmFtZSA9IFN0cmluZyhlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlX25hbWUpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gZW1uYXBpQVdTVC5jcmVhdGUoZW52LCByZXNvdXJjZU9iamVjdCwgcmVzb3VyY2VOYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVvZkFXID0gZW1uYXBpQVdNVC5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgICAgIHZhciBhdyA9IF9tYWxsb2Moc2l6ZW9mQVcpO1xuICAgICAgICAgICAgICAgIGlmICghYXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShhdywgYXcgKyBzaXplb2ZBVykuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXNvdXJjZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHMsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV8gPSByZXNvdXJjZVJlZi5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3LCByZXNvdXJjZV8sIHRydWUpO1xuICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQocywgcmVzb3VyY2VfbmFtZSwgLTEsIGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuYXN5bmNfaWQpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZW52LCBlbnYsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZXhlY3V0ZSwgZXhlY3V0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXcgKyBlbW5hcGlBV01ULm9mZnNldC5jb21wbGV0ZSwgY29tcGxldGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZGF0YSwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBhdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgdmFyIG5hcGlfZGVsZXRlX2FzeW5jX3dvcmsgPSBzaW5nbGVUaHJlYWRBc3luY1dvcmtcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucmVtb3ZlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNJZCwgdHJpZ2dlckFzeW5jSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZSh3b3JrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICB2YXIgbmFwaV9xdWV1ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIHZhciBuYXBpX2NhbmNlbF9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gZW1uYXBpQVdTVC5jYW5jZWwod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlbW5hcGlBV01ULmNhbmNlbFdvcmsod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGluaXRXb3JrZXIoc3RhcnRBcmcpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YXNtSW5zdGFuY2UuZXhwb3J0cy5lbW5hcGlfYXN5bmNfd29ya2VyX2luaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGVtbmFwaV9hc3luY193b3JrZXJfaW5pdGAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0YCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0KHN0YXJ0QXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnRUaHJlYWQgaXMgb25seSBhdmFpbGFibGUgaW4gY2hpbGQgdGhyZWFkcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY1dvcmsod29yaykge1xuICAgICAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBleGVjdXRlID0gZW1uYXBpQVdNVC5nZXRFeGVjdXRlKHdvcmspO1xuICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlBV01ULmdldERhdGEod29yayk7XG4gICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbml0V29ya2VyID0gaW5pdFdvcmtlcjtcbiAgICAgICAgbmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrID0gZXhlY3V0ZUFzeW5jV29yaztcbiAgICAgICAgdmFyIGFzeW5jV29ya01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbmNlbF9hc3luY193b3JrOiBuYXBpX2NhbmNlbF9hc3luY193b3JrLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXN5bmNfd29yazogbmFwaV9jcmVhdGVfYXN5bmNfd29yayxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2FzeW5jX3dvcms6IG5hcGlfZGVsZXRlX2FzeW5jX3dvcmssXG4gICAgICAgICAgICBuYXBpX3F1ZXVlX2FzeW5jX3dvcms6IG5hcGlfcXVldWVfYXN5bmNfd29ya1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUV4dGVybmFsTWVtb3J5ID0ge1xuICAgICAgICAgICAgcmVnaXN0cnk6IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRhYmxlOiBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgICAgd2FzbU1lbW9yeVZpZXdUYWJsZTogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA9IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNEZXRhY2hlZEFycmF5QnVmZmVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0QXJyYXlCdWZmZXJQb2ludGVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIsIHNob3VsZENvcHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8sXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpc0RldGFjaGVkID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkudGFibGUuaGFzKGFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkSW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLmdldChhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRJbmZvLmFkZHJlc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZENvcHkgJiYgY2FjaGVkSW5mby5vd25lcnNoaXAgPT09IDAgLyogT3duZXJzaGlwLmtSdW50aW1lICovICYmIGNhY2hlZEluZm8ucnVudGltZUFsbG9jYXRlZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksIGNhY2hlZEluZm8uYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkIHx8IChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IF9tYWxsb2MoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgaW5mby5hZGRyZXNzID0gcG9pbnRlcjtcbiAgICAgICAgICAgICAgICBpbmZvLm93bmVyc2hpcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICAgICAgaW5mby5ydW50aW1lQWxsb2NhdGVkID0gMTtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZS5zZXQoYXJyYXlCdWZmZXIsIGluZm8pO1xuICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIoYXJyYXlCdWZmZXIsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE9yVXBkYXRlTWVtb3J5VmlldzogZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiB2aWV3LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHZpZXcuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHZpZXcgaW5zdGFuY2VvZiBEYXRhVmlldyA/IHZpZXcuYnl0ZUxlbmd0aCA6IHZpZXcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPbGRXYXNtTWVtb3J5ID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiYgKHZpZXcuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVPbGRXYXNtTWVtb3J5ICYmIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBDdG9yID0gaW5mby5DdG9yO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJ1ZmZlciA9IGVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgQ3RvciA9PT0gQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIGluZm8uYWRkcmVzcywgaW5mby5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmlldyA9IG5ldyBDdG9yKHdhc21NZW1vcnkuYnVmZmVyLCBpbmZvLmFkZHJlc3MsIGluZm8ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLnNldChuZXdWaWV3LCBpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZpZXc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFZpZXdQb2ludGVyOiBmdW5jdGlvbiAodmlldywgc2hvdWxkQ29weSkge1xuICAgICAgICAgICAgICAgIHZpZXcgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRPclVwZGF0ZU1lbW9yeVZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcuYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuZ2V0KHZpZXcpLCBhZGRyZXNzXzEgPSBfYS5hZGRyZXNzLCBvd25lcnNoaXBfMSA9IF9hLm93bmVyc2hpcCwgcnVudGltZUFsbG9jYXRlZF8xID0gX2EucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGFkZHJlc3M6IGFkZHJlc3NfMSwgb3duZXJzaGlwOiBvd25lcnNoaXBfMSwgcnVudGltZUFsbG9jYXRlZDogcnVudGltZUFsbG9jYXRlZF8xLCB2aWV3OiB2aWV3IH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYWRkcmVzczogdmlldy5ieXRlT2Zmc2V0LCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCwgdmlldzogdmlldyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgX2IgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIodmlldy5idWZmZXIsIHNob3VsZENvcHkpLCBhZGRyZXNzID0gX2IuYWRkcmVzcywgb3duZXJzaGlwID0gX2Iub3duZXJzaGlwLCBydW50aW1lQWxsb2NhdGVkID0gX2IucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBhZGRyZXNzOiBhZGRyZXNzID09PSAwID8gMCA6IChhZGRyZXNzICsgdmlldy5ieXRlT2Zmc2V0KSwgb3duZXJzaGlwOiBvd25lcnNoaXAsIHJ1bnRpbWVBbGxvY2F0ZWQ6IHJ1bnRpbWVBbGxvY2F0ZWQsIHZpZXc6IHZpZXcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpU3RyaW5nLmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpU3RyaW5nID0ge1xuICAgICAgICAgICAgdXRmOERlY29kZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHV0ZjE2RGVjb2RlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBmYWxsYmFja0RlY29kZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZ1NpemUgPSBNYXRoLm1pbigweDEwMDAsIGJ5dGVzLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBuZXcgVWludDE2QXJyYXkocGVuZGluZ1NpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmRpbmdJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vcmUgPSBpbnB1dEluZGV4IDwgYnl0ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9yZSB8fCAocGVuZGluZ0luZGV4ID49IHBlbmRpbmdTaXplIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gcGVuZGluZy5zdWJhcnJheSgwLCBwZW5kaW5nSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXlsaWtlID0gc3ViYXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXlsaWtlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9yZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KGlucHV0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUxID0gYnl0ZXNbaW5wdXRJbmRleCsrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJ5dGUxICYgMHg4MCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSBieXRlMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhlMCkgPT09IDB4YzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0luZGV4KytdID0gKChieXRlMSAmIDB4MWYpIDw8IDYpIHwgYnl0ZTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChieXRlMSAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSAoKGJ5dGUxICYgMHgxZikgPDwgMTIpIHwgKGJ5dGUyIDw8IDYpIHwgYnl0ZTM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChieXRlMSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGU0ID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlcG9pbnQgPSAoKGJ5dGUxICYgMHgwNykgPDwgMHgxMikgfCAoYnl0ZTIgPDwgMHgwYykgfCAoYnl0ZTMgPDwgMHgwNikgfCBieXRlNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50IC09IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IChjb2RlcG9pbnQgPj4+IDEwKSAmIDB4M2ZmIHwgMHhkODAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50ID0gMHhkYzAwIHwgY29kZXBvaW50ICYgMHgzZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSBjb2RlcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgdXRmOERlY29kZXI7XG4gICAgICAgICAgICAgICAgdXRmOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoKSA6IGZhbGxiYWNrRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBlbW5hcGlTdHJpbmcudXRmOERlY29kZXIgPSB1dGY4RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB2YXIgZmFsbGJhY2tEZWNvZGVyMiA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50MTZBcnJheShpbnB1dC5idWZmZXIsIGlucHV0LmJ5dGVPZmZzZXQsIGlucHV0LmJ5dGVMZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPD0gMHgxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBNYXRoLm1pbigweDEwMDAsIGJ5dGVzLmxlbmd0aCAtIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMuc3ViYXJyYXkoaSwgaSArIGxlbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB1dGYxNkRlY29kZXI7XG4gICAgICAgICAgICAgICAgdXRmMTZEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHREZWNvZGVyKCd1dGYtMTZsZScpIDogZmFsbGJhY2tEZWNvZGVyMjtcbiAgICAgICAgICAgICAgICBlbW5hcGlTdHJpbmcudXRmMTZEZWNvZGVyID0gdXRmMTZEZWNvZGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aEJ5dGVzVVRGODogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHZhciBjO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPD0gMHg3Rikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8PSAweDdGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBVVEY4VG9TdHJpbmc6IGZ1bmN0aW9uIChwdHIsIGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmICghcHRyIHx8ICFsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICBwdHIgPj4+PSAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IHB0cjtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgSEVBUFU4W2VuZF07KVxuICAgICAgICAgICAgICAgICAgICAgICAgKytlbmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBwdHIgKyAobGVuZ3RoID4+PiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IHB0cjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTAgPSBIRUFQVThbaWR4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodTAgJiAweDgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IEhFQVBVOFtpZHgrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAweEUwKSA9PT0gMHhDMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgodTAgJiAzMSkgPDwgNikgfCB1MSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTIgPSBIRUFQVThbaWR4KytdICYgNjM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUwICYgMHhGMCkgPT09IDB4RTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKEhFQVBVOFtpZHgrK10gJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCB8IChjaCA+PiAxMCksIDB4REMwMCB8IChjaCAmIDB4M0ZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy51dGY4RGVjb2Rlci5kZWNvZGUoKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlci5jb25zdHJ1Y3RvcikgPT09IFwiW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl1cIikpID8gSEVBUFU4LnNsaWNlKHB0ciwgZW5kKSA6IEhFQVBVOC5zdWJhcnJheShwdHIsIGVuZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmluZ1RvVVRGODogZnVuY3Rpb24gKHN0ciwgb3V0UHRyLCBtYXhCeXRlc1RvV3JpdGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBvdXRJZHggPSBvdXRQdHI7XG4gICAgICAgICAgICAgICAgb3V0SWR4ID4+Pj0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIShtYXhCeXRlc1RvV3JpdGUgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0SWR4ID0gb3V0SWR4O1xuICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1ID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID49IDB4RDgwMCAmJiB1IDw9IDB4REZGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gc3RyLmNoYXJDb2RlQXQoKytpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAweDEwMDAwICsgKCh1ICYgMHgzRkYpIDw8IDEwKSB8ICh1MSAmIDB4M0ZGKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodSA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0SWR4ID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSB1O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHUgPD0gMHg3RkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAxID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEMwIHwgKHUgPj4gNik7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHUgPD0gMHhGRkZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0SWR4ICsgMiA+PSBlbmRJZHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHhFMCB8ICh1ID4+IDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKCh1ID4+IDYpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAodSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAzID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEYwIHwgKHUgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gMTIpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gNikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHhdID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0SWR4IC0gc3RhcnRJZHg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVVRGMTZUb1N0cmluZzogZnVuY3Rpb24gKHB0ciwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwdHIgfHwgIWxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHB0ciA+Pj49IDA7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IHB0cjtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gZW5kID4+IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEhFQVBVMTZbaWR4XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBpZHggPDwgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHB0ciArIChsZW5ndGggPj4+IDApICogMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMzIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQxNkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBwdHIsIGxlbmd0aCAvIDIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy51dGYxNkRlY29kZXIuZGVjb2RlKCgodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgSEVBUFU4LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEhFQVBVOC5idWZmZXIuY29uc3RydWN0b3IpID09PSBcIltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdXCIpKSA/IEhFQVBVOC5zbGljZShwdHIsIGVuZCkgOiBIRUFQVTguc3ViYXJyYXkocHRyLCBlbmQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJpbmdUb1VURjE2OiBmdW5jdGlvbiAoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgPSAweDdGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF4Qnl0ZXNUb1dyaXRlIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1dyaXRlIC09IDI7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0UHRyID0gb3V0UHRyO1xuICAgICAgICAgICAgICAgIHZhciBudW1DaGFyc1RvV3JpdGUgPSAobWF4Qnl0ZXNUb1dyaXRlIDwgc3RyLmxlbmd0aCAqIDIpID8gKG1heEJ5dGVzVG9Xcml0ZSAvIDIpIDogc3RyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ2hhcnNUb1dyaXRlOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29kZVVuaXQgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MTYob3V0UHRyLCBjb2RlVW5pdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQxNihvdXRQdHIsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRQdHIgLSBzdGFydFB0cjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXdTdHJpbmc6IGZ1bmN0aW9uIChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQsIHN0cmluZ01ha2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB2YXIgYXV0b0xlbmd0aCA9IGxlbmd0aCA9PT0gLTE7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghKGF1dG9MZW5ndGggfHwgKHNpemVsZW5ndGggPD0gMjE0NzQ4MzY0NykpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdHJWYWx1ZSA9IHN0cmluZ01ha2VyKHN0ciwgYXV0b0xlbmd0aCwgc2l6ZWxlbmd0aCk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShzdHJWYWx1ZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3RXh0ZXJuYWxTdHJpbmc6IGZ1bmN0aW9uIChlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIGNyZWF0ZUFwaSwgc3RyaW5nTWFrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZWxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IGNyZWF0ZUFwaShlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChjb3BpZWQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXIoZmluYWxpemVfY2FsbGJhY2ssIHN0ciwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9hcnJheV9sZW5ndGgoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDggLyogbmFwaV9zdGF0dXMubmFwaV9hcnJheV9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZS5sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FycmF5YnVmZmVyX2luZm8oZW52LCBhcnJheWJ1ZmZlciwgZGF0YSwgYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoaGFuZGxlLnZhbHVlLCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGRhdGEsIHAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfbGVuZ3RoLCBoYW5kbGUudmFsdWUuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9wcm90b3R5cGUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSA/IGhhbmRsZS52YWx1ZSA6IE9iamVjdChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvKGVudiwgdHlwZWRhcnJheSwgdHlwZSwgbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdHlwZWRhcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodHlwZWRhcnJheSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc1R5cGVkQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAyIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlndWludDY0X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHR5cGUsIHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihsZW5ndGgsIHYubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvKGVudiwgYnVmZmVyLCBkYXRhLCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNCdWZmZXIoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbyhlbnYsIGJ1ZmZlciwgMCwgbGVuZ3RoLCBkYXRhLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2RhdGF2aWV3X2luZm8oZW52LCBkYXRhdmlldywgYnl0ZV9sZW5ndGgsIGRhdGEsIGFycmF5YnVmZmVyLCBieXRlX29mZnNldCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFkYXRhdmlldylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZGF0YXZpZXcpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNEYXRhVmlldygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2ID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChieXRlX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX2xlbmd0aCwgdi5ieXRlTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfZGF0ZV92YWx1ZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgPSBoYW5kbGUudmFsdWUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig3IC8qIG5hcGlfc3RhdHVzLm5hcGlfYm9vbGVhbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGhhbmRsZS52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0LCBsb3NzbGVzcykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFsb3NzbGVzcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW1iZXJWYWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0KGVudiwgdmFsdWUsIHJlc3VsdCwgbG9zc2xlc3MpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghbG9zc2xlc3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbnVtYmVyVmFsdWUgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKChudW1iZXJWYWx1ZSA+PSBCaWdJbnQoMCkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkcyhlbnYsIHZhbHVlLCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCF3b3JkX2NvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTcgLyogbmFwaV9zdGF0dXMubmFwaV9iaWdpbnRfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzTWludXMgPSBoYW5kbGUudmFsdWUgPCBCaWdJbnQoMCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgdmFyIHdvcmRfY291bnRfaW50ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmRDb3VudCA9IDA7XG4gICAgICAgICAgICB2YXIgYmlnaW50VmFsdWUgPSBpc01pbnVzID8gKGhhbmRsZS52YWx1ZSAqIEJpZ0ludCgtMSkpIDogaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQrKztcbiAgICAgICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGJpZ2ludFZhbHVlID4+IEJpZ0ludCg2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGlzTWludXMgPyAoaGFuZGxlLnZhbHVlICogQmlnSW50KC0xKSkgOiBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICBpZiAoIXNpZ25fYml0ICYmICF3b3Jkcykge1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnRfaW50ID0gd29yZENvdW50O1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCB3b3JkX2NvdW50X2ludCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25fYml0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghd29yZHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmRzQXJyID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVpbnQ2NCA9IGJpZ2ludFZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgICAgICB3b3Jkc0Fyci5wdXNoKHVpbnQ2NCk7XG4gICAgICAgICAgICAgICAgICAgIGJpZ2ludFZhbHVlID0gYmlnaW50VmFsdWUgPj4gQmlnSW50KDY0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHdvcmRfY291bnRfaW50LCB3b3Jkc0Fyci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG93ID0gTnVtYmVyKHdvcmRzQXJyW2ldICYgQmlnSW50KDB4ZmZmZmZmZmYpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcih3b3Jkc0FycltpXSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRzICsgaSAqIDgsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkcyArIGkgKiA4ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHNpZ25fYml0LCBpc01pbnVzID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCBsZW4sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWwoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNFeHRlcm5hbCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwID0gaGFuZGxlLmRhdGEoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfaW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBJbnQzMkFycmF5KFtoYW5kbGUudmFsdWVdKVswXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKG51bWJlclZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgbnVtYmVyVmFsdWUgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB8fCBpc05hTihudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCArIDQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnVtYmVyVmFsdWUgPCAvKiBJTlQ2NF9SQU5HRV9ORUdBVElWRSAqLyAtOTIyMzM3MjAzNjg1NDc3NjAwMCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgMHg4MDAwMDAwMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChudW1iZXJWYWx1ZSA+PSAvKiBJTlQ2NF9SQU5HRV9QT1NJVElWRSAqLyA5MjIzMzcyMDM2ODU0Nzc2MDAwKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgMHhmZmZmZmZmZiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCArIDQsIDB4N2ZmZmZmZmYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0KHJlc3VsdCwgTWF0aC50cnVuYyhudW1iZXJWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xKGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgaGFuZGxlLnZhbHVlLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmX3NpemUgLSAxOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLnZhbHVlLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50OChidWYgKyBpLCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICBjb3BpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDgoYnVmICsgY29waWVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGNvcGllZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGY4KGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBzdHJMZW5ndGggPSBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGhhbmRsZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgc3RyTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1Zl9zaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGhhbmRsZS52YWx1ZSwgYnVmLCBidWZfc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmMTYoZW52LCB2YWx1ZSwgYnVmLCBidWZfc2l6ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBidWZfc2l6ZSA9IGJ1Zl9zaXplID4+PiAwO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFidWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBoYW5kbGUudmFsdWUubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1Zl9zaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEYxNihoYW5kbGUudmFsdWUsIGJ1ZiwgYnVmX3NpemUgKiAyKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGNvcGllZCAvIDIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfdWludDMyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDYgLyogbmFwaV9zdGF0dXMubmFwaV9udW1iZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgVWludDMyQXJyYXkoW2hhbmRsZS52YWx1ZV0pWzBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb252ZXJ0MmNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfYXJyYXlfbGVuZ3RoOiBuYXBpX2dldF9hcnJheV9sZW5ndGgsXG4gICAgICAgICAgICBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvOiBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfYnVmZmVyX2luZm86IG5hcGlfZ2V0X2J1ZmZlcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfZGF0YXZpZXdfaW5mbzogbmFwaV9nZXRfZGF0YXZpZXdfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2RhdGVfdmFsdWU6IG5hcGlfZ2V0X2RhdGVfdmFsdWUsXG4gICAgICAgICAgICBuYXBpX2dldF9wcm90b3R5cGU6IG5hcGlfZ2V0X3Byb3RvdHlwZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbzogbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X2ludDY0OiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0OiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X3dvcmRzOiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfd29yZHMsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9ib29sOiBuYXBpX2dldF92YWx1ZV9ib29sLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfZG91YmxlOiBuYXBpX2dldF92YWx1ZV9kb3VibGUsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9leHRlcm5hbDogbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWwsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9pbnQzMjogbmFwaV9nZXRfdmFsdWVfaW50MzIsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9pbnQ2NDogbmFwaV9nZXRfdmFsdWVfaW50NjQsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xOiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2OiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmMTYsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmODogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjgsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV91aW50MzI6IG5hcGlfZ2V0X3ZhbHVlX3VpbnQzMlxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9pbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3VpbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSA+Pj4gMCkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwanBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2ludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghaGlnaClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIobG93KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBkcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZG91YmxlKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ19sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLm5ld1N0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQsIGZ1bmN0aW9uIChzdHIsIGF1dG9MZW5ndGgsIHNpemVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGF0aW4xU3RyaW5nID0gJyc7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDgoc3RyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRpbjFTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA8IHNpemVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQ4KHN0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aW4xU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xU3RyaW5nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5VVEYxNlRvU3RyaW5nKHN0ciwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ191dGY4KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcoc3RyLCBsZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2hpbnQsIHJlc3VsdCwgY29waWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLm5ld0V4dGVybmFsU3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCwgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdFeHRlcm5hbFN0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfcHJvcGVydHlfa2V5X3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBqcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X2ludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoaWdoKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YWx1ZSA9IGxvdztcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBqcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X3VpbnQ2NChlbnYsIGxvdywgaGlnaCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghaGlnaClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFsdWUgPSBsb3cgJiAoKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjQpKSAtIEJpZ0ludCgxKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjEgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGhpZ2gsIHYxLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X3dvcmRzKGVudiwgc2lnbl9iaXQsIHdvcmRfY291bnQsIHdvcmRzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2LCBpO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgd29yZF9jb3VudCA9IHdvcmRfY291bnQgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmRfY291bnQgPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3b3JkX2NvdW50ID4gKDEwMjQgKiAxMDI0IC8gKDQgKiA4KSAvIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXhpbXVtIEJpZ0ludCBzaXplIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEJpZ0ludCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvdyA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQzMih3b3JkcyArIGkgKiA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZ2ggPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50MzIod29yZHMgKyBpICogOCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGkgPSBCaWdJbnQobG93KSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHdvcmRpIDw8IEJpZ0ludCg2NCAqIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoKEJpZ0ludChzaWduX2JpdCkgJSBCaWdJbnQoMikgPT09IEJpZ0ludCgwKSkgPyBCaWdJbnQoMSkgOiBCaWdJbnQoLTEpKTtcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnZlcnQybmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF9pbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHM6IG5hcGlfY3JlYXRlX2JpZ2ludF93b3JkcyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RvdWJsZTogbmFwaV9jcmVhdGVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50MzI6IG5hcGlfY3JlYXRlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50NjQ6IG5hcGlfY3JlYXRlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMTogbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNjogbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX3V0Zjg6IG5hcGlfY3JlYXRlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdWludDMyOiBuYXBpX2NyZWF0ZV91aW50MzIsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX2xhdGluMTogbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2OiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNjogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNlxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjYiwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9ICghdXRmOG5hbWUgfHwgIWxlbmd0aCkgPyAnJyA6IChlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCBsZW5ndGgpKTtcbiAgICAgICAgICAgIHZhciBmO1xuICAgICAgICAgICAgdmFyIG1ha2VGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2JpbmZvID0gZW1uYXBpQ3R4LmNiaW5mb1N0YWNrLnB1c2godGhpcywgZGF0YSwgYXJndW1lbnRzLCBmKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jYWxsSW50b01vZHVsZShmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9ICh3YXNtVGFibGUuZ2V0KGNiKSkoZW52T2JqZWN0LmlkLCBjYmluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoIW5hcGlWYWx1ZSkgPyB1bmRlZmluZWQgOiBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG5hcGlWYWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jYmluZm9TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lID09PSAnJykge1xuICAgICAgICAgICAgICAgIGYgPSBtYWtlRnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgZjogZiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoL15bXyRhLXpBLVpdW18kYS16QS1aMC05XSokLy50ZXN0KGZ1bmN0aW9uTmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8sIGY6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnROZXdGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciBfID0gbWFrZUZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZiA9IChuZXcgRnVuY3Rpb24oJ18nLCAncmV0dXJuIGZ1bmN0aW9uICcgKyBmdW5jdGlvbk5hbWUgKyAnKCl7JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCJ1c2Ugc3RyaWN0XCI7JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuIF8uYXBwbHkodGhpcyxhcmd1bWVudHMpOycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ307JykpKF8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgICAgICBmID0gbWFrZUZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgJ25hbWUnLCB7IHZhbHVlOiBmdW5jdGlvbk5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovLCBmOiBmIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBvYmosIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsR2V0dGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbFNldHRlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR2V0dGVyID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCAwLCAwLCBnZXR0ZXIsIGRhdGEpLmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXR0ZXIgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIDAsIDAsIHNldHRlciwgZGF0YSkuZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogKGF0dHJpYnV0ZXMgJiA0IC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2NvbmZpZ3VyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IChhdHRyaWJ1dGVzICYgMiAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9lbnVtZXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBsb2NhbEdldHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBsb2NhbFNldHRlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCBkZXNjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbE1ldGhvZCA9IGVtbmFwaUNyZWF0ZUZ1bmN0aW9uKGVudk9iamVjdCwgMCwgMCwgbWV0aG9kLCBkYXRhKS5mO1xuICAgICAgICAgICAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IChhdHRyaWJ1dGVzICYgNCAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9jb25maWd1cmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAoYXR0cmlidXRlcyAmIDIgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfZW51bWVyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAoYXR0cmlidXRlcyAmIDEgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfd3JpdGFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxNZXRob2RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAoYXR0cmlidXRlcyAmIDQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfY29uZmlndXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogKGF0dHJpYnV0ZXMgJiAyIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2VudW1lcmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogKGF0dHJpYnV0ZXMgJiAxIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX3dyaXRhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoIShoYW5kbGUuaXNPYmplY3QoKSB8fCBoYW5kbGUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVtbmFwaUV4dGVybmFsTWVtb3J5ICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoaGFuZGxlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhoYW5kbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmdldChoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgaGFuZGxlOiBoYW5kbGUgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQ7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfd3JhcCcsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yKCduYXBpX3dyYXAnLCAnUGFyYW1ldGVyIFwicmVzdWx0XCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZVJlc3VsdCA9IGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVSZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoaGFuZGxlUmVzdWx0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVSZXN1bHQuaGFuZGxlO1xuICAgICAgICAgICAgICAgIGlmIChlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyhoYW5kbGUudmFsdWUpLndyYXBwZWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxpemVfY2IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcmVmZXJlbmNlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCAhZmluYWxpemVfY2IgPyBmaW5hbGl6ZV9jYiA6IGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyhoYW5kbGUudmFsdWUpLndyYXBwZWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWpzX29iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAwIC8qIFVud3JhcEFjdGlvbi5LZWVwV3JhcCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoanNfb2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gYmluZGluZy53cmFwcGVkO1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZmVyZW5jZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlZi5kYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09IDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZy53cmFwcGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5vd25lcnNoaXAoKSA9PT0gMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB3cmFwIGlzIGJlZW4gcmVtb3ZlZCwgdGhlIGZpbmFsaXplciBzaG91bGQgYmUgcmVzZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWZpbmVfY2xhc3MoZW52LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSwgcHJvcGVydHlfY291bnQsIHByb3BlcnRpZXMsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHByb3BQdHIsIHZhbHVlSGFuZGxlSWQsIGF0dHJpYnV0ZXM7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPCAtMSkgfHwgKGxlbmd0aCA+IDIxNDc0ODM2NDcpIHx8ICghdXRmOG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcmVzdWx0ID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGZyZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB2YXIgRiA9IGZyZXN1bHQuZjtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMSA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzEpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcyAmIDEwMjQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfc3RhdGljICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBGLCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgRi5wcm90b3R5cGUsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlSGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKEYpO1xuICAgICAgICAgICAgICAgIHZhbHVlSGFuZGxlSWQgPSB2YWx1ZUhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlSGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3dyYXAoZW52LCBqc19vYmplY3QsIG5hdGl2ZV9vYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZW1vdmVfd3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpVW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQsIDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlX3RhZ19vYmplY3QoZW52LCBvYmplY3QsIHR5cGVfdGFnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVfdGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZyA9IGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy50YWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0YWcgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgICAgICAgICAgICAgdGFnLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgdHlwZV90YWcsIDE2KSk7XG4gICAgICAgICAgICAgICAgYmluZGluZy50YWcgPSBuZXcgVWludDMyQXJyYXkodGFnLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZyhlbnYsIG9iamVjdCwgdHlwZV90YWcsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgb25lLXZhclxuICAgICAgICAgICAgdmFyIHJldCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVfdGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcudGFnICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWcgPSBiaW5kaW5nLnRhZztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVUYWcgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHR5cGVfdGFnLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gKHRhZ1swXSA9PT0gdHlwZVRhZ1swXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnWzFdID09PSB0eXBlVGFnWzFdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdbMl0gPT09IHR5cGVUYWdbMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1szXSA9PT0gdHlwZVRhZ1szXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgcmV0ID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9maW5hbGl6ZXIoZW52LCBqc19vYmplY3QsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghZmluYWxpemVfY2IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVSZXN1bHQgPSBlbW5hcGlHZXRIYW5kbGUoanNfb2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVSZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihoYW5kbGVSZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVSZXN1bHQuaGFuZGxlO1xuICAgICAgICAgICAgdmFyIG93bmVyc2hpcCA9ICFyZXN1bHQgPyAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLyA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLztcbiAgICAgICAgICAgIHZhciByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCBvd25lcnNoaXAsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gcmVmZXJlbmNlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByZWZlcmVuY2VJZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXIoZW52LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuZW5xdWV1ZUZpbmFsaXplcihlbW5hcGlDdHguY3JlYXRlVHJhY2tlZEZpbmFsaXplcihlbnZPYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdyYXBNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9hZGRfZmluYWxpemVyOiBuYXBpX2FkZF9maW5hbGl6ZXIsXG4gICAgICAgICAgICBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZzogbmFwaV9jaGVja19vYmplY3RfdHlwZV90YWcsXG4gICAgICAgICAgICBuYXBpX2RlZmluZV9jbGFzczogbmFwaV9kZWZpbmVfY2xhc3MsXG4gICAgICAgICAgICBuYXBpX3JlbW92ZV93cmFwOiBuYXBpX3JlbW92ZV93cmFwLFxuICAgICAgICAgICAgbmFwaV90eXBlX3RhZ19vYmplY3Q6IG5hcGlfdHlwZV90YWdfb2JqZWN0LFxuICAgICAgICAgICAgbmFwaV91bndyYXA6IG5hcGlfdW53cmFwLFxuICAgICAgICAgICAgbmFwaV93cmFwOiBuYXBpX3dyYXAsXG4gICAgICAgICAgICBub2RlX2FwaV9wb3N0X2ZpbmFsaXplcjogbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXJcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCB0eXBlZGFycmF5X3R5cGUsIGV4dGVybmFsX2RhdGEsIGJ5dGVfbGVuZ3RoLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWV4dGVybmFsX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnl0ZV9sZW5ndGggPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDYW5ub3QgY3JlYXRlIGEgbWVtb3J5IHZpZXcgbGFyZ2VyIHRoYW4gMjE0NzQ4MzY0NyBieXRlcycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGV4dGVybmFsX2RhdGEgKyBieXRlX2xlbmd0aCkgPiB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNZW1vcnkgb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplciAmJiBmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydFdlYWtSZWZFcnJvcignZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldycsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmlld0Rlc2NyaXB0b3IgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlZGFycmF5X3R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9pbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEludDhBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX3VpbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQ4QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50OF9jbGFtcGVkX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQ4Q2xhbXBlZEFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50MTZfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogSW50MTZBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAxLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQxNkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDEsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9pbnQzMl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBJbnQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogVWludDMyQXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMiwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDcgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2Zsb2F0MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogRmxvYXQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9mbG9hdDY0X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEZsb2F0NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOSAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYmlnaW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogQmlnSW50NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2JpZ3VpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBCaWdVaW50NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgLTEgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2RhdGFfdmlldyAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBEYXRhVmlldywgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0yIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9idWZmZXIgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvcignZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldycsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXIsIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgQ3RvciA9IHZpZXdEZXNjcmlwdG9yLkN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGVkQXJyYXkgPSB0eXBlZGFycmF5X3R5cGUgPT09IC0yIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9idWZmZXIgKi9cbiAgICAgICAgICAgICAgICAgICAgPyBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXIuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgdmlld0Rlc2NyaXB0b3IuYWRkcmVzcywgdmlld0Rlc2NyaXB0b3IubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBDdG9yKHdhc21NZW1vcnkuYnVmZmVyLCB2aWV3RGVzY3JpcHRvci5hZGRyZXNzLCB2aWV3RGVzY3JpcHRvci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodHlwZWRBcnJheSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQodHlwZWRBcnJheSwgdmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzXzEgPSBuYXBpX2FkZF9maW5hbGl6ZXIoZW52LCBoYW5kbGUuaWQsIGV4dGVybmFsX2RhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCAvKiBOVUxMICovIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzXzEgPT09IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBlbnZPYmplY3QudHJ5Q2F0Y2guZXh0cmFjdEV4Y2VwdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzXzEgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gaGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19zdXBwb3J0X3dlYWtyZWYoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplciA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQgPyAxIDogMDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaU5vZGVCaW5kaW5nID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gJGVtbmFwaVN5bmNNZW1vcnkoanNfdG9fd2FzbSwgYXJyYXlCdWZmZXJPclZpZXcsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgIT09IG51bGwgJiYgb2Zmc2V0ICE9PSB2b2lkIDAgPyBvZmZzZXQgOiAwO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXJPclZpZXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0QXJyYXlCdWZmZXJQb2ludGVyKGFycmF5QnVmZmVyT3JWaWV3LCBmYWxzZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICBpZiAoIXBvaW50ZXIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBBcnJheUJ1ZmZlciBhZGRyZXNzJyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsZW4gIT09ICdudW1iZXInIHx8IGxlbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuID0gYXJyYXlCdWZmZXJPclZpZXcuYnl0ZUxlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuID0gbGVuID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlck9yVmlldztcbiAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXJPclZpZXcsIG9mZnNldCwgbGVuKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FzbU1lbW9yeVU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghanNfdG9fd2FzbSkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldCh3YXNtTWVtb3J5VTguc3ViYXJyYXkocG9pbnRlciwgcG9pbnRlciArIGxlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeVU4LnNldCh2aWV3LCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5QnVmZmVyT3JWaWV3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhcnJheUJ1ZmZlck9yVmlldykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlld1BvaW50ZXJJbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0Vmlld1BvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgbGF0ZXN0VmlldyA9IHZpZXdQb2ludGVySW5mby52aWV3O1xuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gdmlld1BvaW50ZXJJbmZvLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQXJyYXlCdWZmZXIgYWRkcmVzcycpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGVuICE9PSAnbnVtYmVyJyB8fCBsZW4gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbiA9IGxhdGVzdFZpZXcuYnl0ZUxlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuID0gbGVuID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RWaWV3O1xuICAgICAgICAgICAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShsYXRlc3RWaWV3LmJ1ZmZlciwgbGF0ZXN0Vmlldy5ieXRlT2Zmc2V0ICsgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIHZhciB3YXNtTWVtb3J5VTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFqc190b193YXNtKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0KHdhc21NZW1vcnlVOC5zdWJhcnJheShwb2ludGVyLCBwb2ludGVyICsgbGVuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5VTguc2V0KHZpZXcsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0VmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VtbmFwaVN5bmNNZW1vcnkgZXhwZWN0IEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyBhcyBmaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX3N5bmNfbWVtb3J5KGVudiwganNfdG9fd2FzbSwgYXJyYXlidWZmZXJfb3Jfdmlldywgb2Zmc2V0LCBsZW4pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVJZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChoYW5kbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheUJ1ZmZlcigpICYmICFoYW5kbGUuaXNUeXBlZEFycmF5KCkgJiYgIWhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9ICRlbW5hcGlTeW5jTWVtb3J5KEJvb2xlYW4oanNfdG9fd2FzbSksIGhhbmRsZS52YWx1ZSwgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgIT09IHJldCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzKGFycmF5QnVmZmVyT3JWaWV3KSB7XG4gICAgICAgICAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgRGF0YVZpZXc7XG4gICAgICAgICAgICB2YXIgaXNUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5QnVmZmVyT3JWaWV3KSAmJiAhaXNEYXRhVmlldztcbiAgICAgICAgICAgIGlmICghaXNBcnJheUJ1ZmZlciAmJiAhaXNUeXBlZEFycmF5ICYmICFpc0RhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyBleHBlY3QgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3IGFzIGZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGluZm87XG4gICAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBpbmZvLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgb3duZXJzaGlwOiBpbmZvLm93bmVyc2hpcCxcbiAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyhlbnYsIGFycmF5YnVmZmVyX29yX3ZpZXcsIGFkZHJlc3MsIG93bmVyc2hpcCwgcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwLCBydW50aW1lQWxsb2NhdGVkLCBvd25lcnNoaXBPdXQ7XG4gICAgICAgICAgICB2YXIgaW5mbztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyX29yX3ZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzICYmICFvd25lcnNoaXAgJiYgIXJ1bnRpbWVfYWxsb2NhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcl9vcl92aWV3KTtcbiAgICAgICAgICAgICAgICBpbmZvID0gJGVtbmFwaUdldE1lbW9yeUFkZHJlc3MoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBwID0gaW5mby5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYWRkcmVzcywgcCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvd25lcnNoaXApIHtcbiAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwT3V0ID0gaW5mby5vd25lcnNoaXA7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKG93bmVyc2hpcCwgb3duZXJzaGlwT3V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWVfYWxsb2NhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQgPSBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocnVudGltZV9hbGxvY2F0ZWQsIHJ1bnRpbWVBbGxvY2F0ZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfZ2V0X3J1bnRpbWVfdmVyc2lvbihlbnYsIHZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCF2ZXJzaW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcnVudGltZVZlcnNpb247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVWZXJzaW9uID0gZW1uYXBpQ3R4LmdldFJ1bnRpbWVWZXJzaW9ucygpLnZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZlcnNpb25zID0gcnVudGltZVZlcnNpb24uc3BsaXQoJy4nKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIE51bWJlcihuKTsgfSk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24sIHZlcnNpb25zWzBdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih2ZXJzaW9uICsgNCwgdmVyc2lvbnNbMV0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24gKyA4LCB2ZXJzaW9uc1syXSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtbmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzczogJGVtbmFwaUdldE1lbW9yeUFkZHJlc3MsXG4gICAgICAgICAgICAkZW1uYXBpU3luY01lbW9yeTogJGVtbmFwaVN5bmNNZW1vcnksXG4gICAgICAgICAgICBlbW5hcGlfY3JlYXRlX21lbW9yeV92aWV3OiBlbW5hcGlfY3JlYXRlX21lbW9yeV92aWV3LFxuICAgICAgICAgICAgZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzczogZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyxcbiAgICAgICAgICAgIGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uOiBlbW5hcGlfZ2V0X3J1bnRpbWVfdmVyc2lvbixcbiAgICAgICAgICAgIGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlOiBlbW5hcGlfaXNfbm9kZV9iaW5kaW5nX2F2YWlsYWJsZSxcbiAgICAgICAgICAgIGVtbmFwaV9pc19zdXBwb3J0X2JpZ2ludDogZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50LFxuICAgICAgICAgICAgZW1uYXBpX2lzX3N1cHBvcnRfd2Vha3JlZjogZW1uYXBpX2lzX3N1cHBvcnRfd2Vha3JlZixcbiAgICAgICAgICAgIGVtbmFwaV9zeW5jX21lbW9yeTogZW1uYXBpX3N5bmNfbWVtb3J5XG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYXJyYXkoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoW10pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGgoZW52LCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShuZXcgQXJyYXkobGVuZ3RoKSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQ3JlYXRlQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgsIGRhdGEpIHtcbiAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXIsIHRydWUpLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheWJ1ZmZlcihlbnYsIGJ5dGVfbGVuZ3RoLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYXJyYXlCdWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwZHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2RhdGUoZW52LCB0aW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUobmV3IERhdGUodGltZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWwoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0RmluYWxpemVyICYmIGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yKCduYXBpX2NyZWF0ZV9leHRlcm5hbCcsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXh0ZXJuYWxIYW5kbGUgPSBlbW5hcGlDdHguZ2V0Q3VycmVudFNjb3BlKCkuYWRkRXh0ZXJuYWwoZW52T2JqZWN0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGV4dGVybmFsSGFuZGxlLmlkLCAwLCAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLywgZmluYWxpemVfY2IsIGRhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4dGVybmFsSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXIoZW52LCBleHRlcm5hbF9kYXRhLCBieXRlX2xlbmd0aCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsXzEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKGFycmF5QnVmZmVyLCBbYXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdThhcnIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHU4YXJyLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkoZXh0ZXJuYWxfZGF0YSwgZXh0ZXJuYWxfZGF0YSArIGJ5dGVfbGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLnNldChhcnJheUJ1ZmZlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNfMSA9IG5hcGlfYWRkX2ZpbmFsaXplcihlbnYsIGhhbmRsZS5pZCwgZXh0ZXJuYWxfZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIC8qIE5VTEwgKi8gMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfMSA9PT0gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0dXNfMSAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihzdGF0dXNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGUuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9vYmplY3QoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoe30pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3ltYm9sKGVudiwgZGVzY3JpcHRpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN5bWJvbC1kZXNjcmlwdGlvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKFN5bWJvbCgpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sKGRlc2MpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdHlwZWRhcnJheShlbnYsIHR5cGUsIGxlbmd0aCwgYXJyYXlidWZmZXIsIGJ5dGVfb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIFR5cGUsIHNpemVfb2ZfZWxlbWVudCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSBieXRlX29mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9vZl9lbGVtZW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChieXRlX29mZnNldCkgJSAoc2l6ZV9vZl9lbGVtZW50KSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgUmFuZ2VFcnJvcihcInN0YXJ0IG9mZnNldCBvZiBcIi5jb25jYXQoKF9hID0gVHlwZS5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJywgXCIgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgXCIpLmNvbmNhdChzaXplX29mX2VsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFUlJfTkFQSV9JTlZBTElEX1RZUEVEQVJSQVlfQUxJR05NRU5UJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKChsZW5ndGggKiBzaXplX29mX2VsZW1lbnQpICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfVFlQRURBUlJBWV9MRU5HVEgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgb3V0ID0gbmV3IFR5cGUoYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXMob3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KG91dCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBieXRlX29mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShvdXQpLmlkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBJbnQ4QXJyYXksIDEsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50OEFycmF5LCAxLCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9jbGFtcGVkX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50OENsYW1wZWRBcnJheSwgMSwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50MTZfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDE2QXJyYXksIDIsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgVWludDE2QXJyYXksIDIsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBJbnQzMkFycmF5LCA0LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQzMkFycmF5LCA0LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBGbG9hdDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2Zsb2F0NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEZsb2F0NjRBcnJheSwgOCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlnaW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEJpZ0ludDY0QXJyYXksIDgsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWd1aW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEJpZ1VpbnQ2NEFycmF5LCA4LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9idWZmZXIoZW52LCBzaXplLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSwgcG9pbnRlcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcicsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSB8fCAoc2l6ZSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBzaXplKS5maWxsKDApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyXzEgPSBCdWZmZXIuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgcG9pbnRlciwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN0b3I6IEJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHBvaW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXA6IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAxXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KGJ1ZmZlcl8xLCB2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIodmlld0Rlc2NyaXB0b3IsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXJfMSkuaWQ7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwb2ludGVyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYnVmZmVyX2NvcHkoZW52LCBsZW5ndGgsIGRhdGEsIHJlc3VsdF9kYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5JywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihsZW5ndGgsIHJlc3VsdF9kYXRhKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KGRhdGEsIGRhdGEgKyBsZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcihlbnYsIGxlbmd0aCwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovLCBkYXRhLCBsZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRhdmlldyhlbnYsIGJ5dGVfbGVuZ3RoLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBieXRlX29mZnNldCA9IGJ5dGVfb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfbGVuZ3RoICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdieXRlX29mZnNldCArIGJ5dGVfbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGFycmF5IHBhc3NlZCBpbicpO1xuICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFUlJfTkFQSV9JTlZBTElEX0RBVEFWSUVXX0FSR1MnO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXRhdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIsIGJ5dGVfb2Zmc2V0LCBieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhkYXRhdmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KGRhdGF2aWV3LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RvcjogRGF0YVZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogYnl0ZV9vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBieXRlX2xlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZGF0YXZpZXcpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9zeW1ib2xfZm9yKGVudiwgdXRmOGRlc2NyaXB0aW9uLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgIHZhciBzaXplbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgaWYgKGxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghdXRmOGRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlc2NyaXB0aW9uU3RyaW5nID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyh1dGY4ZGVzY3JpcHRpb24sIGxlbmd0aCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sLmZvcihkZXNjcmlwdGlvblN0cmluZykpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjcmVhdGVNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXk6IG5hcGlfY3JlYXRlX2FycmF5LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGg6IG5hcGlfY3JlYXRlX2FycmF5X3dpdGhfbGVuZ3RoLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXlidWZmZXI6IG5hcGlfY3JlYXRlX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYnVmZmVyOiBuYXBpX2NyZWF0ZV9idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9idWZmZXJfY29weTogbmFwaV9jcmVhdGVfYnVmZmVyX2NvcHksXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9kYXRhdmlldzogbmFwaV9jcmVhdGVfZGF0YXZpZXcsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9kYXRlOiBuYXBpX2NyZWF0ZV9kYXRlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWw6IG5hcGlfY3JlYXRlX2V4dGVybmFsLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXI6IG5hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYnVmZmVyOiBuYXBpX2NyZWF0ZV9leHRlcm5hbF9idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9vYmplY3Q6IG5hcGlfY3JlYXRlX29iamVjdCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N5bWJvbDogbmFwaV9jcmVhdGVfc3ltYm9sLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdHlwZWRhcnJheTogbmFwaV9jcmVhdGVfdHlwZWRhcnJheSxcbiAgICAgICAgICAgIG5vZGVfYXBpX3N5bWJvbF9mb3I6IG5vZGVfYXBpX3N5bWJvbF9mb3JcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9ib29sZWFuKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gdmFsdWUgPT09IDAgPyAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLyA6IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9nbG9iYWwoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSA1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbnVsbChlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IDIgLyogR2xvYmFsSGFuZGxlLk5VTEwgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdW5kZWZpbmVkKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnbG9iYWxNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfYm9vbGVhbjogbmFwaV9nZXRfYm9vbGVhbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2dsb2JhbDogbmFwaV9nZXRfZ2xvYmFsLFxuICAgICAgICAgICAgbmFwaV9nZXRfbnVsbDogbmFwaV9nZXRfbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3VuZGVmaW5lZDogbmFwaV9nZXRfdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X2luc3RhbmNlX2RhdGEoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3Quc2V0SW5zdGFuY2VEYXRhKGRhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9pbnN0YW5jZV9kYXRhKGVudiwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudk9iamVjdC5nZXRJbnN0YW5jZURhdGEoKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2dldF9pbnN0YW5jZV9kYXRhOiBuYXBpX2dldF9pbnN0YW5jZV9kYXRhLFxuICAgICAgICAgICAgbmFwaV9zZXRfaW5zdGFuY2VfZGF0YTogbmFwaV9zZXRfaW5zdGFuY2VfZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyB2cHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2dldF9sYXN0X2Vycm9yX2luZm8oZW52LCBlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgdmFyIGxhc3RFcnJvciA9IGVudk9iamVjdC5sYXN0RXJyb3I7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZXJyb3JDb2RlID0gbGFzdEVycm9yLmVycm9yQ29kZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBlbmdpbmVFcnJvckNvZGUgPSBsYXN0RXJyb3IuZW5naW5lRXJyb3JDb2RlID4+PiAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGVuZ2luZVJlc2VydmVkID0gbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGVycm9yX2NvZGUsIGVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZUVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihlbmdpbmVfcmVzZXJ2ZWQsIGVuZ2luZVJlc2VydmVkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93KGVudiwgZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGVycm9yKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93X2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdGhyb3dfdHlwZV9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtc2csIC0xKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNvZGUsIC0xKTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvd19yYW5nZV9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBSYW5nZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBTeW50YXhFcnJvcihlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKG1zZywgLTEpKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcoY29kZSwgLTEpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmcoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV90eXBlX2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcmFuZ2VfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFJhbmdlRXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBtc2dWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobXNnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgU3ludGF4RXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FuZF9jbGVhcl9sYXN0X2V4Y2VwdGlvbihlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMSwgdHJ1ZSk7IC8vIElEX1VOREVGSU5FRFxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBlbnZPYmplY3QudHJ5Q2F0Y2guZXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChlcnIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9mYXRhbF9lcnJvcihsb2NhdGlvbiwgbG9jYXRpb25fbGVuLCBtZXNzYWdlLCBtZXNzYWdlX2xlbikge1xuICAgICAgICAgICAgdmFyIGxvY2F0aW9uU3RyID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhsb2NhdGlvbiwgbG9jYXRpb25fbGVuKTtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlU3RyID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtZXNzYWdlLCBtZXNzYWdlX2xlbik7XG4gICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5uYXBpLmZhdGFsRXJyb3IobG9jYXRpb25TdHIsIG1lc3NhZ2VTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoJ0ZBVEFMIEVSUk9SOiAnICsgbG9jYXRpb25TdHIgKyAnICcgKyBtZXNzYWdlU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2ZhdGFsX2V4Y2VwdGlvbihlbnYsIGVycikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZXJyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGVycik7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyaWdnZXJGYXRhbEV4Y2VwdGlvbihlcnJvci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfZ2V0X2xhc3RfZXJyb3JfaW5mbzogX2VtbmFwaV9nZXRfbGFzdF9lcnJvcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXJyb3I6IG5hcGlfY3JlYXRlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfcmFuZ2VfZXJyb3I6IG5hcGlfY3JlYXRlX3JhbmdlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdHlwZV9lcnJvcjogbmFwaV9jcmVhdGVfdHlwZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfZmF0YWxfZXJyb3I6IG5hcGlfZmF0YWxfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX2ZhdGFsX2V4Y2VwdGlvbjogbmFwaV9mYXRhbF9leGNlcHRpb24sXG4gICAgICAgICAgICBuYXBpX2dldF9hbmRfY2xlYXJfbGFzdF9leGNlcHRpb246IG5hcGlfZ2V0X2FuZF9jbGVhcl9sYXN0X2V4Y2VwdGlvbixcbiAgICAgICAgICAgIG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmc6IG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmcsXG4gICAgICAgICAgICBuYXBpX3Rocm93OiBuYXBpX3Rocm93LFxuICAgICAgICAgICAgbmFwaV90aHJvd19lcnJvcjogbmFwaV90aHJvd19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3I6IG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3Rocm93X3R5cGVfZXJyb3I6IG5hcGlfdGhyb3dfdHlwZV9lcnJvcixcbiAgICAgICAgICAgIG5vZGVfYXBpX2NyZWF0ZV9zeW50YXhfZXJyb3I6IG5vZGVfYXBpX2NyZWF0ZV9zeW50YXhfZXJyb3IsXG4gICAgICAgICAgICBub2RlX2FwaV90aHJvd19zeW50YXhfZXJyb3I6IG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2Z1bmN0aW9uKGVudiwgdXRmOG5hbWUsIGxlbmd0aCwgY2IsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZXN1bHQgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZnJlc3VsdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gZnJlc3VsdC5mO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShmKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfY2JfaW5mbyhlbnYsIGNiaW5mbywgYXJnYywgYXJndiwgdGhpc19hcmcsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5jYmluZm9TdGFjay5nZXQoY2JpbmZvKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYXJndikge1xuICAgICAgICAgICAgICAgIGlmICghYXJnYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnY1ZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKGFyZ2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSBjYmluZm9WYWx1ZS5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgYXJybGVuID0gYXJnY1ZhbHVlIDwgbGVuID8gYXJnY1ZhbHVlIDogbGVuO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFycmxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChjYmluZm9WYWx1ZS5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXJndiArIGkgKiA0LCBhcmdWYWwsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ2NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2NWYWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcmd2ICsgaSAqIDQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ2MpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYXJnYywgY2JpbmZvVmFsdWUuYXJncy5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXNfYXJnKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGNiaW5mb1ZhbHVlLnRoaXopO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRoaXNfYXJnLCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgY2JpbmZvVmFsdWUuZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF9mdW5jdGlvbihlbnYsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWN2KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdjhyZWN2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZWN2KS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWZ1bmMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHY4ZnVuYyA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZnVuYykudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2OGZ1bmMgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IHY4ZnVuYy5hcHBseSh2OHJlY3YsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9uZXdfaW5zdGFuY2UoZW52LCBjb25zdHJ1Y3RvciwgYXJnYywgYXJndiwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBDdG9yID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb25zdHJ1Y3RvcikudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydFJlZmxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ0xpc3QgPSBBcnJheShhcmdjKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0W2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IFJlZmxlY3QuY29uc3RydWN0KEN0b3IsIGFyZ0xpc3QsIEN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheShhcmdjICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpICsgMV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIEJvdW5kQ3RvciA9IEN0b3IuYmluZC5hcHBseShDdG9yLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEJvdW5kQ3RvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0KTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbmV3X3RhcmdldChlbnYsIGNiaW5mbywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWNiaW5mbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5jYmluZm9TdGFjay5nZXQoY2JpbmZvKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNiaW5mb1ZhbHVlLmdldE5ld1RhcmdldChlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jdGlvbk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbGxfZnVuY3Rpb246IG5hcGlfY2FsbF9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Z1bmN0aW9uOiBuYXBpX2NyZWF0ZV9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2NiX2luZm86IG5hcGlfZ2V0X2NiX2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9uZXdfdGFyZ2V0OiBuYXBpX2dldF9uZXdfdGFyZ2V0LFxuICAgICAgICAgICAgbmFwaV9uZXdfaW5zdGFuY2U6IG5hcGlfbmV3X2luc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5faGFuZGxlX3Njb3BlKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgc2NvcGUuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghc2NvcGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICgoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEzIC8qIG5hcGlfc3RhdHVzLm5hcGlfaGFuZGxlX3Njb3BlX21pc21hdGNoICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fZXNjYXBhYmxlX2hhbmRsZV9zY29wZShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHNjb3BlLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTMgLyogbmFwaV9zdGF0dXMubmFwaV9oYW5kbGVfc2NvcGVfbWlzbWF0Y2ggKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9lc2NhcGVfaGFuZGxlKGVudiwgc2NvcGUsIGVzY2FwZWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHNjb3BlT2JqZWN0ID0gZW1uYXBpQ3R4LnNjb3BlU3RvcmUuZ2V0KHNjb3BlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmplY3QuZXNjYXBlQ2FsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3SGFuZGxlID0gc2NvcGVPYmplY3QuZXNjYXBlKGVzY2FwZWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXdIYW5kbGUgPyBuZXdIYW5kbGUuaWQgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTIgLyogbmFwaV9zdGF0dXMubmFwaV9lc2NhcGVfY2FsbGVkX3R3aWNlICovKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3JlZmVyZW5jZShlbnYsIHZhbHVlLCBpbml0aWFsX3JlZmNvdW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gIT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSB8fCBoYW5kbGUuaXNTeW1ib2woKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGhhbmRsZS5pZCwgaW5pdGlhbF9yZWZjb3VudCA+Pj4gMCwgMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHJlZi5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfcmVmZXJlbmNlKGVudiwgcmVmKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWZlcmVuY2VfcmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikucmVmKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmZXJlbmNlX3VucmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgdmFyIHJlZmNvdW50ID0gcmVmZXJlbmNlLnJlZkNvdW50KCk7XG4gICAgICAgICAgICBpZiAocmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHJlZmVyZW5jZS51bnJlZigpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY291bnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9yZWZlcmVuY2VfdmFsdWUoZW52LCByZWYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhhbmRsZUlkID0gcmVmZXJlbmNlLmdldCgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgaGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9lbnZfY2xlYW51cF9ob29rKGVudiwgZnVuLCBhcmcpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFmdW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5hZGRDbGVhbnVwSG9vayhlbnZPYmplY3QsIGZ1biwgYXJnKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVtb3ZlX2Vudl9jbGVhbnVwX2hvb2soZW52LCBmdW4sIGFyZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWZ1bilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlbW92ZUNsZWFudXBIb29rKGVudk9iamVjdCwgZnVuLCBhcmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X3JlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2Vudl91bnJlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlmZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9yZWY6IF9lbW5hcGlfZW52X3JlZixcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X3VucmVmOiBfZW1uYXBpX2Vudl91bnJlZixcbiAgICAgICAgICAgIG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2s6IG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfY2xvc2VfZXNjYXBhYmxlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlOiBuYXBpX2Nsb3NlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JlZmVyZW5jZTogbmFwaV9jcmVhdGVfcmVmZXJlbmNlLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfcmVmZXJlbmNlOiBuYXBpX2RlbGV0ZV9yZWZlcmVuY2UsXG4gICAgICAgICAgICBuYXBpX2VzY2FwZV9oYW5kbGU6IG5hcGlfZXNjYXBlX2hhbmRsZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3JlZmVyZW5jZV92YWx1ZTogbmFwaV9nZXRfcmVmZXJlbmNlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfb3Blbl9lc2NhcGFibGVfaGFuZGxlX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2hhbmRsZV9zY29wZTogbmFwaV9vcGVuX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfcmVmZXJlbmNlX3JlZjogbmFwaV9yZWZlcmVuY2VfcmVmLFxuICAgICAgICAgICAgbmFwaV9yZWZlcmVuY2VfdW5yZWY6IG5hcGlfcmVmZXJlbmNlX3VucmVmLFxuICAgICAgICAgICAgbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9vazogbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9va1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X2ZpbGVuYW1lKGVudiwgYnVmLCBsZW4pIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBlbnZPYmplY3QuZmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGZpbGVuYW1lLCBidWYsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pc2NlbGxhbmVvdXNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfZmlsZW5hbWU6IF9lbW5hcGlfZ2V0X2ZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcHJvbWlzZShlbnYsIGRlZmVycmVkLCBwcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3RJZCwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZlcnJlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZmVycmVkT2JqZWN0ID0gZW1uYXBpQ3R4LmNyZWF0ZURlZmVycmVkKHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkT2JqZWN0SWQgPSBkZWZlcnJlZE9iamVjdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGVmZXJyZWQsIGRlZmVycmVkT2JqZWN0SWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShwKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihwcm9taXNlLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZXNvbHZlX2RlZmVycmVkKGVudiwgZGVmZXJyZWQsIHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x1dGlvbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3QgPSBlbW5hcGlDdHguZGVmZXJyZWRTdG9yZS5nZXQoZGVmZXJyZWQpO1xuICAgICAgICAgICAgICAgIGRlZmVycmVkT2JqZWN0LnJlc29sdmUoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvbHV0aW9uKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWplY3RfZGVmZXJyZWQoZW52LCBkZWZlcnJlZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZGVmZXJyZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHV0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZE9iamVjdCA9IGVtbmFwaUN0eC5kZWZlcnJlZFN0b3JlLmdldChkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3QucmVqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfcHJvbWlzZShlbnYsIHZhbHVlLCBpc19wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWlzX3Byb21pc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNQcm9taXNlKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGlzX3Byb21pc2UsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3Byb21pc2U6IG5hcGlfY3JlYXRlX3Byb21pc2UsXG4gICAgICAgICAgICBuYXBpX2lzX3Byb21pc2U6IG5hcGlfaXNfcHJvbWlzZSxcbiAgICAgICAgICAgIG5hcGlfcmVqZWN0X2RlZmVycmVkOiBuYXBpX3JlamVjdF9kZWZlcnJlZCxcbiAgICAgICAgICAgIG5hcGlfcmVzb2x2ZV9kZWZlcnJlZDogbmFwaV9yZXNvbHZlX2RlZmVycmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcGlpaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCBrZXlfbW9kZSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvYmogPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlfbW9kZSAhPT0gMCAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfaW5jbHVkZV9wcm90b3R5cGVzICovICYmIGtleV9tb2RlICE9PSAxIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9vd25fb25seSAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5X2NvbnZlcnNpb24gIT09IDAgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9rZWVwX251bWJlcnMgKi8gJiYga2V5X2NvbnZlcnNpb24gIT09IDEgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9udW1iZXJzX3RvX3N0cmluZ3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVzID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xzID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlZ2VySW5kaWNlUmVnZXggPSAvXigwfFsxLTldWzAtOV0qKSQvO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVnZXJJbmRpY2VSZWdleC50ZXN0KG5hbWVzW2ldKSA/IE51bWJlcihuYW1lc1tpXSkgOiBuYW1lc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZXNbaV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bjogb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogc3ltYm9sc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltYm9sc1tpXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duOiBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlfbW9kZSA9PT0gMSAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfb3duX29ubHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgICAgICAgICAgICAgICBvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChvYmopO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYWRkTmFtZSA9IGZ1bmN0aW9uIChyZXQsIG5hbWUsIGtleV9maWx0ZXIsIGNvbnZlcnNpb25fbW9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0LmluZGV4T2YobmFtZSkgIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVyc2lvbl9tb2RlID09PSAwIC8qIG5hcGlfa2V5X2NvbnZlcnNpb24ubmFwaV9rZXlfa2VlcF9udW1iZXJzICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb252ZXJzaW9uX21vZGUgPT09IDEgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9udW1iZXJzX3RvX3N0cmluZ3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWFsTmFtZSA9IHR5cGVvZiBuYW1lID09PSAnbnVtYmVyJyA/IFN0cmluZyhuYW1lKSA6IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWxOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGtleV9maWx0ZXIgJiA4IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9za2lwX3N0cmluZ3MgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHJlYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChyZWFsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gcHJvcC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHByb3AuZGVzYztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9maWx0ZXIgPT09IDAgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2FsbF9wcm9wZXJ0aWVzICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lKHJldCwgbmFtZV8xLCBrZXlfZmlsdGVyLCBrZXlfY29udmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciAmIDggLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3RyaW5ncyAqLyAmJiB0eXBlb2YgbmFtZV8xID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9maWx0ZXIgJiAxNiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zeW1ib2xzICovICYmIHR5cGVvZiBuYW1lXzEgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkQWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5X2ZpbHRlciAmIDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3dyaXRhYmxlICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovKToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2Mud3JpdGFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfY29uZmlndXJhYmxlICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoNCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfY29uZmlndXJhYmxlICovIHwgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovKToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2MuY29uZmlndXJhYmxlICYmIGRlc2MuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovIHwgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlICYmIGRlc2Mud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZShyZXQsIG5hbWVfMSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShyZXQpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfcHJvcGVydHlfbmFtZXMoZW52LCBvYmplY3QsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lcyhlbnYsIG9iamVjdCwgMCAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfaW5jbHVkZV9wcm90b3R5cGVzICovLCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovIHwgMTYgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3ltYm9scyAqLywgMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoLnZhbHVlW2VtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9oYXNfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHZbZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlLZXkgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGgudmFsdWUsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZGVsZXRlIGgudmFsdWVbcHJvcGVydHlLZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX293bl9wcm9wZXJ0eShlbnYsIG9iamVjdCwga2V5LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIGNuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCkudmFsdWVbZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjbmFtZSwgLTEpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2hhc19uYW1lZF9wcm9wZXJ0eShlbnYsIG9iamVjdCwgdXRmOG5hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGY4bmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSkgaW4gdjtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eShlbnYsIG9iamVjdCwgdXRmOG5hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSldKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmICghKGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGgudmFsdWVbaW5kZXggPj4+IDBdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX2VsZW1lbnQoZW52LCBvYmplY3QsIGluZGV4LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgciA9ICgoaW5kZXggPj4+IDApIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2VsZW1lbnQoZW52LCBvYmplY3QsIGluZGV4LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh2W2luZGV4ID4+PiAwXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGgudmFsdWUsIGluZGV4ID4+PiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZGVsZXRlIGgudmFsdWVbaW5kZXggPj4+IDBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVmaW5lX3Byb3BlcnRpZXMoZW52LCBvYmplY3QsIHByb3BlcnR5X2NvdW50LCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcHJvcFB0ciwgYXR0cmlidXRlcztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIG1heWJlT2JqZWN0ID0gaC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMiA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzIpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgbWF5YmVPYmplY3QsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfb2JqZWN0X2ZyZWV6ZShlbnYsIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9zZWFsKGVudiwgb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIG1heWJlT2JqZWN0ID0gaC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3Quc2VhbChtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcGVydHlNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9kZWZpbmVfcHJvcGVydGllczogbmFwaV9kZWZpbmVfcHJvcGVydGllcyxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2VsZW1lbnQ6IG5hcGlfZGVsZXRlX2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2RlbGV0ZV9wcm9wZXJ0eTogbmFwaV9kZWxldGVfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9hbGxfcHJvcGVydHlfbmFtZXM6IG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lcyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2VsZW1lbnQ6IG5hcGlfZ2V0X2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eTogbmFwaV9nZXRfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9wcm9wZXJ0eTogbmFwaV9nZXRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lczogbmFwaV9nZXRfcHJvcGVydHlfbmFtZXMsXG4gICAgICAgICAgICBuYXBpX2hhc19lbGVtZW50OiBuYXBpX2hhc19lbGVtZW50LFxuICAgICAgICAgICAgbmFwaV9oYXNfbmFtZWRfcHJvcGVydHk6IG5hcGlfaGFzX25hbWVkX3Byb3BlcnR5LFxuICAgICAgICAgICAgbmFwaV9oYXNfb3duX3Byb3BlcnR5OiBuYXBpX2hhc19vd25fcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2hhc19wcm9wZXJ0eTogbmFwaV9oYXNfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX29iamVjdF9mcmVlemU6IG5hcGlfb2JqZWN0X2ZyZWV6ZSxcbiAgICAgICAgICAgIG5hcGlfb2JqZWN0X3NlYWw6IG5hcGlfb2JqZWN0X3NlYWwsXG4gICAgICAgICAgICBuYXBpX3NldF9lbGVtZW50OiBuYXBpX3NldF9lbGVtZW50LFxuICAgICAgICAgICAgbmFwaV9zZXRfbmFtZWRfcHJvcGVydHk6IG5hcGlfc2V0X25hbWVkX3Byb3BlcnR5LFxuICAgICAgICAgICAgbmFwaV9zZXRfcHJvcGVydHk6IG5hcGlfc2V0X3Byb3BlcnR5XG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9ydW5fc2NyaXB0KGVudiwgc2NyaXB0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBzdGF0dXM7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JpcHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHY4U2NyaXB0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIGlmICghdjhTY3JpcHQuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KDUgLyogR2xvYmFsSGFuZGxlLkdMT0JBTCAqLykudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IGcuZXZhbCh2OFNjcmlwdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY3JpcHRNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9ydW5fc2NyaXB0OiBuYXBpX3J1bl9zY3JpcHRcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3R5cGVvZihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAodi5pc051bWJlcigpKSB7XG4gICAgICAgICAgICAgICAgciA9IDMgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9udW1iZXIgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzQmlnSW50KCkpIHtcbiAgICAgICAgICAgICAgICByID0gOSAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2JpZ2ludCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgIHIgPSA0IC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfc3RyaW5nICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGNvbWUgYmVmb3JlIElzT2JqZWN0IGJlY2F1c2UgSXNGdW5jdGlvblxuICAgICAgICAgICAgICAgIC8vIGltcGxpZXMgSXNPYmplY3RcbiAgICAgICAgICAgICAgICByID0gNyAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2Z1bmN0aW9uICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0V4dGVybmFsKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGNvbWUgYmVmb3JlIElzT2JqZWN0IGJlY2F1c2UgSXNFeHRlcm5hbFxuICAgICAgICAgICAgICAgIC8vIGltcGxpZXMgSXNPYmplY3RcbiAgICAgICAgICAgICAgICByID0gOCAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2V4dGVybmFsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc09iamVjdCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDYgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9vYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzQm9vbGVhbigpKSB7XG4gICAgICAgICAgICAgICAgciA9IDIgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9ib29sZWFuICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc1VuZGVmaW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDAgLyogbmFwaV92YWx1ZXR5cGUubmFwaV91bmRlZmluZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzU3ltYm9sKCkpIHtcbiAgICAgICAgICAgICAgICByID0gNSAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX3N5bWJvbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNOdWxsKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgciA9IDEgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9udWxsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBnZXQgaGVyZSB1bmxlc3MgVjggaGFzIGFkZGVkIHNvbWUgbmV3IGtpbmQgb2YgdmFsdWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZSA/IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8gOiAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fbnVtYmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgQmlnSW50IHZhbHVlIHRvIGEgbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKE51bWJlcihoYW5kbGUudmFsdWUpKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fb2JqZWN0KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChPYmplY3QoaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY29lcmNlX3RvX3N0cmluZyhlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuaXNTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTdHJpbmcoaGFuZGxlLnZhbHVlKSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2luc3RhbmNlb2YoZW52LCBvYmplY3QsIGNvbnN0cnVjdG9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIGN0b3IgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIWN0b3IuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDUgLyogbmFwaV9zdGF0dXMubmFwaV9mdW5jdGlvbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCkudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IHZhbCBpbnN0YW5jZW9mIGN0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgciA9IHJldCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2FycmF5KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNBcnJheSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2FycmF5YnVmZmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNBcnJheUJ1ZmZlcigpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2RhdGUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0RhdGUoKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19lcnJvcihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgdmFsID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9ICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfdHlwZWRhcnJheShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzVHlwZWRBcnJheSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2J1ZmZlcihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzQnVmZmVyKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGF0YXZpZXcoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0RhdGFWaWV3KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3N0cmljdF9lcXVhbHMoZW52LCBsaHMsIHJocywgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJocylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgbHYgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGxocykudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJ2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyaHMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHIgPSAobHYgPT09IHJ2KSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZXRhY2hfYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFhcnJheWJ1ZmZlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcikudmFsdWU7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgKHZhbHVlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIwIC8qIG5hcGlfc3RhdHVzLm5hcGlfZGV0YWNoYWJsZV9hcnJheWJ1ZmZlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDE5IC8qIG5hcGlfc3RhdHVzLm5hcGlfYXJyYXlidWZmZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlQ2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbF8xKCk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodmFsdWUsIFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19kZXRhY2hlZF9hcnJheWJ1ZmZlcihlbnYsIGFycmF5YnVmZmVyLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoaC5pc0FycmF5QnVmZmVyKCkgJiYgaC52YWx1ZS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVPcGVyYXRpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fYm9vbDogbmFwaV9jb2VyY2VfdG9fYm9vbCxcbiAgICAgICAgICAgIG5hcGlfY29lcmNlX3RvX251bWJlcjogbmFwaV9jb2VyY2VfdG9fbnVtYmVyLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fb2JqZWN0OiBuYXBpX2NvZXJjZV90b19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX2NvZXJjZV90b19zdHJpbmc6IG5hcGlfY29lcmNlX3RvX3N0cmluZyxcbiAgICAgICAgICAgIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyOiBuYXBpX2RldGFjaF9hcnJheWJ1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfaW5zdGFuY2VvZjogbmFwaV9pbnN0YW5jZW9mLFxuICAgICAgICAgICAgbmFwaV9pc19hcnJheTogbmFwaV9pc19hcnJheSxcbiAgICAgICAgICAgIG5hcGlfaXNfYXJyYXlidWZmZXI6IG5hcGlfaXNfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2J1ZmZlcjogbmFwaV9pc19idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2RhdGF2aWV3OiBuYXBpX2lzX2RhdGF2aWV3LFxuICAgICAgICAgICAgbmFwaV9pc19kYXRlOiBuYXBpX2lzX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyOiBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9pc19lcnJvcjogbmFwaV9pc19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfaXNfdHlwZWRhcnJheTogbmFwaV9pc190eXBlZGFycmF5LFxuICAgICAgICAgICAgbmFwaV9zdHJpY3RfZXF1YWxzOiBuYXBpX3N0cmljdF9lcXVhbHMsXG4gICAgICAgICAgICBuYXBpX3R5cGVvZjogbmFwaV90eXBlb2ZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZlcnNpb24oZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSA5IC8qIFZlcnNpb24uTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZlcnNpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmVyc2lvbjogbmFwaV9nZXRfdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgZW1uYXBpQVdTVC5pbml0KCk7XG4gICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LmluaXQoKTtcbiAgICAgICAgZW1uYXBpU3RyaW5nLmluaXQoKTtcbiAgICAgICAgZW1uYXBpVFNGTi5pbml0KCk7XG4gICAgICAgIG5hcGlNb2R1bGUuZW1uYXBpLnN5bmNNZW1vcnkgPSAkZW1uYXBpU3luY01lbW9yeTtcbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuZ2V0TWVtb3J5QWRkcmVzcyA9ICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzO1xuICAgICAgICBmdW5jdGlvbiBhZGRJbXBvcnRzKG1vZCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhtb2QpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YoJyQnKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZignZW1uYXBpXycpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGlba10gPSBtb2Rba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZignX2VtbmFwaV8nKSA9PT0gMCB8fCBrID09PSAnbmFwaV9zZXRfbGFzdF9lcnJvcicgfHwgayA9PT0gJ25hcGlfY2xlYXJfbGFzdF9lcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVudltrXSA9IG1vZFtrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpW2tdID0gbW9kW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZGRJbXBvcnRzKGFzeW5jTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhtZW1vcnlNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGFzeW5jV29ya01vZCk7XG4gICAgICAgIGFkZEltcG9ydHModXRpbE1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoY29udmVydDJjTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhjb252ZXJ0Mm5hcGlNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGNyZWF0ZU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZ2xvYmFsTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh3cmFwTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhlbnZNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGVtbmFwaU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZXJyb3JNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGZ1bmN0aW9uTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhsaWZlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhtaXNjZWxsYW5lb3VzTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhub2RlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhwcm9taXNlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhwcm9wZXJ0eU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoc2NyaXB0TW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh2YWx1ZU9wZXJhdGlvbk1vZCk7XG4gICAgICAgIGFkZEltcG9ydHModmVyc2lvbk1vZCk7XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2NyZWF0ZV90aHJlYWRzYWZlX2Z1bmN0aW9uO1xuICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMubmFwaS5uYXBpX2dldF90aHJlYWRzYWZlX2Z1bmN0aW9uX2NvbnRleHQgPSBuYXBpX2dldF90aHJlYWRzYWZlX2Z1bmN0aW9uX2NvbnRleHQ7XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfY2FsbF90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfYWNxdWlyZV90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9hY3F1aXJlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfcmVsZWFzZV90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9yZWxlYXNlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfcmVmX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIHJldHVybiBuYXBpTW9kdWxlO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIG5hcGlNb2R1bGU7XG59XG5cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlSW1wbChsb2FkRm4sIHVzZXJOYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1hc3NlcnRpb25zXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgIHZhciBnZXRNZW1vcnkgPSBvcHRpb25zLmdldE1lbW9yeTtcbiAgICB2YXIgZ2V0VGFibGUgPSBvcHRpb25zLmdldFRhYmxlO1xuICAgIHZhciBiZWZvcmVJbml0ID0gb3B0aW9ucy5iZWZvcmVJbml0O1xuICAgIGlmIChnZXRNZW1vcnkgIT0gbnVsbCAmJiB0eXBlb2YgZ2V0TWVtb3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuZ2V0TWVtb3J5IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGlmIChnZXRUYWJsZSAhPSBudWxsICYmIHR5cGVvZiBnZXRUYWJsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmdldFRhYmxlIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGlmIChiZWZvcmVJbml0ICE9IG51bGwgJiYgdHlwZW9mIGJlZm9yZUluaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5iZWZvcmVJbml0IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHZhciBuYXBpTW9kdWxlO1xuICAgIHZhciBpc0xvYWQgPSB0eXBlb2YgdXNlck5hcGlNb2R1bGUgPT09ICdvYmplY3QnICYmIHVzZXJOYXBpTW9kdWxlICE9PSBudWxsO1xuICAgIGlmIChpc0xvYWQpIHtcbiAgICAgICAgaWYgKHVzZXJOYXBpTW9kdWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpTW9kdWxlIGhhcyBhbHJlYWR5IGxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIG5hcGlNb2R1bGUgPSB1c2VyTmFwaU1vZHVsZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5hcGlNb2R1bGUgPSBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YXIgd2FzaSA9IG9wdGlvbnMud2FzaTtcbiAgICB2YXIgaW1wb3J0T2JqZWN0ID0ge1xuICAgICAgICBlbnY6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYsXG4gICAgICAgIG5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLFxuICAgICAgICBlbW5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGksXG4gICAgICAgIHdhc2k6IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICAgICAgICAgICd0aHJlYWQtc3Bhd24nOiBmdW5jdGlvbiBfX2ltcG9ydGVkX3dhc2lfdGhyZWFkX3NwYXduKHN0YXJ0QXJnLCBlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hcGlNb2R1bGUuc3Bhd25UaHJlYWQoc3RhcnRBcmcsIGVycm9yT3JUaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAod2FzaSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGltcG9ydE9iamVjdCwgdHlwZW9mIHdhc2kuZ2V0SW1wb3J0T2JqZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHdhc2kuZ2V0SW1wb3J0T2JqZWN0KClcbiAgICAgICAgICAgIDogeyB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpLndhc2lJbXBvcnQgfSk7XG4gICAgfVxuICAgIHZhciBvdmVyd3JpdGVJbXBvcnRzID0gb3B0aW9ucy5vdmVyd3JpdGVJbXBvcnRzO1xuICAgIGlmICh0eXBlb2Ygb3ZlcndyaXRlSW1wb3J0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbmV3SW1wb3J0T2JqZWN0ID0gb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG5ld0ltcG9ydE9iamVjdCA9PT0gJ29iamVjdCcgJiYgbmV3SW1wb3J0T2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpbXBvcnRPYmplY3QgPSBuZXdJbXBvcnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRGbih3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgZnVuY3Rpb24gKGVyciwgc291cmNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3JpZ2luYWxJbnN0YW5jZSA9IHNvdXJjZS5pbnN0YW5jZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gb3JpZ2luYWxJbnN0YW5jZTtcbiAgICAgICAgdmFyIG9yaWdpbmFsRXhwb3J0cyA9IG9yaWdpbmFsSW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgdmFyIGV4cG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIG9yaWdpbmFsRXhwb3J0cztcbiAgICAgICAgdmFyIGltcG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIGltcG9ydE9iamVjdC5lbnY7XG4gICAgICAgIHZhciBtZW1vcnkgPSBnZXRNZW1vcnlcbiAgICAgICAgICAgID8gZ2V0TWVtb3J5KG9yaWdpbmFsRXhwb3J0cylcbiAgICAgICAgICAgIDogZXhwb3J0TWVtb3J5XG4gICAgICAgICAgICAgICAgPyBvcmlnaW5hbEV4cG9ydHMubWVtb3J5XG4gICAgICAgICAgICAgICAgOiBpbXBvcnRNZW1vcnlcbiAgICAgICAgICAgICAgICAgICAgPyBpbXBvcnRPYmplY3QuZW52Lm1lbW9yeVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb3J5IGlzIG5laXRoZXIgZXhwb3J0ZWQgbm9yIGltcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUgPyBnZXRUYWJsZShvcmlnaW5hbEV4cG9ydHMpIDogb3JpZ2luYWxFeHBvcnRzLl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGU7XG4gICAgICAgIGlmICh3YXNpICYmICFleHBvcnRNZW1vcnkpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRzXzEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleHBvcnRzXzEsIG9yaWdpbmFsRXhwb3J0cywgeyBtZW1vcnk6IG1lbW9yeSB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0geyBleHBvcnRzOiBleHBvcnRzXzEgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kdWxlID0gc291cmNlLm1vZHVsZTtcbiAgICAgICAgaWYgKHdhc2kpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9oZWxwL2lzc3Vlcy80MTAyXG4gICAgICAgICAgICAgICAgdmFyIGNyZWF0ZUhhbmRsZXIgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcHBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uc3RydWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVQcm9wZXJ0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVsZXRlUHJvcGVydHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdnZXRQcm90b3R5cGVPZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaGFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVuc2libGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ293bktleXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRFeHRlbnNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NldFByb3RvdHlwZU9mJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gaGFuZGxlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyW25hbWVfMV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0W25hbWVfMV0uYXBwbHkoUmVmbGVjdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBjcmVhdGVIYW5kbGVyKG9yaWdpbmFsRXhwb3J0cyk7XG4gICAgICAgICAgICAgICAgdmFyIG5vb3BfMSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmdldCA9IGZ1bmN0aW9uIChfdGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gJ21lbW9yeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09ICdfaW5pdGlhbGl6ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub29wXzE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9yaWdpbmFsRXhwb3J0cywgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGV4cG9ydHNQcm94eV8xID0gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCksIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFByb3h5KGluc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwID09PSAnZXhwb3J0cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0c1Byb3h5XzE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhc2kuaW5pdGlhbGl6ZShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZUluaXQpIHtcbiAgICAgICAgICAgIGJlZm9yZUluaXQoe1xuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBvcmlnaW5hbEluc3RhbmNlLFxuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBuYXBpTW9kdWxlLmluaXQoe1xuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSxcbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJldCA9IHsgaW5zdGFuY2U6IG9yaWdpbmFsSW5zdGFuY2UsIG1vZHVsZTogbW9kdWxlIH07XG4gICAgICAgIGlmICghaXNMb2FkKSB7XG4gICAgICAgICAgICByZXQubmFwaU1vZHVsZSA9IG5hcGlNb2R1bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxvYWRDYWxsYmFjayh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbG9hZCh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCkudGhlbihmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBsb2FkU3luY0NhbGxiYWNrKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0LCBjYWxsYmFjaykge1xuICAgIHZhciBzb3VyY2U7XG4gICAgdHJ5IHtcbiAgICAgICAgc291cmNlID0gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRPYmplY3QpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBsb2FkTmFwaU1vZHVsZShuYXBpTW9kdWxlLCBcbi8qKiBPbmx5IHN1cHBvcnQgYEJ1ZmZlclNvdXJjZWAgb3IgYFdlYkFzc2VtYmx5Lk1vZHVsZWAgb24gTm9kZS5qcyAqL1xud2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBuYXBpTW9kdWxlICE9PSAnb2JqZWN0JyB8fCBuYXBpTW9kdWxlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbmFwaU1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRDYWxsYmFjaywgbmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBsb2FkTmFwaU1vZHVsZVN5bmMobmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBuYXBpTW9kdWxlICE9PSAnb2JqZWN0JyB8fCBuYXBpTW9kdWxlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbmFwaU1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRTeW5jQ2FsbGJhY2ssIG5hcGlNb2R1bGUsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gaW5zdGFudGlhdGVOYXBpTW9kdWxlKFxuLyoqIE9ubHkgc3VwcG9ydCBgQnVmZmVyU291cmNlYCBvciBgV2ViQXNzZW1ibHkuTW9kdWxlYCBvbiBOb2RlLmpzICovXG53YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRDYWxsYmFjaywgdW5kZWZpbmVkLCB3YXNtSW5wdXQsIG9wdGlvbnMpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMod2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGxvYWROYXBpTW9kdWxlSW1wbChsb2FkU3luY0NhbGxiYWNrLCB1bmRlZmluZWQsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG5cbi8qKiBAcHVibGljICovXG52YXIgTWVzc2FnZUhhbmRsZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIob3B0aW9ucykge1xuICAgICAgICB2YXIgb25Mb2FkID0gb3B0aW9ucy5vbkxvYWQ7XG4gICAgICAgIGlmICh0eXBlb2Ygb25Mb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLm9uTG9hZCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Mb2FkID0gb25Mb2FkO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyB0aGlzLm1vZHVsZSA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLm5hcGlNb2R1bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgfVxuICAgIE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZS5kYXRhLl9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkXzEgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIG9uTG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gb25Mb2FkKHBheWxvYWRfMSk7XG4gICAgICAgICAgICAgICAgdmFyIHRoZW4gPSBzb3VyY2UgJiYgJ3RoZW4nIGluIHNvdXJjZSA/IHNvdXJjZS50aGVuIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbChzb3VyY2UsIGZ1bmN0aW9uIChzb3VyY2UpIHsgb25Mb2FkZWQuY2FsbChfdGhpcywgc291cmNlKTsgfSwgZnVuY3Rpb24gKGVycikgeyB0aHJvdyBlcnI7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkZWQuY2FsbCh0aGlzLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVBZnRlckxvYWQuY2FsbCh0aGlzLCBlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm5hcGlNb2R1bGUuc3RhcnRUaHJlYWQocGF5bG9hZF8xLnRpZCwgcGF5bG9hZF8xLmFyZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29ya2VyLWluaXQnKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQWZ0ZXJMb2FkLmNhbGwodGhpcywgZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5uYXBpTW9kdWxlLmluaXRXb3JrZXIocGF5bG9hZF8xLmFyZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1leGVjdXRlJykge1xuICAgICAgICAgICAgICAgIGhhbmRsZUFmdGVyTG9hZC5jYWxsKHRoaXMsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrKHBheWxvYWRfMS53b3JrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lc3NhZ2VIYW5kbGVyO1xufSgpKTtcbmZ1bmN0aW9uIGhhbmRsZUFmdGVyTG9hZChlLCBmKSB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmLmNhbGwodGhpcywgZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzQmVmb3JlTG9hZC5wdXNoKGUuZGF0YSk7XG4gICAgfVxufVxuZnVuY3Rpb24gb25Mb2FkZWQoc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29uTG9hZCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICB2YXIgaW5zdGFuY2UgPSBzb3VyY2UuaW5zdGFuY2U7XG4gICAgdmFyIG5hcGlNb2R1bGUgPSBzb3VyY2UubmFwaU1vZHVsZTtcbiAgICBpZiAoIWluc3RhbmNlKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvbkxvYWQgc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaW5jbHVkZXMgXCJpbnN0YW5jZVwiJyk7XG4gICAgaWYgKCFuYXBpTW9kdWxlKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvbkxvYWQgc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaW5jbHVkZXMgXCJuYXBpTW9kdWxlXCInKTtcbiAgICBpZiAoIW5hcGlNb2R1bGUuY2hpbGRUaHJlYWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmFwaU1vZHVsZSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGBjaGlsZFRocmVhZDogdHJ1ZWAnKTtcbiAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgdGhpcy5uYXBpTW9kdWxlID0gbmFwaU1vZHVsZTtcbiAgICB2YXIgcG9zdE1lc3NhZ2UgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgdHlwZTogJ2xvYWRlZCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQ7XG4gICAgdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWVzc2FnZXNbaV07XG4gICAgICAgIHRoaXMuaGFuZGxlKHsgZGF0YTogZGF0YSB9KTtcbiAgICB9XG59XG5cbnZhciB2ZXJzaW9uID0gXCIxLjEuMVwiO1xuXG5leHBvcnQgeyBNZXNzYWdlSGFuZGxlciwgY3JlYXRlTmFwaU1vZHVsZSwgaW5zdGFudGlhdGVOYXBpTW9kdWxlLCBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jLCBsb2FkTmFwaU1vZHVsZSwgbG9hZE5hcGlNb2R1bGVTeW5jLCB2ZXJzaW9uIH07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlO1xuICAgIGlmIChhc3luYykge1xuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSAndHNsaWInO1xuXG52YXIgRU1QVFlfQVJHUyA9IFtdO1xudmFyIENhbGxiYWNrSW5mbyA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxsYmFja0luZm8oaWQsIHBhcmVudCwgY2hpbGQsIHRoaXosIGRhdGEsIGFyZ3MsIGZuKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDtcbiAgICAgICAgdGhpcy50aGl6ID0gdGhpejtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgdGhpcy5mbiA9IGZuO1xuICAgIH1cbiAgICBDYWxsYmFja0luZm8ucHJvdG90eXBlLmdldE5ld1RhcmdldCA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIHRoaXogPSB0aGlzLnRoaXo7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW9wdGlvbmFsLWNoYWluXG4gICAgICAgIGlmICh0aGl6ID09IG51bGwgfHwgdGhpei5jb25zdHJ1Y3RvciA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGl6IGluc3RhbmNlb2YgdGhpcy5mbiA/IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh0aGl6LmNvbnN0cnVjdG9yKSA6IDA7XG4gICAgfTtcbiAgICBDYWxsYmFja0luZm8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRoaXogIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMudGhpeiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hcmdzID0gRU1QVFlfQVJHUztcbiAgICAgICAgdGhpcy5mbiA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FsbGJhY2tJbmZvO1xufSgpKTtcbnZhciBST09UX0NCSU5GTyA9IG5ldyBDYWxsYmFja0luZm8oMCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7XG52YXIgQ2FsbGJhY2tJbmZvU3RhY2sgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FsbGJhY2tJbmZvU3RhY2soKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFJPT1RfQ0JJTkZPO1xuICAgIH1cbiAgICBDYWxsYmFja0luZm9TdGFjay5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChpZCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBST09UX0NCSU5GTy5jaGlsZDtcbiAgICAgICAgdmFyIGluZm8gPSBST09UX0NCSU5GTztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZDsgKytpKSB7XG4gICAgICAgICAgICBpbmZvID0gaW5mby5jaGlsZDtcbiAgICAgICAgICAgIGlmIChpbmZvID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvID09PSBST09UX0NCSU5GTyA/IG51bGwgOiBpbmZvO1xuICAgIH07XG4gICAgQ2FsbGJhY2tJbmZvU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ID09PSBST09UX0NCSU5GTylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIGN1cnJlbnQuZGlzcG9zZSgpO1xuICAgIH07XG4gICAgQ2FsbGJhY2tJbmZvU3RhY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodGhpeiwgZGF0YSwgYXJncywgZm4pIHtcbiAgICAgICAgdmFyIGluZm8gPSB0aGlzLmN1cnJlbnQuY2hpbGQ7XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICBpbmZvLnRoaXogPSB0aGl6O1xuICAgICAgICAgICAgaW5mby5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGluZm8uYXJncyA9IGFyZ3M7XG4gICAgICAgICAgICBpbmZvLmZuID0gZm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmZvID0gbmV3IENhbGxiYWNrSW5mbyh0aGlzLmN1cnJlbnQuaWQgKyAxLCB0aGlzLmN1cnJlbnQsIG51bGwsIHRoaXosIGRhdGEsIGFyZ3MsIGZuKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5jaGlsZCA9IGluZm87XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gaW5mbztcbiAgICAgICAgcmV0dXJuIGluZm8uaWQ7XG4gICAgfTtcbiAgICBDYWxsYmFja0luZm9TdGFjay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBDYWxsYmFja0luZm9TdGFjaztcbn0oKSk7XG5cbnZhciBzdXBwb3J0TmV3RnVuY3Rpb24gPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGY7XG4gICAgdHJ5IHtcbiAgICAgICAgZiA9IG5ldyBGdW5jdGlvbigpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJztcbn0pKCk7XG52YXIgX2dsb2JhbCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgICB2YXIgZyA9IChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpO1xuICAgIGlmICghZyAmJiBzdXBwb3J0TmV3RnVuY3Rpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGcgPSBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgfVxuICAgIGlmICghZykge1xuICAgICAgICBpZiAodHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICByZXR1cm4gZztcbn0pKCk7XG52YXIgVHJ5Q2F0Y2ggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJ5Q2F0Y2goKSB7XG4gICAgICAgIHRoaXMuX2V4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY2F1Z2h0ID0gZmFsc2U7XG4gICAgfVxuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2NhdWdodDtcbiAgICB9O1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5oYXNDYXVnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXVnaHQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuZXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjZXB0aW9uO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLnNldEVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLl9jYXVnaHQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSBlcnI7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NhdWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuZXh0cmFjdEV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9leGNlcHRpb247XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJ5Q2F0Y2g7XG59KCkpO1xudmFyIGNhblNldEZ1bmN0aW9uTmFtZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oKF9hID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb25maWd1cmFibGUpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSkoKTtcbnZhciBzdXBwb3J0UmVmbGVjdCA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JztcbnZhciBzdXBwb3J0RmluYWxpemVyID0gKHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgV2Vha1JlZiAhPT0gJ3VuZGVmaW5lZCcpO1xudmFyIHN1cHBvcnRXZWFrU3ltYm9sID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzeW1ib2wtZGVzY3JpcHRpb25cbiAgICAgICAgdmFyIHN5bSA9IFN5bWJvbCgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgIG5ldyBXZWFrUmVmKHN5bSk7XG4gICAgICAgIG5ldyBXZWFrTWFwKCkuc2V0KHN5bSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0pKCk7XG52YXIgc3VwcG9ydEJpZ0ludCA9IHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaXNSZWZlcmVuY2VUeXBlKHYpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB8fCB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJztcbn1cbnZhciBfcmVxdWlyZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmF0aXZlUmVxdWlyZTtcbiAgICBpZiAodHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBuYXRpdmVSZXF1aXJlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgX19ub25fd2VicGFja19yZXF1aXJlX18gIT09ICd1bmRlZmluZWQnID8gX19ub25fd2VicGFja19yZXF1aXJlX18gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBuYXRpdmVSZXF1aXJlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gIT09ICd1bmRlZmluZWQnID8gKHR5cGVvZiBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAhPT0gJ3VuZGVmaW5lZCcgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHVuZGVmaW5lZCkgOiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnID8gcmVxdWlyZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZXF1aXJlO1xufSkoKTtcbnZhciBfTWVzc2FnZUNoYW5uZWwgPSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICdmdW5jdGlvbidcbiAgICA/IE1lc3NhZ2VDaGFubmVsXG4gICAgOiAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykuTWVzc2FnZUNoYW5uZWw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pKCk7XG52YXIgX3NldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbidcbiAgICA/IHNldEltbWVkaWF0ZVxuICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxfMSA9IG5ldyBfTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbF8xLnBvcnQxLm9ubWVzc2FnZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2hhbm5lbF8xID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2hhbm5lbF8xLnBvcnQyLnBvc3RNZXNzYWdlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgMCk7XG4gICAgICAgIH1cbiAgICB9O1xudmFyIF9CdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nXG4gICAgPyBCdWZmZXJcbiAgICA6IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSgpO1xudmFyIHZlcnNpb24gPSBcIjEuMS4xXCI7XG52YXIgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUlOID0gMSAvKiBWZXJzaW9uLk5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiAqLztcbnZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSA5IC8qIFZlcnNpb24uTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYICovO1xudmFyIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgPSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLztcbnZhciBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTiA9IDggLyogVmVyc2lvbi5OT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTiAqLztcblxudmFyIEhhbmRsZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBIYW5kbGUoaWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBIYW5kbGUucHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh0aGlzLnZhbHVlKS5kYXRhO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc051bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCaWdJbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdmdW5jdGlvbic7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRXh0ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2VUeXBlKHRoaXMudmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLnZhbHVlKSA9PT0gbnVsbCk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdvYmplY3QnICYmIHRoaXMudmFsdWUgIT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy52YWx1ZSkpICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgX0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBfQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0RhdGFWaWV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRhVmlldyk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1N5bWJvbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3ltYm9sJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNOdWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gbnVsbDtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGU7XG59KCkpO1xudmFyIENvbnN0SGFuZGxlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb25zdEhhbmRsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25zdEhhbmRsZShpZCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGlkLCB2YWx1ZSkgfHwgdGhpcztcbiAgICB9XG4gICAgQ29uc3RIYW5kbGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgcmV0dXJuIENvbnN0SGFuZGxlO1xufShIYW5kbGUpKTtcbmZ1bmN0aW9uIEV4dGVybmFsKCkge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBudWxsKTtcbn1cbkV4dGVybmFsLnByb3RvdHlwZSA9IG51bGw7XG52YXIgSGFuZGxlU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGFuZGxlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlVOREVGSU5FRCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLk5VTEwsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5GQUxTRSxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlRSVUUsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5HTE9CQUxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5fbmV4dCA9IEhhbmRsZVN0b3JlLk1JTl9JRDtcbiAgICB9XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgaWYgKG5leHQgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoID0gdmFsdWVzW25leHRdO1xuICAgICAgICAgICAgaC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaCA9IG5ldyBIYW5kbGUobmV4dCwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVzW25leHRdID0gaDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZXh0Kys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmVyYXNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IHN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzW2ldLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIEhhbmRsZVN0b3JlLnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgdmFyIGggPSB2YWx1ZXNbYV07XG4gICAgICAgIHZhbHVlc1thXSA9IHZhbHVlc1tiXTtcbiAgICAgICAgdmFsdWVzW2FdLmlkID0gTnVtYmVyKGEpO1xuICAgICAgICB2YWx1ZXNbYl0gPSBoO1xuICAgICAgICBoLmlkID0gTnVtYmVyKGIpO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgICAgIHRoaXMuX25leHQgPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgfTtcbiAgICBIYW5kbGVTdG9yZS5VTkRFRklORUQgPSBuZXcgQ29uc3RIYW5kbGUoMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovLCB1bmRlZmluZWQpO1xuICAgIEhhbmRsZVN0b3JlLk5VTEwgPSBuZXcgQ29uc3RIYW5kbGUoMiAvKiBHbG9iYWxIYW5kbGUuTlVMTCAqLywgbnVsbCk7XG4gICAgSGFuZGxlU3RvcmUuRkFMU0UgPSBuZXcgQ29uc3RIYW5kbGUoMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8sIGZhbHNlKTtcbiAgICBIYW5kbGVTdG9yZS5UUlVFID0gbmV3IENvbnN0SGFuZGxlKDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8sIHRydWUpO1xuICAgIEhhbmRsZVN0b3JlLkdMT0JBTCA9IG5ldyBDb25zdEhhbmRsZSg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8sIF9nbG9iYWwpO1xuICAgIEhhbmRsZVN0b3JlLk1JTl9JRCA9IDY7XG4gICAgcmV0dXJuIEhhbmRsZVN0b3JlO1xufSgpKTtcblxudmFyIEhhbmRsZVNjb3BlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZVNjb3BlKGhhbmRsZVN0b3JlLCBpZCwgcGFyZW50U2NvcGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IHN0YXJ0OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBoYW5kbGVTdG9yZTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFNjb3BlO1xuICAgICAgICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlICE9PSBudWxsKVxuICAgICAgICAgICAgcGFyZW50U2NvcGUuY2hpbGQgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLl9lc2NhcGVDYWxsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaCA9IHRoaXMuaGFuZGxlU3RvcmUucHVzaCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmFkZEV4dGVybmFsID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZGF0YSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBuZXcgRXh0ZXJuYWwoKTtcbiAgICAgICAgdmFyIGggPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLnB1c2godmFsdWUpO1xuICAgICAgICB2YXIgYmluZGluZyA9IGVudk9iamVjdC5pbml0T2JqZWN0QmluZGluZyh2YWx1ZSk7XG4gICAgICAgIGJpbmRpbmcuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmVuZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5lcmFzZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuX2VzY2FwZUNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChoYW5kbGUgPCB0aGlzLnN0YXJ0IHx8IGhhbmRsZSA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5zd2FwKGhhbmRsZSwgdGhpcy5zdGFydCk7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5nZXQodGhpcy5zdGFydCk7XG4gICAgICAgIHRoaXMuc3RhcnQrKztcbiAgICAgICAgdGhpcy5wYXJlbnQuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmVzY2FwZUNhbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VzY2FwZUNhbGxlZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGVTY29wZTtcbn0oKSk7XG5cbnZhciBTY29wZVN0b3JlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RTY29wZSA9IG5ldyBIYW5kbGVTY29wZShudWxsLCAwLCBudWxsLCAxLCBIYW5kbGVTdG9yZS5NSU5fSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICB9XG4gICAgU2NvcGVTdG9yZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gdGhpcy5fcm9vdFNjb3BlKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB2YXIgc2NvcGUgPSBjdXJyZW50U2NvcGUuY2hpbGQ7XG4gICAgICAgIGlmIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuc3RhcnQgPSBzY29wZS5lbmQgPSBjdXJyZW50U2NvcGUuZW5kO1xuICAgICAgICAgICAgc2NvcGUuX2VzY2FwZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NvcGUgPSBuZXcgSGFuZGxlU2NvcGUoZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZSwgY3VycmVudFNjb3BlLmlkICsgMSwgY3VycmVudFNjb3BlLCBjdXJyZW50U2NvcGUuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHNjb3BlO1xuICAgICAgICBlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcysrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTY29wZVN0b3JlLnByb3RvdHlwZS5jbG9zZVNjb3BlID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICBpZiAoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHNjb3BlLnBhcmVudDtcbiAgICAgICAgc2NvcGUuZGlzcG9zZSgpO1xuICAgICAgICBlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3Blcy0tO1xuICAgIH07XG4gICAgU2NvcGVTdG9yZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlU3RvcmUgPSBudWxsO1xuICAgICAgICAgICAgc2NvcGUuaWQgPSAwO1xuICAgICAgICAgICAgc2NvcGUucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0ID0gSGFuZGxlU3RvcmUuTUlOX0lEO1xuICAgICAgICAgICAgc2NvcGUuZW5kID0gSGFuZGxlU3RvcmUuTUlOX0lEO1xuICAgICAgICAgICAgc2NvcGUuX2VzY2FwZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gc2NvcGUuY2hpbGQ7XG4gICAgICAgICAgICBzY29wZS5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgICBzY29wZSA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBTY29wZVN0b3JlO1xufSgpKTtcblxudmFyIFJlZlRyYWNrZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVmVHJhY2tlcigpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ByZXYgPSBudWxsO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fcHJldiA9IGxpc3Q7XG4gICAgICAgIHRoaXMuX25leHQgPSBsaXN0Ll9uZXh0O1xuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5fbmV4dCA9IHRoaXM7XG4gICAgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2Ll9uZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXMuX3ByZXY7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgIH07XG4gICAgUmVmVHJhY2tlci5maW5hbGl6ZUFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHdoaWxlIChsaXN0Ll9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaXN0Ll9uZXh0LmZpbmFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZUcmFja2VyO1xufSgpKTtcblxudmFyIEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaW5hbGl6ZXIoZW52T2JqZWN0LCBfZmluYWxpemVDYWxsYmFjaywgX2ZpbmFsaXplRGF0YSwgX2ZpbmFsaXplSGludCkge1xuICAgICAgICBpZiAoX2ZpbmFsaXplQ2FsbGJhY2sgPT09IHZvaWQgMCkgeyBfZmluYWxpemVDYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKF9maW5hbGl6ZURhdGEgPT09IHZvaWQgMCkgeyBfZmluYWxpemVEYXRhID0gMDsgfVxuICAgICAgICBpZiAoX2ZpbmFsaXplSGludCA9PT0gdm9pZCAwKSB7IF9maW5hbGl6ZUhpbnQgPSAwOyB9XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrID0gX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IF9maW5hbGl6ZURhdGE7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IF9maW5hbGl6ZUhpbnQ7XG4gICAgfVxuICAgIEZpbmFsaXplci5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrOyB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplRGF0YTsgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLmhpbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9maW5hbGl6ZUhpbnQ7IH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5yZXNldEZpbmFsaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZmluYWxpemVDYWxsYmFjayA9IDA7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IDA7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IDA7XG4gICAgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbmFsaXplcjtcbn0oKSk7XG5cbnZhciBUcmFja2VkRmluYWxpemVyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUcmFja2VkRmluYWxpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYWNrZWRGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgIF90aGlzLl9wcmV2ID0gbnVsbDtcbiAgICAgICAgX3RoaXMubGluayghZmluYWxpemVfY2FsbGJhY2sgPyBlbnZPYmplY3QucmVmbGlzdCA6IGVudk9iamVjdC5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRyYWNrZWRGaW5hbGl6ZXIuZmluYWxpemVBbGwgPSBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICBSZWZUcmFja2VyLmZpbmFsaXplQWxsKGxpc3QpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIFJlZlRyYWNrZXIucHJvdG90eXBlLmxpbmsuY2FsbCh0aGlzLCBsaXN0KTtcbiAgICB9O1xuICAgIFRyYWNrZWRGaW5hbGl6ZXIucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUmVmVHJhY2tlci5wcm90b3R5cGUudW5saW5rLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBUcmFja2VkRmluYWxpemVyLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhY2tlZEZpbmFsaXplcihlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIFRyYWNrZWRGaW5hbGl6ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0LmRlcXVldWVGaW5hbGl6ZXIodGhpcyk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmluYWxpemVDb3JlKHRydWUpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemVDb3JlID0gZnVuY3Rpb24gKGRlbGV0ZU1lKSB7XG4gICAgICAgIHZhciBmaW5hbGl6ZV9jYWxsYmFjayA9IHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHZhciBmaW5hbGl6ZV9kYXRhID0gdGhpcy5fZmluYWxpemVEYXRhO1xuICAgICAgICB2YXIgZmluYWxpemVfaGludCA9IHRoaXMuX2ZpbmFsaXplSGludDtcbiAgICAgICAgdGhpcy5yZXNldEZpbmFsaXplcigpO1xuICAgICAgICB0aGlzLnVubGluaygpO1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIHZhciBjYXVnaHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZmluaSA9IE51bWJlcihmaW5hbGl6ZV9jYWxsYmFjayk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXIoZmluaSwgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVsZXRlTWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplcjtcbn0oRmluYWxpemVyKSk7XG5cbnZhciBSZWZCYXNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZCYXNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlZkJhc2UoZW52T2JqZWN0LCBpbml0aWFsX3JlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGVudk9iamVjdCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9yZWZjb3VudCA9IGluaXRpYWxfcmVmY291bnQ7XG4gICAgICAgIF90aGlzLl9vd25lcnNoaXAgPSBvd25lcnNoaXA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmQmFzZS5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplRGF0YTtcbiAgICB9O1xuICAgIFJlZkJhc2UucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICsrdGhpcy5fcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLS10aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZkJhc2UucHJvdG90eXBlLnJlZkNvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS5vd25lcnNoaXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vd25lcnNoaXA7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvcmUodGhpcy5fb3duZXJzaGlwID09PSAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLyk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmQmFzZTtcbn0oVHJhY2tlZEZpbmFsaXplcikpO1xuXG5mdW5jdGlvbiB0aHJvd05vZGVBcGlWZXJzaW9uRXJyb3IobW9kdWxlTmFtZSwgbW9kdWxlQXBpVmVyc2lvbikge1xuICAgIHZhciBlcnJvck1lc3NhZ2UgPSBcIlwiLmNvbmNhdChtb2R1bGVOYW1lLCBcIiByZXF1aXJlcyBOb2RlLUFQSSB2ZXJzaW9uIFwiKS5jb25jYXQobW9kdWxlQXBpVmVyc2lvbiwgXCIsIGJ1dCB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBvbmx5IHN1cHBvcnRzIHZlcnNpb24gXCIpLmNvbmNhdChOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIFwiIGFkZC1vbnMuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gaGFuZGxlVGhyb3coZW52T2JqZWN0LCB2YWx1ZSkge1xuICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IHZhbHVlO1xufVxudmFyIEVudiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnYoY3R4LCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9IG1vZHVsZUFwaVZlcnNpb247XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnBwcCA9IG1ha2VEeW5DYWxsX3ZwcHA7XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnAgPSBtYWtlRHluQ2FsbF92cDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgICAgICB0aGlzLm9wZW5IYW5kbGVTY29wZXMgPSAwO1xuICAgICAgICB0aGlzLmluc3RhbmNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2ggPSBuZXcgVHJ5Q2F0Y2goKTtcbiAgICAgICAgdGhpcy5yZWZzID0gMTtcbiAgICAgICAgdGhpcy5yZWZsaXN0ID0gbmV3IFJlZlRyYWNrZXIoKTtcbiAgICAgICAgdGhpcy5maW5hbGl6aW5nX3JlZmxpc3QgPSBuZXcgUmVmVHJhY2tlcigpO1xuICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzID0gW107XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0ge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8sXG4gICAgICAgICAgICBlbmdpbmVFcnJvckNvZGU6IDAsXG4gICAgICAgICAgICBlbmdpbmVSZXNlcnZlZDogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmluZGluZ01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS50ZXJtaW5hdGVkT3JUZXJtaW5hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlZnMrKztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVmcy0tO1xuICAgICAgICBpZiAodGhpcy5yZWZzID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5lbnN1cmVIYW5kbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmVuc3VyZUhhbmRsZSh2YWx1ZSk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmVuc3VyZUhhbmRsZUlkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZUhhbmRsZSh2YWx1ZSkuaWQ7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNsZWFyTGFzdEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdEVycm9yID0gdGhpcy5sYXN0RXJyb3I7XG4gICAgICAgIGlmIChsYXN0RXJyb3IuZXJyb3JDb2RlICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSAhPT0gMClcbiAgICAgICAgICAgIGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgPSAwO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSAwKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkID0gMDtcbiAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuc2V0TGFzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKGVuZ2luZV9lcnJvcl9jb2RlID09PSB2b2lkIDApIHsgZW5naW5lX2Vycm9yX2NvZGUgPSAwOyB9XG4gICAgICAgIGlmIChlbmdpbmVfcmVzZXJ2ZWQgPT09IHZvaWQgMCkgeyBlbmdpbmVfcmVzZXJ2ZWQgPSAwOyB9XG4gICAgICAgIHZhciBsYXN0RXJyb3IgPSB0aGlzLmxhc3RFcnJvcjtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lcnJvckNvZGUgIT09IGVycm9yX2NvZGUpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gZXJyb3JfY29kZTtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgIT09IGVuZ2luZV9lcnJvcl9jb2RlKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA9IGVuZ2luZV9lcnJvcl9jb2RlO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSBlbmdpbmVfcmVzZXJ2ZWQpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZW5naW5lUmVzZXJ2ZWQgPSBlbmdpbmVfcmVzZXJ2ZWQ7XG4gICAgICAgIHJldHVybiBlcnJvcl9jb2RlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRSZXR1cm5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyA6IHRoaXMuc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5jYWxsSW50b01vZHVsZSA9IGZ1bmN0aW9uIChmbiwgaGFuZGxlRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChoYW5kbGVFeGNlcHRpb24gPT09IHZvaWQgMCkgeyBoYW5kbGVFeGNlcHRpb24gPSBoYW5kbGVUaHJvdzsgfVxuICAgICAgICB2YXIgb3BlbkhhbmRsZVNjb3Blc0JlZm9yZSA9IHRoaXMub3BlbkhhbmRsZVNjb3BlcztcbiAgICAgICAgdGhpcy5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB2YXIgciA9IGZuKHRoaXMpO1xuICAgICAgICBpZiAob3BlbkhhbmRsZVNjb3Blc0JlZm9yZSAhPT0gdGhpcy5vcGVuSGFuZGxlU2NvcGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdvcGVuX2hhbmRsZV9zY29wZXMgIT0gb3Blbl9oYW5kbGVfc2NvcGVzX2JlZm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gdGhpcy50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24odGhpcywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIEVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB2YXIgZiA9IHRoaXMubWFrZUR5bkNhbGxfdnBwcChjYik7XG4gICAgICAgIHZhciBlbnYgPSB0aGlzLmlkO1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLmN0eC5vcGVuU2NvcGUodGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxJbnRvTW9kdWxlKGZ1bmN0aW9uICgpIHsgZihlbnYsIGRhdGEsIGhpbnQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlU2NvcGUodGhpcywgc2NvcGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmludm9rZUZpbmFsaXplckZyb21HQyA9IGZ1bmN0aW9uIChmaW5hbGl6ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQXBpVmVyc2lvbiAhPT0gTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCkge1xuICAgICAgICAgICAgdGhpcy5lbnF1ZXVlRmluYWxpemVyKGZpbmFsaXplcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgc2F2ZWQgPSB0aGlzLmluR2NGaW5hbGl6ZXI7XG4gICAgICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZXIuZmluYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5HY0ZpbmFsaXplciA9IHNhdmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNoZWNrR0NBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZHVsZUFwaVZlcnNpb24gPT09IE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgJiYgdGhpcy5pbkdjRmluYWxpemVyKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdGaW5hbGl6ZXIgaXMgY2FsbGluZyBhIGZ1bmN0aW9uIHRoYXQgbWF5IGFmZmVjdCBHQyBzdGF0ZS5cXG4nICtcbiAgICAgICAgICAgICAgICAnVGhlIGZpbmFsaXplcnMgYXJlIHJ1biBkaXJlY3RseSBmcm9tIEdDIGFuZCBtdXN0IG5vdCBhZmZlY3QgR0MgJyArXG4gICAgICAgICAgICAgICAgJ3N0YXRlLlxcbicgK1xuICAgICAgICAgICAgICAgICdVc2UgYG5vZGVfYXBpX3Bvc3RfZmluYWxpemVyYCBmcm9tIGluc2lkZSBvZiB0aGUgZmluYWxpemVyIHRvIHdvcmsgJyArXG4gICAgICAgICAgICAgICAgJ2Fyb3VuZCB0aGlzIGlzc3VlLlxcbicgK1xuICAgICAgICAgICAgICAgICdJdCBzY2hlZHVsZXMgdGhlIGNhbGwgYXMgYSBuZXcgdGFzayBpbiB0aGUgZXZlbnQgbG9vcC4nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgRW52LnByb3RvdHlwZS5lbnF1ZXVlRmluYWxpemVyID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRmluYWxpemVycy5pbmRleE9mKGZpbmFsaXplcikgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLnB1c2goZmluYWxpemVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgRW52LnByb3RvdHlwZS5kZXF1ZXVlRmluYWxpemVyID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLmluZGV4T2YoZmluYWxpemVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRmluYWxpemVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmRlbGV0ZU1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBSZWZCYXNlLmZpbmFsaXplQWxsKHRoaXMuZmluYWxpemluZ19yZWZsaXN0KTtcbiAgICAgICAgUmVmQmFzZS5maW5hbGl6ZUFsbCh0aGlzLnJlZmxpc3QpO1xuICAgICAgICB0aGlzLnRyeUNhdGNoLmV4dHJhY3RFeGNlcHRpb24oKTtcbiAgICAgICAgdGhpcy5jdHguZW52U3RvcmUucmVtb3ZlKHRoaXMuaWQpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pZCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5kZWxldGVNZSgpO1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuaW5pdE9iamVjdEJpbmRpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSB7XG4gICAgICAgICAgICB3cmFwcGVkOiAwLFxuICAgICAgICAgICAgdGFnOiBudWxsLFxuICAgICAgICAgICAgZGF0YTogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nTWFwLnNldCh2YWx1ZSwgYmluZGluZyk7XG4gICAgICAgIHJldHVybiBiaW5kaW5nO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9iaW5kaW5nTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nTWFwLmdldCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdE9iamVjdEJpbmRpbmcodmFsdWUpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5zZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlRGF0YS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZURhdGEgPSBuZXcgUmVmQmFzZSh0aGlzLCAwLCAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLywgZmluYWxpemVfY2IsIGRhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlRGF0YSA/IHRoaXMuaW5zdGFuY2VEYXRhLmRhdGEoKSA6IDA7XG4gICAgfTtcbiAgICByZXR1cm4gRW52O1xufSgpKTtcbnZhciBOb2RlRW52ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb2RlRW52LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vZGVFbnYoY3R4LCBmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0LCBub2RlQmluZGluZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjdHgsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgX3RoaXMubm9kZUJpbmRpbmcgPSBub2RlQmluZGluZztcbiAgICAgICAgX3RoaXMuZGVzdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTm9kZUVudi5wcm90b3R5cGUuZGVsZXRlTWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJ1Y3RpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZWxldGVNZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FuQ2FsbEludG9KcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuY2FuQ2FsbEludG9Kcy5jYWxsKHRoaXMpICYmIHRoaXMuY3R4LmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLnRyaWdnZXJGYXRhbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZUJpbmRpbmcubmFwaS5mYXRhbEV4Y2VwdGlvbihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzLl9mYXRhbEV4Y2VwdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVkID0gcHJvY2Vzcy5fZmF0YWxFeGNlcHRpb24oZXJyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsYmFja0ludG9Nb2R1bGUgPSBmdW5jdGlvbiAoZW5mb3JjZVVuY2F1Z2h0RXhjZXB0aW9uUG9saWN5LCBmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSW50b01vZHVsZShmbiwgZnVuY3Rpb24gKGVudk9iamVjdCwgZXJyKSB7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0LnRlcm1pbmF0ZWRPclRlcm1pbmF0aW5nKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGFzUHJvY2VzcyA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsO1xuICAgICAgICAgICAgdmFyIGhhc0ZvcmNlRmxhZyA9IGhhc1Byb2Nlc3MgPyBCb29sZWFuKHByb2Nlc3MuZXhlY0FyZ3YgJiYgKHByb2Nlc3MuZXhlY0FyZ3YuaW5kZXhPZignLS1mb3JjZS1ub2RlLWFwaS11bmNhdWdodC1leGNlcHRpb25zLXBvbGljeScpICE9PSAtMSkpIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPCBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICYmICFoYXNGb3JjZUZsYWcgJiYgIWVuZm9yY2VVbmNhdWdodEV4Y2VwdGlvblBvbGljeSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXJuID0gaGFzUHJvY2VzcyAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IHByb2Nlc3MuZW1pdFdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAod2FybmluZywgdHlwZSwgY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IGNvZGUgPyBcIltcIi5jb25jYXQoY29kZSwgXCJdIFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdCh0eXBlIHx8ICdXYXJuaW5nJywgXCI6IFwiKS5jb25jYXQod2FybmluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdhcm4oJ1VuY2F1Z2h0IE4tQVBJIGNhbGxiYWNrIGV4Y2VwdGlvbiBkZXRlY3RlZCwgcGxlYXNlIHJ1biBub2RlIHdpdGggb3B0aW9uIC0tZm9yY2Utbm9kZS1hcGktdW5jYXVnaHQtZXhjZXB0aW9ucy1wb2xpY3k9dHJ1ZSB0byBoYW5kbGUgdGhvc2UgZXhjZXB0aW9ucyBwcm9wZXJseS4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgJ0RFUDAxNjgnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnZPYmplY3QudHJpZ2dlckZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB0aGlzLmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgxLCBjYiwgZGF0YSwgaGludCk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsRmluYWxpemVySW50ZXJuYWwgPSBmdW5jdGlvbiAoZm9yY2VVbmNhdWdodCwgY2IsIGRhdGEsIGhpbnQpIHtcbiAgICAgICAgdmFyIGYgPSB0aGlzLm1ha2VEeW5DYWxsX3ZwcHAoY2IpO1xuICAgICAgICB2YXIgZW52ID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdHgub3BlblNjb3BlKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0ludG9Nb2R1bGUoQm9vbGVhbihmb3JjZVVuY2F1Z2h0KSwgZnVuY3Rpb24gKCkgeyBmKGVudiwgZGF0YSwgaGludCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZW5xdWV1ZUZpbmFsaXplci5jYWxsKHRoaXMsIGZpbmFsaXplcik7XG4gICAgICAgIGlmICghdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgJiYgIXRoaXMuZGVzdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmKCk7XG4gICAgICAgICAgICBfc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfdGhpcy51bnJlZigpO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5kcmFpbkZpbmFsaXplclF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nRmluYWxpemVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmVmVHJhY2tlciA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJlZlRyYWNrZXIuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5vZGVFbnY7XG59KEVudikpO1xuZnVuY3Rpb24gbmV3RW52KGN0eCwgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpIHtcbiAgICBtb2R1bGVBcGlWZXJzaW9uID0gdHlwZW9mIG1vZHVsZUFwaVZlcnNpb24gIT09ICdudW1iZXInID8gTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gOiBtb2R1bGVBcGlWZXJzaW9uO1xuICAgIC8vIFZhbGlkYXRlIG1vZHVsZV9hcGlfdmVyc2lvbi5cbiAgICBpZiAobW9kdWxlQXBpVmVyc2lvbiA8IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OKSB7XG4gICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kdWxlQXBpVmVyc2lvbiA+IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAmJiBtb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgIHRocm93Tm9kZUFwaVZlcnNpb25FcnJvcihmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbik7XG4gICAgfVxuICAgIHZhciBlbnYgPSBuZXcgTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICBjdHguZW52U3RvcmUuYWRkKGVudik7XG4gICAgY3R4LmFkZENsZWFudXBIb29rKGVudiwgZnVuY3Rpb24gKCkgeyBlbnYudW5yZWYoKTsgfSwgMCk7XG4gICAgcmV0dXJuIGVudjtcbn1cblxudmFyIEVtbmFwaUVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbW5hcGlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbW5hcGlFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSBfbmV3VGFyZ2V0O1xuICAgICAgICB2YXIgcHJvdG8gPSBFcnJvckNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCEoX3RoaXMgaW5zdGFuY2VvZiBFbW5hcGlFcnJvcikpIHtcbiAgICAgICAgICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm90b3R5cGVPZi5jYWxsKE9iamVjdCwgX3RoaXMsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgICAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbW5hcGlFcnJvcjtcbn0oRXJyb3IpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbW5hcGlFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ0VtbmFwaUVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydFdlYWtSZWZFcnJvciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm90U3VwcG9ydFdlYWtSZWZFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJGaW5hbGl6YXRpb25SZWdpc3RyeVxcXCIgYW5kIFxcXCJXZWFrUmVmXFxcIi5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yO1xufShFbW5hcGlFcnJvcikpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IucHJvdG90eXBlLCAnbmFtZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICdOb3RTdXBwb3J0V2Vha1JlZkVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb3RTdXBwb3J0QnVmZmVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm90U3VwcG9ydEJ1ZmZlckVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJCdWZmZXJcXFwiLiBDb25zaWRlciB1c2luZyBidWZmZXIgcG9seWZpbGwgdG8gbWFrZSBzdXJlIGBnbG9iYWxUaGlzLkJ1ZmZlcmAgaXMgZGVmaW5lZC5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0QnVmZmVyRXJyb3I7XG59KEVtbmFwaUVycm9yKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTm90U3VwcG9ydEJ1ZmZlckVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnTm90U3VwcG9ydEJ1ZmZlckVycm9yJ1xufSk7XG5cbnZhciBTdHJvbmdSZWYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3Ryb25nUmVmKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGVyZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9O1xuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3Ryb25nUmVmO1xufSgpKTtcbnZhciBQZXJzaXN0ZW50ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNpc3RlbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcmVmID0gbmV3IFN0cm9uZ1JlZih2YWx1ZSk7XG4gICAgfVxuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLnNldFdlYWsgPSBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yZWYgaW5zdGFuY2VvZiBXZWFrUmVmKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHZhbHVlLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgIHZhciB3ZWFrUmVmID0gbmV3IFdlYWtSZWYodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZiA9IHdlYWtSZWY7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50LnByb3RvdHlwZS5jbGVhcldlYWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX3JlZiBpbnN0YW5jZW9mIFdlYWtSZWYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgUGVyc2lzdGVudC5fcmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgIHRoaXMuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYgPSBuZXcgU3Ryb25nUmVmKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUGVyc2lzdGVudC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5fcmVmIGluc3RhbmNlb2YgU3Ryb25nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZiA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmRlcmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVmID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmLmRlcmVmKCk7XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50Ll9yZWdpc3RyeSA9IHN1cHBvcnRGaW5hbGl6ZXJcbiAgICAgICAgPyBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5fcmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdmFsdWUuX2NhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gdmFsdWUuX3BhcmFtO1xuICAgICAgICAgICAgdmFsdWUuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFsdWUuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFBlcnNpc3RlbnQ7XG59KCkpO1xuXG5mdW5jdGlvbiB3ZWFrQ2FsbGJhY2socmVmKSB7XG4gICAgcmVmLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICByZWYuZW52T2JqZWN0Lmludm9rZUZpbmFsaXplckZyb21HQyhyZWYpO1xufVxuZnVuY3Rpb24gY2FuQmVIZWxkV2Vha2x5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpIHx8IHZhbHVlLmlzU3ltYm9sKCk7XG59XG52YXIgUmVmZXJlbmNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZlcmVuY2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKGVudk9iamVjdCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjayA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2NhbGxiYWNrID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfZGF0YSA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2RhdGEgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9oaW50ID09PSB2b2lkIDApIHsgZmluYWxpemVfaGludCA9IDA7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZW52T2JqZWN0LCBpbml0aWFsUmVmY291bnQgPj4+IDAsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlkID0gMDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZWZlcmVuY2UuY3JlYXRlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrID09PSB2b2lkIDApIHsgZmluYWxpemVfY2FsbGJhY2sgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9kYXRhID09PSB2b2lkIDApIHsgZmluYWxpemVfZGF0YSA9IDA7IH1cbiAgICAgICAgaWYgKGZpbmFsaXplX2hpbnQgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9oaW50ID0gMDsgfVxuICAgICAgICB2YXIgaGFuZGxlID0gZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZS5nZXQoaGFuZGxlX2lkKTtcbiAgICAgICAgdmFyIHJlZiA9IG5ldyBSZWZlcmVuY2UoZW52T2JqZWN0LCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICBlbnZPYmplY3QuY3R4LnJlZlN0b3JlLmFkZChyZWYpO1xuICAgICAgICByZWYuY2FuQmVXZWFrID0gY2FuQmVIZWxkV2Vha2x5KGhhbmRsZSk7XG4gICAgICAgIHJlZi5wZXJzaXN0ZW50ID0gbmV3IFBlcnNpc3RlbnQoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgaWYgKGluaXRpYWxSZWZjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmVmLl9zZXRXZWFrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wZXJzaXN0ZW50LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvdW50ID0gX3N1cGVyLnByb3RvdHlwZS5yZWYuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKGNvdW50ID09PSAxICYmIHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuY2xlYXJXZWFrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvbGRSZWZjb3VudCA9IHRoaXMucmVmQ291bnQoKTtcbiAgICAgICAgdmFyIHJlZmNvdW50ID0gX3N1cGVyLnByb3RvdHlwZS51bnJlZi5jYWxsKHRoaXMpO1xuICAgICAgICBpZiAob2xkUmVmY291bnQgPT09IDEgJiYgcmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFdlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmogPSB0aGlzLnBlcnNpc3RlbnQuZGVyZWYoKTtcbiAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMuZW52T2JqZWN0LmVuc3VyZUhhbmRsZShvYmopO1xuICAgICAgICByZXR1cm4gaGFuZGxlLmlkO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5fc2V0V2VhayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuc2V0V2Vhayh0aGlzLCB3ZWFrQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wZXJzaXN0ZW50LnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGVyc2lzdGVudC5yZXNldCgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmZpbmFsaXplLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgdGhpcy5lbnZPYmplY3QuY3R4LnJlZlN0b3JlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH07XG4gICAgcmV0dXJuIFJlZmVyZW5jZTtcbn0oUmVmQmFzZSkpO1xuXG52YXIgRGVmZXJyZWQgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmZXJyZWQoY3R4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgRGVmZXJyZWQuY3JlYXRlID0gZnVuY3Rpb24gKGN0eCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gbmV3IERlZmVycmVkKGN0eCwgdmFsdWUpO1xuICAgICAgICBjdHguZGVmZXJyZWRTdG9yZS5hZGQoZGVmZXJyZWQpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9O1xuICAgIERlZmVycmVkLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRoaXMudmFsdWUucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3R4LmRlZmVycmVkU3RvcmUucmVtb3ZlKHRoaXMuaWQpO1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3R4ID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBEZWZlcnJlZDtcbn0oKSk7XG5cbnZhciBTdG9yZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdG9yZSgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSA0O1xuICAgICAgICB0aGlzLl9zaXplID0gMTtcbiAgICAgICAgdGhpcy5fZnJlZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgU3RvcmUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaWQ7XG4gICAgICAgIGlmICh0aGlzLl9mcmVlTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5fZnJlZUxpc3Quc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgICAgIHZhciBjYXBhY2l0eSA9IHRoaXMuX3ZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoaWQgPj0gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gY2FwYWNpdHkgKyAoY2FwYWNpdHkgPj4gMSkgKyAxNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5pZCA9IGlkO1xuICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdmFsdWU7XG4gICAgfTtcbiAgICBTdG9yZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbaWRdO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXSAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaWRdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlLmlkID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9mcmVlTGlzdC5wdXNoKE51bWJlcihpZCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdG9yZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLl9zaXplOyArK2kpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlc1tpXTtcbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgICAgIHRoaXMuX3NpemUgPSAxO1xuICAgICAgICB0aGlzLl9mcmVlTGlzdCA9IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIFN0b3JlO1xufSgpKTtcblxudmFyIENsZWFudXBIb29rQ2FsbGJhY2sgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xlYW51cEhvb2tDYWxsYmFjayhlbnZPYmplY3QsIGZuLCBhcmcsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLmZuID0gZm47XG4gICAgICAgIHRoaXMuYXJnID0gYXJnO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHJldHVybiBDbGVhbnVwSG9va0NhbGxiYWNrO1xufSgpKTtcbnZhciBDbGVhbnVwUXVldWUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xlYW51cFF1ZXVlKCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3MgPSBbXTtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tDb3VudGVyID0gMDtcbiAgICB9XG4gICAgQ2xlYW51cFF1ZXVlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGggPT09IDA7XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZuLCBhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsZWFudXBIb29rcy5maWx0ZXIoZnVuY3Rpb24gKGhvb2spIHsgcmV0dXJuIChob29rLmVudk9iamVjdCA9PT0gZW52T2JqZWN0ICYmIGhvb2suZm4gPT09IGZuICYmIGhvb2suYXJnID09PSBhcmcpOyB9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgYWRkIHNhbWUgZm4gYW5kIGFyZyB0d2ljZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5wdXNoKG5ldyBDbGVhbnVwSG9va0NhbGxiYWNrKGVudk9iamVjdCwgZm4sIGFyZywgdGhpcy5fY2xlYW51cEhvb2tDb3VudGVyKyspKTtcbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGhvb2sgPSB0aGlzLl9jbGVhbnVwSG9va3NbaV07XG4gICAgICAgICAgICBpZiAoaG9vay5lbnZPYmplY3QgPT09IGVudk9iamVjdCAmJiBob29rLmZuID09PSBmbiAmJiBob29rLmFyZyA9PT0gYXJnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBob29rcyA9IHRoaXMuX2NsZWFudXBIb29rcy5zbGljZSgpO1xuICAgICAgICBob29rcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAoYi5vcmRlciAtIGEub3JkZXIpOyB9KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNiID0gaG9va3NbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNiLmZuID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNiLmVudk9iamVjdC5tYWtlRHluQ2FsbF92cChjYi5mbikoY2IuYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNiLmZuKGNiLmFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3Muc3BsaWNlKHRoaXMuX2NsZWFudXBIb29rcy5pbmRleE9mKGNiKSwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rQ291bnRlciA9IDA7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xlYW51cFF1ZXVlO1xufSgpKTtcbnZhciBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyKCkge1xuICAgICAgICB0aGlzLnJlZkhhbmRsZSA9IG5ldyBfTWVzc2FnZUNoYW5uZWwoKS5wb3J0MTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlci5wcm90b3R5cGUuaW5jcmVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlZkhhbmRsZS5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgfTtcbiAgICBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIucHJvdG90eXBlLmRlY3JlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVmSGFuZGxlLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3VudC0tO1xuICAgIH07XG4gICAgcmV0dXJuIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcjtcbn0oKSk7XG52YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9pc1N0b3BwaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NhbkNhbGxJbnRvSnMgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudlN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuc2NvcGVTdG9yZSA9IG5ldyBTY29wZVN0b3JlKCk7XG4gICAgICAgIHRoaXMucmVmU3RvcmUgPSBuZXcgU3RvcmUoKTtcbiAgICAgICAgdGhpcy5kZWZlcnJlZFN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBuZXcgSGFuZGxlU3RvcmUoKTtcbiAgICAgICAgdGhpcy5jYmluZm9TdGFjayA9IG5ldyBDYWxsYmFja0luZm9TdGFjaygpO1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBzdXBwb3J0UmVmbGVjdDogc3VwcG9ydFJlZmxlY3QsXG4gICAgICAgICAgICBzdXBwb3J0RmluYWxpemVyOiBzdXBwb3J0RmluYWxpemVyLFxuICAgICAgICAgICAgc3VwcG9ydFdlYWtTeW1ib2w6IHN1cHBvcnRXZWFrU3ltYm9sLFxuICAgICAgICAgICAgc3VwcG9ydEJpZ0ludDogc3VwcG9ydEJpZ0ludCxcbiAgICAgICAgICAgIHN1cHBvcnROZXdGdW5jdGlvbjogc3VwcG9ydE5ld0Z1bmN0aW9uLFxuICAgICAgICAgICAgY2FuU2V0RnVuY3Rpb25OYW1lOiBjYW5TZXRGdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGU6IF9zZXRJbW1lZGlhdGUsXG4gICAgICAgICAgICBCdWZmZXI6IF9CdWZmZXIsXG4gICAgICAgICAgICBNZXNzYWdlQ2hhbm5lbDogX01lc3NhZ2VDaGFubmVsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlID0gbmV3IENsZWFudXBRdWV1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3Mub25jZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5yZWZDb3VudGVyID0gbmV3IE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgcHJvY2Vzcy5vbmNlKCdiZWZvcmVFeGl0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGVcbiAgICBDb250ZXh0LnByb3RvdHlwZS5nZXRSdW50aW1lVmVyc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYOiBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsXG4gICAgICAgICAgICBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMOiBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMLFxuICAgICAgICAgICAgTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT046IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yID0gZnVuY3Rpb24gKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoYXBpLCBtZXNzYWdlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvciA9IGZ1bmN0aW9uIChhcGksIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RTdXBwb3J0QnVmZmVyRXJyb3IoYXBpLCBtZXNzYWdlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVJlZmVyZW5jZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjayA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2NhbGxiYWNrID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfZGF0YSA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2RhdGEgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9oaW50ID09PSB2b2lkIDApIHsgZmluYWxpemVfaGludCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIFJlZmVyZW5jZS5jcmVhdGUoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWZlcnJlZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRGVmZXJyZWQuY3JlYXRlKHRoaXMsIHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZUVudiA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0LCBub2RlQmluZGluZykge1xuICAgICAgICByZXR1cm4gbmV3RW52KHRoaXMsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVRyYWNrZWRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplci5jcmVhdGUoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5nZXRDdXJyZW50U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlU3RvcmUuY3VycmVudFNjb3BlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuYWRkVG9DdXJyZW50U2NvcGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5jdXJyZW50U2NvcGUuYWRkKHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNsb3NlU2NvcGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBfc2NvcGUpIHtcbiAgICAgICAgdGhpcy5zY29wZVN0b3JlLmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmVuc3VyZUhhbmRsZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDogcmV0dXJuIEhhbmRsZVN0b3JlLlVOREVGSU5FRDtcbiAgICAgICAgICAgIGNhc2UgbnVsbDogcmV0dXJuIEhhbmRsZVN0b3JlLk5VTEw7XG4gICAgICAgICAgICBjYXNlIHRydWU6IHJldHVybiBIYW5kbGVTdG9yZS5UUlVFO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTogcmV0dXJuIEhhbmRsZVN0b3JlLkZBTFNFO1xuICAgICAgICAgICAgY2FzZSBfZ2xvYmFsOiByZXR1cm4gSGFuZGxlU3RvcmUuR0xPQkFMO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmFkZENsZWFudXBIb29rID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5hZGQoZW52T2JqZWN0LCBmbiwgYXJnKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnJlbW92ZUNsZWFudXBIb29rID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5yZW1vdmUoZW52T2JqZWN0LCBmbiwgYXJnKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnJ1bkNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5jbGVhbnVwUXVldWUuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwUXVldWUuZHJhaW4oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuaW5jcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5yZWZDb3VudGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jcmVhc2UoKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMucmVmQ291bnRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY3JlYXNlKCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5zZXRDYW5DYWxsSW50b0pzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NhbkNhbGxJbnRvSnMgPSB2YWx1ZTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnNldFN0b3BwaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2lzU3RvcHBpbmcgPSB2YWx1ZTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5DYWxsSW50b0pzICYmICF0aGlzLl9pc1N0b3BwaW5nO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXRTdG9wcGluZyh0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRDYW5DYWxsSW50b0pzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ydW5DbGVhbnVwKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dDtcbn0oKSk7XG52YXIgZGVmYXVsdENvbnRleHQ7XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KCkge1xuICAgIHJldHVybiBuZXcgQ29udGV4dCgpO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdENvbnRleHQoKSB7XG4gICAgaWYgKCFkZWZhdWx0Q29udGV4dCkge1xuICAgICAgICBkZWZhdWx0Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRDb250ZXh0O1xufVxuXG5leHBvcnQgeyBDYWxsYmFja0luZm8sIENhbGxiYWNrSW5mb1N0YWNrLCBDb25zdEhhbmRsZSwgQ29udGV4dCwgRGVmZXJyZWQsIEVtbmFwaUVycm9yLCBFbnYsIEZpbmFsaXplciwgSGFuZGxlLCBIYW5kbGVTY29wZSwgSGFuZGxlU3RvcmUsIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OLCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiwgTm9kZUVudiwgTm90U3VwcG9ydEJ1ZmZlckVycm9yLCBOb3RTdXBwb3J0V2Vha1JlZkVycm9yLCBQZXJzaXN0ZW50LCBSZWZCYXNlLCBSZWZUcmFja2VyLCBSZWZlcmVuY2UsIFNjb3BlU3RvcmUsIFN0b3JlLCBUcmFja2VkRmluYWxpemVyLCBUcnlDYXRjaCwgY3JlYXRlQ29udGV4dCwgZ2V0RGVmYXVsdENvbnRleHQsIGlzUmVmZXJlbmNlVHlwZSwgdmVyc2lvbiB9O1xuIiwiY29uc3QgX1dlYkFzc2VtYmx5ID0gdHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gV2ViQXNzZW1ibHlcbiAgICA6IHR5cGVvZiBXWFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IFdYV2ViQXNzZW1ibHlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5pZiAoIV9XZWJBc3NlbWJseSkge1xuICAgIHRocm93IG5ldyBFcnJvcignV2ViQXNzZW1ibHkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlZC1jb21tZW50ICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGFuIG9iamVjdC4gUmVjZWl2ZWQgJHt2YWx1ZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB2YWx1ZX1gKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIGJvb2xlYW4uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb24uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVVbmRlZmluZWQodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgdW5kZWZpbmVkLiBSZWNlaXZlZCAke3ZhbHVlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICEhKG9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIHdyYXBJbnN0YW5jZUV4cG9ydHMoZXhwb3J0cywgbWFwRm4pIHtcbiAgICBjb25zdCBuZXdFeHBvcnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGV4cG9ydHNbbmFtZV07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFeHBvcnRzLCBuYW1lLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG1hcEZuKGV4cG9ydFZhbHVlLCBuYW1lKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3RXhwb3J0cztcbn1cbmZ1bmN0aW9uIHNsZWVwQnJlYWtJZihkZWxheSwgYnJlYWtJZikge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGRlbGF5O1xuICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGVuZCkge1xuICAgICAgICBpZiAoYnJlYWtJZigpKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHVuc2hhcmVkU2xpY2Uodmlldywgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2aWV3LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZpZXcuYnVmZmVyLmNvbnN0cnVjdG9yKSA9PT0gJ1tvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdJykpXG4gICAgICAgID8gdmlldy5zbGljZShzdGFydCwgZW5kKVxuICAgICAgICA6IHZpZXcuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG59XG5cbmNvbnN0IGlnbm9yZU5hbWVzID0gW1xuICAgICdhc3luY2lmeV9nZXRfc3RhdGUnLFxuICAgICdhc3luY2lmeV9zdGFydF9yZXdpbmQnLFxuICAgICdhc3luY2lmeV9zdGFydF91bndpbmQnLFxuICAgICdhc3luY2lmeV9zdG9wX3Jld2luZCcsXG4gICAgJ2FzeW5jaWZ5X3N0b3BfdW53aW5kJ1xuXTtcbmZ1bmN0aW9uIHRyeUFsbG9jYXRlKGluc3RhbmNlLCB3YXNtNjQsIHNpemUsIG1hbGxvY05hbWUpIHtcbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV0gIT09ICdmdW5jdGlvbicgfHwgc2l6ZSA8PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3YXNtNjQsXG4gICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgIHN0YXJ0OiB3YXNtNjQgPyAzMiA6IDI0LFxuICAgICAgICAgICAgZW5kOiAxMDI0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1hbGxvYyA9IGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV07XG4gICAgY29uc3QgZGF0YVB0ciA9IHdhc202NCA/IE51bWJlcihtYWxsb2MoQmlnSW50KDE2KSArIEJpZ0ludChzaXplKSkpIDogbWFsbG9jKDggKyBzaXplKTtcbiAgICBpZiAoZGF0YVB0ciA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbG9jYXRlIGFzeW5jaWZ5IGRhdGEgZmFpbGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB3YXNtNjRcbiAgICAgICAgPyB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyAxNiwgZW5kOiBkYXRhUHRyICsgMTYgKyBzaXplIH1cbiAgICAgICAgOiB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyA4LCBlbmQ6IGRhdGFQdHIgKyA4ICsgc2l6ZSB9O1xufVxuLyoqIEBwdWJsaWMgKi9cbmNsYXNzIEFzeW5jaWZ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5leHBvcnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGFQdHIgPSAwO1xuICAgIH1cbiAgICBpbml0KG1lbW9yeSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuZXhwb3J0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3luY2lmeSBoYXMgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKG1lbW9yeSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5NZW1vcnkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlIFdlYkFzc2VtYmx5Lk1lbW9yeSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZ25vcmVOYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzW2lnbm9yZU5hbWVzW2ldXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXN5bmNpZnkgd2FzbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzO1xuICAgICAgICBjb25zdCB3YXNtNjQgPSBCb29sZWFuKG9wdGlvbnMud2FzbTY0KTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnRyeUFsbG9jYXRlKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0ge1xuICAgICAgICAgICAgICAgIHdhc202NCxcbiAgICAgICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgICAgICBzdGFydDogd2FzbTY0ID8gMzIgOiAyNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDEwMjRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cnlBbGxvY2F0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB0cnlBbGxvY2F0ZShpbnN0YW5jZSwgd2FzbTY0LCA0MDk2LCAnbWFsbG9jJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdHJ5QWxsb2NhdGUoaW5zdGFuY2UsIHdhc202NCwgKF9hID0gb3B0aW9ucy50cnlBbGxvY2F0ZS5zaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiA0MDk2LCAoX2IgPSBvcHRpb25zLnRyeUFsbG9jYXRlLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdtYWxsb2MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFQdHIgPSBhZGRyZXNzLmRhdGFQdHI7XG4gICAgICAgIGlmICh3YXNtNjQpIHtcbiAgICAgICAgICAgIG5ldyBCaWdJbnQ2NEFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFtCaWdJbnQoYWRkcmVzcy5zdGFydCksIEJpZ0ludChhZGRyZXNzLmVuZCldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFthZGRyZXNzLnN0YXJ0LCBhZGRyZXNzLmVuZF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwb3J0cyA9IHRoaXMud3JhcEV4cG9ydHMoZXhwb3J0cywgb3B0aW9ucy53cmFwRXhwb3J0cyk7XG4gICAgICAgIGNvbnN0IGFzeW5jaWZpZWRJbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoX1dlYkFzc2VtYmx5Lkluc3RhbmNlLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3luY2lmaWVkSW5zdGFuY2UsICdleHBvcnRzJywgeyB2YWx1ZTogdGhpcy5leHBvcnRzIH0pO1xuICAgICAgICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIEluc3RhbmNlLnByb3RvdHlwZSlcbiAgICAgICAgcmV0dXJuIGFzeW5jaWZpZWRJbnN0YW5jZTtcbiAgICB9XG4gICAgYXNzZXJ0U3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgIT09IDAgLyogQXN5bmNpZnlTdGF0ZS5OT05FICovKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzeW5jaWZ5IHN0YXRlIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JhcEltcG9ydEZ1bmN0aW9uKGYpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGUtbG9vcFxuICAgICAgICAgICAgd2hpbGUgKF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgPT09IDIgLyogQXN5bmNpZnlTdGF0ZS5SRVdJTkRJTkcgKi8pIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0b3BfcmV3aW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAoIWlzUHJvbWlzZUxpa2UodikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZChfdGhpcy5kYXRhUHRyKTtcbiAgICAgICAgICAgIF90aGlzLnZhbHVlID0gdjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdyYXBJbXBvcnRzKGltcG9ydHMpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0T2JqZWN0ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGltcG9ydHMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBpbXBvcnRzW2tdO1xuICAgICAgICAgICAgY29uc3QgbmV3TW9kdWxlID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtb2QpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0VmFsdWUgPSBtb2RbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSB0aGlzLndyYXBJbXBvcnRGdW5jdGlvbihpbXBvcnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSBpbXBvcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltcG9ydE9iamVjdFtrXSA9IG5ld01vZHVsZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbXBvcnRPYmplY3Q7XG4gICAgfVxuICAgIHdyYXBFeHBvcnRGdW5jdGlvbihmKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCByZXQgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB3aGlsZSAoX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKSA9PT0gMSAvKiBBc3luY2lmeVN0YXRlLlVOV0lORElORyAqLykge1xuICAgICAgICAgICAgICAgIF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy52YWx1ZSA9IGF3YWl0IF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmFzc2VydFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9zdGFydF9yZXdpbmQoX3RoaXMuZGF0YVB0cik7XG4gICAgICAgICAgICAgICAgcmV0ID0gZi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3cmFwRXhwb3J0cyhleHBvcnRzLCBuZWVkV3JhcCkge1xuICAgICAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGxldCBpZ25vcmUgPSBpZ25vcmVOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0eXBlb2YgZXhwb3J0VmFsdWUgIT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZWVkV3JhcCkpIHtcbiAgICAgICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpZ25vcmUgPyBleHBvcnRWYWx1ZSA6IHRoaXMud3JhcEV4cG9ydEZ1bmN0aW9uKGV4cG9ydFZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cykge1xuICAgIGlmIChpbXBvcnRzICYmIHR5cGVvZiBpbXBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbXBvcnRzIG11c3QgYmUgYW4gb2JqZWN0IG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZldGNoV2FzbSh1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIGlmICh0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHVybE9yQnVmZmVyLCBpbXBvcnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybE9yQnVmZmVyKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgICAudGhlbihidWZmZXIgPT4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ1ZmZlciwgaW1wb3J0cykpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWQod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgc291cmNlO1xuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcod2FzbUlucHV0KSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiBfV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbUlucHV0LCBpbXBvcnRzKS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgaW5zdGFuY2UsIG1vZHVsZTogd2FzbUlucHV0IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdhc21JbnB1dCAhPT0gJ3N0cmluZycgJiYgISh3YXNtSW5wdXQgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc291cmNlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCByZXNwb25zZVByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UgPSBmZXRjaCh3YXNtSW5wdXQpO1xuICAgICAgICAgICAgc291cmNlID0gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlUHJvbWlzZSwgaW1wb3J0cykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc291cmNlID0gZmV0Y2hXYXNtKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gYXN5bmNpZnlMb2FkKGFzeW5jaWZ5LCB1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgY29uc3QgYXN5bmNpZnlIZWxwZXIgPSBuZXcgQXN5bmNpZnkoKTtcbiAgICBpbXBvcnRzID0gYXN5bmNpZnlIZWxwZXIud3JhcEltcG9ydHMoaW1wb3J0cyk7XG4gICAgcmV0dXJuIGxvYWQodXJsT3JCdWZmZXIsIGltcG9ydHMpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZW1vcnkgPSBzb3VyY2UuaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkgfHwgKChfYSA9IGltcG9ydHMuZW52KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWVtb3J5KTtcbiAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG4gICAgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgbW9kdWxlO1xuICAgIGlmICgod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh3YXNtSW5wdXQpKSB7XG4gICAgICAgIG1vZHVsZSA9IG5ldyBfV2ViQXNzZW1ibHkuTW9kdWxlKHdhc21JbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdhc21JbnB1dCBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICBtb2R1bGUgPSB3YXNtSW5wdXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHNvdXJjZScpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBfV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLCBpbXBvcnRzKTtcbiAgICBjb25zdCBzb3VyY2UgPSB7IGluc3RhbmNlLCBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGFzeW5jaWZ5TG9hZFN5bmMoYXN5bmNpZnksIGJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhciBfYTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIGNvbnN0IGFzeW5jaWZ5SGVscGVyID0gbmV3IEFzeW5jaWZ5KCk7XG4gICAgaW1wb3J0cyA9IGFzeW5jaWZ5SGVscGVyLndyYXBJbXBvcnRzKGltcG9ydHMpO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxvYWRTeW5jKGJ1ZmZlciwgaW1wb3J0cyk7XG4gICAgY29uc3QgbWVtb3J5ID0gc291cmNlLmluc3RhbmNlLmV4cG9ydHMubWVtb3J5IHx8ICgoX2EgPSBpbXBvcnRzLmVudikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1lbW9yeSk7XG4gICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG59XG5cbmNvbnN0IENIQVJfRE9UID0gNDY7IC8qIC4gKi9cbmNvbnN0IENIQVJfRk9SV0FSRF9TTEFTSCA9IDQ3OyAvKiAvICovXG5mdW5jdGlvbiBpc1Bvc2l4UGF0aFNlcGFyYXRvcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZyhwYXRoLCBhbGxvd0Fib3ZlUm9vdCwgc2VwYXJhdG9yLCBpc1BhdGhTZXBhcmF0b3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgbGV0IGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICBsZXQgbGFzdFNsYXNoID0gLTE7XG4gICAgbGV0IGRvdHMgPSAwO1xuICAgIGxldCBjb2RlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpIDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUgPSBDSEFSX0ZPUldBUkRfU0xBU0g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaSAtIDEgfHwgZG90cyA9PT0gMSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoIDwgMiB8fCBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMSkgIT09IENIQVJfRE9UIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAyKSAhPT0gQ0hBUl9ET1QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlcy5pbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5sZW5ndGggLSAxIC0gcmVzLmluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSByZXMubGVuZ3RoID4gMCA/IGAke3NlcGFyYXRvcn0uLmAgOiAnLi4nO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBgJHtzZXBhcmF0b3J9JHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGkgLSBsYXN0U2xhc2ggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IENIQVJfRE9UICYmIGRvdHMgIT09IC0xKSB7XG4gICAgICAgICAgICArK2RvdHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb3RzID0gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHJlc29sdmUoLi4uYXJncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSAnJztcbiAgICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgICAgICBjb25zdCBwYXRoID0gaSA+PSAwID8gYXJnc1tpXSA6ICcvJztcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgIH1cbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpO1xuICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7XG4gICAgICAgIHJldHVybiBgLyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZFBhdGgubGVuZ3RoID4gMCA/IHJlc29sdmVkUGF0aCA6ICcuJztcbn1cblxuY29uc3QgRkRfREFUQVNZTkMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMCkpO1xuY29uc3QgRkRfUkVBRCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxKSk7XG5jb25zdCBGRF9TRUVLID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIpKTtcbmNvbnN0IEZEX0ZEU1RBVF9TRVRfRkxBR1MgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMykpO1xuY29uc3QgRkRfU1lOQyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg0KSk7XG5jb25zdCBGRF9URUxMID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDUpKTtcbmNvbnN0IEZEX1dSSVRFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDYpKTtcbmNvbnN0IEZEX0FEVklTRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg3KSk7XG5jb25zdCBGRF9BTExPQ0FURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg4KSk7XG5jb25zdCBQQVRIX0NSRUFURV9ESVJFQ1RPUlkgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoOSkpO1xuY29uc3QgUEFUSF9DUkVBVEVfRklMRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMCkpO1xuY29uc3QgUEFUSF9MSU5LX1NPVVJDRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMSkpO1xuY29uc3QgUEFUSF9MSU5LX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMikpO1xuY29uc3QgUEFUSF9PUEVOID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDEzKSk7XG5jb25zdCBGRF9SRUFERElSID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE0KSk7XG5jb25zdCBQQVRIX1JFQURMSU5LID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE1KSk7XG5jb25zdCBQQVRIX1JFTkFNRV9TT1VSQ0UgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTYpKTtcbmNvbnN0IFBBVEhfUkVOQU1FX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxNykpO1xuY29uc3QgUEFUSF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTgpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1NJWkUgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTkpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1RJTUVTID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIwKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjEpKTtcbmNvbnN0IEZEX0ZJTEVTVEFUX1NFVF9TSVpFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIyKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9TRVRfVElNRVMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjMpKTtcbmNvbnN0IFBBVEhfU1lNTElOSyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNCkpO1xuY29uc3QgUEFUSF9SRU1PVkVfRElSRUNUT1JZID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI1KSk7XG5jb25zdCBQQVRIX1VOTElOS19GSUxFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI2KSk7XG5jb25zdCBQT0xMX0ZEX1JFQURXUklURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNykpO1xuY29uc3QgU09DS19TSFVURE9XTiA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyOCkpO1xuY29uc3QgU09DS19BQ0NFUFQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjkpKTtcbmNvbnN0IFdhc2lSaWdodHMgPSB7XG4gICAgRkRfREFUQVNZTkMsXG4gICAgRkRfUkVBRCxcbiAgICBGRF9TRUVLLFxuICAgIEZEX0ZEU1RBVF9TRVRfRkxBR1MsXG4gICAgRkRfU1lOQyxcbiAgICBGRF9URUxMLFxuICAgIEZEX1dSSVRFLFxuICAgIEZEX0FEVklTRSxcbiAgICBGRF9BTExPQ0FURSxcbiAgICBQQVRIX0NSRUFURV9ESVJFQ1RPUlksXG4gICAgUEFUSF9DUkVBVEVfRklMRSxcbiAgICBQQVRIX0xJTktfU09VUkNFLFxuICAgIFBBVEhfTElOS19UQVJHRVQsXG4gICAgUEFUSF9PUEVOLFxuICAgIEZEX1JFQURESVIsXG4gICAgUEFUSF9SRUFETElOSyxcbiAgICBQQVRIX1JFTkFNRV9TT1VSQ0UsXG4gICAgUEFUSF9SRU5BTUVfVEFSR0VULFxuICAgIFBBVEhfRklMRVNUQVRfR0VULFxuICAgIFBBVEhfRklMRVNUQVRfU0VUX1NJWkUsXG4gICAgUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMsXG4gICAgRkRfRklMRVNUQVRfR0VULFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9TSVpFLFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9USU1FUyxcbiAgICBQQVRIX1NZTUxJTkssXG4gICAgUEFUSF9SRU1PVkVfRElSRUNUT1JZLFxuICAgIFBBVEhfVU5MSU5LX0ZJTEUsXG4gICAgUE9MTF9GRF9SRUFEV1JJVEUsXG4gICAgU09DS19TSFVURE9XTixcbiAgICBTT0NLX0FDQ0VQVFxufTtcblxuZnVuY3Rpb24gc3RyZXJyb3IoZXJybm8pIHtcbiAgICBzd2l0Y2ggKGVycm5vKSB7XG4gICAgICAgIGNhc2UgMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi86IHJldHVybiAnU3VjY2Vzcyc7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRXJybm8uRTJCSUcgKi86IHJldHVybiAnQXJndW1lbnQgbGlzdCB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMiAvKiBXYXNpRXJybm8uRUFDQ0VTICovOiByZXR1cm4gJ1Blcm1pc3Npb24gZGVuaWVkJztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lFcnJuby5FQUREUklOVVNFICovOiByZXR1cm4gJ0FkZHJlc3MgaW4gdXNlJztcbiAgICAgICAgY2FzZSA0IC8qIFdhc2lFcnJuby5FQUREUk5PVEFWQUlMICovOiByZXR1cm4gJ0FkZHJlc3Mgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRXJybm8uRUFGTk9TVVBQT1JUICovOiByZXR1cm4gJ0FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wnO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUVycm5vLkVBR0FJTiAqLzogcmV0dXJuICdSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNyAvKiBXYXNpRXJybm8uRUFMUkVBRFkgKi86IHJldHVybiAnT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDggLyogV2FzaUVycm5vLkVCQURGICovOiByZXR1cm4gJ0JhZCBmaWxlIGRlc2NyaXB0b3InO1xuICAgICAgICBjYXNlIDkgLyogV2FzaUVycm5vLkVCQURNU0cgKi86IHJldHVybiAnQmFkIG1lc3NhZ2UnO1xuICAgICAgICBjYXNlIDEwIC8qIFdhc2lFcnJuby5FQlVTWSAqLzogcmV0dXJuICdSZXNvdXJjZSBidXN5JztcbiAgICAgICAgY2FzZSAxMSAvKiBXYXNpRXJybm8uRUNBTkNFTEVEICovOiByZXR1cm4gJ09wZXJhdGlvbiBjYW5jZWxlZCc7XG4gICAgICAgIGNhc2UgMTIgLyogV2FzaUVycm5vLkVDSElMRCAqLzogcmV0dXJuICdObyBjaGlsZCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSAxMyAvKiBXYXNpRXJybm8uRUNPTk5BQk9SVEVEICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gYWJvcnRlZCc7XG4gICAgICAgIGNhc2UgMTQgLyogV2FzaUVycm5vLkVDT05OUkVGVVNFRCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlZnVzZWQnO1xuICAgICAgICBjYXNlIDE1IC8qIFdhc2lFcnJuby5FQ09OTlJFU0VUICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcic7XG4gICAgICAgIGNhc2UgMTYgLyogV2FzaUVycm5vLkVERUFETEsgKi86IHJldHVybiAnUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXInO1xuICAgICAgICBjYXNlIDE3IC8qIFdhc2lFcnJuby5FREVTVEFERFJSRVEgKi86IHJldHVybiAnRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCc7XG4gICAgICAgIGNhc2UgMTggLyogV2FzaUVycm5vLkVET00gKi86IHJldHVybiAnRG9tYWluIGVycm9yJztcbiAgICAgICAgY2FzZSAxOSAvKiBXYXNpRXJybm8uRURRVU9UICovOiByZXR1cm4gJ1F1b3RhIGV4Y2VlZGVkJztcbiAgICAgICAgY2FzZSAyMCAvKiBXYXNpRXJybm8uRUVYSVNUICovOiByZXR1cm4gJ0ZpbGUgZXhpc3RzJztcbiAgICAgICAgY2FzZSAyMSAvKiBXYXNpRXJybm8uRUZBVUxUICovOiByZXR1cm4gJ0JhZCBhZGRyZXNzJztcbiAgICAgICAgY2FzZSAyMiAvKiBXYXNpRXJybm8uRUZCSUcgKi86IHJldHVybiAnRmlsZSB0b28gbGFyZ2UnO1xuICAgICAgICBjYXNlIDIzIC8qIFdhc2lFcnJuby5FSE9TVFVOUkVBQ0ggKi86IHJldHVybiAnSG9zdCBpcyB1bnJlYWNoYWJsZSc7XG4gICAgICAgIGNhc2UgMjQgLyogV2FzaUVycm5vLkVJRFJNICovOiByZXR1cm4gJ0lkZW50aWZpZXIgcmVtb3ZlZCc7XG4gICAgICAgIGNhc2UgMjUgLyogV2FzaUVycm5vLkVJTFNFUSAqLzogcmV0dXJuICdJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UnO1xuICAgICAgICBjYXNlIDI2IC8qIFdhc2lFcnJuby5FSU5QUk9HUkVTUyAqLzogcmV0dXJuICdPcGVyYXRpb24gaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDI3IC8qIFdhc2lFcnJuby5FSU5UUiAqLzogcmV0dXJuICdJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCc7XG4gICAgICAgIGNhc2UgMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLzogcmV0dXJuICdJbnZhbGlkIGFyZ3VtZW50JztcbiAgICAgICAgY2FzZSAyOSAvKiBXYXNpRXJybm8uRUlPICovOiByZXR1cm4gJ0kvTyBlcnJvcic7XG4gICAgICAgIGNhc2UgMzAgLyogV2FzaUVycm5vLkVJU0NPTk4gKi86IHJldHVybiAnU29ja2V0IGlzIGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgMzEgLyogV2FzaUVycm5vLkVJU0RJUiAqLzogcmV0dXJuICdJcyBhIGRpcmVjdG9yeSc7XG4gICAgICAgIGNhc2UgMzIgLyogV2FzaUVycm5vLkVMT09QICovOiByZXR1cm4gJ1N5bWJvbGljIGxpbmsgbG9vcCc7XG4gICAgICAgIGNhc2UgMzMgLyogV2FzaUVycm5vLkVNRklMRSAqLzogcmV0dXJuICdObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgMzQgLyogV2FzaUVycm5vLkVNTElOSyAqLzogcmV0dXJuICdUb28gbWFueSBsaW5rcyc7XG4gICAgICAgIGNhc2UgMzUgLyogV2FzaUVycm5vLkVNU0dTSVpFICovOiByZXR1cm4gJ01lc3NhZ2UgdG9vIGxhcmdlJztcbiAgICAgICAgY2FzZSAzNiAvKiBXYXNpRXJybm8uRU1VTFRJSE9QICovOiByZXR1cm4gJ011bHRpaG9wIGF0dGVtcHRlZCc7XG4gICAgICAgIGNhc2UgMzcgLyogV2FzaUVycm5vLkVOQU1FVE9PTE9ORyAqLzogcmV0dXJuICdGaWxlbmFtZSB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMzggLyogV2FzaUVycm5vLkVORVRET1dOICovOiByZXR1cm4gJ05ldHdvcmsgaXMgZG93bic7XG4gICAgICAgIGNhc2UgMzkgLyogV2FzaUVycm5vLkVORVRSRVNFVCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsnO1xuICAgICAgICBjYXNlIDQwIC8qIFdhc2lFcnJuby5FTkVUVU5SRUFDSCAqLzogcmV0dXJuICdOZXR3b3JrIHVucmVhY2hhYmxlJztcbiAgICAgICAgY2FzZSA0MSAvKiBXYXNpRXJybm8uRU5GSUxFICovOiByZXR1cm4gJ1RvbyBtYW55IGZpbGVzIG9wZW4gaW4gc3lzdGVtJztcbiAgICAgICAgY2FzZSA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLzogcmV0dXJuICdObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlJztcbiAgICAgICAgY2FzZSA0MyAvKiBXYXNpRXJybm8uRU5PREVWICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlJztcbiAgICAgICAgY2FzZSA0NCAvKiBXYXNpRXJybm8uRU5PRU5UICovOiByZXR1cm4gJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknO1xuICAgICAgICBjYXNlIDQ1IC8qIFdhc2lFcnJuby5FTk9FWEVDICovOiByZXR1cm4gJ0V4ZWMgZm9ybWF0IGVycm9yJztcbiAgICAgICAgY2FzZSA0NiAvKiBXYXNpRXJybm8uRU5PTENLICovOiByZXR1cm4gJ05vIGxvY2tzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNDcgLyogV2FzaUVycm5vLkVOT0xJTksgKi86IHJldHVybiAnTGluayBoYXMgYmVlbiBzZXZlcmVkJztcbiAgICAgICAgY2FzZSA0OCAvKiBXYXNpRXJybm8uRU5PTUVNICovOiByZXR1cm4gJ091dCBvZiBtZW1vcnknO1xuICAgICAgICBjYXNlIDQ5IC8qIFdhc2lFcnJuby5FTk9NU0cgKi86IHJldHVybiAnTm8gbWVzc2FnZSBvZiB0aGUgZGVzaXJlZCB0eXBlJztcbiAgICAgICAgY2FzZSA1MCAvKiBXYXNpRXJybm8uRU5PUFJPVE9PUFQgKi86IHJldHVybiAnUHJvdG9jb2wgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNTEgLyogV2FzaUVycm5vLkVOT1NQQyAqLzogcmV0dXJuICdObyBzcGFjZSBsZWZ0IG9uIGRldmljZSc7XG4gICAgICAgIGNhc2UgNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLzogcmV0dXJuICdGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQnO1xuICAgICAgICBjYXNlIDUzIC8qIFdhc2lFcnJuby5FTk9UQ09OTiAqLzogcmV0dXJuICdTb2NrZXQgbm90IGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi86IHJldHVybiAnTm90IGEgZGlyZWN0b3J5JztcbiAgICAgICAgY2FzZSA1NSAvKiBXYXNpRXJybm8uRU5PVEVNUFRZICovOiByZXR1cm4gJ0RpcmVjdG9yeSBub3QgZW1wdHknO1xuICAgICAgICBjYXNlIDU2IC8qIFdhc2lFcnJuby5FTk9UUkVDT1ZFUkFCTEUgKi86IHJldHVybiAnU3RhdGUgbm90IHJlY292ZXJhYmxlJztcbiAgICAgICAgY2FzZSA1NyAvKiBXYXNpRXJybm8uRU5PVFNPQ0sgKi86IHJldHVybiAnTm90IGEgc29ja2V0JztcbiAgICAgICAgY2FzZSA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLzogcmV0dXJuICdOb3Qgc3VwcG9ydGVkJztcbiAgICAgICAgY2FzZSA1OSAvKiBXYXNpRXJybm8uRU5PVFRZICovOiByZXR1cm4gJ05vdCBhIHR0eSc7XG4gICAgICAgIGNhc2UgNjAgLyogV2FzaUVycm5vLkVOWElPICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MnO1xuICAgICAgICBjYXNlIDYxIC8qIFdhc2lFcnJuby5FT1ZFUkZMT1cgKi86IHJldHVybiAnVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUnO1xuICAgICAgICBjYXNlIDYyIC8qIFdhc2lFcnJuby5FT1dORVJERUFEICovOiByZXR1cm4gJ1ByZXZpb3VzIG93bmVyIGRpZWQnO1xuICAgICAgICBjYXNlIDYzIC8qIFdhc2lFcnJuby5FUEVSTSAqLzogcmV0dXJuICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCc7XG4gICAgICAgIGNhc2UgNjQgLyogV2FzaUVycm5vLkVQSVBFICovOiByZXR1cm4gJ0Jyb2tlbiBwaXBlJztcbiAgICAgICAgY2FzZSA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovOiByZXR1cm4gJ1Byb3RvY29sIGVycm9yJztcbiAgICAgICAgY2FzZSA2NiAvKiBXYXNpRXJybm8uRVBST1RPTk9TVVBQT1JUICovOiByZXR1cm4gJ1Byb3RvY29sIG5vdCBzdXBwb3J0ZWQnO1xuICAgICAgICBjYXNlIDY3IC8qIFdhc2lFcnJuby5FUFJPVE9UWVBFICovOiByZXR1cm4gJ1Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCc7XG4gICAgICAgIGNhc2UgNjggLyogV2FzaUVycm5vLkVSQU5HRSAqLzogcmV0dXJuICdSZXN1bHQgbm90IHJlcHJlc2VudGFibGUnO1xuICAgICAgICBjYXNlIDY5IC8qIFdhc2lFcnJuby5FUk9GUyAqLzogcmV0dXJuICdSZWFkLW9ubHkgZmlsZSBzeXN0ZW0nO1xuICAgICAgICBjYXNlIDcwIC8qIFdhc2lFcnJuby5FU1BJUEUgKi86IHJldHVybiAnSW52YWxpZCBzZWVrJztcbiAgICAgICAgY2FzZSA3MSAvKiBXYXNpRXJybm8uRVNSQ0ggKi86IHJldHVybiAnTm8gc3VjaCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSA3MiAvKiBXYXNpRXJybm8uRVNUQUxFICovOiByZXR1cm4gJ1N0YWxlIGZpbGUgaGFuZGxlJztcbiAgICAgICAgY2FzZSA3MyAvKiBXYXNpRXJybm8uRVRJTUVET1VUICovOiByZXR1cm4gJ09wZXJhdGlvbiB0aW1lZCBvdXQnO1xuICAgICAgICBjYXNlIDc0IC8qIFdhc2lFcnJuby5FVFhUQlNZICovOiByZXR1cm4gJ1RleHQgZmlsZSBidXN5JztcbiAgICAgICAgY2FzZSA3NSAvKiBXYXNpRXJybm8uRVhERVYgKi86IHJldHVybiAnQ3Jvc3MtZGV2aWNlIGxpbmsnO1xuICAgICAgICBjYXNlIDc2IC8qIFdhc2lFcnJuby5FTk9UQ0FQQUJMRSAqLzogcmV0dXJuICdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdVbmtub3duIGVycm9yJztcbiAgICB9XG59XG5jbGFzcyBXYXNpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZXJybm8pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXJybm8gPSBlcnJubztcbiAgICB9XG4gICAgZ2V0RXJyb3JNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gc3RyZXJyb3IodGhpcy5lcnJubyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdhc2lFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ1dhc2lFcnJvcidcbn0pO1xuXG5jb25zdCBSSUdIVFNfQUxMID0gV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NFRUsgfFxuICAgIFdhc2lSaWdodHMuRkRfRkRTVEFUX1NFVF9GTEFHUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TWU5DIHxcbiAgICBXYXNpUmlnaHRzLkZEX1RFTEwgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOIHxcbiAgICBXYXNpUmlnaHRzLlNPQ0tfQUNDRVBUO1xuY29uc3QgQkxPQ0tfREVWSUNFX0JBU0UgPSBSSUdIVFNfQUxMO1xuY29uc3QgQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkcgPSBSSUdIVFNfQUxMO1xuY29uc3QgQ0hBUkFDVEVSX0RFVklDRV9CQVNFID0gUklHSFRTX0FMTDtcbmNvbnN0IENIQVJBQ1RFUl9ERVZJQ0VfSU5IRVJJVElORyA9IFJJR0hUU19BTEw7XG5jb25zdCBSRUdVTEFSX0ZJTEVfQkFTRSA9IFdhc2lSaWdodHMuRkRfREFUQVNZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TRUVLIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9URUxMIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FEVklTRSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmNvbnN0IERJUkVDVE9SWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURTtcbmNvbnN0IERJUkVDVE9SWV9JTkhFUklUSU5HID0gRElSRUNUT1JZX0JBU0UgfCBSRUdVTEFSX0ZJTEVfQkFTRTtcbmNvbnN0IFNPQ0tFVF9CQVNFID0gKFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX0dFVCB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOKTtcbmNvbnN0IFNPQ0tFVF9JTkhFUklUSU5HID0gUklHSFRTX0FMTDtcbmNvbnN0IFRUWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfR0VUIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgVFRZX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmZ1bmN0aW9uIGdldFJpZ2h0cyhzdGRpbywgZmQsIGZsYWdzLCB0eXBlKSB7XG4gICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBiYXNlOiBCaWdJbnQoMCksXG4gICAgICAgIGluaGVyaXRpbmc6IEJpZ0ludCgwKVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09IDAgLyogV2FzaUZpbGVUeXBlLlVOS05PV04gKi8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biBmaWxlIHR5cGUnLCAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBSRUdVTEFSX0ZJTEVfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi86XG4gICAgICAgICAgICByZXQuYmFzZSA9IERJUkVDVE9SWV9CQVNFO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBESVJFQ1RPUllfSU5IRVJJVElORztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUZpbGVUeXBlLlNPQ0tFVF9TVFJFQU0gKi86XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX0RHUkFNICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBTT0NLRVRfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gU09DS0VUX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovOlxuICAgICAgICAgICAgaWYgKHN0ZGlvLmluZGV4T2YoZmQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gVFRZX0JBU0U7XG4gICAgICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBUVFlfSU5IRVJJVElORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gQ0hBUkFDVEVSX0RFVklDRV9CQVNFO1xuICAgICAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQ0hBUkFDVEVSX0RFVklDRV9JTkhFUklUSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRmlsZVR5cGUuQkxPQ0tfREVWSUNFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBCTE9DS19ERVZJQ0VfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldC5iYXNlID0gQmlnSW50KDApO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIC8qIERpc2FibGUgcmVhZC93cml0ZSBiaXRzIGRlcGVuZGluZyBvbiBhY2Nlc3MgbW9kZS4gKi9cbiAgICBjb25zdCByZWFkX29yX3dyaXRlX29ubHkgPSBmbGFncyAmICgwIHwgMSB8IDIpO1xuICAgIGlmIChyZWFkX29yX3dyaXRlX29ubHkgPT09IDApIHtcbiAgICAgICAgcmV0LmJhc2UgJj0gfldhc2lSaWdodHMuRkRfV1JJVEU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlYWRfb3Jfd3JpdGVfb25seSA9PT0gMSkge1xuICAgICAgICByZXQuYmFzZSAmPSB+V2FzaVJpZ2h0cy5GRF9SRUFEO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb25jYXRCdWZmZXIoYnVmZmVycywgc2l6ZSkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiBzaXplID49IDApIHtcbiAgICAgICAgdG90YWwgPSBzaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBidWZmZXJzW2ldO1xuICAgICAgICAgICAgdG90YWwgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcG9zID0gMDtcbiAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XG4gICAgICAgIHJldC5zZXQoYnVmZmVyLCBwb3MpO1xuICAgICAgICBwb3MgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mZCA9IGZkO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnJlYWxQYXRoID0gcmVhbFBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMucmlnaHRzQmFzZSA9IHJpZ2h0c0Jhc2U7XG4gICAgICAgIHRoaXMucmlnaHRzSW5oZXJpdGluZyA9IHJpZ2h0c0luaGVyaXRpbmc7XG4gICAgICAgIHRoaXMucHJlb3BlbiA9IHByZW9wZW47XG4gICAgICAgIHRoaXMucG9zID0gQmlnSW50KDApO1xuICAgICAgICB0aGlzLnNpemUgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHtcbiAgICAgICAgaWYgKHdoZW5jZSA9PT0gMCAvKiBXYXNpV2hlbmNlLlNFVCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aGVuY2UgPT09IDEgLyogV2FzaVdoZW5jZS5DVVIgKi8pIHtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdoZW5jZSA9PT0gMiAvKiBXYXNpV2hlbmNlLkVORCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQodGhpcy5zaXplKSAtIEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biB3aGVuY2UnLCAyOSAvKiBXYXNpRXJybm8uRUlPICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfVxufVxuY2xhc3MgU3RhbmRhcmRPdXRwdXQgZXh0ZW5kcyBGaWxlRGVzY3JpcHRvciB7XG4gICAgY29uc3RydWN0b3IobG9nLCBpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHN1cGVyKGlkLCBmZCwgcGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB0aGlzLl9sb2cgPSBsb2c7XG4gICAgICAgIHRoaXMuX2J1ZiA9IG51bGw7XG4gICAgfVxuICAgIHdyaXRlKGJ1ZmZlcikge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgaWYgKHRoaXMuX2J1Zikge1xuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0QnVmZmVyKFt0aGlzLl9idWYsIGJ1ZmZlcl0pO1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyLmluZGV4T2YoMTApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gYnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgICAgICBsZXQgbGFzdEJlZ2luID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICB3aGlsZSAoKGluZGV4ID0gYnVmZmVyLmluZGV4T2YoMTAsIHdyaXR0ZW4pKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShidWZmZXIuc3ViYXJyYXkobGFzdEJlZ2luLCBpbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5fbG9nKHN0cik7XG4gICAgICAgICAgICB3cml0dGVuICs9IGluZGV4IC0gbGFzdEJlZ2luICsgMTtcbiAgICAgICAgICAgIGxhc3RCZWdpbiA9IGluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JpdHRlbiA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZiA9IGJ1ZmZlci5zbGljZSh3cml0dGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiB0b0ZpbGVUeXBlKHN0YXQpIHtcbiAgICBpZiAoc3RhdC5pc0Jsb2NrRGV2aWNlKCkpXG4gICAgICAgIHJldHVybiAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSlcbiAgICAgICAgcmV0dXJuIDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgcmV0dXJuIDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICBpZiAoc3RhdC5pc1NvY2tldCgpKVxuICAgICAgICByZXR1cm4gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSlcbiAgICAgICAgcmV0dXJuIDQgLyogV2FzaUZpbGVUeXBlLlJFR1VMQVJfRklMRSAqLztcbiAgICBpZiAoc3RhdC5pc1N5bWJvbGljTGluaygpKVxuICAgICAgICByZXR1cm4gNyAvKiBXYXNpRmlsZVR5cGUuU1lNQk9MSUNfTElOSyAqLztcbiAgICByZXR1cm4gMCAvKiBXYXNpRmlsZVR5cGUuVU5LTk9XTiAqLztcbn1cbmZ1bmN0aW9uIHRvRmlsZVN0YXQodmlldywgYnVmLCBzdGF0KSB7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmLCBzdGF0LmRldiwgdHJ1ZSk7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmICsgOCwgc3RhdC5pbm8sIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDE2LCBCaWdJbnQodG9GaWxlVHlwZShzdGF0KSksIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDI0LCBzdGF0Lm5saW5rLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyAzMiwgc3RhdC5zaXplLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0MCwgc3RhdC5hdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0OCwgc3RhdC5tdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA1Niwgc3RhdC5jdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy51c2VkID0gMDtcbiAgICAgICAgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgICB0aGlzLmZkcyA9IEFycmF5KG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgIHRoaXMuc3RkaW8gPSBbb3B0aW9ucy5pbiwgb3B0aW9ucy5vdXQsIG9wdGlvbnMuZXJyXTtcbiAgICAgICAgdGhpcy5wcmludCA9IG9wdGlvbnMucHJpbnQ7XG4gICAgICAgIHRoaXMucHJpbnRFcnIgPSBvcHRpb25zLnByaW50RXJyO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuaW4sIDAsICc8c3RkaW4+Jyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0U3RkaW8ob3B0aW9ucy5vdXQsIDEsICc8c3Rkb3V0PicpO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuZXJyLCAyLCAnPHN0ZGVycj4nKTtcbiAgICB9XG4gICAgaW5zZXJ0U3RkaW8oZmQsIGV4cGVjdGVkLCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovO1xuICAgICAgICBjb25zdCB7IGJhc2UsIGluaGVyaXRpbmcgfSA9IGdldFJpZ2h0cyh0aGlzLnN0ZGlvLCBmZCwgMiAvKiBGaWxlQ29udHJvbEZsYWcuT19SRFdSICovLCB0eXBlKTtcbiAgICAgICAgY29uc3Qgd3JhcCA9IHRoaXMuaW5zZXJ0KGZkLCBuYW1lLCBuYW1lLCB0eXBlLCBiYXNlLCBpbmhlcml0aW5nLCAwKTtcbiAgICAgICAgaWYgKHdyYXAuaWQgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKGBpZDogJHt3cmFwLmlkfSAhPT0gZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YCwgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBpbnNlcnQoZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICBpZiAodGhpcy51c2VkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAqIDI7XG4gICAgICAgICAgICB0aGlzLmZkcy5sZW5ndGggPSBuZXdTaXplO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZkc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeTtcbiAgICAgICAgaWYgKG1hcHBlZFBhdGggPT09ICc8c3Rkb3V0PicpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IFN0YW5kYXJkT3V0cHV0KChfYSA9IHRoaXMucHJpbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnNvbGUubG9nLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXBwZWRQYXRoID09PSAnPHN0ZGVycj4nKSB7XG4gICAgICAgICAgICBlbnRyeSA9IG5ldyBTdGFuZGFyZE91dHB1dCgoX2IgPSB0aGlzLnByaW50RXJyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjb25zb2xlLmVycm9yLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IEZpbGVEZXNjcmlwdG9yKGluZGV4LCBmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmRzW2luZGV4XSA9IGVudHJ5O1xuICAgICAgICB0aGlzLnVzZWQrKztcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICBnZXQoaWQsIGJhc2UsIGluaGVyaXRpbmcpIHtcbiAgICAgICAgaWYgKGlkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignSW52YWxpZCBmZCcsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZmRzW2lkXTtcbiAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5pZCAhPT0gaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0JhZCBmaWxlIGRlc2NyaXB0b3InLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgZmQgaGFzIHRoZSBuZWNlc3NhcnkgcmlnaHRzLiAqL1xuICAgICAgICBpZiAoKH5lbnRyeS5yaWdodHNCYXNlICYgYmFzZSkgIT09IEJpZ0ludCgwKSB8fCAofmVudHJ5LnJpZ2h0c0luaGVyaXRpbmcgJiBpbmhlcml0aW5nKSAhPT0gQmlnSW50KDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JywgNzYgLyogV2FzaUVycm5vLkVOT1RDQVBBQkxFICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIHJlbW92ZShpZCkge1xuICAgICAgICBpZiAoaWQgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5mZHNbaWRdO1xuICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmlkICE9PSBpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignQmFkIGZpbGUgZGVzY3JpcHRvcicsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZkc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cbmNsYXNzIFN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZnMgPSBvcHRpb25zLmZzO1xuICAgIH1cbiAgICBnZXRGaWxlVHlwZUJ5RmQoZmQpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyhmZCwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5jbG9zZVN5bmMoZHN0RW50cnkuZmQpO1xuICAgICAgICB0aGlzLmZkc1tkc3RdID0gdGhpcy5mZHNbc3JjXTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XS5pZCA9IGRzdDtcbiAgICAgICAgdGhpcy5mZHNbc3JjXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51c2VkLS07XG4gICAgfVxufVxuY2xhc3MgQXN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIGdldEZpbGVUeXBlQnlGZChmZCkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZkLnN0YXQoeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgYXN5bmMgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLmZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgYXN5bmMgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZHN0RW50cnkuZmQuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XSA9IHRoaXMuZmRzW3NyY107XG4gICAgICAgIHRoaXMuZmRzW2RzdF0uaWQgPSBkc3Q7XG4gICAgICAgIHRoaXMuZmRzW3NyY10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmNvbnN0IFdlYkFzc2VtYmx5TWVtb3J5ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkgeyByZXR1cm4gX1dlYkFzc2VtYmx5Lk1lbW9yeTsgfSkoKTtcbi8qKiBAcHVibGljICovXG5jbGFzcyBNZW1vcnkgZXh0ZW5kcyBXZWJBc3NlbWJseU1lbW9yeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRvcikge1xuICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgZ2V0IEhFQVA4KCkgeyByZXR1cm4gbmV3IEludDhBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IEhFQVBVOCgpIHsgcmV0dXJuIG5ldyBVaW50OEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDE2KCkgeyByZXR1cm4gbmV3IEludDE2QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTE2KCkgeyByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDMyKCkgeyByZXR1cm4gbmV3IEludDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTMyKCkgeyByZXR1cm4gbmV3IFVpbnQzMkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDY0KCkgeyByZXR1cm4gbmV3IEJpZ0ludDY0QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTY0KCkgeyByZXR1cm4gbmV3IEJpZ1VpbnQ2NEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUEYzMigpIHsgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQRjY0KCkgeyByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IHZpZXcoKSB7IHJldHVybiBuZXcgRGF0YVZpZXcoc3VwZXIuYnVmZmVyKTsgfVxufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGV4dGVuZE1lbW9yeShtZW1vcnkpIHtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1lbW9yeSkgPT09IF9XZWJBc3NlbWJseS5NZW1vcnkucHJvdG90eXBlKSB7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihtZW1vcnksIE1lbW9yeS5wcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb3J5O1xufVxuXG5mdW5jdGlvbiBjaGVja1dlYkFzc2VtYmx5RnVuY3Rpb24oKSB7XG4gICAgY29uc3QgV2ViQXNzZW1ibHlGdW5jdGlvbiA9IF9XZWJBc3NlbWJseS5GdW5jdGlvbjtcbiAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJBc3NlbWJseS5GdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJyArXG4gICAgICAgICAgICAnIElmIHlvdSBhcmUgdXNpbmcgVjggYmFzZWQgYnJvd3NlciBsaWtlIENocm9tZSwgdHJ5IHRvIHNwZWNpZnknICtcbiAgICAgICAgICAgICcgLS1qcy1mbGFncz1cIi0td2FzbS1zdGFnaW5nIC0tZXhwZXJpbWVudGFsLXdhc20tc3RhY2stc3dpdGNoaW5nXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIFdlYkFzc2VtYmx5RnVuY3Rpb247XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jSW1wb3J0KGYsIHBhcmFtZXRlclR5cGUsIHJldHVyblR5cGUpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJUeXBlLnNsaWNlKDApO1xuICAgIHBhcmFtZXRlcnMudW5zaGlmdCgnZXh0ZXJucmVmJyk7XG4gICAgcmV0dXJuIG5ldyBXZWJBc3NlbWJseUZ1bmN0aW9uKHsgcGFyYW1ldGVycywgcmVzdWx0czogcmV0dXJuVHlwZSB9LCBmLCB7IHN1c3BlbmRpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jRXhwb3J0KGYpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXNzZW1ibHlGdW5jdGlvbih7IHBhcmFtZXRlcnM6IFsuLi5XZWJBc3NlbWJseUZ1bmN0aW9uLnR5cGUoZikucGFyYW1ldGVycy5zbGljZSgxKV0sIHJlc3VsdHM6IFsnZXh0ZXJucmVmJ10gfSwgZiwgeyBwcm9taXNpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEV4cG9ydHMoZXhwb3J0cywgbmVlZFdyYXApIHtcbiAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgbGV0IGlnbm9yZSA9IHR5cGVvZiBleHBvcnRWYWx1ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmVlZFdyYXApKSB7XG4gICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWdub3JlID8gZXhwb3J0VmFsdWUgOiB3cmFwQXN5bmNFeHBvcnQoZXhwb3J0VmFsdWUpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjb3B5TWVtb3J5KHRhcmdldHMsIHNyYykge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCB8fCBzcmMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBsZXQgY29waWVkID0gMDtcbiAgICBsZXQgbGVmdCA9IHNyYy5sZW5ndGggLSBjb3BpZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbaV07XG4gICAgICAgIGlmIChsZWZ0IDwgdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNldChzcmMuc3ViYXJyYXkoY29waWVkLCBjb3BpZWQgKyBsZWZ0KSwgMCk7XG4gICAgICAgICAgICBjb3BpZWQgKz0gbGVmdDtcbiAgICAgICAgICAgIGxlZnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGNvcGllZDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuc2V0KHNyYy5zdWJhcnJheShjb3BpZWQsIGNvcGllZCArIHRhcmdldC5sZW5ndGgpLCAwKTtcbiAgICAgICAgY29waWVkICs9IHRhcmdldC5sZW5ndGg7XG4gICAgICAgIGxlZnQgLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcGllZDtcbn1cbmNvbnN0IF9tZW1vcnkgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX3dhc2kgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX2ZzID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGdldE1lbW9yeSh3YXNpKSB7XG4gICAgcmV0dXJuIF9tZW1vcnkuZ2V0KHdhc2kpO1xufVxuZnVuY3Rpb24gZ2V0RnMod2FzaSkge1xuICAgIGNvbnN0IGZzID0gX2ZzLmdldCh3YXNpKTtcbiAgICBpZiAoIWZzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbGVzeXN0ZW0gaXMgdW5hdmFpbGFibGUnKTtcbiAgICByZXR1cm4gZnM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgV2FzaUVycm9yKSB7XG4gICAgICAgIGlmICgoKHByb2Nlc3MuZW52Lk5PREVfRU5WKSkgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyci5lcnJubztcbiAgICB9XG4gICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICBjYXNlICdFTk9FTlQnOiByZXR1cm4gNDQgLyogV2FzaUVycm5vLkVOT0VOVCAqLztcbiAgICAgICAgY2FzZSAnRUJBREYnOiByZXR1cm4gOCAvKiBXYXNpRXJybm8uRUJBREYgKi87XG4gICAgICAgIGNhc2UgJ0VJTlZBTCc6IHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICBjYXNlICdFUEVSTSc6IHJldHVybiA2MyAvKiBXYXNpRXJybm8uRVBFUk0gKi87XG4gICAgICAgIGNhc2UgJ0VQUk9UTyc6IHJldHVybiA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovO1xuICAgICAgICBjYXNlICdFRVhJU1QnOiByZXR1cm4gMjAgLyogV2FzaUVycm5vLkVFWElTVCAqLztcbiAgICAgICAgY2FzZSAnRU5PVERJUic6IHJldHVybiA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLztcbiAgICAgICAgY2FzZSAnRU1GSUxFJzogcmV0dXJuIDMzIC8qIFdhc2lFcnJuby5FTUZJTEUgKi87XG4gICAgICAgIGNhc2UgJ0VBQ0NFUyc6IHJldHVybiAyIC8qIFdhc2lFcnJuby5FQUNDRVMgKi87XG4gICAgICAgIGNhc2UgJ0VJU0RJUic6IHJldHVybiAzMSAvKiBXYXNpRXJybm8uRUlTRElSICovO1xuICAgICAgICBjYXNlICdFTk9URU1QVFknOiByZXR1cm4gNTUgLyogV2FzaUVycm5vLkVOT1RFTVBUWSAqLztcbiAgICAgICAgY2FzZSAnRU5PU1lTJzogcmV0dXJuIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi87XG4gICAgfVxuICAgIHRocm93IGVycjtcbn1cbmZ1bmN0aW9uIGRlZmluZU5hbWUobmFtZSwgZikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG4gICAgcmV0dXJuIGY7XG59XG5mdW5jdGlvbiBzeXNjYWxsV3JhcChzZWxmLCBuYW1lLCBmKSB7XG4gICAgcmV0dXJuIGRlZmluZU5hbWUobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9ERUJVR19OQVRJVkUgPT09ICd3YXNpJykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBsZXQgZGVidWdBcmdzID0gW2Ake25hbWV9KCR7QXJyYXkuZnJvbSh7IGxlbmd0aDogYXJndW1lbnRzLmxlbmd0aCB9KS5tYXAoKCkgPT4gJyVkJykuam9pbignLCAnKX0pYF07XG4gICAgICAgICAgICBkZWJ1Z0FyZ3MgPSBkZWJ1Z0FyZ3MuY29uY2F0KGFyZ3MpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLCBkZWJ1Z0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgciA9IGYuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudGhlbihfID0+IF8sIGhhbmRsZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIHBhdGgsIGZsYWdzKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGgpO1xuICAgIGlmICgoZmxhZ3MgJiAxKSA9PT0gMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gZnMucmVhZGxpbmtTeW5jKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBwYXRoLCBmbGFncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoKTtcbiAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRsaW5rKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZWQtY29tbWVudFxuY29uc3QgZW5jb2RlciA9IC8qI19fUFVSRV9fKi8gbmV3IFRleHRFbmNvZGVyKCk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3BhY2VkLWNvbW1lbnRcbmNvbnN0IGRlY29kZXIgPSAvKiNfX1BVUkVfXyovIG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgSU5UNjRfTUFYID0gKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSAtIEJpZ0ludCgxKTtcbmZ1bmN0aW9uIHJlYWRTdGRpbigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5wcm9tcHQoKTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSArICdcXG4nKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVGc3RGbGFnc09yUmV0dXJuKGZsYWdzKSB7XG4gICAgcmV0dXJuIChCb29sZWFuKChmbGFncykgJiB+KDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLyB8XG4gICAgICAgIDQgLyogV2FzaUZzdEZsYWcuU0VUX01USU0gKi8gfCA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykpIHx8XG4gICAgICAgICgoZmxhZ3MpICYgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykpID09PVxuICAgICAgICAgICAgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgfHxcbiAgICAgICAgKChmbGFncykgJiAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSkgPT09XG4gICAgICAgICAgICAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSk7XG59XG5jbGFzcyBXQVNJJDEge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MsIGVudiwgZmRzLCBhc3luY0ZzLCBmcywgYXN5bmNpZnkpIHtcbiAgICAgICAgdGhpcy5hcmdzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX2dldCcsIGZ1bmN0aW9uIChhcmd2LCBhcmd2X2J1Zikge1xuICAgICAgICAgICAgYXJndiA9IE51bWJlcihhcmd2KTtcbiAgICAgICAgICAgIGFyZ3ZfYnVmID0gTnVtYmVyKGFyZ3ZfYnVmKTtcbiAgICAgICAgICAgIGlmIChhcmd2ID09PSAwIHx8IGFyZ3ZfYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0SW50MzIoYXJndiwgYXJndl9idWYsIHRydWUpO1xuICAgICAgICAgICAgICAgIGFyZ3YgKz0gNDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoYXJnICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgYXJndl9idWYpO1xuICAgICAgICAgICAgICAgIGFyZ3ZfYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcmdzX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX3NpemVzX2dldCcsIGZ1bmN0aW9uIChhcmdjLCBhcmd2X2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBhcmdjID0gTnVtYmVyKGFyZ2MpO1xuICAgICAgICAgICAgYXJndl9idWZfc2l6ZSA9IE51bWJlcihhcmd2X2J1Zl9zaXplKTtcbiAgICAgICAgICAgIGlmIChhcmdjID09PSAwIHx8IGFyZ3ZfYnVmX3NpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmdjLCBhcmdzLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmd2X2J1Zl9zaXplLCBlbmNvZGVyLmVuY29kZShhcmdzLmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudmlyb25fZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Vudmlyb25fZ2V0JywgZnVuY3Rpb24gKGVudmlyb24sIGVudmlyb25fYnVmKSB7XG4gICAgICAgICAgICBlbnZpcm9uID0gTnVtYmVyKGVudmlyb24pO1xuICAgICAgICAgICAgZW52aXJvbl9idWYgPSBOdW1iZXIoZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgaWYgKGVudmlyb24gPT09IDAgfHwgZW52aXJvbl9idWYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gd2FzaS5lbnY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBlbnZbaV07XG4gICAgICAgICAgICAgICAgdmlldy5zZXRJbnQzMihlbnZpcm9uLCBlbnZpcm9uX2J1ZiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW52aXJvbiArPSA0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShwYWlyICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgICAgIGVudmlyb25fYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbnZpcm9uX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdlbnZpcm9uX3NpemVzX2dldCcsIGZ1bmN0aW9uIChsZW4sIGJ1Zmxlbikge1xuICAgICAgICAgICAgbGVuID0gTnVtYmVyKGxlbik7XG4gICAgICAgICAgICBidWZsZW4gPSBOdW1iZXIoYnVmbGVuKTtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDAgfHwgYnVmbGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihsZW4sIHdhc2kuZW52Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZsZW4sIGVuY29kZXIuZW5jb2RlKHdhc2kuZW52LmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3Jlc19nZXQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnY2xvY2tfcmVzX2dldCcsIGZ1bmN0aW9uIChpZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgcmVzb2x1dGlvbiA9IE51bWJlcihyZXNvbHV0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogV2FzaUNsb2NraWQuUkVBTFRJTUUgKi86XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KHJlc29sdXRpb24sIEJpZ0ludCgxMDAwMDAwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogV2FzaUNsb2NraWQuTU9OT1RPTklDICovOlxuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXNpQ2xvY2tpZC5QUk9DRVNTX0NQVVRJTUVfSUQgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFdhc2lDbG9ja2lkLlRIUkVBRF9DUFVUSU1FX0lEICovOlxuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChyZXNvbHV0aW9uLCBCaWdJbnQoMTAwMCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3RpbWVfZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Nsb2NrX3RpbWVfZ2V0JywgZnVuY3Rpb24gKGlkLCBfcGVyY2lzaW9uLCB0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gTnVtYmVyKHRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBXYXNpQ2xvY2tpZC5SRUFMVElNRSAqLzpcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQodGltZSwgQmlnSW50KERhdGUubm93KCkpICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBXYXNpQ2xvY2tpZC5NT05PVE9OSUMgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAyIC8qIFdhc2lDbG9ja2lkLlBST0NFU1NfQ1BVVElNRV9JRCAqLzpcbiAgICAgICAgICAgICAgICBjYXNlIDMgLyogV2FzaUNsb2NraWQuVEhSRUFEX0NQVVRJTUVfSUQgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gTWF0aC50cnVuYyh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXMgPSBNYXRoLmZsb29yKCh0IC0gcykgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQmlnSW50KHMpICogQmlnSW50KDEwMDAwMDAwMDApICsgQmlnSW50KG1zKSAqIEJpZ0ludCgxMDAwMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQodGltZSwgcmVzdWx0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfYWR2aXNlID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2FkdmlzZScsIGZ1bmN0aW9uIChfZmQsIF9vZmZzZXQsIF9sZW4sIF9hZHZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybiA1MiAvKiBXYXNpRXJybm8uRU5PU1lTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9mZHN0YXRfZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2Zkc3RhdF9nZXQnLCBmdW5jdGlvbiAoZmQsIGZkc3RhdCkge1xuICAgICAgICAgICAgZmRzdGF0ID0gTnVtYmVyKGZkc3RhdCk7XG4gICAgICAgICAgICBpZiAoZmRzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoZmRzdGF0LCBmaWxlRGVzY3JpcHRvci50eXBlLCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KGZkc3RhdCArIDIsIDAsIHRydWUpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoZmRzdGF0ICsgOCwgZmlsZURlc2NyaXB0b3IucmlnaHRzQmFzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChmZHN0YXQgKyAxNiwgZmlsZURlc2NyaXB0b3IucmlnaHRzSW5oZXJpdGluZywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX2Zkc3RhdF9zZXRfZmxhZ3MgPSBzeXNjYWxsV3JhcCh0aGlzLCAnZmRfZmRzdGF0X3NldF9mbGFncycsIGZ1bmN0aW9uIChfZmQsIF9mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX2Zkc3RhdF9zZXRfcmlnaHRzID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2Zkc3RhdF9zZXRfcmlnaHRzJywgZnVuY3Rpb24gKGZkLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICgocmlnaHRzQmFzZSB8IGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0Jhc2UpID4gZmlsZURlc2NyaXB0b3IucmlnaHRzQmFzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA3NiAvKiBXYXNpRXJybm8uRU5PVENBUEFCTEUgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHJpZ2h0c0luaGVyaXRpbmcgfCBmaWxlRGVzY3JpcHRvci5yaWdodHNJbmhlcml0aW5nKSA+XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucmlnaHRzSW5oZXJpdGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA3NiAvKiBXYXNpRXJybm8uRU5PVENBUEFCTEUgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5yaWdodHNCYXNlID0gcmlnaHRzQmFzZTtcbiAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0luaGVyaXRpbmcgPSByaWdodHNJbmhlcml0aW5nO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9wcmVzdGF0X2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9wcmVzdGF0X2dldCcsIGZ1bmN0aW9uIChmZCwgcHJlc3RhdCkge1xuICAgICAgICAgICAgcHJlc3RhdCA9IE51bWJlcihwcmVzdGF0KTtcbiAgICAgICAgICAgIGlmIChwcmVzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IGZpbGVEZXNjcmlwdG9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBXYXNpRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJybm87XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yLnByZW9wZW4gIT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIC8vIHByZW9wZW4gdHlwZSBpcyBkaXIoMClcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHByZXN0YXQsIDAsIHRydWUpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIocHJlc3RhdCArIDQsIGVuY29kZXIuZW5jb2RlKGZpbGVEZXNjcmlwdG9yLnBhdGgpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX3ByZXN0YXRfZGlyX25hbWUgPSBzeXNjYWxsV3JhcCh0aGlzLCAnZmRfcHJlc3RhdF9kaXJfbmFtZScsIGZ1bmN0aW9uIChmZCwgcGF0aCwgcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoZmlsZURlc2NyaXB0b3IucHJlb3BlbiAhPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gOCAvKiBXYXNpRXJybm8uRUJBREYgKi87XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBlbmNvZGVyLmVuY29kZShmaWxlRGVzY3JpcHRvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHNpemUgPiBwYXRoX2xlbilcbiAgICAgICAgICAgICAgICByZXR1cm4gNDIgLyogV2FzaUVycm5vLkVOT0JVRlMgKi87XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgSEVBUFU4LnNldChidWZmZXIsIHBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9zZWVrID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX3NlZWsnLCBmdW5jdGlvbiAoZmQsIG9mZnNldCwgd2hlbmNlLCBuZXdPZmZzZXQpIHtcbiAgICAgICAgICAgIG5ld09mZnNldCA9IE51bWJlcihuZXdPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKG5ld09mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZkID09PSAwIHx8IGZkID09PSAxIHx8IGZkID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9TRUVLLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgciA9IGZpbGVEZXNjcmlwdG9yLnNlZWsob2Zmc2V0LCB3aGVuY2UpO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChuZXdPZmZzZXQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF90ZWxsID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX3RlbGwnLCBmdW5jdGlvbiAoZmQsIG9mZnNldCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1RFTEwsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBCaWdJbnQoZmlsZURlc2NyaXB0b3IucG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoTnVtYmVyKG9mZnNldCksIHBvcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvbGxfb25lb2ZmID0gc3lzY2FsbFdyYXAodGhpcywgJ3BvbGxfb25lb2ZmJywgZnVuY3Rpb24gKGluX3B0ciwgb3V0X3B0ciwgbnN1YnNjcmlwdGlvbnMsIG5ldmVudHMpIHtcbiAgICAgICAgICAgIGluX3B0ciA9IE51bWJlcihpbl9wdHIpO1xuICAgICAgICAgICAgb3V0X3B0ciA9IE51bWJlcihvdXRfcHRyKTtcbiAgICAgICAgICAgIG5ldmVudHMgPSBOdW1iZXIobmV2ZW50cyk7XG4gICAgICAgICAgICBuc3Vic2NyaXB0aW9ucyA9IE51bWJlcihuc3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgICBuc3Vic2NyaXB0aW9ucyA9IG5zdWJzY3JpcHRpb25zID4+PiAwO1xuICAgICAgICAgICAgaWYgKGluX3B0ciA9PT0gMCB8fCBvdXRfcHRyID09PSAwIHx8IG5zdWJzY3JpcHRpb25zID09PSAwIHx8IG5ldmVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgMCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgdGltZXJfdXNlcmRhdGEgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBsZXQgY3VyX3RpbWVvdXQgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBsZXQgaGFzX3RpbWVvdXQgPSAwO1xuICAgICAgICAgICAgbGV0IG1pbl90aW1lb3V0ID0gQmlnSW50KDApO1xuICAgICAgICAgICAgbGV0IHN1YjtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBBcnJheShuc3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnN1YnNjcmlwdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1YiA9IGluX3B0ciArIGkgKiA0ODtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyZGF0YSA9IHZpZXcuZ2V0QmlnVWludDY0KHN1YiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHZpZXcuZ2V0VWludDgoc3ViICsgOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvY2tJZE9yRmQgPSB2aWV3LmdldFVpbnQzMihzdWIgKyAxNiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHZpZXcuZ2V0QmlnVWludDY0KHN1YiArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVjaXNpb24gPSB2aWV3LmdldEJpZ1VpbnQ2NChzdWIgKyAzMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhZ3MgPSB2aWV3LmdldFVpbnQxNihzdWIgKyA0MCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfaWQ6IGNsb2NrSWRPckZkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVhZHdyaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQ6IGNsb2NrSWRPckZkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmRldmVudHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3Vic2NyaXB0aW9uczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3ViID0gc3Vic2NyaXB0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Yi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBXYXNpRXZlbnRUeXBlLkNMT0NLICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViLnUuY2xvY2suZmxhZ3MgPT09IDEgLyogV2FzaVN1YmNsb2NrZmxhZ3MuQUJTVElNRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgYWJzb2x1dGUgdGltZSB0byByZWxhdGl2ZSBkZWxheS4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBCaWdJbnQoRGF0ZS5ub3coKSkgKiBCaWdJbnQoMTAwMDAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWVvdXQgPSBzdWIudS5jbG9jay50aW1lb3V0IC0gbm93O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWVvdXQgPSBzdWIudS5jbG9jay50aW1lb3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc190aW1lb3V0ID09PSAwIHx8IGN1cl90aW1lb3V0IDwgbWluX3RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGltZW91dCA9IGN1cl90aW1lb3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX3VzZXJkYXRhID0gc3ViLnVzZXJkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc190aW1lb3V0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBXYXNpRXZlbnRUeXBlLkZEX1JFQUQgKi86XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXNpRXZlbnRUeXBlLkZEX1dSSVRFICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmRldmVudHMucHVzaChzdWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmZGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZkZXZlbnQgPSBmZGV2ZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBvdXRfcHRyICsgMzIgKiBpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChldmVudCwgZmRldmVudC51c2VyZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgOCwgNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgMTIsIGZkZXZlbnQudHlwZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KGV2ZW50ICsgMTYsIEJpZ0ludCgwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KGV2ZW50ICsgMjQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihuZXZlbnRzLCAxLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgZmRldmVudHMubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzX3RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IE51bWJlcihtaW5fdGltZW91dCAvIEJpZ0ludCgxMDAwMDAwKSk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGlzTWFpblRocmVhZCB8fCB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEJyZWFrSWYoZGVsYXksICgpID0+IGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgYnVmID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDQpXG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBhcnIgPSBuZXcgSW50MzJBcnJheShidWYpXG4gICAgICAgICAgICAgICAgLy8gICBwb3N0TXNnKHtcbiAgICAgICAgICAgICAgICAvLyAgICAgX190eWJ5c193YXNtX3V0aWxfd2FzaV9fOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogJ3NldC10aW1lb3V0JyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBidWZmZXI6IGJ1ZixcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRlbGF5XG4gICAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICB9KVxuICAgICAgICAgICAgICAgIC8vICAgQXRvbWljcy53YWl0KGFyciwgMCwgMClcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBvdXRfcHRyO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KGV2ZW50LCB0aW1lcl91c2VyZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoZXZlbnQgKyA4LCAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoZXZlbnQgKyAxMiwgMCAvKiBXYXNpRXZlbnRUeXBlLkNMT0NLICovLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihuZXZlbnRzLCAxLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvY19leGl0ID0gc3lzY2FsbFdyYXAodGhpcywgJ3Byb2NfZXhpdCcsIGZ1bmN0aW9uIChydmFsKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpICYmICh0eXBlb2YgcHJvY2Vzcy5leGl0ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdChydmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvY19yYWlzZSA9IHN5c2NhbGxXcmFwKHRoaXMsICdwcm9jX3JhaXNlJywgZnVuY3Rpb24gKF9zaWcpIHtcbiAgICAgICAgICAgIHJldHVybiA1MiAvKiBXYXNpRXJybm8uRU5PU1lTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2hlZF95aWVsZCA9IHN5c2NhbGxXcmFwKHRoaXMsICdzY2hlZF95aWVsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmFuZG9tX2dldCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHN5c2NhbGxXcmFwKHRoaXMsICdyYW5kb21fZ2V0JywgZnVuY3Rpb24gKGJ1ZiwgYnVmX2xlbikge1xuICAgICAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgICAgIGlmIChidWYgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlcikgPT09ICdbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWY7IGkgPCBidWYgKyBidWZfbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoaSwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcG9zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlkZSA9IDY1NTM2O1xuICAgICAgICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zICsgc3RyaWRlIDwgYnVmX2xlbjsgcG9zICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEhFQVBVOC5zdWJhcnJheShidWYgKyBwb3MsIGJ1ZiArIHBvcyArIHN0cmlkZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEhFQVBVOC5zdWJhcnJheShidWYgKyBwb3MsIGJ1ZiArIGJ1Zl9sZW4pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBzeXNjYWxsV3JhcCh0aGlzLCAncmFuZG9tX2dldCcsIGZ1bmN0aW9uIChidWYsIGJ1Zl9sZW4pIHtcbiAgICAgICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWY7IGkgPCBidWYgKyBidWZfbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OChpLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19yZWN2ID0gc3lzY2FsbFdyYXAodGhpcywgJ3NvY2tfcmVjdicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19zZW5kID0gc3lzY2FsbFdyYXAodGhpcywgJ3NvY2tfc2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19zaHV0ZG93biA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX3NodXRkb3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb2NrX2FjY2VwdCA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX2FjY2VwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIF93YXNpLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBmZHMsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZW52XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZnMpXG4gICAgICAgICAgICBfZnMuc2V0KHRoaXMsIGZzKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gZGVmaW5lSW1wb3J0KG5hbWUsIHN5bmNWZXJzaW9uLCBhc3luY1ZlcnNpb24sIHBhcmFtZXRlclR5cGUsIHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgIGlmIChhc3luY0ZzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jaWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzW25hbWVdID0gYXN5bmNpZnkud3JhcEltcG9ydEZ1bmN0aW9uKHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBhc3luY1ZlcnNpb24pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzW25hbWVdID0gd3JhcEFzeW5jSW1wb3J0KHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBhc3luY1ZlcnNpb24pLCBwYXJhbWV0ZXJUeXBlLCByZXR1cm5UeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdGhpc1tuYW1lXSA9IHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBzeW5jVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9hbGxvY2F0ZScsIGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGZkLCBvZmZzZXQsIGxlbikge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5mc3RhdFN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuc2l6ZSA8IG9mZnNldCArIGxlbikge1xuICAgICAgICAgICAgICAgIGZzLmZ0cnVuY2F0ZVN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIE51bWJlcihvZmZzZXQgKyBsZW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfYWxsb2NhdGUoZmQsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfQUxMT0NBVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgaC5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuc2l6ZSA8IG9mZnNldCArIGxlbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGgudHJ1bmNhdGUoTnVtYmVyKG9mZnNldCArIGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpNjQnLCAnZjY0J10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX2Nsb3NlJywgZnVuY3Rpb24gZmRfY2xvc2UoZmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmaWxlRGVzY3JpcHRvci5mZCk7XG4gICAgICAgICAgICB3YXNpLmZkcy5yZW1vdmUoZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9jbG9zZShmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC5jbG9zZSgpO1xuICAgICAgICAgICAgd2FzaS5mZHMucmVtb3ZlKGZkKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZGF0YXN5bmMnLCBmdW5jdGlvbiBmZF9kYXRhc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0RBVEFTWU5DLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmZkYXRhc3luY1N5bmMoZmlsZURlc2NyaXB0b3IuZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9kYXRhc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0RBVEFTWU5DLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQuZGF0YXN5bmMoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZmlsZXN0YXRfZ2V0JywgZnVuY3Rpb24gZmRfZmlsZXN0YXRfZ2V0KGZkLCBidWYpIHtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGZzLmZzdGF0U3luYyhmaWxlRGVzY3JpcHRvci5mZCwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHRvRmlsZVN0YXQodmlldywgYnVmLCBzdGF0KTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfZ2V0KGZkLCBidWYpIHtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgaC5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICB0b0ZpbGVTdGF0KHZpZXcsIGJ1Ziwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9maWxlc3RhdF9zZXRfc2l6ZScsIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF9zaXplKGZkLCBzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuZnRydW5jYXRlU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgTnVtYmVyKHNpemUpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoZmQsIHNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9TRVRfU0laRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGggPSBmaWxlRGVzY3JpcHRvci5mZDtcbiAgICAgICAgICAgIGF3YWl0IGgudHJ1bmNhdGUoTnVtYmVyKHNpemUpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTY0J10sIFsnaTMyJ10pO1xuICAgICAgICBmdW5jdGlvbiBmZEZpbGVzdGF0R2V0VGltZXMoZmQsIGF0aW0sIG10aW0sIGZsYWdzKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSA9PT0gMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pIHtcbiAgICAgICAgICAgICAgICBhdGltID0gQmlnSW50KERhdGUubm93KCkgKiAxMDAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykgPT09IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgbXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmaWxlRGVzY3JpcHRvciwgYXRpbSwgbXRpbSB9O1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZmlsZXN0YXRfc2V0X3RpbWVzJywgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBhdGltLCBtdGltLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRnN0RmxhZ3NPclJldHVybihmbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZmlsZURlc2NyaXB0b3IsIGF0aW06IGF0aW1SZXMsIG10aW06IG10aW1SZXMgfSA9IGZkRmlsZXN0YXRHZXRUaW1lcy5jYWxsKHRoaXMsIGZkLCBhdGltLCBtdGltLCBmbGFncyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuZnV0aW1lc1N5bmMoZmlsZURlc2NyaXB0b3IuZmQsIE51bWJlcihhdGltUmVzKSwgTnVtYmVyKG10aW1SZXMpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBhdGltLCBtdGltLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRnN0RmxhZ3NPclJldHVybihmbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZmlsZURlc2NyaXB0b3IsIGF0aW06IGF0aW1SZXMsIG10aW06IG10aW1SZXMgfSA9IGZkRmlsZXN0YXRHZXRUaW1lcy5jYWxsKHRoaXMsIGZkLCBhdGltLCBtdGltLCBmbGFncyk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBhd2FpdCBoLnV0aW1lcyhOdW1iZXIoYXRpbVJlcyksIE51bWJlcihtdGltUmVzKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3ByZWFkJywgZnVuY3Rpb24gZmRfcHJlYWQoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCB8IFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgU2hhcmVkQXJyYXlCdWZmZXIodG90YWxTaXplKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICBidWZmZXIuX2lzQnVmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIob2Zmc2V0KSk7XG4gICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSkgOiAwO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgbnJlYWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiAoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCB8IFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIG5yZWFkID0gYnVmZmVyID8gY29weU1lbW9yeShpb1ZlY3MsIGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKSA6IDA7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBucmVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9wd3JpdGUnLCBmdW5jdGlvbiBmZF9wd3JpdGUoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfV1JJVEUgfCBXYXNpUmlnaHRzLkZEX1NFRUssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBjb25jYXRCdWZmZXIoQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IG53cml0dGVuID0gZnMud3JpdGVTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG53cml0dGVuLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcHdyaXRlKGZkLCBpb3ZzLCBpb3ZzbGVuLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDAgfHwgb2Zmc2V0ID4gSU5UNjRfTUFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1dSSVRFIHwgV2FzaVJpZ2h0cy5GRF9TRUVLLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gY29uY2F0QnVmZmVyKEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHsgYnl0ZXNXcml0dGVuIH0gPSBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIGJ5dGVzV3JpdHRlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9yZWFkJywgZnVuY3Rpb24gZmRfcmVhZChmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFELCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgICAgICAgICBjb25zdCBpb1ZlY3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGJ1ZkxlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBpZiAoZmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5wcm9tcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIgPSByZWFkU3RkaW4oKTtcbiAgICAgICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIpIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFNoYXJlZEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIoZmlsZURlc2NyaXB0b3IucG9zKSk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpIDogMDtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG5yZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG5yZWFkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcmVhZChmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFELCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgICAgICAgICBjb25zdCBpb1ZlY3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGJ1ZkxlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBpZiAoZmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5wcm9tcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIgPSByZWFkU3RkaW4oKTtcbiAgICAgICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIpIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIoZmlsZURlc2NyaXB0b3IucG9zKSk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpIDogMDtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG5yZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG5yZWFkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfcmVhZGRpcicsIGZ1bmN0aW9uIGZkX3JlYWRkaXIoZmQsIGJ1ZiwgYnVmX2xlbiwgY29va2llLCBidWZ1c2VkKSB7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICBidWZ1c2VkID0gTnVtYmVyKGJ1ZnVzZWQpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMCB8fCBidWZ1c2VkID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFERElSLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGxldCBidWZmZXJVc2VkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBOdW1iZXIoY29va2llKTsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRGF0YSA9IGVuY29kZXIuZW5jb2RlKGVudHJpZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlJbmZvID0gZnMuc3RhdFN5bmMocmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgZW50cmllc1tpXS5uYW1lKSwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMjQgKyBuYW1lRGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeVZpZXcgPSBuZXcgRGF0YVZpZXcoZW50cnlEYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldEJpZ1VpbnQ2NCgwLCBCaWdJbnQoaSArIDEpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0QmlnVWludDY0KDgsIEJpZ0ludChlbnRyeUluZm8uaW5vID8gZW50cnlJbmZvLmlubyA6IDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDMyKDE2LCBuYW1lRGF0YS5ieXRlTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA3IC8qIFdhc2lGaWxlVHlwZS5TWU1CT0xJQ19MSU5LICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzQ2hhcmFjdGVyRGV2aWNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNCbG9ja0RldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNTb2NrZXQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwIC8qIFdhc2lGaWxlVHlwZS5VTktOT1dOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDgoMjAsIHR5cGUpO1xuICAgICAgICAgICAgICAgIGVudHJ5RGF0YS5zZXQobmFtZURhdGEsIDI0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW50cnlEYXRhLnNsaWNlKDAsIE1hdGgubWluKGVudHJ5RGF0YS5sZW5ndGgsIGJ1Zl9sZW4gLSBidWZmZXJVc2VkKSk7XG4gICAgICAgICAgICAgICAgSEVBUFU4LnNldChkYXRhLCBidWYgKyBidWZmZXJVc2VkKTtcbiAgICAgICAgICAgICAgICBidWZmZXJVc2VkICs9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGJ1ZmZlclVzZWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9yZWFkZGlyKGZkLCBidWYsIGJ1Zl9sZW4sIGNvb2tpZSwgYnVmdXNlZCkge1xuICAgICAgICAgICAgYnVmID0gTnVtYmVyKGJ1Zik7XG4gICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgYnVmdXNlZCA9IE51bWJlcihidWZ1c2VkKTtcbiAgICAgICAgICAgIGlmIChidWYgPT09IDAgfHwgYnVmdXNlZCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRERJUiwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGxldCBidWZmZXJVc2VkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBOdW1iZXIoY29va2llKTsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRGF0YSA9IGVuY29kZXIuZW5jb2RlKGVudHJpZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlJbmZvID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChyZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBlbnRyaWVzW2ldLm5hbWUpLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeURhdGEgPSBuZXcgVWludDhBcnJheSgyNCArIG5hbWVEYXRhLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5VmlldyA9IG5ldyBEYXRhVmlldyhlbnRyeURhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0QmlnVWludDY0KDAsIEJpZ0ludChpICsgMSksIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRCaWdVaW50NjQoOCwgQmlnSW50KGVudHJ5SW5mby5pbm8gPyBlbnRyeUluZm8uaW5vIDogMCksIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRVaW50MzIoMTYsIG5hbWVEYXRhLmJ5dGVMZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA0IC8qIFdhc2lGaWxlVHlwZS5SRUdVTEFSX0ZJTEUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMyAvKiBXYXNpRmlsZVR5cGUuRElSRUNUT1JZICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDcgLyogV2FzaUZpbGVUeXBlLlNZTUJPTElDX0xJTksgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNDaGFyYWN0ZXJEZXZpY2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMiAvKiBXYXNpRmlsZVR5cGUuQ0hBUkFDVEVSX0RFVklDRSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDEgLyogV2FzaUZpbGVUeXBlLkJMT0NLX0RFVklDRSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc1NvY2tldCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA2IC8qIFdhc2lGaWxlVHlwZS5TT0NLRVRfU1RSRUFNICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDAgLyogV2FzaUZpbGVUeXBlLlVOS05PV04gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRVaW50OCgyMCwgdHlwZSk7XG4gICAgICAgICAgICAgICAgZW50cnlEYXRhLnNldChuYW1lRGF0YSwgMjQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBlbnRyeURhdGEuc2xpY2UoMCwgTWF0aC5taW4oZW50cnlEYXRhLmxlbmd0aCwgYnVmX2xlbiAtIGJ1ZmZlclVzZWQpKTtcbiAgICAgICAgICAgICAgICBIRUFQVTguc2V0KGRhdGEsIGJ1ZiArIGJ1ZmZlclVzZWQpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlclVzZWQgKz0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoYnVmdXNlZCwgYnVmZmVyVXNlZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9yZW51bWJlcicsIGZ1bmN0aW9uIGZkX3JlbnVtYmVyKGZyb20sIHRvKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgd2FzaS5mZHMucmVudW1iZXIodG8sIGZyb20pO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9yZW51bWJlcihmcm9tLCB0bykge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IHdhc2kuZmRzLnJlbnVtYmVyKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3N5bmMnLCBmdW5jdGlvbiBmZF9zeW5jKGZkKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5mc3luY1N5bmMoZmlsZURlc2NyaXB0b3IuZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9zeW5jKGZkKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLnN5bmMoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfd3JpdGUnLCBmdW5jdGlvbiBmZF93cml0ZShmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9XUklURSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGNvbmNhdEJ1ZmZlcihBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBsZXQgbndyaXR0ZW47XG4gICAgICAgICAgICBpZiAoZmQgPT09IDEgfHwgZmQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBud3JpdHRlbiA9IGZpbGVEZXNjcmlwdG9yLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgICAgIG53cml0dGVuID0gZnMud3JpdGVTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihmaWxlRGVzY3JpcHRvci5wb3MpKTtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG53cml0dGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG53cml0dGVuLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfd3JpdGUoZmQsIGlvdnMsIGlvdnNsZW4sIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfV1JJVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBjb25jYXRCdWZmZXIoQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgbGV0IG53cml0dGVuO1xuICAgICAgICAgICAgaWYgKGZkID09PSAxIHx8IGZkID09PSAyKSB7XG4gICAgICAgICAgICAgICAgbndyaXR0ZW4gPSBmaWxlRGVzY3JpcHRvci53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbndyaXR0ZW4gPSBhd2FpdCAoYXdhaXQgKGZpbGVEZXNjcmlwdG9yLmZkLndyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgTnVtYmVyKGZpbGVEZXNjcmlwdG9yLnBvcykpKSkuYnl0ZXNXcml0dGVuO1xuICAgICAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnBvcyArPSBCaWdJbnQobndyaXR0ZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgbndyaXR0ZW4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX2NyZWF0ZV9kaXJlY3RvcnknLCBmdW5jdGlvbiBwYXRoX2NyZWF0ZV9kaXJlY3RvcnkoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9DUkVBVEVfRElSRUNUT1JZLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX2NyZWF0ZV9kaXJlY3RvcnkoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9DUkVBVEVfRElSRUNUT1JZLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9maWxlc3RhdF9nZXQnLCBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChmZCwgZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBmaWxlc3RhdCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGZpbGVzdGF0ID0gTnVtYmVyKGZpbGVzdGF0KTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGZpbGVzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfRklMRVNUQVRfR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgbGV0IHN0YXQ7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMocGF0aFN0cmluZywgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ID0gZnMubHN0YXRTeW5jKHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9GaWxlU3RhdCh2aWV3LCBmaWxlc3RhdCwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfZ2V0KGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGZpbGVzdGF0KSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgZmlsZXN0YXQgPSBOdW1iZXIoZmlsZXN0YXQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgZmlsZXN0YXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBsZXQgc3RhdDtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAxKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9GaWxlU3RhdCh2aWV3LCBmaWxlc3RhdCwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX2ZpbGVzdGF0X3NldF90aW1lcycsIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGF0aW0sIG10aW0sIGZzdF9mbGFncykge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZnN0X2ZsYWdzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKSwgZmxhZ3MpO1xuICAgICAgICAgICAgaWYgKChmc3RfZmxhZ3MgJiAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgPT09IDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgYXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzdF9mbGFncyAmIDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSA9PT0gOCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTV9OT1cgKi8pIHtcbiAgICAgICAgICAgICAgICBtdGltID0gQmlnSW50KERhdGUubm93KCkgKiAxMDAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZzLnV0aW1lc1N5bmMocmVzb2x2ZWRQYXRoLCBOdW1iZXIoYXRpbSksIE51bWJlcihtdGltKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGF0aW0sIG10aW0sIGZzdF9mbGFncykge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZnN0X2ZsYWdzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSksIGZsYWdzKTtcbiAgICAgICAgICAgIGlmICgoZnN0X2ZsYWdzICYgMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pID09PSAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykge1xuICAgICAgICAgICAgICAgIGF0aW0gPSBCaWdJbnQoRGF0ZS5ub3coKSAqIDEwMDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChmc3RfZmxhZ3MgJiA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykgPT09IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgbXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51dGltZXMocmVzb2x2ZWRQYXRoLCBOdW1iZXIoYXRpbSksIE51bWJlcihtdGltKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfbGluaycsIGZ1bmN0aW9uIHBhdGhfbGluayhvbGRfZmQsIG9sZF9mbGFncywgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfU09VUkNFIHwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9MSU5LX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9sZFBhdGggPSByZXNvbHZlUGF0aFN5bmMoZnMsIG9sZFdyYXAsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSwgb2xkX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTmV3UGF0aCA9IHJlc29sdmUobmV3V3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG5ld19wYXRoLCBuZXdfcGF0aCArIG5ld19wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGZzLmxpbmtTeW5jKHJlc29sdmVkT2xkUGF0aCwgcmVzb2x2ZWROZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9saW5rKG9sZF9mZCwgb2xkX2ZsYWdzLCBvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBuZXdfZmQsIG5ld19wYXRoLCBuZXdfcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIG9sZF9wYXRoID0gTnVtYmVyKG9sZF9wYXRoKTtcbiAgICAgICAgICAgIG9sZF9wYXRoX2xlbiA9IE51bWJlcihvbGRfcGF0aF9sZW4pO1xuICAgICAgICAgICAgbmV3X3BhdGggPSBOdW1iZXIobmV3X3BhdGgpO1xuICAgICAgICAgICAgbmV3X3BhdGhfbGVuID0gTnVtYmVyKG5ld19wYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAob2xkX3BhdGggPT09IDAgfHwgbmV3X3BhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBsZXQgb2xkV3JhcDtcbiAgICAgICAgICAgIGxldCBuZXdXcmFwO1xuICAgICAgICAgICAgaWYgKG9sZF9mZCA9PT0gbmV3X2ZkKSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfCBXYXNpUmlnaHRzLlBBVEhfTElOS19UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbGRXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfU09VUkNFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgICAgIG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQobmV3X2ZkLCBXYXNpUmlnaHRzLlBBVEhfTElOS19UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT2xkUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIG9sZFdyYXAsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSwgb2xkX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTmV3UGF0aCA9IHJlc29sdmUobmV3V3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG5ld19wYXRoLCBuZXdfcGF0aCArIG5ld19wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmxpbmsocmVzb2x2ZWRPbGRQYXRoLCByZXNvbHZlZE5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZnVuY3Rpb24gcGF0aE9wZW4ob19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncykge1xuICAgICAgICAgICAgY29uc3QgcmVhZCA9IChmc19yaWdodHNfYmFzZSAmIChXYXNpUmlnaHRzLkZEX1JFQUQgfFxuICAgICAgICAgICAgICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUikpICE9PSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZSA9IChmc19yaWdodHNfYmFzZSAmIChXYXNpUmlnaHRzLkZEX0RBVEFTWU5DIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFKSkgIT09IEJpZ0ludCgwKTtcbiAgICAgICAgICAgIGxldCBmbGFncyA9IHdyaXRlID8gcmVhZCA/IDIgLyogRmlsZUNvbnRyb2xGbGFnLk9fUkRXUiAqLyA6IDEgLyogRmlsZUNvbnRyb2xGbGFnLk9fV1JPTkxZICovIDogMCAvKiBGaWxlQ29udHJvbEZsYWcuT19SRE9OTFkgKi87XG4gICAgICAgICAgICBsZXQgbmVlZGVkX2Jhc2UgPSBXYXNpUmlnaHRzLlBBVEhfT1BFTjtcbiAgICAgICAgICAgIGxldCBuZWVkZWRfaW5oZXJpdGluZyA9IGZzX3JpZ2h0c19iYXNlIHwgZnNfcmlnaHRzX2luaGVyaXRpbmc7XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAxIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19DUkVBVCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSA2NCAvKiBGaWxlQ29udHJvbEZsYWcuT19DUkVBVCAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfYmFzZSB8PSBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0ZJTEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAyIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19ESVJFQ1RPUlkgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gNjU1MzYgLyogRmlsZUNvbnRyb2xGbGFnLk9fRElSRUNUT1JZICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChvX2ZsYWdzICYgNCAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fRVhDTCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAxMjggLyogRmlsZUNvbnRyb2xGbGFnLk9fRVhDTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgob19mbGFncyAmIDggLyogV2FzaUZpbGVDb250cm9sRmxhZy5PX1RSVU5DICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDUxMiAvKiBGaWxlQ29udHJvbEZsYWcuT19UUlVOQyAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfYmFzZSB8PSBXYXNpUmlnaHRzLlBBVEhfRklMRVNUQVRfU0VUX1NJWkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgMSAvKiBXYXNpRmRGbGFnLkFQUEVORCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAxMDI0IC8qIEZpbGVDb250cm9sRmxhZy5PX0FQUEVORCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiAyIC8qIFdhc2lGZEZsYWcuRFNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxhZ3MgfD0gRmlsZUNvbnRyb2xGbGFnLk9fRFNZTkM7XG4gICAgICAgICAgICAgICAgbmVlZGVkX2luaGVyaXRpbmcgfD0gV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiA0IC8qIFdhc2lGZEZsYWcuTk9OQkxPQ0sgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMjA0OCAvKiBGaWxlQ29udHJvbEZsYWcuT19OT05CTE9DSyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiA4IC8qIFdhc2lGZEZsYWcuUlNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTA1MjY3MiAvKiBGaWxlQ29udHJvbEZsYWcuT19TWU5DICovO1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiAxNiAvKiBXYXNpRmRGbGFnLlNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTA1MjY3MiAvKiBGaWxlQ29udHJvbEZsYWcuT19TWU5DICovO1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3cml0ZSAmJiAoZmxhZ3MgJiAoMTAyNCAvKiBGaWxlQ29udHJvbEZsYWcuT19BUFBFTkQgKi8gfCA1MTIgLyogRmlsZUNvbnRyb2xGbGFnLk9fVFJVTkMgKi8pKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGZsYWdzLCBuZWVkZWRfYmFzZSwgbmVlZGVkX2luaGVyaXRpbmcgfTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfb3BlbicsIGZ1bmN0aW9uIHBhdGhfb3BlbihkaXJmZCwgZGlyZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBvX2ZsYWdzLCBmc19yaWdodHNfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcsIGZzX2ZsYWdzLCBmZCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIGZkID0gTnVtYmVyKGZkKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGZkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBmc19yaWdodHNfYmFzZSA9IEJpZ0ludChmc19yaWdodHNfYmFzZSk7XG4gICAgICAgICAgICBmc19yaWdodHNfaW5oZXJpdGluZyA9IEJpZ0ludChmc19yaWdodHNfaW5oZXJpdGluZyk7XG4gICAgICAgICAgICBjb25zdCB7IGZsYWdzOiBmbGFnc1JlcywgbmVlZGVkX2Jhc2U6IG5lZWRlZEJhc2UsIG5lZWRlZF9pbmhlcml0aW5nOiBuZWVkZWRJbmhlcml0aW5nIH0gPSBwYXRoT3BlbihvX2ZsYWdzLCBmc19yaWdodHNfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcsIGZzX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChkaXJmZCwgbmVlZGVkQmFzZSwgbmVlZGVkSW5oZXJpdGluZyk7XG4gICAgICAgICAgICBjb25zdCBtZW1vcnkgPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBIRUFQVTggPSBtZW1vcnkuSEVBUFU4O1xuICAgICAgICAgICAgY29uc3QgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZF9wYXRoID0gcmVzb2x2ZVBhdGhTeW5jKGZzLCBmaWxlRGVzY3JpcHRvciwgcGF0aFN0cmluZywgZGlyZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3QgciA9IGZzLm9wZW5TeW5jKHJlc29sdmVkX3BhdGgsIGZsYWdzUmVzLCAwbzY2Nik7XG4gICAgICAgICAgICBjb25zdCBmaWxldHlwZSA9IHdhc2kuZmRzLmdldEZpbGVUeXBlQnlGZChyKTtcbiAgICAgICAgICAgIGlmICgob19mbGFncyAmIDIgLyogV2FzaUZpbGVDb250cm9sRmxhZy5PX0RJUkVDVE9SWSAqLykgIT09IDAgJiYgZmlsZXR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgYmFzZTogbWF4X2Jhc2UsIGluaGVyaXRpbmc6IG1heF9pbmhlcml0aW5nIH0gPSBnZXRSaWdodHMod2FzaS5mZHMuc3RkaW8sIHIsIGZsYWdzUmVzLCBmaWxldHlwZSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwID0gd2FzaS5mZHMuaW5zZXJ0KHIsIHJlc29sdmVkX3BhdGgsIHJlc29sdmVkX3BhdGgsIGZpbGV0eXBlLCBmc19yaWdodHNfYmFzZSAmIG1heF9iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZyAmIG1heF9pbmhlcml0aW5nLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5mc3RhdFN5bmMociwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIHdyYXAuc2l6ZSA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoKGZsYWdzUmVzICYgMTAyNCAvKiBGaWxlQ29udHJvbEZsYWcuT19BUFBFTkQgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXAucG9zID0gc3RhdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBtZW1vcnkudmlldztcbiAgICAgICAgICAgIHZpZXcuc2V0SW50MzIoZmQsIHdyYXAuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX29wZW4oZGlyZmQsIGRpcmZsYWdzLCBwYXRoLCBwYXRoX2xlbiwgb19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncywgZmQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBmZCA9IE51bWJlcihmZCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBmZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2Jhc2UgPSBCaWdJbnQoZnNfcmlnaHRzX2Jhc2UpO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2luaGVyaXRpbmcgPSBCaWdJbnQoZnNfcmlnaHRzX2luaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgeyBmbGFnczogZmxhZ3NSZXMsIG5lZWRlZF9iYXNlOiBuZWVkZWRCYXNlLCBuZWVkZWRfaW5oZXJpdGluZzogbmVlZGVkSW5oZXJpdGluZyB9ID0gcGF0aE9wZW4ob19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZGlyZmQsIG5lZWRlZEJhc2UsIG5lZWRlZEluaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgSEVBUFU4ID0gbWVtb3J5LkhFQVBVODtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRfcGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBwYXRoU3RyaW5nLCBkaXJmbGFncyk7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihyZXNvbHZlZF9wYXRoLCBmbGFnc1JlcywgMG82NjYpO1xuICAgICAgICAgICAgY29uc3QgZmlsZXR5cGUgPSBhd2FpdCB3YXNpLmZkcy5nZXRGaWxlVHlwZUJ5RmQocik7XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAyIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19ESVJFQ1RPUlkgKi8pICE9PSAwICYmIGZpbGV0eXBlICE9PSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGJhc2U6IG1heF9iYXNlLCBpbmhlcml0aW5nOiBtYXhfaW5oZXJpdGluZyB9ID0gZ2V0UmlnaHRzKHdhc2kuZmRzLnN0ZGlvLCByLmZkLCBmbGFnc1JlcywgZmlsZXR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcCA9IHdhc2kuZmRzLmluc2VydChyLCByZXNvbHZlZF9wYXRoLCByZXNvbHZlZF9wYXRoLCBmaWxldHlwZSwgZnNfcmlnaHRzX2Jhc2UgJiBtYXhfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcgJiBtYXhfaW5oZXJpdGluZywgMCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgci5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwLnNpemUgPSBzdGF0LnNpemU7XG4gICAgICAgICAgICAgICAgaWYgKChmbGFnc1JlcyAmIDEwMjQgLyogRmlsZUNvbnRyb2xGbGFnLk9fQVBQRU5EICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwLnBvcyA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbWVtb3J5LnZpZXc7XG4gICAgICAgICAgICB2aWV3LnNldEludDMyKGZkLCB3cmFwLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX3JlYWRsaW5rJywgZnVuY3Rpb24gcGF0aF9yZWFkbGluayhmZCwgcGF0aCwgcGF0aF9sZW4sIGJ1ZiwgYnVmX2xlbiwgYnVmdXNlZCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgYnVmX2xlbiA9IE51bWJlcihidWZfbGVuKTtcbiAgICAgICAgICAgIGJ1ZnVzZWQgPSBOdW1iZXIoYnVmdXNlZCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBidWYgPT09IDAgfHwgYnVmdXNlZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGZzLnJlYWRsaW5rU3luYyhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtEYXRhID0gZW5jb2Rlci5lbmNvZGUobGluayk7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsaW5rRGF0YS5sZW5ndGgsIGJ1Zl9sZW4pO1xuICAgICAgICAgICAgaWYgKGxlbiA+PSBidWZfbGVuKVxuICAgICAgICAgICAgICAgIHJldHVybiA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLztcbiAgICAgICAgICAgIEhFQVBVOC5zZXQobGlua0RhdGEuc3ViYXJyYXkoMCwgbGVuKSwgYnVmKTtcbiAgICAgICAgICAgIEhFQVBVOFtidWYgKyBsZW5dID0gMDtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfcmVhZGxpbmsoZmQsIHBhdGgsIHBhdGhfbGVuLCBidWYsIGJ1Zl9sZW4sIGJ1ZnVzZWQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICBidWZ1c2VkID0gTnVtYmVyKGJ1ZnVzZWQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgYnVmID09PSAwIHx8IGJ1ZnVzZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9SRUFETElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkbGluayhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtEYXRhID0gZW5jb2Rlci5lbmNvZGUobGluayk7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsaW5rRGF0YS5sZW5ndGgsIGJ1Zl9sZW4pO1xuICAgICAgICAgICAgaWYgKGxlbiA+PSBidWZfbGVuKVxuICAgICAgICAgICAgICAgIHJldHVybiA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLztcbiAgICAgICAgICAgIEhFQVBVOC5zZXQobGlua0RhdGEuc3ViYXJyYXkoMCwgbGVuKSwgYnVmKTtcbiAgICAgICAgICAgIEhFQVBVOFtidWYgKyBsZW5dID0gMDtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9yZW1vdmVfZGlyZWN0b3J5JywgZnVuY3Rpb24gcGF0aF9yZW1vdmVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLnJtZGlyU3luYyhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9yZW1vdmVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtZGlyKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfcmVuYW1lJywgZnVuY3Rpb24gcGF0aF9yZW5hbWUob2xkX2ZkLCBvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBuZXdfZmQsIG5ld19wYXRoLCBuZXdfcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIG9sZF9wYXRoID0gTnVtYmVyKG9sZF9wYXRoKTtcbiAgICAgICAgICAgIG9sZF9wYXRoX2xlbiA9IE51bWJlcihvbGRfcGF0aF9sZW4pO1xuICAgICAgICAgICAgbmV3X3BhdGggPSBOdW1iZXIobmV3X3BhdGgpO1xuICAgICAgICAgICAgbmV3X3BhdGhfbGVuID0gTnVtYmVyKG5ld19wYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAob2xkX3BhdGggPT09IDAgfHwgbmV3X3BhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBsZXQgb2xkV3JhcDtcbiAgICAgICAgICAgIGxldCBuZXdXcmFwO1xuICAgICAgICAgICAgaWYgKG9sZF9mZCA9PT0gbmV3X2ZkKSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8IFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfU09VUkNFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgICAgIG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQobmV3X2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9sZFBhdGggPSByZXNvbHZlKG9sZFdyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE5ld1BhdGggPSByZXNvbHZlKG5ld1dyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMucmVuYW1lU3luYyhyZXNvbHZlZE9sZFBhdGgsIHJlc29sdmVkTmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfcmVuYW1lKG9sZF9mZCwgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9TT1VSQ0UgfCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPbGRQYXRoID0gcmVzb2x2ZShvbGRXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWROZXdQYXRoID0gcmVzb2x2ZShuZXdXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgbmV3X3BhdGgsIG5ld19wYXRoICsgbmV3X3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShyZXNvbHZlZE9sZFBhdGgsIHJlc29sdmVkTmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9zeW1saW5rJywgZnVuY3Rpb24gcGF0aF9zeW1saW5rKG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIGZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIG5ld1BhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5zeW1saW5rU3luYyhvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9zeW1saW5rKG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIGZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIG5ld1BhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5zeW1saW5rKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF91bmxpbmtfZmlsZScsIGZ1bmN0aW9uIHBhdGhfdW5saW5rX2ZpbGUoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9VTkxJTktfRklMRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfdW5saW5rX2ZpbGUoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9VTkxJTktfRklMRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgdGhpcy5fc2V0TWVtb3J5ID0gZnVuY3Rpb24gc2V0TWVtb3J5KG0pIHtcbiAgICAgICAgICAgIGlmICghKG0gaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTWVtb3J5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnlcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgV2ViQXNzZW1ibHkuTWVtb3J5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbWVtb3J5LnNldChfdGhpcywgZXh0ZW5kTWVtb3J5KG0pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVN5bmMoYXJncywgZW52LCBwcmVvcGVucywgc3RkaW8sIGZzLCBwcmludCwgcHJpbnRFcnIpIHtcbiAgICAgICAgY29uc3QgZmRzID0gbmV3IFN5bmNUYWJsZSh7XG4gICAgICAgICAgICBzaXplOiAzLFxuICAgICAgICAgICAgaW46IHN0ZGlvWzBdLFxuICAgICAgICAgICAgb3V0OiBzdGRpb1sxXSxcbiAgICAgICAgICAgIGVycjogc3RkaW9bMl0sXG4gICAgICAgICAgICBmcyxcbiAgICAgICAgICAgIHByaW50LFxuICAgICAgICAgICAgcHJpbnRFcnJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IF90aGlzID0gbmV3IFdBU0kkMShhcmdzLCBlbnYsIGZkcywgZmFsc2UsIGZzKTtcbiAgICAgICAgaWYgKHByZW9wZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlb3BlbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcmVvcGVuc1tpXS5yZWFsUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKHJlYWxQYXRoLCAncicsIDBvNjY2KTtcbiAgICAgICAgICAgICAgICBmZHMuaW5zZXJ0UHJlb3BlbihmZCwgcHJlb3BlbnNbaV0ubWFwcGVkUGF0aCwgcmVhbFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFzeW5jKGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBmcywgcHJpbnQsIHByaW50RXJyLCBhc3luY2lmeSkge1xuICAgICAgICBjb25zdCBmZHMgPSBuZXcgQXN5bmNUYWJsZSh7XG4gICAgICAgICAgICBzaXplOiAzLFxuICAgICAgICAgICAgaW46IHN0ZGlvWzBdLFxuICAgICAgICAgICAgb3V0OiBzdGRpb1sxXSxcbiAgICAgICAgICAgIGVycjogc3RkaW9bMl0sXG4gICAgICAgICAgICBwcmludCxcbiAgICAgICAgICAgIHByaW50RXJyXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfdGhpcyA9IG5ldyBXQVNJJDEoYXJncywgZW52LCBmZHMsIHRydWUsIGZzLCBhc3luY2lmeSk7XG4gICAgICAgIGlmIChwcmVvcGVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZW9wZW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBwcmVvcGVuc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGVudHJ5LnJlYWxQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4ocmVhbFBhdGgsICdyJywgMG82NjYpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZkcy5pbnNlcnRQcmVvcGVuKGZkLCBlbnRyeS5tYXBwZWRQYXRoLCByZWFsUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNwYWNlZC1jb21tZW50XG5jb25zdCBrRW1wdHlPYmplY3QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoLyojX19QVVJFX18qLyBPYmplY3QuY3JlYXRlKG51bGwpKTtcbmNvbnN0IGtFeGl0Q29kZSA9IFN5bWJvbCgna0V4aXRDb2RlJyk7XG5jb25zdCBrU2V0TWVtb3J5ID0gU3ltYm9sKCdrU2V0TWVtb3J5Jyk7XG5jb25zdCBrU3RhcnRlZCA9IFN5bWJvbCgna1N0YXJ0ZWQnKTtcbmNvbnN0IGtJbnN0YW5jZSA9IFN5bWJvbCgna0luc3RhbmNlJyk7XG5jb25zdCBrQmluZGluZ05hbWUgPSBTeW1ib2woJ2tCaW5kaW5nTmFtZScpO1xuZnVuY3Rpb24gc2V0dXBJbnN0YW5jZShzZWxmLCBpbnN0YW5jZSkge1xuICAgIHZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCAnaW5zdGFuY2UnKTtcbiAgICB2YWxpZGF0ZU9iamVjdChpbnN0YW5jZS5leHBvcnRzLCAnaW5zdGFuY2UuZXhwb3J0cycpO1xuICAgIHNlbGZba0luc3RhbmNlXSA9IGluc3RhbmNlO1xuICAgIHNlbGZba1NldE1lbW9yeV0oaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkpO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBsZXQgX1dBU0k7XG4gICAgaWYgKG9wdGlvbnMudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMudmVyc2lvbiwgJ29wdGlvbnMudmVyc2lvbicpO1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAndW5zdGFibGUnOlxuICAgICAgICAgICAgICAgIF9XQVNJID0gV0FTSSQxO1xuICAgICAgICAgICAgICAgIHRoaXNba0JpbmRpbmdOYW1lXSA9ICd3YXNpX3Vuc3RhYmxlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcxJzpcbiAgICAgICAgICAgICAgICBfV0FTSSA9IFdBU0kkMTtcbiAgICAgICAgICAgICAgICB0aGlzW2tCaW5kaW5nTmFtZV0gPSAnd2FzaV9zbmFwc2hvdF9wcmV2aWV3MSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIFdBU0kgdmVyc2lvbiBcIiR7b3B0aW9ucy52ZXJzaW9ufVwiYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIF9XQVNJID0gV0FTSSQxO1xuICAgICAgICB0aGlzW2tCaW5kaW5nTmFtZV0gPSAnd2FzaV9zbmFwc2hvdF9wcmV2aWV3MSc7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZUFycmF5KG9wdGlvbnMuYXJncywgJ29wdGlvbnMuYXJncycpO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gKChfYSA9IG9wdGlvbnMuYXJncykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pLm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IGVudiA9IFtdO1xuICAgIGlmIChvcHRpb25zLmVudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMuZW52LCAnb3B0aW9ucy5lbnYnKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbnYpLmZvckVhY2goKHsgMDoga2V5LCAxOiB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGVudi5wdXNoKGAke2tleX09JHt2YWx1ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHByZW9wZW5zID0gW107XG4gICAgaWYgKG9wdGlvbnMucHJlb3BlbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLnByZW9wZW5zLCAnb3B0aW9ucy5wcmVvcGVucycpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLnByZW9wZW5zKS5mb3JFYWNoKCh7IDA6IGtleSwgMTogdmFsdWUgfSkgPT4gcHJlb3BlbnMucHVzaCh7IG1hcHBlZFBhdGg6IFN0cmluZyhrZXkpLCByZWFsUGF0aDogU3RyaW5nKHZhbHVlKSB9KSk7XG4gICAgfVxuICAgIGlmIChwcmVvcGVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmlsZXN5c3RlbSBpcyBkaXNhYmxlZCwgY2FuIG5vdCBwcmVvcGVuIGRpcmVjdG9yeScpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmZzLCAnb3B0aW9ucy5mcycpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb2RlLmpzIGZzIGxpa2UgaW1wbGVtZW50YXRpb24gaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgKG9wdGlvbnMuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmZpbGVzeXN0ZW0sICdvcHRpb25zLmZpbGVzeXN0ZW0nKVxuICAgIC8vICAgdmFsaWRhdGVTdHJpbmcob3B0aW9ucy5maWxlc3lzdGVtLnR5cGUsICdvcHRpb25zLmZpbGVzeXN0ZW0udHlwZScpXG4gICAgLy8gICBpZiAob3B0aW9ucy5maWxlc3lzdGVtLnR5cGUgIT09ICdtZW1mcycgJiYgb3B0aW9ucy5maWxlc3lzdGVtLnR5cGUgIT09ICdmaWxlLXN5c3RlbS1hY2Nlc3MtYXBpJykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGVzeXN0ZW0gdHlwZSAkeyhvcHRpb25zLmZpbGVzeXN0ZW0gYXMgYW55KS50eXBlIGFzIHN0cmluZ30gaXMgbm90IHN1cHBvcnRlZCwgb25seSBcIm1lbWZzXCIgYW5kIFwiZmlsZS1zeXN0ZW0tYWNjZXNzLWFwaVwiIGlzIHN1cHBvcnRlZCBjdXJyZW50bHlgKVxuICAgIC8vICAgfVxuICAgIC8vICAgdHJ5IHtcbiAgICAvLyAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5maWxlc3lzdGVtLmZzLCAnb3B0aW9ucy5maWxlc3lzdGVtLmZzJylcbiAgICAvLyAgIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlLmpzIGZzIGxpa2UgaW1wbGVtZW50YXRpb24gaXMgbm90IHByb3ZpZGVkJylcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgaWYgKG9wdGlvbnMucHJpbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zLnByaW50LCAnb3B0aW9ucy5wcmludCcpO1xuICAgIGlmIChvcHRpb25zLnByaW50RXJyICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucy5wcmludEVyciwgJ29wdGlvbnMucHJpbnRFcnInKTtcbiAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucy5yZXR1cm5PbkV4aXQsICdvcHRpb25zLnJldHVybk9uRXhpdCcpO1xuICAgIH1cbiAgICAvLyBjb25zdCB7IHN0ZGluID0gMCwgc3Rkb3V0ID0gMSwgc3RkZXJyID0gMiB9ID0gb3B0aW9uc1xuICAgIC8vIHZhbGlkYXRlSW50MzIoc3RkaW4sICdvcHRpb25zLnN0ZGluJywgMClcbiAgICAvLyB2YWxpZGF0ZUludDMyKHN0ZG91dCwgJ29wdGlvbnMuc3Rkb3V0JywgMClcbiAgICAvLyB2YWxpZGF0ZUludDMyKHN0ZGVyciwgJ29wdGlvbnMuc3RkZXJyJywgMClcbiAgICAvLyBjb25zdCBzdGRpbyA9IFtzdGRpbiwgc3Rkb3V0LCBzdGRlcnJdIGFzIGNvbnN0XG4gICAgY29uc3Qgc3RkaW8gPSBbMCwgMSwgMl07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgZW52LFxuICAgICAgICBwcmVvcGVucyxcbiAgICAgICAgc3RkaW8sXG4gICAgICAgIF9XQVNJXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGluaXRXQVNJKHNldE1lbW9yeSwgd3JhcCkge1xuICAgIHRoaXNba1NldE1lbW9yeV0gPSBzZXRNZW1vcnk7XG4gICAgdGhpcy53YXNpSW1wb3J0ID0gd3JhcDtcbiAgICB0aGlzW2tTdGFydGVkXSA9IGZhbHNlO1xuICAgIHRoaXNba0V4aXRDb2RlXSA9IDA7XG4gICAgdGhpc1trSW5zdGFuY2VdID0gdW5kZWZpbmVkO1xufVxuLyoqIEBwdWJsaWMgKi9cbmNsYXNzIFdBU0kge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBrRW1wdHlPYmplY3QpIHtcbiAgICAgICAgY29uc3QgeyBhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgX1dBU0kgfSA9IHZhbGlkYXRlT3B0aW9ucy5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB3cmFwID0gX1dBU0kuY3JlYXRlU3luYyhhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgb3B0aW9ucy5mcywgb3B0aW9ucy5wcmludCwgb3B0aW9ucy5wcmludEVycik7XG4gICAgICAgIGNvbnN0IHNldE1lbW9yeSA9IHdyYXAuX3NldE1lbW9yeTtcbiAgICAgICAgZGVsZXRlIHdyYXAuX3NldE1lbW9yeTtcbiAgICAgICAgaW5pdFdBU0kuY2FsbCh0aGlzLCBzZXRNZW1vcnksIHdyYXApO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQpIHtcbiAgICAgICAgICAgIHdyYXAucHJvY19leGl0ID0gd2FzaVJldHVybk9uUHJvY0V4aXQuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNdXN0IG5vdCBleHBvcnQgX2luaXRpYWxpemUsIG11c3QgZXhwb3J0IF9zdGFydFxuICAgIHN0YXJ0KGluc3RhbmNlKSB7XG4gICAgICAgIGlmICh0aGlzW2tTdGFydGVkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXQVNJIGluc3RhbmNlIGhhcyBhbHJlYWR5IHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW2tTdGFydGVkXSA9IHRydWU7XG4gICAgICAgIHNldHVwSW5zdGFuY2UodGhpcywgaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCB7IF9zdGFydCwgX2luaXRpYWxpemUgfSA9IHRoaXNba0luc3RhbmNlXS5leHBvcnRzO1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKF9zdGFydCwgJ2luc3RhbmNlLmV4cG9ydHMuX3N0YXJ0Jyk7XG4gICAgICAgIHZhbGlkYXRlVW5kZWZpbmVkKF9pbml0aWFsaXplLCAnaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZScpO1xuICAgICAgICBsZXQgcmV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gX3N0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0LnRoZW4oKCkgPT4gdGhpc1trRXhpdENvZGVdLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba0V4aXRDb2RlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tFeGl0Q29kZV07XG4gICAgfVxuICAgIC8vIE11c3Qgbm90IGV4cG9ydCBfc3RhcnQsIG1heSBvcHRpb25hbGx5IGV4cG9ydCBfaW5pdGlhbGl6ZVxuICAgIGluaXRpYWxpemUoaW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKHRoaXNba1N0YXJ0ZWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dBU0kgaW5zdGFuY2UgaGFzIGFscmVhZHkgc3RhcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNba1N0YXJ0ZWRdID0gdHJ1ZTtcbiAgICAgICAgc2V0dXBJbnN0YW5jZSh0aGlzLCBpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHsgX3N0YXJ0LCBfaW5pdGlhbGl6ZSB9ID0gdGhpc1trSW5zdGFuY2VdLmV4cG9ydHM7XG4gICAgICAgIHZhbGlkYXRlVW5kZWZpbmVkKF9zdGFydCwgJ2luc3RhbmNlLmV4cG9ydHMuX3N0YXJ0Jyk7XG4gICAgICAgIGlmIChfaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKF9pbml0aWFsaXplLCAnaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZScpO1xuICAgICAgICAgICAgcmV0dXJuIF9pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0SW1wb3J0T2JqZWN0KCkge1xuICAgICAgICByZXR1cm4geyBbdGhpc1trQmluZGluZ05hbWVdXTogdGhpcy53YXNpSW1wb3J0IH07XG4gICAgfVxufVxuZnVuY3Rpb24gd2FzaVJldHVybk9uUHJvY0V4aXQocnZhbCkge1xuICAgIHRoaXNba0V4aXRDb2RlXSA9IHJ2YWw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aHJvdy1saXRlcmFsXG4gICAgdGhyb3cga0V4aXRDb2RlO1xufVxuLyoqIEBwdWJsaWMgKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFzeW5jV0FTSShvcHRpb25zID0ga0VtcHR5T2JqZWN0KSB7XG4gICAgY29uc3QgX3RoaXMgPSBPYmplY3QuY3JlYXRlKFdBU0kucHJvdG90eXBlKTtcbiAgICBjb25zdCB7IGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBfV0FTSSB9ID0gdmFsaWRhdGVPcHRpb25zLmNhbGwoX3RoaXMsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLmFzeW5jaWZ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5hc3luY2lmeSwgJ29wdGlvbnMuYXN5bmNpZnknKTtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zLmFzeW5jaWZ5LndyYXBJbXBvcnRGdW5jdGlvbiwgJ29wdGlvbnMuYXN5bmNpZnkud3JhcEltcG9ydEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHdyYXAgPSBhd2FpdCBfV0FTSS5jcmVhdGVBc3luYyhhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgb3B0aW9ucy5mcywgb3B0aW9ucy5wcmludCwgb3B0aW9ucy5wcmludEVyciwgb3B0aW9ucy5hc3luY2lmeSk7XG4gICAgY29uc3Qgc2V0TWVtb3J5ID0gd3JhcC5fc2V0TWVtb3J5O1xuICAgIGRlbGV0ZSB3cmFwLl9zZXRNZW1vcnk7XG4gICAgaW5pdFdBU0kuY2FsbChfdGhpcywgc2V0TWVtb3J5LCB3cmFwKTtcbiAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQpIHtcbiAgICAgICAgd3JhcC5wcm9jX2V4aXQgPSB3YXNpUmV0dXJuT25Qcm9jRXhpdC5iaW5kKF90aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xufVxuXG5leHBvcnQgeyBBc3luY2lmeSwgTWVtb3J5LCBXQVNJLCBXZWJBc3NlbWJseU1lbW9yeSwgYXN5bmNpZnlMb2FkLCBhc3luY2lmeUxvYWRTeW5jLCBjcmVhdGVBc3luY1dBU0ksIGV4dGVuZE1lbW9yeSwgbG9hZCwgbG9hZFN5bmMsIHdyYXBBc3luY0V4cG9ydCwgd3JhcEFzeW5jSW1wb3J0LCB3cmFwRXhwb3J0cyB9O1xuIiwiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICovXG5jb25zdCBnZXRUeXBlID0gKHZhbHVlKSA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMFxuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAxXG4gIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHQgPT09ICdib29sZWFuJykgcmV0dXJuIDJcbiAgaWYgKHQgPT09ICdudW1iZXInKSByZXR1cm4gM1xuICBpZiAodCA9PT0gJ3N0cmluZycpIHJldHVybiA0XG4gIGlmICh0ID09PSAnb2JqZWN0JykgcmV0dXJuIDZcbiAgaWYgKHQgPT09ICdiaWdpbnQnKSByZXR1cm4gOVxuICByZXR1cm4gLTFcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnbWVtZnMnKS5JRnN9IG1lbWZzXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgZ2V0VHlwZT59IHR5cGVcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5jb25zdCBlbmNvZGVWYWx1ZSA9IChtZW1mcywgdmFsdWUsIHR5cGUpID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKVxuICAgIGNhc2UgMjoge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBJbnQzMkFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWUgPyAxIDogMFxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIDM6IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWVcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlcilcbiAgICB9XG4gICAgY2FzZSA0OiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxuICAgICAgcmV0dXJuIHZpZXdcbiAgICB9XG4gICAgY2FzZSA2OiB7XG4gICAgICBjb25zdCBbZW50cnldID0gT2JqZWN0LmVudHJpZXMobWVtZnMpLmZpbHRlcigoW18sIHZdKSA9PiB2ID09PSB2YWx1ZS5jb25zdHJ1Y3RvcilbMF0gPz8gW11cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsICdfX2NvbnN0cnVjdG9yX18nLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGVudHJ5XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIGBCaWdJbnQoJHtTdHJpbmcodmFsdWUpfSlgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9KVxuICAgICAgY29uc3QgdmlldyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKVxuICAgICAgcmV0dXJuIHZpZXdcbiAgICB9XG4gICAgY2FzZSA5OiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEJpZ0ludDY0QXJyYXkoMSlcbiAgICAgIHZpZXdbMF0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIC0xOlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRhdGEnKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJ21lbWZzJykuSUZzfSBmc1xuICogQHJldHVybnMgeyhlOiB7IGRhdGE6IHsgX19mc19fOiB7IHNhYjogSW50MzJBcnJheSwgdHlwZToga2V5b2YgaW1wb3J0KCdtZW1mcycpLklGcywgcGF5bG9hZDogYW55W10gfSB9IH0pID0+IHZvaWR9XG4gKi9cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZU9uTWVzc2FnZSA9IChmcykgPT4gZnVuY3Rpb24gb25NZXNzYWdlKGUpIHtcbiAgaWYgKGUuZGF0YS5fX2ZzX18pIHtcbiAgICAvKipcbiAgICAgKiAwLi40ICAgICAgICAgICAgICAgICAgICBzdGF0dXMoaW50MzJfdCk6ICAgICAgICAyMSh3YWl0aW5nKSAwKHN1Y2Nlc3MpIDEoZXJyb3IpXG4gICAgICogNS4uOCAgICAgICAgICAgICAgICAgICAgdHlwZShuYXBpX3ZhbHVldHlwZSk6ICAgMCh1bmRlZmluZWQpIDEobnVsbCkgMihib29sZWFuKSAzKG51bWJlcikgNChzdHJpbmcpIDYoanNvbnN0cmluZykgOShiaWdpbnQpIC0xKHVuc3VwcG9ydGVkKVxuICAgICAqIDkuLjE2ICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSh1aW50MzJfdCkgIDw9IDEwMjRcbiAgICAgKiAxNi4uMTYgKyBwYXlsb2FkX3NpemUgICBwYXlsb2FkX2NvbnRlbnRcbiAgICAgKi9cbiAgICBjb25zdCB7IHNhYiwgdHlwZSwgcGF5bG9hZCB9ID0gZS5kYXRhLl9fZnNfX1xuICAgIGNvbnN0IGZuID0gZnNbdHlwZV1cbiAgICBjb25zdCBhcmdzID0gcGF5bG9hZCA/IHBheWxvYWQubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAvLyBidWZmZXIgcG9seWZpbGwgYnVnXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgdmFsdWUuX2lzQnVmZmVyID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSkgOiBwYXlsb2FkXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuLmFwcGx5KGZzLCBhcmdzKVxuICAgICAgY29uc3QgdCA9IGdldFR5cGUocmV0KVxuICAgICAgY29uc3QgdiA9IGVuY29kZVZhbHVlKGZzLCByZXQsIHQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMCwgMClcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAxLCB0KVxuICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDIsIHYubGVuZ3RoKVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoc2FiLmJ1ZmZlcikuc2V0KHYsIDE2KVxuXG4gICAgfSBjYXRjaCAoLyoqIEB0eXBlIHthbnl9ICovIGVycikge1xuICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDAsIDEpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMSwgNilcbiAgICAgIGNvbnN0IHBheWxvYWRDb250ZW50ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgLi4uZXJyLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVyci5zdGFja1xuICAgICAgfSkpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMiwgcGF5bG9hZENvbnRlbnQubGVuZ3RoKVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoc2FiLmJ1ZmZlcikuc2V0KHBheWxvYWRDb250ZW50LCAxNilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgQXRvbWljcy5ub3RpZnkoc2FiLCAwKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCdtZW1mcycpLklGc30gbWVtZnNcbiAqL1xubW9kdWxlLmV4cG9ydHMuY3JlYXRlRnNQcm94eSA9IChtZW1mcykgPT4gbmV3IFByb3h5KHt9LCB7XG4gIGdldCAoX3RhcmdldCwgcCwgX3JlY2VpdmVyKSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3Qgc2FiID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDE2ICsgMTAyNClcbiAgICAgIGNvbnN0IGkzMmFyciA9IG5ldyBJbnQzMkFycmF5KHNhYilcbiAgICAgIEF0b21pY3Muc3RvcmUoaTMyYXJyLCAwLCAyMSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBfX2ZzX186IHtcbiAgICAgICAgICBzYWI6IGkzMmFycixcbiAgICAgICAgICB0eXBlOiBwLFxuICAgICAgICAgIHBheWxvYWQ6IGFyZ3NcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgQXRvbWljcy53YWl0KGkzMmFyciwgMCwgMjEpXG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IEF0b21pY3MubG9hZChpMzJhcnIsIDApXG4gICAgICBjb25zdCB0eXBlID0gQXRvbWljcy5sb2FkKGkzMmFyciwgMSlcbiAgICAgIGNvbnN0IHNpemUgPSBBdG9taWNzLmxvYWQoaTMyYXJyLCAyKVxuICAgICAgY29uc3QgY29udGVudCA9IG5ldyBVaW50OEFycmF5KHNhYiwgMTYsIHNpemUpXG4gICAgICBpZiAoc3RhdHVzID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGVycm9iaiA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQuc2xpY2UoKSkpXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihlcnJvYmoubWVzc2FnZSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ3N0YWNrJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogZXJyb2JqLnN0YWNrXG4gICAgICAgIH0pXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9iaikpIHtcbiAgICAgICAgICBpZiAoayA9PT0gJ21lc3NhZ2UnIHx8IGsgPT09ICdzdGFjaycpIGNvbnRpbnVlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGVycltrXSA9IHZcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBpZiAodHlwZSA9PT0gMSkgcmV0dXJuIG51bGxcbiAgICAgIGlmICh0eXBlID09PSAyKSByZXR1cm4gQm9vbGVhbihjb250ZW50WzBdKVxuICAgICAgaWYgKHR5cGUgPT09IDMpIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KHNhYiwgMTYsIDEpWzBdXG4gICAgICBpZiAodHlwZSA9PT0gNCkgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50LnNsaWNlKCkpXG4gICAgICBpZiAodHlwZSA9PT0gNikge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50LnNsaWNlKCkpLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHZhbHVlLm1hdGNoKC9eQmlnSW50XFwoKC0/XFxkKylcXCkkLylcbiAgICAgICAgICAgIGlmIChtYXRjaGVkICYmIG1hdGNoZWRbMV0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChtYXRjaGVkWzFdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKG9iai5fX2NvbnN0cnVjdG9yX18pIHtcbiAgICAgICAgICBjb25zdCBjdG9yID0gb2JqLl9fY29uc3RydWN0b3JfX1xuICAgICAgICAgIGRlbGV0ZSBvYmouX19jb25zdHJ1Y3Rvcl9fXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihvYmosIG1lbWZzW2N0b3JdLnByb3RvdHlwZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gOSkgcmV0dXJuIG5ldyBCaWdJbnQ2NEFycmF5KHNhYiwgMTYsIDEpWzBdXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRhdGEnKVxuICAgIH1cbiAgfVxufSlcbiJdLCJuYW1lcyI6WyJfV2ViQXNzZW1ibHkiXSwibWFw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T0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsS0FBSztBQUNMLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdkIsUUFBUSxJQUFJLEdBQUcsS0FBSyxHQUFHO0FBQ3ZCLFlBQVksT0FBTztBQUNuQixRQUFRLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDbEQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO0FBQ3ZFLFNBQVM7QUFDVCxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtBQUNsRixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7QUFDdkUsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FB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 diff --git a/samples/Javascript/clean/napi_rs_runtime.js.simple b/samples/Javascript/clean/napi_rs_runtime.js.simple new file mode 100644 index 000000000..abdf08619 --- /dev/null +++ b/samples/Javascript/clean/napi_rs_runtime.js.simple @@ -0,0 +1,21 @@ +# Javascript/clean/napi_rs_runtime.js +data/embedded/base64/terms +data/embedded/base64/url +encoding/base64 +encoding/json/decode +encoding/json/encode +fd/write +fs/directory/create +fs/directory/list +fs/directory/remove +fs/file/delete +fs/file/stat +fs/file/times/set +fs/link/read +fs/symlink/resolve +kernel/sysinfo +net/socket/listen +net/socket/receive +net/socket/send +ref/site/url +ref/words/exclamation