"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.excelToJsonPlugin = void 0; // 由于Cocos Creator插件环境特殊,使用动态require方式 const fs = __importStar(require("fs")); const path = __importStar(require("path")); const os = __importStar(require("os")); const XLSX = __importStar(require("xlsx")); class ExcelToJsonPlugin { constructor() { this.config = { excelPath: './配置表/excelList', jsonExportPath: './assets/bundles/first/config', tsExportPath: './assets/script/interface', autoExport: true, watcher: null }; this.fileWatcher = null; // 消息处理 this.messages = { 'excel-to-json-ts:export-manual': () => { this.exportManual(); } }; } async load() { // 先执行一次导出 await this.exportAllExcel(); // 设置文件监听 this.setupFileWatcher(); // // 注册消息处理 // Editor.Message.addBroadcastListener('excel-to-json-ts:profile-updated', () => { // this.loadConfig(); // // 如果配置了自动导出,重新设置监听 // if (this.config.autoExport) { // this.stopFileWatcher(); // this.setupFileWatcher(); // this.exportAllExcel(); // 配置保存后立即导出一次 // } else { // this.stopFileWatcher(); // } // }); } unload() { this.log('[Excel插件] 插件已卸载'); this.stopFileWatcher(); } // 加载配置 async loadConfig() { try { let conf = await Editor.Profile.getProject('excel-to-json-ts'); if (conf) this.config = conf; else { Editor.Profile.setProject('excel-to-json-ts', "excelPath", this.config.excelPath); Editor.Profile.setProject('excel-to-json-ts', "jsonExportPath", this.config.jsonExportPath); Editor.Profile.setProject('excel-to-json-ts', "tsExportPath", this.config.tsExportPath); this.warn(`[Excel插件] 路径配置不正确`); } this.log('[Excel插件] 配置已加载'); this.log('[Excel插件] excelPath' + this.config.excelPath); this.log('[Excel插件] jsonPath' + this.config.jsonExportPath); this.log('[Excel插件] tsPath' + this.config.tsExportPath); } catch (err) { this.error(`[Excel插件] 加载配置失败: ${err}`); } } // 手动导出 exportManual() { this.exportAllExcel(); } // 导出所有Excel(增强健壮性) async exportAllExcel() { await this.loadConfig(); if (!this.config.excelPath) { this.error('[Excel插件] Excel目录路径未配置'); return; } if (!fs.existsSync(this.config.excelPath)) { this.error(`[Excel插件] Excel目录不存在: ${this.config.excelPath}`); return; } try { // 确保导出目录存在 if (this.config.jsonExportPath && !fs.existsSync(this.config.jsonExportPath)) { fs.mkdirSync(this.config.jsonExportPath, { recursive: true }); } if (this.config.tsExportPath && !fs.existsSync(this.config.tsExportPath)) { fs.mkdirSync(this.config.tsExportPath, { recursive: true }); } // 获取目录中所有Excel文件 const excelFiles = this.getExcelFilesInDirectory(this.config.excelPath); if (excelFiles.length === 0) { this.warn(`[Excel插件] 目录中没有找到Excel文件: ${this.config.excelPath}`); return; } this.log(`[Excel插件] 找到 ${excelFiles.length} 个Excel文件`); let successCount = 0; let errorCount = 0; // 处理每个Excel文件 for (const excelFile of excelFiles) { try { this.processExcelFile(excelFile); successCount++; } catch (err) { this.error(`[Excel插件] 处理文件失败 ${path.basename(excelFile)}: ${err}`); errorCount++; } } if (successCount > 0) { this.refreshAssetDatabase(); this.success(`[Excel插件] 导出完成,成功处理 ${successCount} 个文件,失败 ${errorCount} 个`); } else { this.error(`[Excel插件] 导出失败,没有成功处理任何文件`); } } catch (err) { this.error(`[Excel插件] 导出失败: ${err}`); } } // 获取目录中的所有Excel文件 getExcelFilesInDirectory(dirPath) { return fs.readdirSync(dirPath) .filter(file => { // 过滤隐藏文件(以点开头的文件) if (file.startsWith('.') || file.startsWith('~')) { return false; } const ext = path.extname(file).toLowerCase(); return (ext === '.xlsx' || ext === '.xls') && fs.statSync(path.join(dirPath, file)).isFile(); }) .map(file => path.join(dirPath, file)); } // 处理单个Excel文件 processExcelFile(filePath) { try { // 安全读取打开状态的Excel文件 const workbook = this.readExcelSafely(filePath); const sheetNames = workbook.SheetNames; // 导出每个工作表 for (const sheetName of sheetNames) { if (sheetName.match("Sheet") || !sheetName.match("|")) { continue; } this.exportSheet(workbook, sheetName, filePath); } } catch (err) { throw new Error(`处理文件 ${path.basename(filePath)} 失败: ${err}`); } } // 安全读取打开状态的Excel文件(终极版) readExcelSafely(filePath) { const tempPath = path.join(os.tmpdir(), `excel-temp-${Date.now()}-${path.basename(filePath)}`); try { // 详细记录文件状态 const stats = fs.statSync(filePath); // this.log(`[Excel插件] 尝试读取文件 - 大小: ${stats.size} bytes, 最后修改: ${new Date(stats.mtimeMs).toLocaleTimeString()}`); // 尝试复制文件,带详细错误处理 try { fs.copyFileSync(filePath, tempPath); } catch (copyErr) { this.warn(`[Excel插件] 第一次复制失败: ${copyErr}`); // 再次尝试,有时第一次会失败 try { fs.copyFileSync(filePath, tempPath); } catch (finalErr) { this.error(`[Excel插件] 两次复制尝试均失败: ${finalErr}`); throw finalErr; } } // 验证临时文件 const tempStats = fs.statSync(tempPath); if (tempStats.size === 0) { throw new Error("临时文件大小为0,复制可能未完成"); } return XLSX.readFile(tempPath); } catch (err) { throw new Error(`读取Excel失败: ${err.message || err}`); } finally { // 确保清理临时文件 try { if (fs.existsSync(tempPath)) { fs.unlinkSync(tempPath); } } catch (e) { this.warn(`[Excel插件] 无法删除临时文件: ${tempPath} - ${e}`); } } } // 导出单个工作表 exportSheet(workbook, sheetName, filePath) { try { const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 检查是否有足够的表头行(至少3行:字段名、类型、说明) if (jsonData.length < 3) { this.warn(`[Excel插件] 工作表 "${sheetName}" 数据不足,跳过导出 (文件: ${path.basename(filePath)})的${sheetName}`); return; } if (!sheetName.match("|") || sheetName.split("|").length < 2) { this.warn(`[Excel插件] 工作表 "${sheetName}" 名称格式错误,跳过导出 (文件: ${path.basename(filePath)})的${sheetName}`); return; } const sName = sheetName.split("|")[1]; // 提取表头信息 const headers = { fields: jsonData[0], types: jsonData[1], descriptions: jsonData[2] }; // 从第4行开始是数据 const dataRows = jsonData.slice(3); // 生成JSON数据 const jsonResult = this.generateJsonData(dataRows, headers); // 生成TS接口 const tsInterface = this.generateTSInterface(sName, headers); // 生成文件名 const safeSheetName = this.makeSafeFileName(sName); const jsonFileName = `${safeSheetName}.json`; //const tsFileName = `ITable${safeSheetName}.ts`; const tsFileName = `AutoTable.ts`; // 写入JSON文件 if (this.config.jsonExportPath) { const jsonPath = path.join(this.config.jsonExportPath, jsonFileName); fs.writeFileSync(jsonPath, JSON.stringify(jsonResult, null, 4), 'utf-8'); } // 写入TS文件 if (this.config.tsExportPath) { const tsPath = path.join(this.config.tsExportPath, tsFileName); let tsContent = ""; try { if (fs.existsSync(tsPath)) { tsContent = fs.readFileSync(tsPath, 'utf-8'); } } catch (err) { this.warn(`[Excel插件] 读取TS文件失败: ${err}`); } if (tsContent == "") { tsContent = "declare global {\n\n}\nexport { };"; } if (this.extractFullInterfaceBlock(tsContent, "ITable" + sName)) { //console.log("替换接口:" + sName + ",内容:" + tsInterface); tsContent = this.replaceInterfaceBlock(tsContent, "ITable" + sName, tsInterface); } else { //console.log("加到末尾:" + tsInterface); tsContent = tsContent.replace(/}\nexport { };$/, tsInterface + "}\nexport { };"); } fs.writeFileSync(tsPath, tsContent, 'utf-8'); } } catch (err) { throw new Error(`工作表 "${sheetName}" 导出失败 (文件: ${path.basename(filePath)}): ${err}`); } } /** * 转义正则特殊字符 */ escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } /** * 精准查找接口声明行(全字匹配) */ findInterfaceDeclarationLine(fileContent, interfaceName) { // 使用单词边界 \b 确保全字匹配 const regex = new RegExp(`\\binterface\\s+${this.escapeRegExp(interfaceName)}\\b(?:\\s*<[^>]*>)?\\s*[\\{\\n]`, 'g'); let match; while ((match = regex.exec(fileContent)) !== null) { // 找到匹配位置,确定完整行 const matchStart = match.index; // 向前找到行开始 const lineStart = fileContent.lastIndexOf('\n', matchStart - 1) + 1; // 向后找到行结束 const lineEnd = fileContent.indexOf('\n', matchStart); const actualLineEnd = lineEnd === -1 ? fileContent.length : lineEnd; const lineContent = fileContent.substring(lineStart, actualLineEnd); // 验证:确保这一行确实是我们的目标接口 if (lineContent.trim().startsWith(`interface ${interfaceName}`)) { return { lineStart, lineEnd: actualLineEnd, lineContent }; } } return null; } /** * 提取完整的接口块(包括上方注释) */ extractFullInterfaceBlock(fileContent, interfaceName) { const interfaceLine = this.findInterfaceDeclarationLine(fileContent, interfaceName); if (!interfaceLine) { return null; } // === 向前查找连续的注释块 === let blockStart = interfaceLine.lineStart; let currentPos = interfaceLine.lineStart; while (currentPos > 0) { const prevLineEnd = currentPos - 1; const prevLineStart = fileContent.lastIndexOf('\n', prevLineEnd - 1) + 1; const prevLine = fileContent.substring(prevLineStart, prevLineEnd).trim(); // 检查是否为注释行或空行 if (prevLine === '' || prevLine.startsWith('//') || prevLine.startsWith('/*') || prevLine.startsWith('*')) { currentPos = prevLineStart; } else { blockStart = currentPos; break; } } if (currentPos === 0) { blockStart = 0; } // === 向后查找接口体结束 === // 找到 interface 行中的开括号位置 const openBraceIndex = interfaceLine.lineContent.indexOf('{'); let startPos = interfaceLine.lineStart; let braceCount = 0; if (openBraceIndex !== -1) { // 开括号在同一行 startPos = interfaceLine.lineStart + openBraceIndex; braceCount = 1; } else { // 开括号在下一行,找到第一个 { const nextOpenBrace = fileContent.indexOf('{', interfaceLine.lineEnd); if (nextOpenBrace === -1) return null; startPos = nextOpenBrace; braceCount = 1; } let pos = startPos + 1; // 跳过 { while (pos < fileContent.length && braceCount > 0) { if (fileContent[pos] === '{') { braceCount++; } else if (fileContent[pos] === '}') { braceCount--; } pos++; } if (braceCount !== 0) { return null; // 括号不匹配 } const blockEnd = pos; const fullContent = fileContent.substring(blockStart, blockEnd); return { start: blockStart, end: blockEnd, content: fullContent }; } /** * 完全替换接口块(全字匹配,精准替换) */ replaceInterfaceBlock(fileContent, interfaceName, newInterfaceBlock) { const blockInfo = this.extractFullInterfaceBlock(fileContent, interfaceName); if (!blockInfo) { throw new Error(`❌ 接口 "${interfaceName}" 未找到!请检查名称是否正确。`); } // 验证:确保提取的块确实只包含目标接口 const interfaceLines = blockInfo.content.split('\n'); const interfaceDeclLines = interfaceLines.filter(line => line.trim().startsWith('interface ')); if (interfaceDeclLines.length !== 1) { throw new Error(`❌ 找到多个 interface 声明,可能匹配错误!`); } if (!interfaceDeclLines[0].includes(`interface ${interfaceName}`)) { throw new Error(`❌ 匹配到错误的接口名称!`); } //console.log(`✅ 精准匹配到接口 "${interfaceName}"`); return (fileContent.substring(0, blockInfo.start) + newInterfaceBlock + fileContent.substring(blockInfo.end)); } // 设置文件监听(终极版) setupFileWatcher() { this.stopFileWatcher(); if (!this.config.excelPath) return; if (!fs.existsSync(this.config.excelPath)) { this.error(`[Excel插件] 监听目录不存在: ${this.config.excelPath}`); return; } try { // 使用更可靠的监听方式 this.fileWatcher = fs.watch(this.config.excelPath, { recursive: false, encoding: 'utf8' }, async (eventType, filename) => { if (!filename) return; this.loadConfig(); if (this.config.autoExport == false) return; // 确保是字符串 const fileNameStr = typeof filename === 'string' ? filename : filename + ""; const ext = path.extname(fileNameStr).toLowerCase(); if (ext === '.xlsx' || ext === '.xls') { const filePath = path.join(this.config.excelPath, fileNameStr); // 额外验证:确保是文件且存在 try { if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) { this.log(`[Excel插件] 检测到文件变更: ${fileNameStr} (${eventType})`); // 使用终极重试机制 // 重试次数增加到8,基础延迟1秒 this.processExcelFileWithRetry(filePath, 8, 1000); } } catch (err) { this.warn(`[Excel插件] 验证文件状态时出错: ${err}`); } } }); // 处理监听错误 if (this.fileWatcher && typeof this.fileWatcher.on === 'function') { this.fileWatcher.on('error', (error) => { this.error(`[Excel插件] 文件监听错误: ${error}`); // 尝试重新设置监听 setTimeout(() => { this.stopFileWatcher(); this.setupFileWatcher(); }, 15000); }); } this.log('[Excel插件] 已启动Excel目录监听(终极版)'); } catch (err) { this.error(`[Excel插件] 目录监听失败: ${err}`); // 尝试重新设置监听 setTimeout(() => { this.stopFileWatcher(); this.setupFileWatcher(); }, 20000); } } // 带终极重试机制处理Excel文件 processExcelFileWithRetry(filePath, maxRetries = 8, baseDelay = 1000) { let attempt = 0; const startTime = Date.now(); const tryProcess = () => { attempt++; const elapsed = Date.now() - startTime; const delay = baseDelay * Math.min(1.5 ** (attempt - 1), 4); // 指数退避,但上限为4倍基础延迟 this.log(`[Excel插件] 处理文件 "${path.basename(filePath)}" - 尝试 ${attempt}/${maxRetries} (延迟 ${Math.round(delay)}ms, 已耗时 ${Math.round(elapsed / 1000)}s)`); setTimeout(() => { try { // 额外检查文件是否可读 const stats = fs.statSync(filePath); if (stats.size === 0) { throw new Error("文件大小为0,可能仍在写入"); } // 检查文件最后修改时间,确保不是刚被修改 const now = Date.now(); const fileAge = now - stats.mtimeMs; if (fileAge < 2000) { // 文件修改时间少于2秒,可能还在写入 throw new Error(`文件刚被修改 (${Math.round(fileAge)}ms前),可能仍在写入`); } this.processExcelFile(filePath); const totalTime = Date.now() - startTime; this.refreshAssetDatabase(); this.success(`[Excel插件] 文件 "${path.basename(filePath)}" 自动导出成功 (总耗时 ${Math.round(totalTime / 1000)}s, 尝试 ${attempt}/${maxRetries})`); } catch (err) { // 详细记录错误 this.warn(`[Excel插件] 尝试 ${attempt} 失败: ${err.message || err}`); // 检查是否是文件锁定或权限错误 const isFileLockError = err.message && (err.message.includes('EPERM') || err.message.includes('EBUSY') || err.message.includes('permission') || err.message.includes('locked') || err.message.includes('EACCES') || err.message.includes('file size 0') || err.message.includes('刚被修改')); if (isFileLockError && attempt < maxRetries) { // 计算下一次尝试的延迟(指数退避) const nextDelay = baseDelay * Math.min(1.5 ** attempt, 4); this.warn(`[Excel插件] 文件 "${path.basename(filePath)}" 可能仍在保存中,将在 ${Math.round(nextDelay)}ms 后重试 (尝试 ${attempt + 1}/${maxRetries})`); setTimeout(tryProcess, nextDelay); } else { const totalTime = Date.now() - startTime; this.error(`[Excel插件] 文件 "${path.basename(filePath)}" 自动导出失败 (总耗时 ${Math.round(totalTime / 1000)}s): ${err}`); // 如果是文件锁定错误但已达到最大重试次数,提供具体建议 if (isFileLockError) { this.error(`[Excel插件] 建议: 确保Excel完全保存后再进行修改,或增加重试次数和延迟`); } } } }, delay); }; // 开始第一次尝试 tryProcess(); } // 停止文件监听(更新) stopFileWatcher() { if (this.fileWatcher) { try { // 使用类型断言确保调用close方法 this.fileWatcher.close(); this.fileWatcher = null; } catch (e) { this.warn(`[Excel插件] 停止监听时出错: ${e}`); } if (this.config.watcher) { clearTimeout(this.config.watcher); this.config.watcher = null; } this.log('[Excel插件] 已停止Excel文件监听'); } } // 生成JSON数据 generateJsonData(dataRows, headers) { const result = []; for (const row of dataRows) { const obj = {}; for (let i = 0; i < headers.fields.length; i++) { const field = headers.fields[i]; const type = headers.types[i]; if (field) { // 处理空单元格,使用对应类型的默认值 const value = row[i] !== undefined ? row[i] : this.getDefaultValue(type); obj[field] = this.convertValue(value, type); } } result.push(obj); } return result; } // 根据类型获取默认值 getDefaultValue(type) { if (!type) return null; const cleanType = type.toLowerCase().trim(); switch (cleanType) { case 'int': case 'float': return 0; case 'boolean': return false; case 'int[]': case 'float[]': case 'string[]': case 'any[]': return []; case 'string': return ''; default: return ''; } } // 类型转换 convertValue(value, type) { if (value === null || value === undefined) return null; const cleanType = type.toLowerCase().trim(); try { switch (cleanType) { case 'int': return parseInt(value); case 'float': return parseFloat(value); case 'json': return JSON.parse(value); case 'boolean': return value.toString().toLowerCase() === 'true' || value === 1; case 'int[]': return this.parseArray(value, 'int'); case 'float[]': return this.parseArray(value, 'float'); case 'string[]': return this.parseArray(value, 'string'); case 'any[]': return this.parseArray(value, 'any'); default: return value; } } catch (e) { this.warn(`[Excel插件] 类型转换失败 [${type}]: ${value} - ${e}`); return value; } } // 解析数组 parseArray(value, targetType) { if (Array.isArray(value)) return value; // 尝试分割字符串 let items = []; if (typeof value === 'string') { items = value.split(/[,;#\s]\s*/).filter(v => v); } else { items = [value]; } return items.map(item => { if (targetType === 'any') { // 自动识别类型 if (!isNaN(item)) { return !isNaN(parseFloat(item)) ? parseFloat(item) : parseInt(item); } if (item.toLowerCase() === 'true' || item.toLowerCase() === 'false') { return item.toLowerCase() === 'true'; } return item; } // 指定类型转换 switch (targetType) { case 'int': return parseInt(item); case 'float': return parseFloat(item); case 'string': return String(item); default: return item; } }); } generateTSInterfaceStart(sheetName) { const interfaceName = `ITable${sheetName}`; const safeSheetName = `${this.makeSafeFileName(sheetName)}`; let tsContent = ` /**\n * ${safeSheetName} 配置数据\n */\n`; tsContent += ` interface ${interfaceName} {\n`; return tsContent; } // 生成TS接口 generateTSInterface(sheetName, headers) { const interfaceName = `ITable${sheetName}`; const safeSheetName = `${this.makeSafeFileName(sheetName)}`; let tsContent = ` /**\n * ${safeSheetName} 配置数据\n */\n`; tsContent += ` interface ${interfaceName} {\n`; for (let i = 0; i < headers.fields.length; i++) { const field = headers.fields[i]; const type = headers.types[i]; const description = headers.descriptions[i] || '字段说明'; if (field) { tsContent += ` /** ${description} */\n`; tsContent += ` readonly ${field}: ${this.convertToTSType(type)};\n`; } } tsContent += ` }\n`; return tsContent; } // 转换为TS类型 convertToTSType(excelType) { if (!excelType) return 'any'; const type = excelType.toLowerCase().trim(); switch (type) { case 'string': return 'string'; case 'int': case 'float': return 'number'; case 'boolean': return 'boolean'; case 'int[]': return 'number[]'; case 'float[]': return 'number[]'; case 'string[]': return 'string[]'; case 'any[]': return '(number | string | boolean)[]'; default: return 'any'; } } // 转换为PascalCase toPascalCase(str) { return str.replace(/(\w)(\w*)/g, (_, g1, g2) => g1.toUpperCase() + g2.toLowerCase()).replace(/[^a-zA-Z0-9]/g, ''); } // 创建安全的文件名 makeSafeFileName(name) { return name.replace(/[^a-zA-Z0-9_]/g, '_'); } // 日志输出 log(message) { console.log(message); } error(message) { console.error(message); } warn(message) { console.warn(message); } success(message) { console.log(message); } // 刷新资源管理器 async refreshAssetDatabase() { try { // 确保路径是项目内的路径(db://assets/开头) const jsonDbPath = this.convertToDbPath(this.config.jsonExportPath); const tsDbPath = this.convertToDbPath(this.config.tsExportPath); // 刷新JSON导出目录 if (jsonDbPath && jsonDbPath.startsWith('db://')) { await Editor.Message.request('asset-db', 'refresh-asset', jsonDbPath); } // 刷新TS导出目录 if (tsDbPath && tsDbPath.startsWith('db://')) { await Editor.Message.request('asset-db', 'refresh-asset', tsDbPath); } this.success('[Excel插件] 资源刷新请求已发送'); } catch (err) { this.error(`[Excel插件] 资源刷新失败: ${err}`); } } // 将系统路径转换为Cocos的db路径 convertToDbPath(systemPath) { if (!systemPath) return ''; try { // 获取项目路径 const projectPath = Editor.Project.path; // 规范化路径(统一使用正斜杠) systemPath = systemPath.replace(/\\/g, '/'); const normalizedProjectPath = projectPath.replace(/\\/g, '/'); // 确保路径以/结尾 const projectPathWithSlash = normalizedProjectPath.endsWith('/') ? normalizedProjectPath : normalizedProjectPath + '/'; // 检查是否在项目目录内 if (systemPath.startsWith(projectPathWithSlash)) { // 计算相对路径 const relativePath = systemPath.substring(projectPathWithSlash.length); return `db://${relativePath}`; } // 如果路径包含assets目录,尝试直接转换 if (systemPath.includes('/assets/') || systemPath.includes('\\assets\\')) { const assetsIndex = systemPath.toLowerCase().indexOf('/assets/'); if (assetsIndex !== -1) { const relativeToAssets = systemPath.substring(assetsIndex + 1); return `db://${relativeToAssets}`; } } this.warn(`[Excel插件] 路径不在项目内,可能无法正确刷新: ${systemPath}`); return systemPath; } catch (err) { this.error(`[Excel插件] 路径转换失败: ${err}`); return systemPath; } } } exports.excelToJsonPlugin = new ExcelToJsonPlugin(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwyanNvbkFuZFRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2V4Y2VsMmpzb25BbmRUcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBc0M7QUFDdEMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBYTdCLE1BQU0saUJBQWlCO0lBQXZCO1FBQ1ksV0FBTSxHQUFpQjtZQUMzQixTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLGNBQWMsRUFBRSwrQkFBK0I7WUFDL0MsWUFBWSxFQUFFLDJCQUEyQjtZQUN6QyxVQUFVLEVBQUUsSUFBSTtZQUNoQixPQUFPLEVBQUUsSUFBSTtTQUNoQixDQUFDO1FBRU0sZ0JBQVcsR0FBd0IsSUFBSSxDQUFDO1FBNnhCaEQsT0FBTztRQUNQLGFBQVEsR0FBRztZQUNQLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLENBQUM7U0FDSixDQUFBO0lBaUVMLENBQUM7SUFqMkJHLEtBQUssQ0FBQyxJQUFJO1FBRU4sVUFBVTtRQUNWLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTVCLFNBQVM7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUd4QixZQUFZO1FBQ1osa0ZBQWtGO1FBQ2xGLHlCQUF5QjtRQUV6QiwwQkFBMEI7UUFDMUIsb0NBQW9DO1FBQ3BDLGtDQUFrQztRQUNsQyxtQ0FBbUM7UUFDbkMsZ0RBQWdEO1FBQ2hELGVBQWU7UUFDZixrQ0FBa0M7UUFDbEMsUUFBUTtRQUNSLE1BQU07SUFDVixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU87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Q3RCLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUFFWSxRQUFBLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIOeUseS6jkNvY29zIENyZWF0b3Lmj5Lku7bnjq/looPnibnmrorvvIzkvb/nlKjliqjmgIFyZXF1aXJl5pa55byPXHJcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7IC8vIOihpeWFheWvvOWFpWNob2tpZGFy5qih5Z2XXHJcblxyXG5cclxuLy8g5a6a5LmJ57G75Z6L5Lul5o+Q6auY5Luj56CB5Y+v6K+75oCnXHJcbmludGVyZmFjZSBQbHVnaW5Db25maWcge1xyXG4gICAgZXhjZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBqc29uRXhwb3J0UGF0aDogc3RyaW5nO1xyXG4gICAgdHNFeHBvcnRQYXRoOiBzdHJpbmc7XHJcbiAgICBhdXRvRXhwb3J0OiBib29sZWFuO1xyXG4gICAgd2F0Y2hlcjogYW55O1xyXG59XHJcblxyXG5jbGFzcyBFeGNlbFRvSnNvblBsdWdpbiB7XHJcbiAgICBwcml2YXRlIGNvbmZpZzogUGx1Z2luQ29uZmlnID0ge1xyXG4gICAgICAgIGV4Y2VsUGF0aDogJy4v6YWN572u6KGoL2V4Y2VsTGlzdCcsXHJcbiAgICAgICAganNvbkV4cG9ydFBhdGg6ICcuL2Fzc2V0cy9idW5kbGVzL2ZpcnN0L2NvbmZpZycsXHJcbiAgICAgICAgdHNFeHBvcnRQYXRoOiAnLi9hc3NldHMvc2NyaXB0L2ludGVyZmFjZScsXHJcbiAgICAgICAgYXV0b0V4cG9ydDogdHJ1ZSxcclxuICAgICAgICB3YXRjaGVyOiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZmlsZVdhdGNoZXI6IGZzLkZTV2F0Y2hlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGFzeW5jIGxvYWQoKSB7XHJcblxyXG4gICAgICAgIC8vIOWFiOaJp+ihjOS4gOasoeWvvOWHulxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0QWxsRXhjZWwoKTtcclxuXHJcbiAgICAgICAgLy8g6K6+572u5paH5Lu255uR5ZCsXHJcbiAgICAgICAgdGhpcy5zZXR1cEZpbGVXYXRjaGVyKCk7XHJcblxyXG5cclxuICAgICAgICAvLyAvLyDms6jlhozmtojmga/lpITnkIZcclxuICAgICAgICAvLyBFZGl0b3IuTWVzc2FnZS5hZGRCcm9hZGNhc3RMaXN0ZW5lcignZXhjZWwtdG8tanNvbi10czpwcm9maWxlLXVwZGF0ZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubG9hZENvbmZpZygpO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8g5aaC5p6c6YWN572u5LqG6Ieq5Yqo5a+85Ye677yM6YeN5paw6K6+572u55uR5ZCsXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvRXhwb3J0KSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnN0b3BGaWxlV2F0Y2hlcigpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zZXR1cEZpbGVXYXRjaGVyKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmV4cG9ydEFsbEV4Y2VsKCk7IC8vIOmFjee9ruS/neWtmOWQjueri+WNs+WvvOWHuuS4gOasoVxyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zdG9wRmlsZVdhdGNoZXIoKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZCgpIHtcclxuICAgICAgICB0aGlzLmxvZygnW0V4Y2Vs5o+S5Lu2XSDmj5Lku7blt7Lljbjovb0nKTtcclxuICAgICAgICB0aGlzLnN0b3BGaWxlV2F0Y2hlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWKoOi9vemFjee9rlxyXG4gICAgYXN5bmMgbG9hZENvbmZpZygpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgY29uZiA9IGF3YWl0IEVkaXRvci5Qcm9maWxlLmdldFByb2plY3QoJ2V4Y2VsLXRvLWpzb24tdHMnKTtcclxuICAgICAgICAgICAgaWYgKGNvbmYpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmY7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgRWRpdG9yLlByb2ZpbGUuc2V0UHJvamVjdCgnZXhjZWwtdG8tanNvbi10cycsIFwiZXhjZWxQYXRoXCIsIHRoaXMuY29uZmlnLmV4Y2VsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBFZGl0b3IuUHJvZmlsZS5zZXRQcm9qZWN0KCdleGNlbC10by1qc29uLXRzJywgXCJqc29uRXhwb3J0UGF0aFwiLCB0aGlzLmNvbmZpZy5qc29uRXhwb3J0UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBFZGl0b3IuUHJvZmlsZS5zZXRQcm9qZWN0KCdleGNlbC10by1qc29uLXRzJywgXCJ0c0V4cG9ydFBhdGhcIiwgdGhpcy5jb25maWcudHNFeHBvcnRQYXRoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDot6/lvoTphY3nva7kuI3mraPnoa5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvZygnW0V4Y2Vs5o+S5Lu2XSDphY3nva7lt7LliqDovb0nKTtcclxuICAgICAgICAgICAgdGhpcy5sb2coJ1tFeGNlbOaPkuS7tl0gZXhjZWxQYXRoJyArIHRoaXMuY29uZmlnLmV4Y2VsUGF0aCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKCdbRXhjZWzmj5Lku7ZdIGpzb25QYXRoJyArIHRoaXMuY29uZmlnLmpzb25FeHBvcnRQYXRoKTtcclxuICAgICAgICAgICAgdGhpcy5sb2coJ1tFeGNlbOaPkuS7tl0gdHNQYXRoJyArIHRoaXMuY29uZmlnLnRzRXhwb3J0UGF0aCk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yKGBbRXhjZWzmj5Lku7ZdIOWKoOi9vemFjee9ruWksei0pTogJHtlcnJ9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaJi+WKqOWvvOWHulxyXG4gICAgZXhwb3J0TWFudWFsKCkge1xyXG4gICAgICAgIHRoaXMuZXhwb3J0QWxsRXhjZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlr7zlh7rmiYDmnIlFeGNlbO+8iOWinuW8uuWBpeWjruaAp++8iVxyXG4gICAgYXN5bmMgZXhwb3J0QWxsRXhjZWwoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuZXhjZWxQYXRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoJ1tFeGNlbOaPkuS7tl0gRXhjZWznm67lvZXot6/lvoTmnKrphY3nva4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuY29uZmlnLmV4Y2VsUGF0aCkpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvcihgW0V4Y2Vs5o+S5Lu2XSBFeGNlbOebruW9leS4jeWtmOWcqDogJHt0aGlzLmNvbmZpZy5leGNlbFBhdGh9YCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIOehruS/neWvvOWHuuebruW9leWtmOWcqFxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuanNvbkV4cG9ydFBhdGggJiYgIWZzLmV4aXN0c1N5bmModGhpcy5jb25maWcuanNvbkV4cG9ydFBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5jb25maWcuanNvbkV4cG9ydFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy50c0V4cG9ydFBhdGggJiYgIWZzLmV4aXN0c1N5bmModGhpcy5jb25maWcudHNFeHBvcnRQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuY29uZmlnLnRzRXhwb3J0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOiOt+WPluebruW9leS4reaJgOaciUV4Y2Vs5paH5Lu2XHJcbiAgICAgICAgICAgIGNvbnN0IGV4Y2VsRmlsZXMgPSB0aGlzLmdldEV4Y2VsRmlsZXNJbkRpcmVjdG9yeSh0aGlzLmNvbmZpZy5leGNlbFBhdGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV4Y2VsRmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcm4oYFtFeGNlbOaPkuS7tl0g55uu5b2V5Lit5rKh5pyJ5om+5YiwRXhjZWzmlofku7Y6ICR7dGhpcy5jb25maWcuZXhjZWxQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvZyhgW0V4Y2Vs5o+S5Lu2XSDmib7liLAgJHtleGNlbEZpbGVzLmxlbmd0aH0g5LiqRXhjZWzmlofku7ZgKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdWNjZXNzQ291bnQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICAvLyDlpITnkIbmr4/kuKpFeGNlbOaWh+S7tlxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4Y2VsRmlsZSBvZiBleGNlbEZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0V4Y2VsRmlsZShleGNlbEZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgW0V4Y2Vs5o+S5Lu2XSDlpITnkIbmlofku7blpLHotKUgJHtwYXRoLmJhc2VuYW1lKGV4Y2VsRmlsZSl9OiAke2Vycn1gKTtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdWNjZXNzQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hBc3NldERhdGFiYXNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3MoYFtFeGNlbOaPkuS7tl0g5a+85Ye65a6M5oiQ77yM5oiQ5Yqf5aSE55CGICR7c3VjY2Vzc0NvdW50fSDkuKrmlofku7bvvIzlpLHotKUgJHtlcnJvckNvdW50fSDkuKpgKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBbRXhjZWzmj5Lku7ZdIOWvvOWHuuWksei0pe+8jOayoeacieaIkOWKn+WkhOeQhuS7u+S9leaWh+S7tmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoYFtFeGNlbOaPkuS7tl0g5a+85Ye65aSx6LSlOiAke2Vycn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIOiOt+WPluebruW9leS4reeahOaJgOaciUV4Y2Vs5paH5Lu2XHJcbiAgICBnZXRFeGNlbEZpbGVzSW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKVxyXG4gICAgICAgICAgICAuZmlsdGVyKGZpbGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8g6L+H5ruk6ZqQ6JeP5paH5Lu277yI5Lul54K55byA5aS055qE5paH5Lu277yJXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCcuJykgfHwgZmlsZS5zdGFydHNXaXRoKCd+JykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZXh0ID09PSAnLnhsc3gnIHx8IGV4dCA9PT0gJy54bHMnKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlKSkuaXNGaWxlKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5tYXAoZmlsZSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhuWNleS4qkV4Y2Vs5paH5Lu2XHJcbiAgICBwcm9jZXNzRXhjZWxGaWxlKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyDlronlhajor7vlj5bmiZPlvIDnirbmgIHnmoRFeGNlbOaWh+S7tlxyXG4gICAgICAgICAgICBjb25zdCB3b3JrYm9vayA9IHRoaXMucmVhZEV4Y2VsU2FmZWx5KGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2hlZXROYW1lcyA9IHdvcmtib29rLlNoZWV0TmFtZXM7XHJcblxyXG4gICAgICAgICAgICAvLyDlr7zlh7rmr4/kuKrlt6XkvZzooahcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzaGVldE5hbWUgb2Ygc2hlZXROYW1lcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0TmFtZS5tYXRjaChcIlNoZWV0XCIpIHx8ICFzaGVldE5hbWUubWF0Y2goXCJ8XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydFNoZWV0KHdvcmtib29rLCBzaGVldE5hbWUsIGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOWkhOeQhuaWh+S7tiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSDlpLHotKU6ICR7ZXJyfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlronlhajor7vlj5bmiZPlvIDnirbmgIHnmoRFeGNlbOaWh+S7tu+8iOe7iOaegeeJiO+8iVxyXG4gICAgcmVhZEV4Y2VsU2FmZWx5KGZpbGVQYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcGF0aC5qb2luKG9zLnRtcGRpcigpLCBgZXhjZWwtdGVtcC0ke0RhdGUubm93KCl9LSR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9YCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIOivpue7huiusOW9leaWh+S7tueKtuaAgVxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5sb2coYFtFeGNlbOaPkuS7tl0g5bCd6K+V6K+75Y+W5paH5Lu2IC0g5aSn5bCPOiAke3N0YXRzLnNpemV9IGJ5dGVzLCDmnIDlkI7kv67mlLk6ICR7bmV3IERhdGUoc3RhdHMubXRpbWVNcykudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YCk7XHJcblxyXG4gICAgICAgICAgICAvLyDlsJ3or5XlpI3liLbmlofku7bvvIzluKbor6bnu4bplJnor6/lpITnkIZcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmaWxlUGF0aCwgdGVtcFBhdGgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChjb3B5RXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcm4oYFtFeGNlbOaPkuS7tl0g56ys5LiA5qyh5aSN5Yi25aSx6LSlOiAke2NvcHlFcnJ9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5YaN5qyh5bCd6K+V77yM5pyJ5pe256ys5LiA5qyh5Lya5aSx6LSlXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmaWxlUGF0aCwgdGVtcFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWxFcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBbRXhjZWzmj5Lku7ZdIOS4pOasoeWkjeWItuWwneivleWdh+Wksei0pTogJHtmaW5hbEVycn1gKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaW5hbEVycjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g6aqM6K+B5Li05pe25paH5Lu2XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBTdGF0cyA9IGZzLnN0YXRTeW5jKHRlbXBQYXRoKTtcclxuICAgICAgICAgICAgaWYgKHRlbXBTdGF0cy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLkuLTml7bmlofku7blpKflsI/kuLow77yM5aSN5Yi25Y+v6IO95pyq5a6M5oiQXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gWExTWC5yZWFkRmlsZSh0ZW1wUGF0aCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDor7vlj5ZFeGNlbOWksei0pTogJHtlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgLy8g56Gu5L+d5riF55CG5Li05pe25paH5Lu2XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKHRlbXBQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuKGBbRXhjZWzmj5Lku7ZdIOaXoOazleWIoOmZpOS4tOaXtuaWh+S7tjogJHt0ZW1wUGF0aH0gLSAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5a+85Ye65Y2V5Liq5bel5L2c6KGoXHJcbiAgICBleHBvcnRTaGVldCh3b3JrYm9vazogYW55LCBzaGVldE5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5pyJ6Laz5aSf55qE6KGo5aS06KGM77yI6Iez5bCRM+ihjO+8muWtl+auteWQjeOAgeexu+Wei+OAgeivtOaYju+8iVxyXG4gICAgICAgICAgICBpZiAoanNvbkRhdGEubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuKGBbRXhjZWzmj5Lku7ZdIOW3peS9nOihqCBcIiR7c2hlZXROYW1lfVwiIOaVsOaNruS4jei2s++8jOi3s+i/h+WvvOWHuiAo5paH5Lu2OiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSnnmoQke3NoZWV0TmFtZX1gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFzaGVldE5hbWUubWF0Y2goXCJ8XCIpIHx8IHNoZWV0TmFtZS5zcGxpdChcInxcIikubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuKGBbRXhjZWzmj5Lku7ZdIOW3peS9nOihqCBcIiR7c2hlZXROYW1lfVwiIOWQjeensOagvOW8j+mUmeivr++8jOi3s+i/h+WvvOWHuiAo5paH5Lu2OiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSnnmoQke3NoZWV0TmFtZX1gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc05hbWUgPSBzaGVldE5hbWUuc3BsaXQoXCJ8XCIpWzFdO1xyXG5cclxuICAgICAgICAgICAgLy8g5o+Q5Y+W6KGo5aS05L+h5oGvXHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGpzb25EYXRhWzBdLFxyXG4gICAgICAgICAgICAgICAgdHlwZXM6IGpzb25EYXRhWzFdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25zOiBqc29uRGF0YVsyXVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8g5LuO56ysNOihjOW8gOWni+aYr+aVsOaNrlxyXG4gICAgICAgICAgICBjb25zdCBkYXRhUm93cyA9IGpzb25EYXRhLnNsaWNlKDMpIGFzIGFueVtdW107XHJcblxyXG4gICAgICAgICAgICAvLyDnlJ/miJBKU09O5pWw5o2uXHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25SZXN1bHQgPSB0aGlzLmdlbmVyYXRlSnNvbkRhdGEoZGF0YVJvd3MsIGhlYWRlcnMpO1xyXG5cclxuICAgICAgICAgICAgLy8g55Sf5oiQVFPmjqXlj6NcclxuICAgICAgICAgICAgY29uc3QgdHNJbnRlcmZhY2UgPSB0aGlzLmdlbmVyYXRlVFNJbnRlcmZhY2Uoc05hbWUsIGhlYWRlcnMpO1xyXG5cclxuICAgICAgICAgICAgLy8g55Sf5oiQ5paH5Lu25ZCNXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVTaGVldE5hbWUgPSB0aGlzLm1ha2VTYWZlRmlsZU5hbWUoc05hbWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QganNvbkZpbGVOYW1lID0gYCR7c2FmZVNoZWV0TmFtZX0uanNvbmA7XHJcbiAgICAgICAgICAgIC8vY29uc3QgdHNGaWxlTmFtZSA9IGBJVGFibGUke3NhZmVTaGVldE5hbWV9LnRzYDtcclxuICAgICAgICAgICAgY29uc3QgdHNGaWxlTmFtZSA9IGBBdXRvVGFibGUudHNgO1xyXG5cclxuICAgICAgICAgICAgLy8g5YaZ5YWlSlNPTuaWh+S7tlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuanNvbkV4cG9ydFBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnLmpzb25FeHBvcnRQYXRoLCBqc29uRmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhqc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgNCksICd1dGYtOCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDlhpnlhaVUU+aWh+S7tlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcudHNFeHBvcnRQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0c1BhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWcudHNFeHBvcnRQYXRoLCB0c0ZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIGxldCB0c0NvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0c1BhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0c1BhdGgsICd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDor7vlj5ZUU+aWh+S7tuWksei0pTogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHNDb250ZW50ID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0c0NvbnRlbnQgPSBcImRlY2xhcmUgZ2xvYmFsIHtcXG5cXG59XFxuZXhwb3J0IHsgfTtcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4dHJhY3RGdWxsSW50ZXJmYWNlQmxvY2sodHNDb250ZW50LCBcIklUYWJsZVwiICsgc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIuabv+aNouaOpeWPozpcIiArIHNOYW1lICsgXCLvvIzlhoXlrrnvvJpcIiArIHRzSW50ZXJmYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0c0NvbnRlbnQgPSB0aGlzLnJlcGxhY2VJbnRlcmZhY2VCbG9jayh0c0NvbnRlbnQsIFwiSVRhYmxlXCIgKyBzTmFtZSwgdHNJbnRlcmZhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwi5Yqg5Yiw5pyr5bC+77yaXCIgKyB0c0ludGVyZmFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHNDb250ZW50ID0gdHNDb250ZW50LnJlcGxhY2UoL31cXG5leHBvcnQgeyB9OyQvLCB0c0ludGVyZmFjZSArIFwifVxcbmV4cG9ydCB7IH07XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0c1BhdGgsIHRzQ29udGVudCwgJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDlt6XkvZzooaggXCIke3NoZWV0TmFtZX1cIiDlr7zlh7rlpLHotKUgKOaWh+S7tjogJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX0pOiAke2Vycn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDovazkuYnmraPliJnnibnmrorlrZfnrKZcclxuICAgICAqL1xyXG4gICAgZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnsr7lh4bmn6Xmib7mjqXlj6Plo7DmmI7ooYzvvIjlhajlrZfljLnphY3vvIlcclxuICAgICAqL1xyXG4gICAgZmluZEludGVyZmFjZURlY2xhcmF0aW9uTGluZShmaWxlQ29udGVudDogc3RyaW5nLCBpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiB7XHJcbiAgICAgICAgbGluZVN0YXJ0OiBudW1iZXI7XHJcbiAgICAgICAgbGluZUVuZDogbnVtYmVyO1xyXG4gICAgICAgIGxpbmVDb250ZW50OiBzdHJpbmc7XHJcbiAgICB9IHwgbnVsbCB7XHJcbiAgICAgICAgLy8g5L2/55So5Y2V6K+N6L6555WMIFxcYiDnoa7kv53lhajlrZfljLnphY1cclxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXHJcbiAgICAgICAgICAgIGBcXFxcYmludGVyZmFjZVxcXFxzKyR7dGhpcy5lc2NhcGVSZWdFeHAoaW50ZXJmYWNlTmFtZSl9XFxcXGIoPzpcXFxccyo8W14+XSo+KT9cXFxccypbXFxcXHtcXFxcbl1gLFxyXG4gICAgICAgICAgICAnZydcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgbWF0Y2g7XHJcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoZmlsZUNvbnRlbnQpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyDmib7liLDljLnphY3kvY3nva7vvIznoa7lrprlrozmlbTooYxcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hTdGFydCA9IG1hdGNoLmluZGV4O1xyXG5cclxuICAgICAgICAgICAgLy8g5ZCR5YmN5om+5Yiw6KGM5byA5aeLXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGZpbGVDb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBtYXRjaFN0YXJ0IC0gMSkgKyAxO1xyXG5cclxuICAgICAgICAgICAgLy8g5ZCR5ZCO5om+5Yiw6KGM57uT5p2fXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVFbmQgPSBmaWxlQ29udGVudC5pbmRleE9mKCdcXG4nLCBtYXRjaFN0YXJ0KTtcclxuICAgICAgICAgICAgY29uc3QgYWN0dWFsTGluZUVuZCA9IGxpbmVFbmQgPT09IC0xID8gZmlsZUNvbnRlbnQubGVuZ3RoIDogbGluZUVuZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGxpbmVTdGFydCwgYWN0dWFsTGluZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAvLyDpqozor4HvvJrnoa7kv53ov5nkuIDooYznoa7lrp7mmK/miJHku6znmoTnm67moIfmjqXlj6NcclxuICAgICAgICAgICAgaWYgKGxpbmVDb250ZW50LnRyaW0oKS5zdGFydHNXaXRoKGBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfWApKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICBsaW5lRW5kOiBhY3R1YWxMaW5lRW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVDb250ZW50XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaPkOWPluWujOaVtOeahOaOpeWPo+Wdl++8iOWMheaLrOS4iuaWueazqOmHiu+8iVxyXG4gICAgICovXHJcbiAgICBleHRyYWN0RnVsbEludGVyZmFjZUJsb2NrKGZpbGVDb250ZW50OiBzdHJpbmcsIGludGVyZmFjZU5hbWU6IHN0cmluZyk6IHtcclxuICAgICAgICBzdGFydDogbnVtYmVyO1xyXG4gICAgICAgIGVuZDogbnVtYmVyO1xyXG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZztcclxuICAgIH0gfCBudWxsIHtcclxuICAgICAgICBjb25zdCBpbnRlcmZhY2VMaW5lID0gdGhpcy5maW5kSW50ZXJmYWNlRGVjbGFyYXRpb25MaW5lKGZpbGVDb250ZW50LCBpbnRlcmZhY2VOYW1lKTtcclxuICAgICAgICBpZiAoIWludGVyZmFjZUxpbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyA9PT0g5ZCR5YmN5p+l5om+6L+e57ut55qE5rOo6YeK5Z2XID09PVxyXG4gICAgICAgIGxldCBibG9ja1N0YXJ0ID0gaW50ZXJmYWNlTGluZS5saW5lU3RhcnQ7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRQb3MgPSBpbnRlcmZhY2VMaW5lLmxpbmVTdGFydDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRQb3MgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZMaW5lRW5kID0gY3VycmVudFBvcyAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZMaW5lU3RhcnQgPSBmaWxlQ29udGVudC5sYXN0SW5kZXhPZignXFxuJywgcHJldkxpbmVFbmQgLSAxKSArIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZMaW5lID0gZmlsZUNvbnRlbnQuc3Vic3RyaW5nKHByZXZMaW5lU3RhcnQsIHByZXZMaW5lRW5kKS50cmltKCk7XHJcblxyXG4gICAgICAgICAgICAvLyDmo4Dmn6XmmK/lkKbkuLrms6jph4rooYzmiJbnqbrooYxcclxuICAgICAgICAgICAgaWYgKHByZXZMaW5lID09PSAnJyB8fFxyXG4gICAgICAgICAgICAgICAgcHJldkxpbmUuc3RhcnRzV2l0aCgnLy8nKSB8fFxyXG4gICAgICAgICAgICAgICAgcHJldkxpbmUuc3RhcnRzV2l0aCgnLyonKSB8fFxyXG4gICAgICAgICAgICAgICAgcHJldkxpbmUuc3RhcnRzV2l0aCgnKicpKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zID0gcHJldkxpbmVTdGFydDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrU3RhcnQgPSBjdXJyZW50UG9zO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50UG9zID09PSAwKSB7XHJcbiAgICAgICAgICAgIGJsb2NrU3RhcnQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gPT09IOWQkeWQjuafpeaJvuaOpeWPo+S9k+e7k+adnyA9PT1cclxuICAgICAgICAvLyDmib7liLAgaW50ZXJmYWNlIOihjOS4reeahOW8gOaLrOWPt+S9jee9rlxyXG4gICAgICAgIGNvbnN0IG9wZW5CcmFjZUluZGV4ID0gaW50ZXJmYWNlTGluZS5saW5lQ29udGVudC5pbmRleE9mKCd7Jyk7XHJcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gaW50ZXJmYWNlTGluZS5saW5lU3RhcnQ7XHJcbiAgICAgICAgbGV0IGJyYWNlQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBpZiAob3BlbkJyYWNlSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIOW8gOaLrOWPt+WcqOWQjOS4gOihjFxyXG4gICAgICAgICAgICBzdGFydFBvcyA9IGludGVyZmFjZUxpbmUubGluZVN0YXJ0ICsgb3BlbkJyYWNlSW5kZXg7XHJcbiAgICAgICAgICAgIGJyYWNlQ291bnQgPSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIOW8gOaLrOWPt+WcqOS4i+S4gOihjO+8jOaJvuWIsOesrOS4gOS4qiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRPcGVuQnJhY2UgPSBmaWxlQ29udGVudC5pbmRleE9mKCd7JywgaW50ZXJmYWNlTGluZS5saW5lRW5kKTtcclxuICAgICAgICAgICAgaWYgKG5leHRPcGVuQnJhY2UgPT09IC0xKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgc3RhcnRQb3MgPSBuZXh0T3BlbkJyYWNlO1xyXG4gICAgICAgICAgICBicmFjZUNvdW50ID0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBzdGFydFBvcyArIDE7IC8vIOi3s+i/hyB7XHJcblxyXG4gICAgICAgIHdoaWxlIChwb3MgPCBmaWxlQ29udGVudC5sZW5ndGggJiYgYnJhY2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGZpbGVDb250ZW50W3Bvc10gPT09ICd7Jykge1xyXG4gICAgICAgICAgICAgICAgYnJhY2VDb3VudCsrO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVDb250ZW50W3Bvc10gPT09ICd9Jykge1xyXG4gICAgICAgICAgICAgICAgYnJhY2VDb3VudC0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBvcysrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJyYWNlQ291bnQgIT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIOaLrOWPt+S4jeWMuemFjVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tFbmQgPSBwb3M7XHJcbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSBmaWxlQ29udGVudC5zdWJzdHJpbmcoYmxvY2tTdGFydCwgYmxvY2tFbmQpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzdGFydDogYmxvY2tTdGFydCxcclxuICAgICAgICAgICAgZW5kOiBibG9ja0VuZCxcclxuICAgICAgICAgICAgY29udGVudDogZnVsbENvbnRlbnRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a6M5YWo5pu/5o2i5o6l5Y+j5Z2X77yI5YWo5a2X5Yy56YWN77yM57K+5YeG5pu/5o2i77yJXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2VJbnRlcmZhY2VCbG9jayhcclxuICAgICAgICBmaWxlQ29udGVudDogc3RyaW5nLFxyXG4gICAgICAgIGludGVyZmFjZU5hbWU6IHN0cmluZyxcclxuICAgICAgICBuZXdJbnRlcmZhY2VCbG9jazogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrSW5mbyA9IHRoaXMuZXh0cmFjdEZ1bGxJbnRlcmZhY2VCbG9jayhmaWxlQ29udGVudCwgaW50ZXJmYWNlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmICghYmxvY2tJbmZvKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg4p2MIOaOpeWPoyBcIiR7aW50ZXJmYWNlTmFtZX1cIiDmnKrmib7liLDvvIHor7fmo4Dmn6XlkI3np7DmmK/lkKbmraPnoa7jgIJgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOmqjOivge+8muehruS/neaPkOWPlueahOWdl+ehruWunuWPquWMheWQq+ebruagh+aOpeWPo1xyXG4gICAgICAgIGNvbnN0IGludGVyZmFjZUxpbmVzID0gYmxvY2tJbmZvLmNvbnRlbnQuc3BsaXQoJ1xcbicpO1xyXG4gICAgICAgIGNvbnN0IGludGVyZmFjZURlY2xMaW5lcyA9IGludGVyZmFjZUxpbmVzLmZpbHRlcihsaW5lID0+XHJcbiAgICAgICAgICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ2ludGVyZmFjZSAnKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChpbnRlcmZhY2VEZWNsTGluZXMubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg4p2MIOaJvuWIsOWkmuS4qiBpbnRlcmZhY2Ug5aOw5piO77yM5Y+v6IO95Yy56YWN6ZSZ6K+v77yBYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWludGVyZmFjZURlY2xMaW5lc1swXS5pbmNsdWRlcyhgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX1gKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOKdjCDljLnphY3liLDplJnor6/nmoTmjqXlj6PlkI3np7DvvIFgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2coYOKchSDnsr7lh4bljLnphY3liLDmjqXlj6MgXCIke2ludGVyZmFjZU5hbWV9XCJgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgZmlsZUNvbnRlbnQuc3Vic3RyaW5nKDAsIGJsb2NrSW5mby5zdGFydCkgK1xyXG4gICAgICAgICAgICBuZXdJbnRlcmZhY2VCbG9jayArXHJcbiAgICAgICAgICAgIGZpbGVDb250ZW50LnN1YnN0cmluZyhibG9ja0luZm8uZW5kKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6K6+572u5paH5Lu255uR5ZCs77yI57uI5p6B54mI77yJXHJcbiAgICBzZXR1cEZpbGVXYXRjaGVyKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcEZpbGVXYXRjaGVyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuZXhjZWxQYXRoKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmNvbmZpZy5leGNlbFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoYFtFeGNlbOaPkuS7tl0g55uR5ZCs55uu5b2V5LiN5a2Y5ZyoOiAke3RoaXMuY29uZmlnLmV4Y2VsUGF0aH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8g5L2/55So5pu05Y+v6Z2g55qE55uR5ZCs5pa55byPXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZVdhdGNoZXIgPSBmcy53YXRjaCh0aGlzLmNvbmZpZy5leGNlbFBhdGgsIHtcclxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXHJcbiAgICAgICAgICAgIH0sIGFzeW5jIChldmVudFR5cGUsIGZpbGVuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVuYW1lKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRDb25maWcoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvRXhwb3J0ID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g56Gu5L+d5piv5a2X56ym5LiyXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZVN0ciA9IHR5cGVvZiBmaWxlbmFtZSA9PT0gJ3N0cmluZycgPyBmaWxlbmFtZSA6IGZpbGVuYW1lICsgXCJcIjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlTmFtZVN0cikudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXh0ID09PSAnLnhsc3gnIHx8IGV4dCA9PT0gJy54bHMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWcuZXhjZWxQYXRoLCBmaWxlTmFtZVN0cik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOmineWklumqjOivge+8muehruS/neaYr+aWh+S7tuS4lOWtmOWcqFxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbRXhjZWzmj5Lku7ZdIOajgOa1i+WIsOaWh+S7tuWPmOabtDogJHtmaWxlTmFtZVN0cn0gKCR7ZXZlbnRUeXBlfSlgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDkvb/nlKjnu4jmnoHph43or5XmnLrliLZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmHjeivleasoeaVsOWinuWKoOWIsDjvvIzln7rnoYDlu7bov58x56eSXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFeGNlbEZpbGVXaXRoUmV0cnkoZmlsZVBhdGgsIDgsIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDpqozor4Hmlofku7bnirbmgIHml7blh7rplJk6ICR7ZXJyfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyDlpITnkIbnm5HlkKzplJnor69cclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsZVdhdGNoZXIgJiYgdHlwZW9mIHRoaXMuZmlsZVdhdGNoZXIub24gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVdhdGNoZXIub24oJ2Vycm9yJywgKGVycm9yOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYFtFeGNlbOaPkuS7tl0g5paH5Lu255uR5ZCs6ZSZ6K+vOiAke2Vycm9yfWApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyDlsJ3or5Xph43mlrDorr7nva7nm5HlkKxcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wRmlsZVdhdGNoZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cEZpbGVXYXRjaGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTUwMDApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9nKCdbRXhjZWzmj5Lku7ZdIOW3suWQr+WKqEV4Y2Vs55uu5b2V55uR5ZCs77yI57uI5p6B54mI77yJJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoYFtFeGNlbOaPkuS7tl0g55uu5b2V55uR5ZCs5aSx6LSlOiAke2Vycn1gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOWwneivlemHjeaWsOiuvue9ruebkeWQrFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcEZpbGVXYXRjaGVyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwRmlsZVdhdGNoZXIoKTtcclxuICAgICAgICAgICAgfSwgMjAwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDluKbnu4jmnoHph43or5XmnLrliLblpITnkIZFeGNlbOaWh+S7tlxyXG4gICAgcHJvY2Vzc0V4Y2VsRmlsZVdpdGhSZXRyeShmaWxlUGF0aDogc3RyaW5nLCBtYXhSZXRyaWVzOiBudW1iZXIgPSA4LCBiYXNlRGVsYXk6IG51bWJlciA9IDEwMDApIHtcclxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAgICAgY29uc3QgdHJ5UHJvY2VzcyA9ICgpID0+IHtcclxuICAgICAgICAgICAgYXR0ZW1wdCsrO1xyXG4gICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKiBNYXRoLm1pbigxLjUgKiogKGF0dGVtcHQgLSAxKSwgNCk7IC8vIOaMh+aVsOmAgOmBv++8jOS9huS4iumZkOS4ujTlgI3ln7rnoYDlu7bov59cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9nKGBbRXhjZWzmj5Lku7ZdIOWkhOeQhuaWh+S7tiBcIiR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9XCIgLSDlsJ3or5UgJHthdHRlbXB0fS8ke21heFJldHJpZXN9ICjlu7bov58gJHtNYXRoLnJvdW5kKGRlbGF5KX1tcywg5bey6ICX5pe2ICR7TWF0aC5yb3VuZChlbGFwc2VkIC8gMTAwMCl9cylgKTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDpop3lpJbmo4Dmn6Xmlofku7bmmK/lkKblj6/or7tcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLmlofku7blpKflsI/kuLow77yM5Y+v6IO95LuN5Zyo5YaZ5YWlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25pyA5ZCO5L+u5pS55pe26Ze077yM56Gu5L+d5LiN5piv5Yia6KKr5L+u5pS5XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlQWdlID0gbm93IC0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUFnZSA8IDIwMDApIHsgLy8g5paH5Lu25L+u5pS55pe26Ze05bCR5LqOMuenku+8jOWPr+iDvei/mOWcqOWGmeWFpVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOaWh+S7tuWImuiiq+S/ruaUuSAoJHtNYXRoLnJvdW5kKGZpbGVBZ2UpfW1z5YmNKe+8jOWPr+iDveS7jeWcqOWGmeWFpWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXhjZWxGaWxlKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEFzc2V0RGF0YWJhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3MoYFtFeGNlbOaPkuS7tl0g5paH5Lu2IFwiJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1cIiDoh6rliqjlr7zlh7rmiJDlip8gKOaAu+iAl+aXtiAke01hdGgucm91bmQodG90YWxUaW1lIC8gMTAwMCl9cywg5bCd6K+VICR7YXR0ZW1wdH0vJHttYXhSZXRyaWVzfSlgKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOivpue7huiusOW9lemUmeivr1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDlsJ3or5UgJHthdHRlbXB0fSDlpLHotKU6ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyDmo4Dmn6XmmK/lkKbmmK/mlofku7bplIHlrprmiJbmnYPpmZDplJnor69cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbGVMb2NrRXJyb3IgPSBlcnIubWVzc2FnZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdFUEVSTScpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdFQlVTWScpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdwZXJtaXNzaW9uJykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2xvY2tlZCcpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdFQUNDRVMnKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZS5pbmNsdWRlcygnZmlsZSBzaXplIDAnKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZS5pbmNsdWRlcygn5Yia6KKr5L+u5pS5JylcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaWxlTG9ja0Vycm9yICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOiuoeeul+S4i+S4gOasoeWwneivleeahOW7tui/n++8iOaMh+aVsOmAgOmBv++8iVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RGVsYXkgPSBiYXNlRGVsYXkgKiBNYXRoLm1pbigxLjUgKiogYXR0ZW1wdCwgNCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDmlofku7YgXCIke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfVwiIOWPr+iDveS7jeWcqOS/neWtmOS4re+8jOWwhuWcqCAke01hdGgucm91bmQobmV4dERlbGF5KX1tcyDlkI7ph43or5UgKOWwneivlSAke2F0dGVtcHQgKyAxfS8ke21heFJldHJpZXN9KWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRyeVByb2Nlc3MsIG5leHREZWxheSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgW0V4Y2Vs5o+S5Lu2XSDmlofku7YgXCIke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfVwiIOiHquWKqOWvvOWHuuWksei0pSAo5oC76ICX5pe2ICR7TWF0aC5yb3VuZCh0b3RhbFRpbWUgLyAxMDAwKX1zKTogJHtlcnJ9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzmmK/mlofku7bplIHlrprplJnor6/kvYblt7Lovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmj5DkvpvlhbfkvZPlu7rorq5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlsZUxvY2tFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgW0V4Y2Vs5o+S5Lu2XSDlu7rorq46IOehruS/nUV4Y2Vs5a6M5YWo5L+d5a2Y5ZCO5YaN6L+b6KGM5L+u5pS577yM5oiW5aKe5Yqg6YeN6K+V5qyh5pWw5ZKM5bu26L+fYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGRlbGF5KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyDlvIDlp4vnrKzkuIDmrKHlsJ3or5VcclxuICAgICAgICB0cnlQcm9jZXNzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5YGc5q2i5paH5Lu255uR5ZCs77yI5pu05paw77yJXHJcbiAgICBzdG9wRmlsZVdhdGNoZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsZVdhdGNoZXIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIOS9v+eUqOexu+Wei+aWreiogOehruS/neiwg+eUqGNsb3Nl5pa55rOVXHJcbiAgICAgICAgICAgICAgICAodGhpcy5maWxlV2F0Y2hlciBhcyBhbnkpLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVXYXRjaGVyID0gbnVsbDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuKGBbRXhjZWzmj5Lku7ZdIOWBnOatouebkeWQrOaXtuWHuumUmTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcud2F0Y2hlcikge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29uZmlnLndhdGNoZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcud2F0Y2hlciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5sb2coJ1tFeGNlbOaPkuS7tl0g5bey5YGc5q2iRXhjZWzmlofku7bnm5HlkKwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g55Sf5oiQSlNPTuaVsOaNrlxyXG4gICAgZ2VuZXJhdGVKc29uRGF0YShkYXRhUm93czogYW55W11bXSwgaGVhZGVyczogYW55KTogYW55W10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhUm93cykge1xyXG4gICAgICAgICAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBoZWFkZXJzLmZpZWxkc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBoZWFkZXJzLnR5cGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOWkhOeQhuepuuWNleWFg+agvO+8jOS9v+eUqOWvueW6lOexu+Wei+eahOm7mOiupOWAvFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2ldICE9PSB1bmRlZmluZWQgPyByb3dbaV0gOiB0aGlzLmdldERlZmF1bHRWYWx1ZSh0eXBlKTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbZmllbGRdID0gdGhpcy5jb252ZXJ0VmFsdWUodmFsdWUsIHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyDmoLnmja7nsbvlnovojrflj5bpu5jorqTlgLxcclxuICAgIGdldERlZmF1bHRWYWx1ZSh0eXBlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGlmICghdHlwZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsZWFuVHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgICAgc3dpdGNoIChjbGVhblR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnaW50JzpcclxuICAgICAgICAgICAgY2FzZSAnZmxvYXQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjYXNlICdpbnRbXSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2Zsb2F0W10nOlxyXG4gICAgICAgICAgICBjYXNlICdzdHJpbmdbXSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2FueVtdJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIOexu+Wei+i9rOaNolxyXG4gICAgY29udmVydFZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBjbGVhblR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNsZWFuVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW50JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvYXQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gMTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludFtdJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycmF5KHZhbHVlLCAnaW50Jyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmbG9hdFtdJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycmF5KHZhbHVlLCAnZmxvYXQnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZ1tdJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycmF5KHZhbHVlLCAnc3RyaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdhbnlbXSc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcnJheSh2YWx1ZSwgJ2FueScpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybihgW0V4Y2Vs5o+S5Lu2XSDnsbvlnovovazmjaLlpLHotKUgWyR7dHlwZX1dOiAke3ZhbHVlfSAtICR7ZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDop6PmnpDmlbDnu4RcclxuICAgIHBhcnNlQXJyYXkodmFsdWU6IGFueSwgdGFyZ2V0VHlwZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICAvLyDlsJ3or5XliIblibLlrZfnrKbkuLJcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpdGVtcyA9IHZhbHVlLnNwbGl0KC9bLDsjXFxzXVxccyovKS5maWx0ZXIodiA9PiB2KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtcyA9IFt2YWx1ZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gJ2FueScpIHtcclxuICAgICAgICAgICAgICAgIC8vIOiHquWKqOivhuWIq+exu+Wei1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChpdGVtKSkgPyBwYXJzZUZsb2F0KGl0ZW0pIDogcGFyc2VJbnQoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgaXRlbS50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOaMh+Wumuexu+Wei+i9rOaNolxyXG4gICAgICAgICAgICBzd2l0Y2ggKHRhcmdldFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludCc6IHJldHVybiBwYXJzZUludChpdGVtKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzogcmV0dXJuIHBhcnNlRmxvYXQoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gU3RyaW5nKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZVRTSW50ZXJmYWNlU3RhcnQoc2hlZXROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSBgSVRhYmxlJHtzaGVldE5hbWV9YDtcclxuICAgICAgICBjb25zdCBzYWZlU2hlZXROYW1lID0gYCR7dGhpcy5tYWtlU2FmZUZpbGVOYW1lKHNoZWV0TmFtZSl9YDtcclxuXHJcbiAgICAgICAgbGV0IHRzQ29udGVudCA9IGAgICAgLyoqXFxuICAgICAqICR7c2FmZVNoZWV0TmFtZX0g6YWN572u5pWw5o2uXFxuICAgICovXFxuYDtcclxuICAgICAgICB0c0NvbnRlbnQgKz0gYCAgICBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSB7XFxuYDtcclxuICAgICAgICByZXR1cm4gdHNDb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOeUn+aIkFRT5o6l5Y+jXHJcbiAgICBnZW5lcmF0ZVRTSW50ZXJmYWNlKHNoZWV0TmFtZTogc3RyaW5nLCBoZWFkZXJzOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSBgSVRhYmxlJHtzaGVldE5hbWV9YDtcclxuICAgICAgICBjb25zdCBzYWZlU2hlZXROYW1lID0gYCR7dGhpcy5tYWtlU2FmZUZpbGVOYW1lKHNoZWV0TmFtZSl9YDtcclxuXHJcbiAgICAgICAgbGV0IHRzQ29udGVudCA9IGAgICAgLyoqXFxuICAgICAqICR7c2FmZVNoZWV0TmFtZX0g6YWN572u5pWw5o2uXFxuICAgICovXFxuYDtcclxuICAgICAgICB0c0NvbnRlbnQgKz0gYCAgICBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSB7XFxuYDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGhlYWRlcnMuZmllbGRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaGVhZGVycy50eXBlc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBoZWFkZXJzLmRlc2NyaXB0aW9uc1tpXSB8fCAn5a2X5q616K+05piOJztcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdHNDb250ZW50ICs9IGAgICAgICAgIC8qKiAke2Rlc2NyaXB0aW9ufSAqL1xcbmA7XHJcbiAgICAgICAgICAgICAgICB0c0NvbnRlbnQgKz0gYCAgICAgICAgcmVhZG9ubHkgJHtmaWVsZH06ICR7dGhpcy5jb252ZXJ0VG9UU1R5cGUodHlwZSl9O1xcbmA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRzQ29udGVudCArPSBgICAgIH1cXG5gO1xyXG4gICAgICAgIHJldHVybiB0c0NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6L2s5o2i5Li6VFPnsbvlnotcclxuICAgIGNvbnZlcnRUb1RTVHlwZShleGNlbFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFleGNlbFR5cGUpIHJldHVybiAnYW55JztcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGV4Y2VsVHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcclxuICAgICAgICAgICAgY2FzZSAnaW50JzpcclxuICAgICAgICAgICAgY2FzZSAnZmxvYXQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInO1xyXG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ludFtdJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyW10nO1xyXG4gICAgICAgICAgICBjYXNlICdmbG9hdFtdJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyW10nO1xyXG4gICAgICAgICAgICBjYXNlICdzdHJpbmdbXSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZ1tdJztcclxuICAgICAgICAgICAgY2FzZSAnYW55W10nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcobnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbilbXSc7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FueSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOi9rOaNouS4ulBhc2NhbENhc2VcclxuICAgIHRvUGFzY2FsQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXFx3KShcXHcqKS9nLCAoXywgZzEsIGcyKSA9PlxyXG4gICAgICAgICAgICBnMS50b1VwcGVyQ2FzZSgpICsgZzIudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICkucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDliJvlu7rlronlhajnmoTmlofku7blkI1cclxuICAgIG1ha2VTYWZlRmlsZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csICdfJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pel5b+X6L6T5Ye6XHJcbiAgICBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa2iOaBr+WkhOeQhlxyXG4gICAgbWVzc2FnZXMgPSB7XHJcbiAgICAgICAgJ2V4Y2VsLXRvLWpzb24tdHM6ZXhwb3J0LW1hbnVhbCc6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHBvcnRNYW51YWwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Yi35paw6LWE5rqQ566h55CG5ZmoXHJcbiAgICBhc3luYyByZWZyZXNoQXNzZXREYXRhYmFzZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyDnoa7kv53ot6/lvoTmmK/pobnnm67lhoXnmoTot6/lvoTvvIhkYjovL2Fzc2V0cy/lvIDlpLTvvIlcclxuICAgICAgICAgICAgY29uc3QganNvbkRiUGF0aCA9IHRoaXMuY29udmVydFRvRGJQYXRoKHRoaXMuY29uZmlnLmpzb25FeHBvcnRQYXRoKTtcclxuICAgICAgICAgICAgY29uc3QgdHNEYlBhdGggPSB0aGlzLmNvbnZlcnRUb0RiUGF0aCh0aGlzLmNvbmZpZy50c0V4cG9ydFBhdGgpO1xyXG5cclxuICAgICAgICAgICAgLy8g5Yi35pawSlNPTuWvvOWHuuebruW9lVxyXG4gICAgICAgICAgICBpZiAoanNvbkRiUGF0aCAmJiBqc29uRGJQYXRoLnN0YXJ0c1dpdGgoJ2RiOi8vJykpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3JlZnJlc2gtYXNzZXQnLCBqc29uRGJQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5Yi35pawVFPlr7zlh7rnm67lvZVcclxuICAgICAgICAgICAgaWYgKHRzRGJQYXRoICYmIHRzRGJQYXRoLnN0YXJ0c1dpdGgoJ2RiOi8vJykpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3JlZnJlc2gtYXNzZXQnLCB0c0RiUGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcygnW0V4Y2Vs5o+S5Lu2XSDotYTmupDliLfmlrDor7fmsYLlt7Llj5HpgIEnKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvcihgW0V4Y2Vs5o+S5Lu2XSDotYTmupDliLfmlrDlpLHotKU6ICR7ZXJyfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlsIbns7vnu5/ot6/lvoTovazmjaLkuLpDb2Nvc+eahGRi6Lev5b6EXHJcbiAgICBjb252ZXJ0VG9EYlBhdGgoc3lzdGVtUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIXN5c3RlbVBhdGgpIHJldHVybiAnJztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8g6I635Y+W6aG555uu6Lev5b6EXHJcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RQYXRoID0gRWRpdG9yLlByb2plY3QucGF0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIOinhOiMg+WMlui3r+W+hO+8iOe7n+S4gOS9v+eUqOato+aWnOadoO+8iVxyXG4gICAgICAgICAgICBzeXN0ZW1QYXRoID0gc3lzdGVtUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOehruS/nei3r+W+hOS7pS/nu5PlsL5cclxuICAgICAgICAgICAgY29uc3QgcHJvamVjdFBhdGhXaXRoU2xhc2ggPSBub3JtYWxpemVkUHJvamVjdFBhdGguZW5kc1dpdGgoJy8nKVxyXG4gICAgICAgICAgICAgICAgPyBub3JtYWxpemVkUHJvamVjdFBhdGhcclxuICAgICAgICAgICAgICAgIDogbm9ybWFsaXplZFByb2plY3RQYXRoICsgJy8nO1xyXG5cclxuICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5Zyo6aG555uu55uu5b2V5YaFXHJcbiAgICAgICAgICAgIGlmIChzeXN0ZW1QYXRoLnN0YXJ0c1dpdGgocHJvamVjdFBhdGhXaXRoU2xhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDorqHnrpfnm7jlr7not6/lvoRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHN5c3RlbVBhdGguc3Vic3RyaW5nKHByb2plY3RQYXRoV2l0aFNsYXNoLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYGRiOi8vJHtyZWxhdGl2ZVBhdGh9YDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5aaC5p6c6Lev5b6E5YyF5ZCrYXNzZXRz55uu5b2V77yM5bCd6K+V55u05o6l6L2s5o2iXHJcbiAgICAgICAgICAgIGlmIChzeXN0ZW1QYXRoLmluY2x1ZGVzKCcvYXNzZXRzLycpIHx8IHN5c3RlbVBhdGguaW5jbHVkZXMoJ1xcXFxhc3NldHNcXFxcJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0c0luZGV4ID0gc3lzdGVtUGF0aC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy9hc3NldHMvJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXNzZXRzSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVUb0Fzc2V0cyA9IHN5c3RlbVBhdGguc3Vic3RyaW5nKGFzc2V0c0luZGV4ICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBkYjovLyR7cmVsYXRpdmVUb0Fzc2V0c31gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLndhcm4oYFtFeGNlbOaPkuS7tl0g6Lev5b6E5LiN5Zyo6aG555uu5YaF77yM5Y+v6IO95peg5rOV5q2j56Gu5Yi35pawOiAke3N5c3RlbVBhdGh9YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW1QYXRoO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yKGBbRXhjZWzmj5Lku7ZdIOi3r+W+hOi9rOaNouWksei0pTogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW1QYXRoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGV4Y2VsVG9Kc29uUGx1Z2luID0gbmV3IEV4Y2VsVG9Kc29uUGx1Z2luKCk7Il19