ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
211 lines (206 loc) • 22.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = build;
var _nodes = require('../types/nodes');
var HBS = _interopRequireWildcard(_nodes);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function unreachable() {
throw new Error('unreachable');
}
function build(ast) {
if (!ast) {
return '';
}
const output = [];
switch (ast.type) {
case 'Program':
{
const chainBlock = ast['chained'] && ast.body[0];
if (chainBlock) {
chainBlock['chained'] = true;
}
const body = buildEach(ast.body).join('');
output.push(body);
}
break;
case 'ElementNode':
output.push('<', ast.tag);
if (ast.attributes.length) {
output.push(' ', buildEach(ast.attributes).join(' '));
}
if (ast.modifiers.length) {
output.push(' ', buildEach(ast.modifiers).join(' '));
}
if (ast.comments.length) {
output.push(' ', buildEach(ast.comments).join(' '));
}
output.push('>');
output.push.apply(output, buildEach(ast.children));
output.push('</', ast.tag, '>');
break;
case 'AttrNode':
output.push(ast.name, '=');
const value = build(ast.value);
if (ast.value.type === 'TextNode') {
output.push('"', value, '"');
} else {
output.push(value);
}
break;
case 'ConcatStatement':
output.push('"');
ast.parts.forEach(node => {
if (node.type === 'StringLiteral') {
output.push(node.original);
} else {
output.push(build(node));
}
});
output.push('"');
break;
case 'TextNode':
output.push(ast.chars);
break;
case 'MustacheStatement':
{
output.push(compactJoin(['{{', pathParams(ast), '}}']));
}
break;
case 'MustacheCommentStatement':
{
output.push(compactJoin(['{{!--', ast.value, '--}}']));
}
break;
case 'ElementModifierStatement':
{
output.push(compactJoin(['{{', pathParams(ast), '}}']));
}
break;
case 'PathExpression':
output.push(ast.original);
break;
case 'SubExpression':
{
output.push('(', pathParams(ast), ')');
}
break;
case 'BooleanLiteral':
output.push(ast.value ? 'true' : 'false');
break;
case 'BlockStatement':
{
const lines = [];
if (ast['chained']) {
lines.push(['{{else ', pathParams(ast), '}}'].join(''));
} else {
lines.push(openBlock(ast));
}
lines.push(build(ast.program));
if (ast.inverse) {
if (!ast.inverse['chained']) {
lines.push('{{else}}');
}
lines.push(build(ast.inverse));
}
if (!ast['chained']) {
lines.push(closeBlock(ast));
}
output.push(lines.join(''));
}
break;
case 'PartialStatement':
{
output.push(compactJoin(['{{>', pathParams(ast), '}}']));
}
break;
case 'CommentStatement':
{
output.push(compactJoin(['<!--', ast.value, '-->']));
}
break;
case 'StringLiteral':
{
output.push(`"${ast.value}"`);
}
break;
case 'NumberLiteral':
{
output.push(String(ast.value));
}
break;
case 'UndefinedLiteral':
{
output.push('undefined');
}
break;
case 'NullLiteral':
{
output.push('null');
}
break;
case 'Hash':
{
output.push(ast.pairs.map(pair => {
return build(pair);
}).join(' '));
}
break;
case 'HashPair':
{
output.push(`${ast.key}=${build(ast.value)}`);
}
break;
}
return output.join('');
}
function compact(array) {
const newArray = [];
array.forEach(a => {
if (typeof a !== 'undefined' && a !== null && a !== '') {
newArray.push(a);
}
});
return newArray;
}
function buildEach(asts) {
return asts.map(build);
}
function pathParams(ast) {
let path;
switch (ast.type) {
case 'MustacheStatement':
case 'SubExpression':
case 'ElementModifierStatement':
case 'BlockStatement':
if (HBS.isLiteral(ast.path)) {
return String(ast.path.value);
}
path = build(ast.path);
break;
case 'PartialStatement':
path = build(ast.name);
break;
default:
return unreachable();
}
return compactJoin([path, buildEach(ast.params).join(' '), build(ast.hash)], ' ');
}
function compactJoin(array, delimiter) {
return compact(array).join(delimiter || '');
}
function blockParams(block) {
const params = block.program.blockParams;
if (params.length) {
return ` as |${params.join(' ')}|`;
}
return null;
}
function openBlock(block) {
return ['{{#', pathParams(block), blockParams(block), '}}'].join('');
}
function closeBlock(block) {
return ['{{/', build(block.path), '}}'].join('');
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9nZW5lcmF0aW9uL3ByaW50LmpzIl0sIm5hbWVzIjpbImJ1aWxkIiwiSEJTIiwidW5yZWFjaGFibGUiLCJFcnJvciIsImFzdCIsIm91dHB1dCIsInR5cGUiLCJjaGFpbkJsb2NrIiwiYm9keSIsImJ1aWxkRWFjaCIsImpvaW4iLCJwdXNoIiwidGFnIiwiYXR0cmlidXRlcyIsImxlbmd0aCIsIm1vZGlmaWVycyIsImNvbW1lbnRzIiwiYXBwbHkiLCJjaGlsZHJlbiIsIm5hbWUiLCJ2YWx1ZSIsInBhcnRzIiwiZm9yRWFjaCIsIm5vZGUiLCJvcmlnaW5hbCIsImNoYXJzIiwiY29tcGFjdEpvaW4iLCJwYXRoUGFyYW1zIiwibGluZXMiLCJvcGVuQmxvY2siLCJwcm9ncmFtIiwiaW52ZXJzZSIsImNsb3NlQmxvY2siLCJTdHJpbmciLCJwYWlycyIsIm1hcCIsInBhaXIiLCJrZXkiLCJjb21wYWN0IiwiYXJyYXkiLCJuZXdBcnJheSIsImEiLCJhc3RzIiwicGF0aCIsImlzTGl0ZXJhbCIsInBhcmFtcyIsImhhc2giLCJkZWxpbWl0ZXIiLCJibG9ja1BhcmFtcyIsImJsb2NrIl0sIm1hcHBpbmdzIjoiOzs7OztrQkFJd0JBLEs7O0FBSnhCOztJQUFZQyxHOzs7O0FBQ1osU0FBU0MsV0FBVCxHQUF1QjtBQUNuQixVQUFNLElBQUlDLEtBQUosQ0FBVSxhQUFWLENBQU47QUFDSDtBQUNjLFNBQVNILEtBQVQsQ0FBZUksR0FBZixFQUFvQjtBQUMvQixRQUFJLENBQUNBLEdBQUwsRUFBVTtBQUNOLGVBQU8sRUFBUDtBQUNIO0FBQ0QsVUFBTUMsU0FBUyxFQUFmO0FBQ0EsWUFBUUQsSUFBSUUsSUFBWjtBQUNJLGFBQUssU0FBTDtBQUNJO0FBQ0ksc0JBQU1DLGFBQWFILElBQUksU0FBSixLQUFrQkEsSUFBSUksSUFBSixDQUFTLENBQVQsQ0FBckM7QUFDQSxvQkFBSUQsVUFBSixFQUFnQjtBQUNaQSwrQkFBVyxTQUFYLElBQXdCLElBQXhCO0FBQ0g7QUFDRCxzQkFB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RUFBUXRCLFdBQVdzQixLQUFYLENBQVIsRUFBMkJELFlBQVlDLEtBQVosQ0FBM0IsRUFBK0MsSUFBL0MsRUFBcUR2QyxJQUFyRCxDQUEwRCxFQUExRCxDQUFQO0FBQ0g7QUFDRCxTQUFTc0IsVUFBVCxDQUFvQmlCLEtBQXBCLEVBQTJCO0FBQ3ZCLFdBQU8sQ0FBQyxLQUFELEVBQVFqRCxNQUFNaUQsTUFBTU4sSUFBWixDQUFSLEVBQTJCLElBQTNCLEVBQWlDakMsSUFBakMsQ0FBc0MsRUFBdEMsQ0FBUDtBQUNIIiwiZmlsZSI6ImxpYi9nZW5lcmF0aW9uL3ByaW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgSEJTIGZyb20gJy4uL3R5cGVzL25vZGVzJztcbmZ1bmN0aW9uIHVucmVhY2hhYmxlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUnKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkKGFzdCkge1xuICAgIGlmICghYXN0KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgc3dpdGNoIChhc3QudHlwZSkge1xuICAgICAgICBjYXNlICdQcm9ncmFtJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFpbkJsb2NrID0gYXN0WydjaGFpbmVkJ10gJiYgYXN0LmJvZHlbMF07XG4gICAgICAgICAgICAgICAgaWYgKGNoYWluQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhaW5CbG9ja1snY2hhaW5lZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGJ1aWxkRWFjaChhc3QuYm9keSkuam9pbignJyk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRWxlbWVudE5vZGUnOlxuICAgICAgICAgICAgb3V0cHV0LnB1c2goJzwnLCBhc3QudGFnKTtcbiAgICAgICAgICAgIGlmIChhc3QuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnICcsIGJ1aWxkRWFjaChhc3QuYXR0cmlidXRlcykuam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3QubW9kaWZpZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCcgJywgYnVpbGRFYWNoKGFzdC5tb2RpZmllcnMpLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXN0LmNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCcgJywgYnVpbGRFYWNoKGFzdC5jb21tZW50cykuam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCc+Jyk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaC5hcHBseShvdXRwdXQsIGJ1aWxkRWFjaChhc3QuY2hpbGRyZW4pKTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCc8LycsIGFzdC50YWcsICc+Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXR0ck5vZGUnOlxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYXN0Lm5hbWUsICc9Jyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGJ1aWxkKGFzdC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoYXN0LnZhbHVlLnR5cGUgPT09ICdUZXh0Tm9kZScpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnXCInLCB2YWx1ZSwgJ1wiJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdDb25jYXRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgb3V0cHV0LnB1c2goJ1wiJyk7XG4gICAgICAgICAgICBhc3QucGFydHMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobm9kZS5vcmlnaW5hbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYnVpbGQobm9kZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goJ1wiJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVGV4dE5vZGUnOlxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYXN0LmNoYXJzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNdXN0YWNoZVN0YXRlbWVudCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY29tcGFjdEpvaW4oWyd7eycsIHBhdGhQYXJhbXMoYXN0KSwgJ319J10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNvbXBhY3RKb2luKFsne3shLS0nLCBhc3QudmFsdWUsICctLX19J10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNvbXBhY3RKb2luKFsne3snLCBwYXRoUGFyYW1zKGFzdCksICd9fSddKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUGF0aEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYXN0Lm9yaWdpbmFsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTdWJFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnKCcsIHBhdGhQYXJhbXMoYXN0KSwgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCb29sZWFuTGl0ZXJhbCc6XG4gICAgICAgICAgICBvdXRwdXQucHVzaChhc3QudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoYXN0WydjaGFpbmVkJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChbJ3t7ZWxzZSAnLCBwYXRoUGFyYW1zKGFzdCksICd9fSddLmpvaW4oJycpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKG9wZW5CbG9jayhhc3QpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChidWlsZChhc3QucHJvZ3JhbSkpO1xuICAgICAgICAgICAgICAgIGlmIChhc3QuaW52ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFzdC5pbnZlcnNlWydjaGFpbmVkJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJ3t7ZWxzZX19Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChidWlsZChhc3QuaW52ZXJzZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWFzdFsnY2hhaW5lZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goY2xvc2VCbG9jayhhc3QpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobGluZXMuam9pbignJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1BhcnRpYWxTdGF0ZW1lbnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNvbXBhY3RKb2luKFsne3s+JywgcGF0aFBhcmFtcyhhc3QpLCAnfX0nXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNvbXBhY3RKb2luKFsnPCEtLScsIGFzdC52YWx1ZSwgJy0tPiddKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnU3RyaW5nTGl0ZXJhbCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYFwiJHthc3QudmFsdWV9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdOdW1iZXJMaXRlcmFsJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcoYXN0LnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVW5kZWZpbmVkTGl0ZXJhbCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ3VuZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ051bGxMaXRlcmFsJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnbnVsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0hhc2gnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGFzdC5wYWlycy5tYXAocGFpciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZChwYWlyKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCcgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0hhc2hQYWlyJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChgJHthc3Qua2V5fT0ke2J1aWxkKGFzdC52YWx1ZSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgIGFycmF5LmZvckVhY2goYSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgYSAhPT0gJ3VuZGVmaW5lZCcgJiYgYSAhPT0gbnVsbCAmJiBhICE9PSAnJykge1xuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChhKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXdBcnJheTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRWFjaChhc3RzKSB7XG4gICAgcmV0dXJuIGFzdHMubWFwKGJ1aWxkKTtcbn1cbmZ1bmN0aW9uIHBhdGhQYXJhbXMoYXN0KSB7XG4gICAgbGV0IHBhdGg7XG4gICAgc3dpdGNoIChhc3QudHlwZSkge1xuICAgICAgICBjYXNlICdNdXN0YWNoZVN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ1N1YkV4cHJlc3Npb24nOlxuICAgICAgICBjYXNlICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICAgICAgICBpZiAoSEJTLmlzTGl0ZXJhbChhc3QucGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGFzdC5wYXRoLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGggPSBidWlsZChhc3QucGF0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUGFydGlhbFN0YXRlbWVudCc6XG4gICAgICAgICAgICBwYXRoID0gYnVpbGQoYXN0Lm5hbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdW5yZWFjaGFibGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhY3RKb2luKFtwYXRoLCBidWlsZEVhY2goYXN0LnBhcmFtcykuam9pbignICcpLCBidWlsZChhc3QuaGFzaCldLCAnICcpO1xufVxuZnVuY3Rpb24gY29tcGFjdEpvaW4oYXJyYXksIGRlbGltaXRlcikge1xuICAgIHJldHVybiBjb21wYWN0KGFycmF5KS5qb2luKGRlbGltaXRlciB8fCAnJyk7XG59XG5mdW5jdGlvbiBibG9ja1BhcmFtcyhibG9jaykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGJsb2NrLnByb2dyYW0uYmxvY2tQYXJhbXM7XG4gICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGAgYXMgfCR7cGFyYW1zLmpvaW4oJyAnKX18YDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBvcGVuQmxvY2soYmxvY2spIHtcbiAgICByZXR1cm4gWyd7eyMnLCBwYXRoUGFyYW1zKGJsb2NrKSwgYmxvY2tQYXJhbXMoYmxvY2spLCAnfX0nXS5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soYmxvY2spIHtcbiAgICByZXR1cm4gWyd7ey8nLCBidWlsZChibG9jay5wYXRoKSwgJ319J10uam9pbignJyk7XG59Il19