UNPKG

@glimmer/compiler

Version:
131 lines (109 loc) 13.5 kB
import { normalize, Source } from '@glimmer/syntax'; import { LOCAL_LOGGER } from '@glimmer/util'; import pass0 from './passes/1-normalization/index'; import { visit as pass2 } from './passes/2-encoding/index'; export var defaultId = function () { var req = typeof module === 'object' && typeof module.require === 'function' ? module.require : require; if (req) { try { var crypto = req('crypto'); var idFn = function idFn(src) { var hash = crypto.createHash('sha1'); hash.update(src, 'utf8'); // trim to 6 bytes of data (2^48 - 1) return hash.digest('base64').substring(0, 8); }; idFn('test'); return idFn; } catch (e) {} } return function idFn() { return null; }; }(); var defaultOptions = { id: defaultId }; /* * Compile a string into a template javascript string. * * Example usage: * import { precompile } from '@glimmer/compiler'; * import { templateFactory } from 'glimmer-runtime'; * let templateJs = precompile("Howdy {{name}}"); * let factory = templateFactory(new Function("return " + templateJs)()); * let template = factory.create(env); * * @method precompile * @param {string} string a Glimmer template string * @return {string} a template javascript string */ export function precompileJSON(string, options) { if (options === void 0) { options = defaultOptions; } var _a, _b; var source = new Source(string, (_a = options.meta) === null || _a === void 0 ? void 0 : _a.moduleName); var _normalize = normalize(source, options), ast = _normalize[0], locals = _normalize[1]; var block = pass0(source, ast, (_b = options.strictMode) !== null && _b !== void 0 ? _b : false).mapOk(function (pass2In) { return pass2(pass2In); }); if (false /* LOCAL_SHOULD_LOG */ ) { LOCAL_LOGGER.log("Template ->", block); } if (block.isOk) { return [block.value, locals]; } else { throw block.reason; } } // UUID used as a unique placeholder for placing a snippet of JS code into // the otherwise JSON stringified value below. var SCOPE_PLACEHOLDER = '796d24e6-2450-4fb0-8cdf-b65638b5ef70'; /* * Compile a string into a template javascript string. * * Example usage: * import { precompile } from '@glimmer/compiler'; * import { templateFactory } from 'glimmer-runtime'; * let templateJs = precompile("Howdy {{name}}"); * let factory = templateFactory(new Function("return " + templateJs)()); * let template = factory.create(env); * * @method precompile * @param {string} string a Glimmer template string * @return {string} a template javascript string */ export function precompile(source, options) { if (options === void 0) { options = defaultOptions; } var _a, _b; var _precompileJSON = precompileJSON(source, options), block = _precompileJSON[0], usedLocals = _precompileJSON[1]; var moduleName = (_a = options.meta) === null || _a === void 0 ? void 0 : _a.moduleName; var idFn = options.id || defaultId; var blockJSON = JSON.stringify(block); var templateJSONObject = { id: idFn(JSON.stringify(options.meta) + blockJSON), block: blockJSON, moduleName: moduleName !== null && moduleName !== void 0 ? moduleName : '(unknown template module)', // lying to the type checker here because we're going to // replace it just below, after stringification scope: SCOPE_PLACEHOLDER, isStrictMode: (_b = options.strictMode) !== null && _b !== void 0 ? _b : false }; if (usedLocals.length === 0) { delete templateJSONObject.scope; } // JSON is javascript var stringified = JSON.stringify(templateJSONObject); if (usedLocals.length > 0) { var scopeFn = "()=>[" + usedLocals.join(',') + "]"; stringified = stringified.replace("\"" + SCOPE_PLACEHOLDER + "\"", scopeFn); } return stringified; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxTQUFBLFNBQUEsRUFBQSxNQUFBLFFBQUEsaUJBQUE7QUFDQSxTQUFBLFlBQUEsUUFBQSxlQUFBO0FBRUEsT0FBQSxLQUFBLE1BQUEsZ0NBQUE7QUFDQSxTQUFTLEtBQUssSUFBZCxLQUFBLFFBQUEsMkJBQUE7QUFjQSxPQUFPLElBQU0sU0FBUyxHQUFrQixZQUFLO0FBQzNDLE1BQUksR0FBRyxHQUNMLE9BQUEsTUFBQSxLQUFBLFFBQUEsSUFBOEIsT0FBTyxNQUFNLENBQWIsT0FBQSxLQUE5QixVQUFBLEdBQXFFLE1BQU0sQ0FBM0UsT0FBQSxHQURGLE9BQUE7O0FBR0EsTUFBQSxHQUFBLEVBQVM7QUFDUCxRQUFJO0FBQ0YsVUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFsQixRQUFrQixDQUFsQjs7QUFFQSxVQUFJLElBQUksR0FBa0IsU0FBdEIsSUFBc0IsQ0FBQSxHQUFELEVBQVE7QUFDL0IsWUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFOLFVBQUEsQ0FBWCxNQUFXLENBQVg7QUFDQSxRQUFBLElBQUksQ0FBSixNQUFBLENBQUEsR0FBQSxFQUYrQixNQUUvQixFQUYrQixDQUcvQjs7QUFDQSxlQUFPLElBQUksQ0FBSixNQUFBLENBQUEsUUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBLEVBQVAsQ0FBTyxDQUFQO0FBSkYsT0FBQTs7QUFPQSxNQUFBLElBQUksQ0FBSixNQUFJLENBQUo7QUFFQSxhQUFBLElBQUE7QUFaRixLQUFBLENBYUUsT0FBQSxDQUFBLEVBQVUsQ0FBRTtBQUNmOztBQUVELFNBQU8sU0FBQSxJQUFBLEdBQWE7QUFDbEIsV0FBQSxJQUFBO0FBREYsR0FBQTtBQXJCSyxDQUFnQyxFQUFoQztBQTBCUCxJQUFNLGNBQWMsR0FBc0I7QUFDeEMsRUFBQSxFQUFFLEVBQUU7QUFEb0MsQ0FBMUM7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FBY0EsT0FBTSxTQUFBLGNBQUEsQ0FBQSxNQUFBLEVBRUosT0FGSSxFQUV1QztBQUFBLE1BQTNDLE9BQTJDO0FBQTNDLElBQUEsT0FBMkMsR0FGdkMsY0FFdUM7QUFBQTs7OztBQUUzQyxNQUFJLE1BQU0sR0FBRyxJQUFBLE1BQUEsQ0FBQSxNQUFBLEVBQWlCLENBQUEsRUFBQSxHQUFFLE9BQU8sQ0FBVCxJQUFBLE1BQUEsSUFBQSxJQUFjLEVBQUEsS0FBQSxLQUFkLENBQUEsR0FBYyxLQUFkLENBQUEsR0FBYyxFQUFBLENBQTVDLFVBQWEsQ0FBYjs7QUFGMkMsbUJBR3ZCLFNBQVMsQ0FBQSxNQUFBLEVBQTdCLE9BQTZCLENBSGM7QUFBQSxNQUd2QyxHQUh1QztBQUFBLE1BR3ZDLE1BSHVDOztBQUkzQyxNQUFJLEtBQUssR0FBRyxLQUFLLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBWSxDQUFBLEVBQUEsR0FBRSxPQUFPLENBQVQsVUFBQSxNQUFBLElBQUEsSUFBb0IsRUFBQSxLQUFBLEtBQXBCLENBQUEsR0FBQSxFQUFBLEdBQWpCLEtBQUssQ0FBTCxDQUFBLEtBQUEsQ0FBdUQsVUFBQSxPQUFELEVBQVk7QUFDNUUsV0FBTyxLQUFLLENBQVosT0FBWSxDQUFaO0FBREYsR0FBWSxDQUFaOztBQUlBLE1BQUE7QUFBQTtBQUFBLElBQXNCO0FBQ3BCLE1BQUEsWUFBWSxDQUFaLEdBQUEsZ0JBQUEsS0FBQTtBQUNEOztBQUVELE1BQUksS0FBSyxDQUFULElBQUEsRUFBZ0I7QUFDZCxXQUFPLENBQUMsS0FBSyxDQUFOLEtBQUEsRUFBUCxNQUFPLENBQVA7QUFERixHQUFBLE1BRU87QUFDTCxVQUFNLEtBQUssQ0FBWCxNQUFBO0FBQ0Q7RUFHSDtBQUNBOztBQUNBLElBQU0saUJBQWlCLEdBQXZCLHNDQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQWNBLE9BQU0sU0FBQSxVQUFBLENBQUEsTUFBQSxFQUVKLE9BRkksRUFFdUM7QUFBQSxNQUEzQyxPQUEyQztBQUEzQyxJQUFBLE9BQTJDLEdBRnZDLGNBRXVDO0FBQUE7Ozs7QUFBQSx3QkFFakIsY0FBYyxDQUFBLE1BQUEsRUFBeEMsT0FBd0MsQ0FGRztBQUFBLE1BRXZDLEtBRnVDO0FBQUEsTUFFdkMsVUFGdUM7O0FBSTNDLE1BQUksVUFBVSxHQUFBLENBQUEsRUFBQSxHQUFHLE9BQU8sQ0FBVixJQUFBLE1BQUEsSUFBQSxJQUFlLEVBQUEsS0FBQSxLQUFmLENBQUEsR0FBZSxLQUFmLENBQUEsR0FBZSxFQUFBLENBQTdCLFVBQUE7QUFDQSxNQUFJLElBQUksR0FBRyxPQUFPLENBQVAsRUFBQSxJQUFYLFNBQUE7QUFDQSxNQUFJLFNBQVMsR0FBRyxJQUFJLENBQUosU0FBQSxDQUFoQixLQUFnQixDQUFoQjtBQUNBLE1BQUksa0JBQWtCLEdBQW9DO0FBQ3hELElBQUEsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUosU0FBQSxDQUFlLE9BQU8sQ0FBdEIsSUFBQSxJQUQrQyxTQUNoRCxDQURnRDtBQUV4RCxJQUFBLEtBQUssRUFGbUQsU0FBQTtBQUd4RCxJQUFBLFVBQVUsRUFBRSxVQUFVLEtBQVYsSUFBQSxJQUFBLFVBQVUsS0FBQSxLQUFWLENBQUEsR0FBQSxVQUFBLEdBSDRDLDJCQUFBO0FBSXhEO0FBQ0E7QUFDQSxJQUFBLEtBQUssRUFObUQsaUJBQUE7QUFPeEQsSUFBQSxZQUFZLEVBQUEsQ0FBQSxFQUFBLEdBQUUsT0FBTyxDQUFULFVBQUEsTUFBQSxJQUFBLElBQW9CLEVBQUEsS0FBQSxLQUFwQixDQUFBLEdBQUEsRUFBQSxHQUF3QjtBQVBvQixHQUExRDs7QUFVQSxNQUFJLFVBQVUsQ0FBVixNQUFBLEtBQUosQ0FBQSxFQUE2QjtBQUMzQixXQUFPLGtCQUFrQixDQUF6QixLQUFBO0FBbEJ5QyxHQUFBLENBcUIzQzs7O0FBQ0EsTUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFKLFNBQUEsQ0FBbEIsa0JBQWtCLENBQWxCOztBQUVBLE1BQUksVUFBVSxDQUFWLE1BQUEsR0FBSixDQUFBLEVBQTJCO0FBQ3pCLFFBQUksT0FBTyxhQUFXLFVBQVUsQ0FBVixJQUFBLENBQXRCLEdBQXNCLENBQVgsTUFBWDtBQUVBLElBQUEsV0FBVyxHQUFHLFdBQVcsQ0FBWCxPQUFBLFFBQUEsaUJBQUEsU0FBZCxPQUFjLENBQWQ7QUFDRDs7QUFFRCxTQUFBLFdBQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLFxuICBTZXJpYWxpemVkVGVtcGxhdGVXaXRoTGF6eUJsb2NrLFxuICBUZW1wbGF0ZUphdmFzY3JpcHQsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfU0hPVUxEX0xPRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IG5vcm1hbGl6ZSwgUHJlY29tcGlsZU9wdGlvbnMsIFNvdXJjZSwgVGVtcGxhdGVJZEZuIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IExPQ0FMX0xPR0dFUiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgcGFzczAgZnJvbSAnLi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2luZGV4JztcbmltcG9ydCB7IHZpc2l0IGFzIHBhc3MyIH0gZnJvbSAnLi9wYXNzZXMvMi1lbmNvZGluZy9pbmRleCc7XG5cbmRlY2xhcmUgZnVuY3Rpb24gcmVxdWlyZShpZDogJ2NyeXB0bycpOiBDcnlwdG87XG5kZWNsYXJlIGZ1bmN0aW9uIHJlcXVpcmUoaWQ6IHN0cmluZyk6IHVua25vd247XG5cbmludGVyZmFjZSBDcnlwdG8ge1xuICBjcmVhdGVIYXNoKFxuICAgIGFsZzogJ3NoYTEnXG4gICk6IHtcbiAgICB1cGRhdGUoc3JjOiBzdHJpbmcsIGVuY29kaW5nOiAndXRmOCcpOiB2b2lkO1xuICAgIGRpZ2VzdChlbmNvZGluZzogJ2Jhc2U2NCcpOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SWQ6IFRlbXBsYXRlSWRGbiA9ICgoKSA9PiB7XG4gIGxldCByZXE6IHR5cGVvZiByZXF1aXJlIHwgdW5kZWZpbmVkID1cbiAgICB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLnJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBtb2R1bGUucmVxdWlyZSA6IHJlcXVpcmU7XG5cbiAgaWYgKHJlcSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcnlwdG8gPSByZXEoJ2NyeXB0bycpO1xuXG4gICAgICBsZXQgaWRGbjogVGVtcGxhdGVJZEZuID0gKHNyYykgPT4ge1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJyk7XG4gICAgICAgIGhhc2gudXBkYXRlKHNyYywgJ3V0ZjgnKTtcbiAgICAgICAgLy8gdHJpbSB0byA2IGJ5dGVzIG9mIGRhdGEgKDJeNDggLSAxKVxuICAgICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2Jhc2U2NCcpLnN1YnN0cmluZygwLCA4KTtcbiAgICAgIH07XG5cbiAgICAgIGlkRm4oJ3Rlc3QnKTtcblxuICAgICAgcmV0dXJuIGlkRm47XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBpZEZuKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xufSkoKTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFByZWNvbXBpbGVPcHRpb25zID0ge1xuICBpZDogZGVmYXVsdElkLFxufTtcblxuLypcbiAqIENvbXBpbGUgYSBzdHJpbmcgaW50byBhIHRlbXBsYXRlIGphdmFzY3JpcHQgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiAgICAgaW1wb3J0IHsgcHJlY29tcGlsZSB9IGZyb20gJ0BnbGltbWVyL2NvbXBpbGVyJztcbiAqICAgICBpbXBvcnQgeyB0ZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICdnbGltbWVyLXJ1bnRpbWUnO1xuICogICAgIGxldCB0ZW1wbGF0ZUpzID0gcHJlY29tcGlsZShcIkhvd2R5IHt7bmFtZX19XCIpO1xuICogICAgIGxldCBmYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5KG5ldyBGdW5jdGlvbihcInJldHVybiBcIiArIHRlbXBsYXRlSnMpKCkpO1xuICogICAgIGxldCB0ZW1wbGF0ZSA9IGZhY3RvcnkuY3JlYXRlKGVudik7XG4gKlxuICogQG1ldGhvZCBwcmVjb21waWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIGEgR2xpbW1lciB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB0ZW1wbGF0ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29tcGlsZUpTT04oXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zOiBQcmVjb21waWxlT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBbYmxvY2s6IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLCB1c2VkTG9jYWxzOiBzdHJpbmdbXV0ge1xuICBsZXQgc291cmNlID0gbmV3IFNvdXJjZShzdHJpbmcsIG9wdGlvbnMubWV0YT8ubW9kdWxlTmFtZSk7XG4gIGxldCBbYXN0LCBsb2NhbHNdID0gbm9ybWFsaXplKHNvdXJjZSwgb3B0aW9ucyk7XG4gIGxldCBibG9jayA9IHBhc3MwKHNvdXJjZSwgYXN0LCBvcHRpb25zLnN0cmljdE1vZGUgPz8gZmFsc2UpLm1hcE9rKChwYXNzMkluKSA9PiB7XG4gICAgcmV0dXJuIHBhc3MyKHBhc3MySW4pO1xuICB9KTtcblxuICBpZiAoTE9DQUxfU0hPVUxEX0xPRykge1xuICAgIExPQ0FMX0xPR0dFUi5sb2coYFRlbXBsYXRlIC0+YCwgYmxvY2spO1xuICB9XG5cbiAgaWYgKGJsb2NrLmlzT2spIHtcbiAgICByZXR1cm4gW2Jsb2NrLnZhbHVlLCBsb2NhbHNdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGJsb2NrLnJlYXNvbjtcbiAgfVxufVxuXG4vLyBVVUlEIHVzZWQgYXMgYSB1bmlxdWUgcGxhY2Vob2xkZXIgZm9yIHBsYWNpbmcgYSBzbmlwcGV0IG9mIEpTIGNvZGUgaW50b1xuLy8gdGhlIG90aGVyd2lzZSBKU09OIHN0cmluZ2lmaWVkIHZhbHVlIGJlbG93LlxuY29uc3QgU0NPUEVfUExBQ0VIT0xERVIgPSAnNzk2ZDI0ZTYtMjQ1MC00ZmIwLThjZGYtYjY1NjM4YjVlZjcwJztcblxuLypcbiAqIENvbXBpbGUgYSBzdHJpbmcgaW50byBhIHRlbXBsYXRlIGphdmFzY3JpcHQgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiAgICAgaW1wb3J0IHsgcHJlY29tcGlsZSB9IGZyb20gJ0BnbGltbWVyL2NvbXBpbGVyJztcbiAqICAgICBpbXBvcnQgeyB0ZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICdnbGltbWVyLXJ1bnRpbWUnO1xuICogICAgIGxldCB0ZW1wbGF0ZUpzID0gcHJlY29tcGlsZShcIkhvd2R5IHt7bmFtZX19XCIpO1xuICogICAgIGxldCBmYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5KG5ldyBGdW5jdGlvbihcInJldHVybiBcIiArIHRlbXBsYXRlSnMpKCkpO1xuICogICAgIGxldCB0ZW1wbGF0ZSA9IGZhY3RvcnkuY3JlYXRlKGVudik7XG4gKlxuICogQG1ldGhvZCBwcmVjb21waWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIGEgR2xpbW1lciB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB0ZW1wbGF0ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29tcGlsZShcbiAgc291cmNlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByZWNvbXBpbGVPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFRlbXBsYXRlSmF2YXNjcmlwdCB7XG4gIGxldCBbYmxvY2ssIHVzZWRMb2NhbHNdID0gcHJlY29tcGlsZUpTT04oc291cmNlLCBvcHRpb25zKTtcblxuICBsZXQgbW9kdWxlTmFtZSA9IG9wdGlvbnMubWV0YT8ubW9kdWxlTmFtZTtcbiAgbGV0IGlkRm4gPSBvcHRpb25zLmlkIHx8IGRlZmF1bHRJZDtcbiAgbGV0IGJsb2NrSlNPTiA9IEpTT04uc3RyaW5naWZ5KGJsb2NrKTtcbiAgbGV0IHRlbXBsYXRlSlNPTk9iamVjdDogU2VyaWFsaXplZFRlbXBsYXRlV2l0aExhenlCbG9jayA9IHtcbiAgICBpZDogaWRGbihKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGEpICsgYmxvY2tKU09OKSxcbiAgICBibG9jazogYmxvY2tKU09OLFxuICAgIG1vZHVsZU5hbWU6IG1vZHVsZU5hbWUgPz8gJyh1bmtub3duIHRlbXBsYXRlIG1vZHVsZSknLFxuICAgIC8vIGx5aW5nIHRvIHRoZSB0eXBlIGNoZWNrZXIgaGVyZSBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvXG4gICAgLy8gcmVwbGFjZSBpdCBqdXN0IGJlbG93LCBhZnRlciBzdHJpbmdpZmljYXRpb25cbiAgICBzY29wZTogKFNDT1BFX1BMQUNFSE9MREVSIGFzIHVua25vd24pIGFzIG51bGwsXG4gICAgaXNTdHJpY3RNb2RlOiBvcHRpb25zLnN0cmljdE1vZGUgPz8gZmFsc2UsXG4gIH07XG5cbiAgaWYgKHVzZWRMb2NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHRlbXBsYXRlSlNPTk9iamVjdC5zY29wZTtcbiAgfVxuXG4gIC8vIEpTT04gaXMgamF2YXNjcmlwdFxuICBsZXQgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZUpTT05PYmplY3QpO1xuXG4gIGlmICh1c2VkTG9jYWxzLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgc2NvcGVGbiA9IGAoKT0+WyR7dXNlZExvY2Fscy5qb2luKCcsJyl9XWA7XG5cbiAgICBzdHJpbmdpZmllZCA9IHN0cmluZ2lmaWVkLnJlcGxhY2UoYFwiJHtTQ09QRV9QTEFDRUhPTERFUn1cImAsIHNjb3BlRm4pO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmaWVkO1xufVxuXG5leHBvcnQgeyBQcmVjb21waWxlT3B0aW9ucyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==