UNPKG

@sencha/ext-webpack-plugin

Version:
160 lines (159 loc) 22.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._extractFromSource = _extractFromSource; exports._getAllComponents = _getAllComponents; exports._getDefaultVars = _getDefaultVars; exports._toDev = _toDev; exports._toProd = _toProd; exports._writeFilesToProdFolder = _writeFilesToProdFolder; function _getDefaultVars() { return { touchFile: '/src/themer.js', watchStarted: false, buildstep: '1 of 1', firstTime: true, firstCompile: true, browserCount: 0, manifest: null, extPath: 'ext', pluginErrors: [], deps: [], usedExtWebComponents: [], rebuild: true }; } function _extractFromSource(module, options, compilation, ExtWebComponents) { const logv = require('./pluginUtil').logv; const verbose = options.verbose; logv(verbose, 'FUNCTION _extractFromSource'); var js = module._source._value; logv(verbose, module.resource); var statements = []; var generate = require("@babel/generator").default; var parse = require("babylon").parse; var traverse = require("ast-traverse"); var ast = parse(js, { plugins: ['typescript', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportDefaultFrom', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], sourceType: 'module' }); traverse(ast, { pre: function (node) { if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { statements.push(generate(node).code); } if (node.type === 'CallExpression') { const code = generate(node).code; statements = statements.concat(getXtypeFromHTMLJS(code, statements, ExtWebComponents)); } if (node.type === 'StringLiteral') { let code = node.value; for (var i = 0; i < code.length; ++i) { if (code.charAt(i) == '<') { if (code.substr(i, 4) == '<!--') { i += 4; i += code.substr(i).indexOf('-->') + 3; } else if (code.charAt(i + 1) !== '/') { var start = code.substring(i); var end = getEnd(start, [' ', '\n', '>']); var xtype = start.substring(1, end); if (ExtWebComponents.includes(xtype)) { xtype = xtype.substring(4, end); var theValue = node.value.toLowerCase(); if (theValue.indexOf('doctype html') == -1) { var config = `Ext.create(${JSON.stringify({ xtype: xtype })})`; if (statements.indexOf(config) < 0) { statements.push(config); } } } i += end; } } } statements = statements.concat(getXtypeFromHTMLJS(code, statements, ExtWebComponents)); } } }); return statements; } function getXtypeFromHTMLJS(code, statements, ExtWebComponents) { const logv = require('./pluginUtil').logv; const result = []; const xtypeRepetitons = (code.match(/xtype/g) || []).length; if (xtypeRepetitons > 0) { for (var j = 0; j < xtypeRepetitons; j++) { var start = code.substring(code.indexOf('xtype') + 5); var ifAsProps = start.indexOf(':'); var ifAsAttribute = start.indexOf('='); start = start.substring(Math.min(ifAsProps, ifAsAttribute) + 1); start = start.trim(); var end = getEnd(start, ['\n', '>', '}', '\r']); var xtype = start.substring(1, end).trim().replace(/['",]/g, ''); var config = `Ext.create(${JSON.stringify({ xtype: xtype })})`; if (ExtWebComponents.includes('ext-' + xtype) && statements.indexOf(config) === -1) { result.push(config); } code = start.substr(end).trim(); } } return result; } function _toProd(vars, options) { const logv = require('./pluginUtil').logv; logv(options.verbose, 'FUNCTION _toProd (empty'); try {} catch (e) { console.log(e); return []; } } function _toDev(vars, options) { try {} catch (e) { console.log(e); return []; } } function _getAllComponents(vars, options) { const log = require('./pluginUtil').log; const logv = require('./pluginUtil').logv; logv(options.verbose, 'FUNCTION _getAllComponents'); const path = require('path'); const fsx = require('fs-extra'); var ExtWebComponents = []; const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-web-components-modern/dist'); var files = fsx.readdirSync(packageLibPath); files.forEach(fileName => { if (fileName && fileName.substr(0, 4) == 'ext-') { var end = fileName.substr(4).indexOf('.component'); if (end >= 0) { ExtWebComponents.push(fileName.substring(0, end + 4)); } } }); logv(options.verbose, `Identifying all ext-${options.framework}-modern modules`); //log(vars.app, `Identifying all ext-${options.framework} modules`) return ExtWebComponents; } function _writeFilesToProdFolder(vars, options) { const logv = require('./pluginUtil').logv; logv(options.verbose, 'FUNCTION _writeFilesToProdFolder (empty)'); try {} catch (e) { console.log(e); } } function getEnd(start, setOfSymbolsToCheck) { var endingsArr = []; for (var i = 0; i < setOfSymbolsToCheck.length; i++) { var symbolIndex = start.indexOf(setOfSymbolsToCheck[i]); if (symbolIndex !== -1) { endingsArr.push(symbolIndex); } } return Math.min(...endingsArr); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9leHRyYWN0RnJvbVNvdXJjZSIsIl9nZXRBbGxDb21wb25lbnRzIiwiX2dldERlZmF1bHRWYXJzIiwiX3RvRGV2IiwiX3RvUHJvZCIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwidG91Y2hGaWxlIiwid2F0Y2hTdGFydGVkIiwiYnVpbGRzdGVwIiwiZmlyc3RUaW1lIiwiZmlyc3RDb21waWxlIiwiYnJvd3NlckNvdW50IiwibWFuaWZlc3QiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwiZGVwcyIsInVzZWRFeHRXZWJDb21wb25lbnRzIiwicmVidWlsZCIsIm1vZHVsZSIsIm9wdGlvbnMiLCJjb21waWxhdGlvbiIsIkV4dFdlYkNvbXBvbmVudHMiLCJsb2d2IiwicmVxdWlyZSIsInZlcmJvc2UiLCJqcyIsIl9zb3VyY2UiLCJfdmFsdWUiLCJyZXNvdXJjZSIsInN0YXRlbWVudHMiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwiYXN0IiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJwcmUiLCJub2RlIiwidHlwZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJwdXNoIiwiY29kZSIsImNvbmNhdCIsImdldFh0eXBlRnJvbUhUTUxKUyIsImkiLCJsZW5ndGgiLCJjaGFyQXQiLCJzdWJzdHIiLCJpbmRleE9mIiwic3RhcnQiLCJzdWJzdHJpbmciLCJlbmQiLCJnZXRFbmQiLCJ4dHlwZSIsImluY2x1ZGVzIiwidGhlVmFsdWUiLCJ0b0xvd2VyQ2FzZSIsImNvbmZpZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXN1bHQiLCJ4dHlwZVJlcGV0aXRvbnMiLCJtYXRjaCIsImoiLCJpZkFzUHJvcHMiLCJpZkFzQXR0cmlidXRlIiwiTWF0aCIsIm1pbiIsInRyaW0iLCJyZXBsYWNlIiwidmFycyIsImUiLCJjb25zb2xlIiwibG9nIiwicGF0aCIsImZzeCIsInBhY2thZ2VMaWJQYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJjd2QiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwiZm9yRWFjaCIsImZpbGVOYW1lIiwiZnJhbWV3b3JrIiwic2V0T2ZTeW1ib2xzVG9DaGVjayIsImVuZGluZ3NBcnIiLCJzeW1ib2xJbmRleCJdLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItY29tcG9uZW50c1V0aWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5cInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy9zcmMvdGhlbWVyLmpzJyxcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBidWlsZHN0ZXA6ICcxIG9mIDEnLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dCcsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0V2ViQ29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgRXh0V2ViQ29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIGxvZ3YodmVyYm9zZSwnRlVOQ1RJT04gX2V4dHJhY3RGcm9tU291cmNlJylcbiAgdmFyIGpzID0gbW9kdWxlLl9zb3VyY2UuX3ZhbHVlXG4gIGxvZ3YodmVyYm9zZSxtb2R1bGUucmVzb3VyY2UpXG4gIHZhciBzdGF0ZW1lbnRzID0gW11cblxuICB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiQGJhYmVsL2dlbmVyYXRvclwiKS5kZWZhdWx0XG4gIHZhciBwYXJzZSA9IHJlcXVpcmUoXCJiYWJ5bG9uXCIpLnBhcnNlXG4gIHZhciB0cmF2ZXJzZSA9IHJlcXVpcmUoXCJhc3QtdHJhdmVyc2VcIilcblxuICB2YXIgYXN0ID0gcGFyc2UoanMsIHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAndHlwZXNjcmlwdCcsXG4gICAgICAnZmxvdycsXG4gICAgICAnZG9FeHByZXNzaW9ucycsXG4gICAgICAnb2JqZWN0UmVzdFNwcmVhZCcsXG4gICAgICAnY2xhc3NQcm9wZXJ0aWVzJyxcbiAgICAgICdleHBvcnREZWZhdWx0RnJvbScsXG4gICAgICAnZXhwb3J0RXh0ZW5zaW9ucycsXG4gICAgICAnYXN5bmNHZW5lcmF0b3JzJyxcbiAgICAgICdmdW5jdGlvbkJpbmQnLFxuICAgICAgJ2Z1bmN0aW9uU2VudCcsXG4gICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICBdLFxuICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnXG4gIH0pXG5cbiAgdHJhdmVyc2UoYXN0LCB7XG4gICAgcHJlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBub2RlLmNhbGxlZSAmJiBub2RlLmNhbGxlZS5vYmplY3QgJiYgbm9kZS5jYWxsZWUub2JqZWN0Lm5hbWUgPT09ICdFeHQnKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaChnZW5lcmF0ZShub2RlKS5jb2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJykge1xuICAgICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGUobm9kZSkuY29kZTtcbiAgICAgICAgc3RhdGVtZW50cyA9IHN0YXRlbWVudHMuY29uY2F0KGdldFh0eXBlRnJvbUhUTUxKUyhjb2RlLCBzdGF0ZW1lbnRzLCBFeHRXZWJDb21wb25lbnRzKSk7XG4gICAgICB9XG4gICAgICBpZihub2RlLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykge1xuICAgICAgICBsZXQgY29kZSA9IG5vZGUudmFsdWVcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGNvZGUuY2hhckF0KGkpID09ICc8Jykge1xuICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKGksIDQpID09ICc8IS0tJykge1xuICAgICAgICAgICAgICBpICs9IDRcbiAgICAgICAgICAgICAgaSArPSBjb2RlLnN1YnN0cihpKS5pbmRleE9mKCctLT4nKSArIDNcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jaGFyQXQoaSsxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgIHZhciBzdGFydCA9IGNvZGUuc3Vic3RyaW5nKGkpXG4gICAgICAgICAgICAgIHZhciBlbmQgPSBnZXRFbmQoc3RhcnQsIFsnICcsICdcXG4nLCAnPiddKTtcblxuICAgICAgICAgICAgICAgIHZhciB4dHlwZSA9IHN0YXJ0LnN1YnN0cmluZygxLCBlbmQpXG4gICAgICAgICAgICAgICAgaWYoRXh0V2ViQ29tcG9uZW50cy5pbmNsdWRlcyh4dHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIHh0eXBlID0geHR5cGUuc3Vic3RyaW5nKDQsIGVuZCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdGhlVmFsdWUgPSBub2RlLnZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgIGlmICh0aGVWYWx1ZS5pbmRleE9mKCdkb2N0eXBlIGh0bWwnKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gYEV4dC5jcmVhdGUoJHtKU09OLnN0cmluZ2lmeSh7eHR5cGU6IHh0eXBlfSl9KWA7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudHMuaW5kZXhPZihjb25maWcpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gZW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50cy5jb25jYXQoZ2V0WHR5cGVGcm9tSFRNTEpTKGNvZGUsIHN0YXRlbWVudHMsIEV4dFdlYkNvbXBvbmVudHMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICB9KTtcblxuICByZXR1cm4gc3RhdGVtZW50c1xufVxuXG5mdW5jdGlvbiBnZXRYdHlwZUZyb21IVE1MSlMoY29kZSwgc3RhdGVtZW50cywgRXh0V2ViQ29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgeHR5cGVSZXBldGl0b25zID0gKGNvZGUubWF0Y2goL3h0eXBlL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgaWYgKHh0eXBlUmVwZXRpdG9ucyA+IDApIHtcbiAgICBmb3IgKHZhciBqPTA7IGo8eHR5cGVSZXBldGl0b25zOyBqKyspIHtcbiAgICAgIHZhciBzdGFydCA9IGNvZGUuc3Vic3RyaW5nKGNvZGUuaW5kZXhPZigneHR5cGUnKSArIDUpO1xuICAgICAgdmFyIGlmQXNQcm9wcyA9IHN0YXJ0LmluZGV4T2YoJzonKTtcbiAgICAgIHZhciBpZkFzQXR0cmlidXRlID0gc3RhcnQuaW5kZXhPZignPScpO1xuICAgICAgc3RhcnQgPSBzdGFydC5zdWJzdHJpbmcoTWF0aC5taW4oaWZBc1Byb3BzLCBpZkFzQXR0cmlidXRlKSArIDEpO1xuICAgICAgc3RhcnQgPSBzdGFydC50cmltKCk7XG4gICAgICB2YXIgZW5kID0gZ2V0RW5kKHN0YXJ0LCBbJ1xcbicsICc+JywnfScsICdcXHInXSlcbiAgICAgIHZhciB4dHlwZSA9IHN0YXJ0LnN1YnN0cmluZygxLCBlbmQpLnRyaW0oKS5yZXBsYWNlKC9bJ1wiLF0vZywgJycpO1xuXG4gICAgICB2YXIgY29uZmlnID0gYEV4dC5jcmVhdGUoJHtKU09OLnN0cmluZ2lmeSh7eHR5cGU6IHh0eXBlfSl9KWA7XG4gICAgICBpZihFeHRXZWJDb21wb25lbnRzLmluY2x1ZGVzKCdleHQtJyArIHh0eXBlKSAmJiBzdGF0ZW1lbnRzLmluZGV4T2YoY29uZmlnKSA9PT0gLTEpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGNvZGUgPSBzdGFydC5zdWJzdHIoZW5kKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF90b1Byb2QodmFycywgb3B0aW9ucykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX3RvUHJvZCAoZW1wdHknKVxuICB0cnkge1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBbGxDb21wb25lbnRzKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfZ2V0QWxsQ29tcG9uZW50cycpXG5cbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICBjb25zdCBmc3ggPSByZXF1aXJlKCdmcy1leHRyYScpXG5cbiAgdmFyIEV4dFdlYkNvbXBvbmVudHMgPSBbXVxuICBjb25zdCBwYWNrYWdlTGliUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LXdlYi1jb21wb25lbnRzLW1vZGVybi9kaXN0JylcbiAgdmFyIGZpbGVzID0gZnN4LnJlYWRkaXJTeW5jKHBhY2thZ2VMaWJQYXRoKVxuICBmaWxlcy5mb3JFYWNoKChmaWxlTmFtZSkgPT4ge1xuICAgIGlmIChmaWxlTmFtZSAmJiBmaWxlTmFtZS5zdWJzdHIoMCwgNCkgPT0gJ2V4dC0nKSB7XG4gICAgICB2YXIgZW5kID0gZmlsZU5hbWUuc3Vic3RyKDQpLmluZGV4T2YoJy5jb21wb25lbnQnKVxuICAgICAgaWYgKGVuZCA+PSAwKSB7XG4gICAgICAgIEV4dFdlYkNvbXBvbmVudHMucHVzaChmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZW5kICsgNCkpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwgYElkZW50aWZ5aW5nIGFsbCBleHQtJHtvcHRpb25zLmZyYW1ld29ya30tbW9kZXJuIG1vZHVsZXNgKVxuICAvL2xvZyh2YXJzLmFwcCwgYElkZW50aWZ5aW5nIGFsbCBleHQtJHtvcHRpb25zLmZyYW1ld29ya30gbW9kdWxlc2ApXG4gIHJldHVybiBFeHRXZWJDb21wb25lbnRzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlciAoZW1wdHkpJylcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RW5kKHN0YXJ0LCBzZXRPZlN5bWJvbHNUb0NoZWNrKSB7XG4gIHZhciBlbmRpbmdzQXJyID0gW107XG5cbiAgZm9yICh2YXIgaT0wO2k8c2V0T2ZTeW1ib2xzVG9DaGVjay5sZW5ndGg7aSsrKSB7XG4gICAgIHZhciBzeW1ib2xJbmRleCA9IHN0YXJ0LmluZGV4T2Yoc2V0T2ZTeW1ib2xzVG9DaGVja1tpXSk7XG5cbiAgICAgaWYgKHN5bWJvbEluZGV4ICE9PSAtMSkge1xuICAgICAgIGVuZGluZ3NBcnIucHVzaChzeW1ib2xJbmRleCk7XG4gICAgIH1cbiAgfVxuICByZXR1cm4gTWF0aC5taW4oLi4uZW5kaW5nc0Fycilcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWTs7QUFBQUEsTUFBQSxDQUFBQyxjQUFBLENBQUFDLE9BQUE7RUFBQUMsS0FBQTtBQUFBO0FBQUFELE9BQUEsQ0FBQUUsa0JBQUEsR0FBQUEsa0JBQUE7QUFBQUYsT0FBQSxDQUFBRyxpQkFBQSxHQUFBQSxpQkFBQTtBQUFBSCxPQUFBLENBQUFJLGVBQUEsR0FBQUEsZUFBQTtBQUFBSixPQUFBLENBQUFLLE1BQUEsR0FBQUEsTUFBQTtBQUFBTCxPQUFBLENBQUFNLE9BQUEsR0FBQUEsT0FBQTtBQUFBTixPQUFBLENBQUFPLHVCQUFBLEdBQUFBLHVCQUFBO0FBRUwsU0FBU0gsZUFBZUEsQ0FBQSxFQUFHO0VBQ2hDLE9BQU87SUFDTEksU0FBUyxFQUFFLGdCQUFnQjtJQUMzQkMsWUFBWSxFQUFHLEtBQUs7SUFDcEJDLFNBQVMsRUFBRSxRQUFRO0lBQ25CQyxTQUFTLEVBQUcsSUFBSTtJQUNoQkMsWUFBWSxFQUFFLElBQUk7SUFDbEJDLFlBQVksRUFBRyxDQUFDO0lBQ2hCQyxRQUFRLEVBQUUsSUFBSTtJQUNkQyxPQUFPLEVBQUUsS0FBSztJQUNkQyxZQUFZLEVBQUUsRUFBRTtJQUNoQkMsSUFBSSxFQUFFLEVBQUU7SUFDUkMsb0JBQW9CLEVBQUUsRUFBRTtJQUN4QkMsT0FBTyxFQUFFO0VBQ1gsQ0FBQztBQUNIO0FBRU8sU0FBU2pCLGtCQUFr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