204 lines
28 KiB
JavaScript
204 lines
28 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const fs_extra_1 = require("fs-extra");
|
|
const path_1 = require("path");
|
|
const config_manager_1 = require("../../utcp/config-manager");
|
|
/**
|
|
* @zh 如果希望兼容 3.3 之前的版本可以使用下方的代码
|
|
* @en You can add the code below if you want compatibility with versions prior to 3.3
|
|
*/
|
|
// Editor.Panel.define = Editor.Panel.define || function(options: any) { return options }
|
|
module.exports = Editor.Panel.define({
|
|
listeners: {
|
|
show() { console.log('show'); },
|
|
hide() { console.log('hide'); },
|
|
},
|
|
template: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/template/default/index.html'), 'utf-8'),
|
|
style: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/style/default/index.css'), 'utf-8'),
|
|
$: {
|
|
app: '.panel',
|
|
portInput: '#port-input',
|
|
savePortBtn: '#save-port-btn',
|
|
// MCP Integration
|
|
mcpConfigCode: '#mcp-config-code',
|
|
// UTCP Config
|
|
utcpConfigPathInput: '#utcp-config-path',
|
|
utcpConfigPathSaveBtn: '#save-utcp-path-btn',
|
|
bridgeList: '#bridge-container',
|
|
addBridgeBtn: '#add-bridge-btn',
|
|
newTemplateJson: '#new-template-json',
|
|
},
|
|
methods: {
|
|
async loadSettings() {
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
await configManager.initialize();
|
|
// Update UI with config path
|
|
if (this.$.utcpConfigPathInput) {
|
|
this.$.utcpConfigPathInput.value = configManager.getConfigPath();
|
|
}
|
|
// Load Port
|
|
const port = await configManager.getCurrentPort();
|
|
if (this.$.portInput) {
|
|
this.$.portInput.value = port || 0;
|
|
}
|
|
this.updateMcpCodeBlock();
|
|
this.fetchBridgeList();
|
|
},
|
|
async saveSettings() {
|
|
const newPath = this.$.utcpConfigPathInput.value;
|
|
if (newPath) {
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
await configManager.setConfigPath(newPath);
|
|
this.updateMcpCodeBlock();
|
|
this.fetchBridgeList(); // Reload templates from new path
|
|
console.log('Saved UTCP Config Path:', newPath);
|
|
}
|
|
},
|
|
async updatePort() {
|
|
const portVal = this.$.portInput.value;
|
|
const port = parseInt(portVal);
|
|
console.log(`Updating port to: ${port}`);
|
|
// Send message to main process to restart server
|
|
Editor.Message.send('cocos-code-mode-ai', 'restart-server', port);
|
|
},
|
|
updateMcpCodeBlock() {
|
|
const codeEl = this.$.mcpConfigCode;
|
|
if (!codeEl)
|
|
return;
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
const configPath = configManager.getConfigPath();
|
|
const config = {
|
|
"mcpServers": {
|
|
"code-mode": {
|
|
"command": "npx",
|
|
"args": ["-y", "@utcp/code-mode-mcp"],
|
|
"env": {
|
|
"UTCP_CONFIG_FILE": configPath
|
|
}
|
|
}
|
|
}
|
|
};
|
|
codeEl.textContent = JSON.stringify(config, null, 2);
|
|
},
|
|
// Renamed from fetchBridgeList to be more generic 'renderTemplates' logic
|
|
fetchBridgeList() {
|
|
const container = this.$.bridgeList;
|
|
if (!container) {
|
|
console.warn('Bridge Config Container not found');
|
|
return;
|
|
}
|
|
// Clear "Loading..." or previous content
|
|
container.innerHTML = '';
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
const config = configManager.readConfig();
|
|
const templates = config.manual_call_templates || [];
|
|
console.log('Rendering templates:', templates.length);
|
|
if (templates.length === 0) {
|
|
container.innerHTML = '<div style="padding:10px; color: #888;">No templates found.</div>';
|
|
}
|
|
else {
|
|
let html = '';
|
|
templates.forEach((t) => {
|
|
const isCocos = t.name === 'CocosEditor';
|
|
const delBtn = isCocos
|
|
? `` // No delete for Cocos
|
|
: `<ui-button slot="header" type="danger" class="remove-btn" tooltip="Remove Template">
|
|
<ui-icon value="del"></ui-icon>
|
|
</ui-button>`;
|
|
const headerText = `${t.name} (${t.call_template_type})`;
|
|
html += `
|
|
<ui-section class="bridge-item-section" data-name="${t.name}">
|
|
<div slot="header" style="display: flex; justify-content: space-between; align-items: center; width: 100%; padding-right: 10px;">
|
|
<ui-label>${headerText}</ui-label>
|
|
${delBtn}
|
|
</div>
|
|
<div class="bridge-item-content">
|
|
<ui-code language="json" readonly id="code-${t.name}"></ui-code>
|
|
</div>
|
|
</ui-section>
|
|
`;
|
|
});
|
|
container.innerHTML = html;
|
|
// Now populate the code values correctly
|
|
templates.forEach((t) => {
|
|
const el = container.querySelector(`#code-${t.name}`);
|
|
if (el)
|
|
el.textContent = JSON.stringify(t, null, 2);
|
|
});
|
|
}
|
|
},
|
|
addBridgeTemplate() {
|
|
const input = this.$.newTemplateJson;
|
|
if (!input)
|
|
return;
|
|
const content = input.value.trim();
|
|
if (!content)
|
|
return;
|
|
try {
|
|
let newTpl = JSON.parse(content);
|
|
// Validate with @utcp/sdk or simple schema
|
|
if (!newTpl.name || !newTpl.call_template_type) {
|
|
alert('Invalid template. Must have name and call_template_type.');
|
|
return;
|
|
}
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
const config = configManager.readConfig();
|
|
// Check duplicates
|
|
if (config.manual_call_templates.find((t) => t.name === newTpl.name)) {
|
|
alert(`Template ${newTpl.name} already exists.`);
|
|
return;
|
|
}
|
|
config.manual_call_templates.push(newTpl);
|
|
configManager.writeConfig(config);
|
|
input.value = '';
|
|
this.fetchBridgeList();
|
|
}
|
|
catch (e) {
|
|
alert('Invalid JSON: ' + e.message);
|
|
}
|
|
},
|
|
removeBridge(name) {
|
|
if (name === 'CocosEditor')
|
|
return;
|
|
if (!confirm(`Remove template ${name}?`))
|
|
return;
|
|
const configManager = (0, config_manager_1.getConfigManager)();
|
|
const config = configManager.readConfig();
|
|
if (config.manual_call_templates) {
|
|
config.manual_call_templates = config.manual_call_templates.filter((t) => t.name !== name);
|
|
configManager.writeConfig(config);
|
|
this.fetchBridgeList();
|
|
}
|
|
},
|
|
},
|
|
ready() {
|
|
this.loadSettings();
|
|
// Listeners
|
|
const savePort = this.$.savePortBtn;
|
|
if (savePort)
|
|
savePort.addEventListener('click', () => this.updatePort());
|
|
const savePath = this.$.utcpConfigPathSaveBtn;
|
|
if (savePath)
|
|
savePath.addEventListener('click', () => this.saveSettings());
|
|
const addBtn = this.$.addBridgeBtn;
|
|
if (addBtn)
|
|
addBtn.addEventListener('click', () => this.addBridgeTemplate());
|
|
const list = this.$.bridgeList;
|
|
if (list) {
|
|
list.addEventListener('click', (e) => {
|
|
// Handle delete clicks
|
|
const btn = e.target.closest('.remove-btn');
|
|
if (btn) {
|
|
// In new structure, btn is inside .bridge-item-content inside ui-section
|
|
const section = btn.closest('.bridge-item-section');
|
|
if (section && section.dataset.name) {
|
|
this.removeBridge(section.dataset.name);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
},
|
|
beforeClose() { },
|
|
close() { },
|
|
});
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvcGFuZWxzL2RlZmF1bHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBd0M7QUFDeEMsK0JBQTRCO0FBQzVCLDhEQUE2RDtBQUc3RDs7O0dBR0c7QUFDSCx5RkFBeUY7QUFFekYsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxTQUFTLEVBQUU7UUFDUCxJQUFJLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsUUFBUSxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDL0YsS0FBSyxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUseUNBQXlDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEYsQ0FBQyxFQUFFO1FBQ0MsR0FBRyxFQUFFLFFBQVE7UUFDYixTQUFTLEVBQUUsYUFBYTtRQUN4QixXQUFXLEVBQUUsZ0JBQWdCO1FBRTdCLGtCQUFrQjtRQUNsQixhQUFhLEVBQUUsa0JBQWtCO1FBRWpDLGNBQWM7UUFDZCxtQkFBbUIsRUFBRSxtQkFBbUI7UUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO1FBQzVDLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixlQUFlLEVBQUUsb0JBQW9CO0tBQ3hDO0lBRUQsT0FBTyxFQUFFO1FBQ0wsS0FBSyxDQUFDLFlBQVk7WUFDZCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxhQUFhLENB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QUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUU1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQTJCLENBQUM7UUFDbEQsSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBeUIsQ0FBQztRQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN0Qyx1QkFBdUI7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNOLHlFQUF5RTtvQkFDekUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLEtBQUssQ0FBQztJQUNqQixLQUFLLEtBQUssQ0FBQztDQUNkLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldENvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi8uLi91dGNwL2NvbmZpZy1tYW5hZ2VyJztcbmltcG9ydCB7IENhbGxUZW1wbGF0ZVNlcmlhbGl6ZXIgfSBmcm9tICdAdXRjcC9zZGsnO1xuXG4vKipcbiAqIEB6aCDlpoLmnpzluIzmnJvlhbzlrrkgMy4zIOS5i+WJjeeahOeJiOacrOWPr+S7peS9v+eUqOS4i+aWueeahOS7o+eggVxuICogQGVuIFlvdSBjYW4gYWRkIHRoZSBjb2RlIGJlbG93IGlmIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byAzLjNcbiAqL1xuLy8gRWRpdG9yLlBhbmVsLmRlZmluZSA9IEVkaXRvci5QYW5lbC5kZWZpbmUgfHwgZnVuY3Rpb24ob3B0aW9uczogYW55KSB7IHJldHVybiBvcHRpb25zIH1cblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3IuUGFuZWwuZGVmaW5lKHtcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgc2hvdygpIHsgY29uc29sZS5sb2coJ3Nob3cnKTsgfSxcbiAgICAgICAgaGlkZSgpIHsgY29uc29sZS5sb2coJ2hpZGUnKTsgfSxcbiAgICB9LFxuICAgIHRlbXBsYXRlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvdGVtcGxhdGUvZGVmYXVsdC9pbmRleC5odG1sJyksICd1dGYtOCcpLFxuICAgIHN0eWxlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvc3R5bGUvZGVmYXVsdC9pbmRleC5jc3MnKSwgJ3V0Zi04JyksXG4gICAgJDoge1xuICAgICAgICBhcHA6ICcucGFuZWwnLFxuICAgICAgICBwb3J0SW5wdXQ6ICcjcG9ydC1pbnB1dCcsXG4gICAgICAgIHNhdmVQb3J0QnRuOiAnI3NhdmUtcG9ydC1idG4nLFxuXG4gICAgICAgIC8vIE1DUCBJbnRlZ3JhdGlvblxuICAgICAgICBtY3BDb25maWdDb2RlOiAnI21jcC1jb25maWctY29kZScsXG5cbiAgICAgICAgLy8gVVRDUCBDb25maWdcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhJbnB1dDogJyN1dGNwLWNvbmZpZy1wYXRoJyxcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhTYXZlQnRuOiAnI3NhdmUtdXRjcC1wYXRoLWJ0bicsXG4gICAgICAgIGJyaWRnZUxpc3Q6ICcjYnJpZGdlLWNvbnRhaW5lcicsXG4gICAgICAgIGFkZEJyaWRnZUJ0bjogJyNhZGQtYnJpZGdlLWJ0bicsXG4gICAgICAgIG5ld1RlbXBsYXRlSnNvbjogJyNuZXctdGVtcGxhdGUtanNvbicsXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgVUkgd2l0aCBjb25maWcgcGF0aFxuICAgICAgICAgICAgaWYgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0KSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWUgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTG9hZCBQb3J0XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRDdXJyZW50UG9ydCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5wb3J0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlID0gcG9ydCB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1jcENvZGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3UGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zZXRDb25maWdQYXRoKG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWNwQ29kZUJsb2NrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTsgLy8gUmVsb2FkIHRlbXBsYXRlcyBmcm9tIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NhdmVkIFVUQ1AgQ29uZmlnIFBhdGg6JywgbmV3UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgdXBkYXRlUG9ydCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcnRWYWwgPSAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHBvcnRWYWwpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIHBvcnQgdG86ICR7cG9ydH1gKTtcbiAgICAgICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBtYWluIHByb2Nlc3MgdG8gcmVzdGFydCBzZXJ2ZXJcbiAgICAgICAgICAgIEVkaXRvci5NZXNzYWdlLnNlbmQoJ2NvY29zLWNvZGUtbW9kZS1haScsICdyZXN0YXJ0LXNlcnZlcicsIHBvcnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZU1jcENvZGVCbG9jaygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbCA9IHRoaXMuJC5tY3BDb25maWdDb2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFjb2RlRWwpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIFwibWNwU2VydmVyc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiY29kZS1tb2RlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBcIm5weFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmdzXCI6IFtcIi15XCIsIFwiQHV0Y3AvY29kZS1tb2RlLW1jcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW52XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVUQ1BfQ09ORklHX0ZJTEVcIjogY29uZmlnUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29kZUVsLnRleHRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZW5hbWVkIGZyb20gZmV0Y2hCcmlkZ2VMaXN0IHRvIGJlIG1vcmUgZ2VuZXJpYyAncmVuZGVyVGVtcGxhdGVzJyBsb2dpY1xuICAgICAgICBmZXRjaEJyaWRnZUxpc3QoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLiQuYnJpZGdlTGlzdCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdCcmlkZ2UgQ29uZmlnIENvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFyIFwiTG9hZGluZy4uLlwiIG9yIHByZXZpb3VzIGNvbnRlbnRcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIucmVhZENvbmZpZygpO1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcyB8fCBbXTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbmRlcmluZyB0ZW1wbGF0ZXM6JywgdGVtcGxhdGVzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4OyBjb2xvcjogIzg4ODtcIj5ObyB0ZW1wbGF0ZXMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29jb3MgPSB0Lm5hbWUgPT09ICdDb2Nvc0VkaXRvcic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbEJ0biA9IGlzQ29jb3NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGAgLy8gTm8gZGVsZXRlIGZvciBDb2Nvc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBgPHVpLWJ1dHRvbiBzbG90PVwiaGVhZGVyXCIgdHlwZT1cImRhbmdlclwiIGNsYXNzPVwicmVtb3ZlLWJ0blwiIHRvb2x0aXA9XCJSZW1vdmUgVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gdmFsdWU9XCJkZWxcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpLWJ1dHRvbj5gO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclRleHQgPSBgJHt0Lm5hbWV9ICgke3QuY2FsbF90ZW1wbGF0ZV90eXBlfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgICAgICAgICAgICA8dWktc2VjdGlvbiBjbGFzcz1cImJyaWRnZS1pdGVtLXNlY3Rpb25cIiBkYXRhLW5hbWU9XCIke3QubmFtZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cImhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyB3aWR0aDogMTAwJTsgcGFkZGluZy1yaWdodDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktbGFiZWw+JHtoZWFkZXJUZXh0fTwvdWktbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkZWxCdG59XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmlkZ2UtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1jb2RlIGxhbmd1YWdlPVwianNvblwiIHJlYWRvbmx5IGlkPVwiY29kZS0ke3QubmFtZX1cIj48L3VpLWNvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAgICAgICAgICAgLy8gTm93IHBvcHVsYXRlIHRoZSBjb2RlIHZhbHVlcyBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCNjb2RlLSR7dC5uYW1lfWApIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHQsIG51bGwsIDIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEJyaWRnZVRlbXBsYXRlKCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLiQubmV3VGVtcGxhdGVKc29uIGFzIGFueTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VHBsID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIEB1dGNwL3NkayBvciBzaW1wbGUgc2NoZW1hXG4gICAgICAgICAgICAgICAgaWYgKCFuZXdUcGwubmFtZSB8fCAhbmV3VHBsLmNhbGxfdGVtcGxhdGVfdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCB0ZW1wbGF0ZS4gTXVzdCBoYXZlIG5hbWUgYW5kIGNhbGxfdGVtcGxhdGVfdHlwZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMuZmluZCgodDogYW55KSA9PiB0Lm5hbWUgPT09IG5ld1RwbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgVGVtcGxhdGUgJHtuZXdUcGwubmFtZX0gYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLnB1c2gobmV3VHBsKTtcbiAgICAgICAgICAgICAgICBjb25maWdNYW5hZ2VyLndyaXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCBKU09OOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVCcmlkZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ0NvY29zRWRpdG9yJykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtKGBSZW1vdmUgdGVtcGxhdGUgJHtuYW1lfT9gKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMgPSBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLmZpbHRlcigodDogYW55KSA9PiB0Lm5hbWUgIT09IG5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ01hbmFnZXIud3JpdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHNhdmVQb3J0ID0gdGhpcy4kLnNhdmVQb3J0QnRuIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoc2F2ZVBvcnQpIHNhdmVQb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy51cGRhdGVQb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVQYXRoID0gdGhpcy4kLnV0Y3BDb25maWdQYXRoU2F2ZUJ0biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHNhdmVQYXRoKSBzYXZlUGF0aC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2F2ZVNldHRpbmdzKCkpO1xuXG4gICAgICAgIGNvbnN0IGFkZEJ0biA9IHRoaXMuJC5hZGRCcmlkZ2VCdG4gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChhZGRCdG4pIGFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuYWRkQnJpZGdlVGVtcGxhdGUoKSk7XG5cbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMuJC5icmlkZ2VMaXN0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgbGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZGVsZXRlIGNsaWNrc1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5yZW1vdmUtYnRuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBuZXcgc3RydWN0dXJlLCBidG4gaXMgaW5zaWRlIC5icmlkZ2UtaXRlbS1jb250ZW50IGluc2lkZSB1aS1zZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBidG4uY2xvc2VzdCgnLmJyaWRnZS1pdGVtLXNlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5kYXRhc2V0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnJpZGdlKHNlY3Rpb24uZGF0YXNldC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVDbG9zZSgpIHsgfSxcbiAgICBjbG9zZSgpIHsgfSxcbn0pOyJdfQ==
|