消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

794 lines
110 KiB

"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