UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

129 lines (116 loc) 14.5 kB
import compileReplacement from './compileReplacement/index.mjs' import createReplacementConverter, { bulkConvert, } from './convertReplacement/index.mjs' import pipeline from './util/pipeline.mjs' import { last } from 'lodash-es' export default function replace(match, replace, { backend }) { var _match$path$parentPat const path = ((_match$path$parentPat = match.path.parentPath) === null || _match$path$parentPat === void 0 ? void 0 : _match$path$parentPat.node.type) === 'ExpressionStatement' ? match.path.parentPath : match.path const replacements = [ ...bulkConvert( (replace instanceof Object && typeof replace.generate === 'function' ? replace : compileReplacement( Array.isArray(replace) ? replace.map((n) => new backend.t.NodePath(n)) : new backend.t.NodePath(replace), { backend, } ) ).generate(match), createReplacementConverter(path) ), ] doReplace(match, replacements) } export function replaceAll(matches, replace, { backend }) { for (const match of matches) { var _match$path$parentPat2 const path = ((_match$path$parentPat2 = match.path.parentPath) === null || _match$path$parentPat2 === void 0 ? void 0 : _match$path$parentPat2.node.type) === 'ExpressionStatement' ? match.path.parentPath : match.path const replacements = [ ...bulkConvert( (replace instanceof Object && typeof replace.generate === 'function' ? replace : compileReplacement( pipeline( typeof replace === 'function' ? replace(match) : replace, (replacement) => Array.isArray(replacement) ? replacement.map((n) => new backend.t.NodePath(n)) : new backend.t.NodePath(replacement) ), { backend, } ) ).generate(match), createReplacementConverter(path) ), ] doReplace(match, replacements) } } function doReplace(match, replacements) { var _replacedPaths$ const replacedPaths = match.paths.map((p) => { var _p$parentPath return ((_p$parentPath = p.parentPath) === null || _p$parentPath === void 0 ? void 0 : _p$parentPath.node.type) === 'ExpressionStatement' ? p.parentPath : p }) transferComments(replacedPaths[0], replacements[0], { leading: true, }) transferComments(last(replacedPaths), last(replacements), { trailing: true, }) ;(_replacedPaths$ = replacedPaths[0]) === null || _replacedPaths$ === void 0 ? void 0 : _replacedPaths$.replace(...replacements) for (let i = 1; i < replacedPaths.length; i++) { replacedPaths[i].prune() } } function transferComments(from, to, options) { var _node$comments, _node$comments2 if (!from || !to) return const node = from.node const leading = options.leading ? ((_node$comments = node.comments) === null || _node$comments === void 0 ? void 0 : _node$comments.filter((c) => c.leading)) || node.leadingComments : undefined if (leading !== null && leading !== void 0 && leading.length) { const dest = node.comments ? to.comments || (to.comments = []) : to.leadingComments || (to.leadingComments = []) for (const c of leading) dest.push(c) } const trailing = options.trailing ? ((_node$comments2 = node.comments) === null || _node$comments2 === void 0 ? void 0 : _node$comments2.filter((c) => c.trailing)) || node.trailingComments : undefined if (trailing !== null && trailing !== void 0 && trailing.length) { const dest = node.comments ? to.comments || (to.comments = []) : to.trailingComments || (to.trailingComments = []) for (const c of trailing) dest.push(c) } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlUmVwbGFjZW1lbnQiLCJjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlciIsImJ1bGtDb252ZXJ0IiwicGlwZWxpbmUiLCJsYXN0IiwicmVwbGFjZSIsIm1hdGNoIiwiYmFja2VuZCIsInBhdGgiLCJwYXJlbnRQYXRoIiwibm9kZSIsInR5cGUiLCJyZXBsYWNlbWVudHMiLCJPYmplY3QiLCJnZW5lcmF0ZSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIm4iLCJ0IiwiTm9kZVBhdGgiLCJkb1JlcGxhY2UiLCJyZXBsYWNlQWxsIiwibWF0Y2hlcyIsInJlcGxhY2VtZW50IiwicmVwbGFjZWRQYXRocyIsInBhdGhzIiwicCIsInRyYW5zZmVyQ29tbWVudHMiLCJsZWFkaW5nIiwidHJhaWxpbmciLCJpIiwibGVuZ3RoIiwicHJ1bmUiLCJmcm9tIiwidG8iLCJvcHRpb25zIiwiY29tbWVudHMiLCJmaWx0ZXIiLCJjIiwibGVhZGluZ0NvbW1lbnRzIiwidW5kZWZpbmVkIiwiZGVzdCIsInB1c2giLCJ0cmFpbGluZ0NvbW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcGxhY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZSwgTm9kZVBhdGggfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgTWF0Y2ggfSBmcm9tICcuL2ZpbmQnXG5pbXBvcnQgY29tcGlsZVJlcGxhY2VtZW50LCB7IENvbXBpbGVkUmVwbGFjZW1lbnQgfSBmcm9tICcuL2NvbXBpbGVSZXBsYWNlbWVudCdcbmltcG9ydCBjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlciwgeyBidWxrQ29udmVydCB9IGZyb20gJy4vY29udmVydFJlcGxhY2VtZW50J1xuaW1wb3J0IHsgQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZC9CYWNrZW5kJ1xuaW1wb3J0IHBpcGVsaW5lIGZyb20gJy4vdXRpbC9waXBlbGluZSdcbmltcG9ydCB7IGxhc3QgfSBmcm9tICdsb2Rhc2gnXG5cbmV4cG9ydCB0eXBlIFJlcGxhY2VPcHRpb25zID0ge1xuICBiYWNrZW5kOiBCYWNrZW5kXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcGxhY2UoXG4gIG1hdGNoOiBNYXRjaCxcbiAgcmVwbGFjZTogQ29tcGlsZWRSZXBsYWNlbWVudCB8IE5vZGUgfCByZWFkb25seSBOb2RlW10sXG4gIHsgYmFja2VuZCB9OiBSZXBsYWNlT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHBhdGggPVxuICAgIG1hdGNoLnBhdGgucGFyZW50UGF0aD8ubm9kZS50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCdcbiAgICAgID8gbWF0Y2gucGF0aC5wYXJlbnRQYXRoXG4gICAgICA6IG1hdGNoLnBhdGhcbiAgY29uc3QgcmVwbGFjZW1lbnRzID0gW1xuICAgIC4uLmJ1bGtDb252ZXJ0KFxuICAgICAgKHJlcGxhY2UgaW5zdGFuY2VvZiBPYmplY3QgJiZcbiAgICAgIHR5cGVvZiAocmVwbGFjZSBhcyBhbnkpLmdlbmVyYXRlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHJlcGxhY2UgYXMgQ29tcGlsZWRSZXBsYWNlbWVudClcbiAgICAgICAgOiBjb21waWxlUmVwbGFjZW1lbnQoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHJlcGxhY2UpXG4gICAgICAgICAgICAgID8gcmVwbGFjZS5tYXAoKG4pID0+IG5ldyBiYWNrZW5kLnQuTm9kZVBhdGgobikpXG4gICAgICAgICAgICAgIDogbmV3IGJhY2tlbmQudC5Ob2RlUGF0aChyZXBsYWNlKSxcbiAgICAgICAgICAgIHsgYmFja2VuZCB9XG4gICAgICAgICAgKVxuICAgICAgKS5nZW5lcmF0ZShtYXRjaCksXG4gICAgICBjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlcihwYXRoKVxuICAgICksXG4gIF1cblxuICBkb1JlcGxhY2UobWF0Y2gsIHJlcGxhY2VtZW50cylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwoXG4gIG1hdGNoZXM6IE1hdGNoW10sXG4gIHJlcGxhY2U6XG4gICAgfCBDb21waWxlZFJlcGxhY2VtZW50XG4gICAgfCBOb2RlXG4gICAgfCByZWFkb25seSBOb2RlW11cbiAgICB8ICgobWF0Y2g6IE1hdGNoKSA9PiBDb21waWxlZFJlcGxhY2VtZW50IHwgTm9kZSB8IHJlYWRvbmx5IE5vZGVbXSksXG4gIHsgYmFja2VuZCB9OiBSZXBsYWNlT3B0aW9uc1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgIGNvbnN0IHBhdGggPVxuICAgICAgbWF0Y2gucGF0aC5wYXJlbnRQYXRoPy5ub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50J1xuICAgICAgICA/IG1hdGNoLnBhdGgucGFyZW50UGF0aFxuICAgICAgICA6IG1hdGNoLnBhdGhcbiAgICBjb25zdCByZXBsYWNlbWVudHMgPSBbXG4gICAgICAuLi5idWxrQ29udmVydChcbiAgICAgICAgKHJlcGxhY2UgaW5zdGFuY2VvZiBPYmplY3QgJiZcbiAgICAgICAgdHlwZW9mIChyZXBsYWNlIGFzIGFueSkuZ2VuZXJhdGUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IChyZXBsYWNlIGFzIENvbXBpbGVkUmVwbGFjZW1lbnQpXG4gICAgICAgICAgOiBjb21waWxlUmVwbGFjZW1lbnQoXG4gICAgICAgICAgICAgIHBpcGVsaW5lKFxuICAgICAgICAgICAgICAgIHR5cGVvZiByZXBsYWNlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IHJlcGxhY2UobWF0Y2gpXG4gICAgICAgICAgICAgICAgICA6IChyZXBsYWNlIGFzIGFueSksXG4gICAgICAgICAgICAgICAgKHJlcGxhY2VtZW50OiBOb2RlIHwgcmVhZG9ubHkgTm9kZVtdKTogTm9kZVBhdGggfCBOb2RlUGF0aFtdID0+XG4gICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHJlcGxhY2VtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VtZW50Lm1hcCgobikgPT4gbmV3IGJhY2tlbmQudC5Ob2RlUGF0aChuKSlcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgYmFja2VuZC50Lk5vZGVQYXRoKHJlcGxhY2VtZW50KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB7IGJhY2tlbmQgfVxuICAgICAgICAgICAgKVxuICAgICAgICApLmdlbmVyYXRlKG1hdGNoKSxcbiAgICAgICAgY3JlYXRlUmVwbGFjZW1lbnRDb252ZXJ0ZXIocGF0aClcbiAgICAgICksXG4gICAgXVxuXG4gICAgZG9SZXBsYWNlKG1hdGNoLCByZXBsYWNlbWVudHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG9SZXBsYWNlKG1hdGNoOiBNYXRjaCwgcmVwbGFjZW1lbnRzOiBOb2RlW10pIHtcbiAgY29uc3QgcmVwbGFjZWRQYXRocyA9IG1hdGNoLnBhdGhzLm1hcCgocCkgPT5cbiAgICBwLnBhcmVudFBhdGg/Lm5vZGUudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnID8gcC5wYXJlbnRQYXRoIDogcFxuICApXG5cbiAgdHJhbnNmZXJDb21tZW50cyhyZXBsYWNlZFBhdGhzWzBdLCByZXBsYWNlbWVudHNbMF0sIHsgbGVhZGluZzogdHJ1ZSB9KVxuICB0cmFuc2ZlckNvbW1lbnRzKGxhc3QocmVwbGFjZWRQYXRocyksIGxhc3QocmVwbGFjZW1lbnRzKSwgeyB0cmFpbGluZzogdHJ1ZSB9KVxuXG4gIHJlcGxhY2VkUGF0aHNbMF0/LnJlcGxhY2UoLi4ucmVwbGFjZW1lbnRzKVxuICBmb3IgKGxldCBpID0gMTsgaSA8IHJlcGxhY2VkUGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXBsYWNlZFBhdGhzW2ldLnBydW5lKClcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckNvbW1lbnRzKFxuICBmcm9tOiBOb2RlUGF0aCB8IHVuZGVmaW5lZCxcbiAgdG86IE5vZGUgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHsgbGVhZGluZz86IGJvb2xlYW47IHRyYWlsaW5nPzogYm9vbGVhbiB9XG4pIHtcbiAgaWYgKCFmcm9tIHx8ICF0bykgcmV0dXJuXG4gIGNvbnN0IG5vZGU6IGFueSA9IGZyb20ubm9kZVxuICBjb25zdCBsZWFkaW5nID0gb3B0aW9ucy5sZWFkaW5nXG4gICAgPyBub2RlLmNvbW1lbnRzPy5maWx0ZXIoKGM6IGFueSkgPT4gYy5sZWFkaW5nKSB8fCBub2RlLmxlYWRpbmdDb21tZW50c1xuICAgIDogdW5kZWZpbmVkXG4gIGlmIChsZWFkaW5nPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZXN0ID0gbm9kZS5jb21tZW50c1xuICAgICAgPyAodG8gYXMgYW55KS5jb21tZW50cyB8fCAoKHRvIGFzIGFueSkuY29tbWVudHMgPSBbXSlcbiAgICAgIDogKHRvIGFzIGFueSkubGVhZGluZ0NvbW1lbnRzIHx8ICgodG8gYXMgYW55KS5sZWFkaW5nQ29tbWVudHMgPSBbXSlcbiAgICBmb3IgKGNvbnN0IGMgb2YgbGVhZGluZykgZGVzdC5wdXNoKGMpXG4gIH1cbiAgY29uc3QgdHJhaWxpbmcgPSBvcHRpb25zLnRyYWlsaW5nXG4gICAgPyBub2RlLmNvbW1lbnRzPy5maWx0ZXIoKGM6IGFueSkgPT4gYy50cmFpbGluZykgfHwgbm9kZS50cmFpbGluZ0NvbW1lbnRzXG4gICAgOiB1bmRlZmluZWRcbiAgaWYgKHRyYWlsaW5nPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZXN0ID0gbm9kZS5jb21tZW50c1xuICAgICAgPyAodG8gYXMgYW55KS5jb21tZW50cyB8fCAoKHRvIGFzIGFueSkuY29tbWVudHMgPSBbXSlcbiAgICAgIDogKHRvIGFzIGFueSkudHJhaWxpbmdDb21tZW50cyB8fCAoKHRvIGFzIGFueSkudHJhaWxpbmdDb21tZW50cyA9IFtdKVxuICAgIGZvciAoY29uc3QgYyBvZiB0cmFpbGluZykgZGVzdC5wdXNoKGMpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxPQUFPQSxrQkFBUCxNQUF3RCxzQkFBeEQ7QUFDQSxPQUFPQywwQkFBUCxJQUFxQ0MsV0FBckMsUUFBd0Qsc0JBQXhEOztBQUVBLE9BQU9DLFFBQVAsTUFBcUIsaUJBQXJCO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixRQUFyQjs7Ozs7O0FBTUEsZUFBZSxTQUFTQyxPQUFUO0FBQ2JDLEtBRGE7QUFFYkQsT0FGYTtBQUdiLEVBQUVFLE9BQUYsRUFIYTtBQUlQO0VBQ04sTUFBTUMsSUFBSTtFQUNSLDBCQUFBRixLQUFLLENBQUNFLElBQU4sQ0FBV0MsVUFBWCxnRkFBdUJDLElBQXZCLENBQTRCQyxJQUE1QixNQUFxQyxxQkFBckM7RUFDSUwsS0FBSyxDQUFDRSxJQUFOLENBQVdDLFVBRGY7RUFFSUgsS0FBSyxDQUFDRSxJQUhaO0VBSUEsTUFBTUksWUFBWSxHQUFHO0VBQ25CLEdBQUdWLFdBQVc7RUFDWixDQUFDRyxPQUFPLFlBQVlRLE1BQW5CO0VBQ0QsT0FBUVIsT0FBRCxDQUFpQlMsUUFBeEIsS0FBcUMsVUFEcEM7RUFFSVQsT0FGSjtFQUdHTCxrQkFBa0I7RUFDaEJlLEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxPQUFkO0VBQ0lBLE9BQU8sQ0FBQ1ksR0FBUixDQUFZLENBQUNDLENBQUQsS0FBTyxJQUFJWCxPQUFPLENBQUNZLENBQVIsQ0FBVUMsUUFBZCxDQUF1QkYsQ0FBdkIsQ0FBbkIsQ0FESjtFQUVJLElBQUlYLE9BQU8sQ0FBQ1ksQ0FBUixDQUFVQyxRQUFkLENBQXVCZixPQUF2QixDQUhZO0VBSWhCLEVBQUVFLE9BQUYsRUFKZ0IsQ0FIdEI7O0VBU0VPLFFBVEYsQ0FTV1IsS0FUWCxDQURZO0VBV1pMLDBCQUEwQixDQUFDTyxJQUFELENBWGQsQ0FESyxDQUFyQjs7OztFQWdCQWEsU0FBUyxDQUFDZixLQUFELEVBQVFNLFlBQVIsQ0FBVDtBQUNEOztBQUVELE9BQU8sU0FBU1UsVUFBVDtBQUNMQyxPQURLO0FBRUxsQixPQUZLOzs7OztBQU9MLEVBQUVFLE9BQUYsRUFQSztBQVFDO0VBQ04sS0FBSyxNQUFNRCxLQUFYLElBQW9CaUIsT0FBcEIsRUFBNkI7SUFDM0IsTUFBTWYsSUFBSTtJQUNSLDJCQUFBRixLQUFLLENBQUNFLElBQU4sQ0FBV0MsVUFBWCxrRkFBdUJDLElBQXZCLENBQTRCQyxJQUE1QixNQUFxQyxxQkFBckM7SUFDSUwsS0FBSyxDQUFDRSxJQUFOLENBQVdDLFVBRGY7SUFFSUgsS0FBSyxDQUFDRSxJQUhaO0lBSUEsTUFBTUksWUFBWSxHQUFHO0lBQ25CLEdBQUdWLFdBQVc7SUFDWixDQUFDRyxPQUFPLFlBQVlRLE1BQW5CO0lBQ0QsT0FBUVIsT0FBRCxDQUFpQlMsUUFBeEIsS0FBcUMsVUFEcEM7SUFFSVQsT0FGSjtJQUdHTCxrQkFBa0I7SUFDaEJHLFFBQVE7SUFDTixPQUFPRSxPQUFQLEtBQW1CLFVBQW5CO0lBQ0lBLE9BQU8sQ0FBQ0MsS0FBRCxDQURYO0lBRUtELE9BSEM7SUFJTixDQUFDbUIsV0FBRDtJQUNFVCxLQUFLLENBQUNDLE9BQU4sQ0FBY1EsV0FBZDtJQUNJQSxXQUFXLENBQUNQLEdBQVosQ0FBZ0IsQ0FBQ0MsQ0FBRCxLQUFPLElBQUlYLE9BQU8sQ0FBQ1ksQ0FBUixDQUFVQyxRQUFkLENBQXVCRixDQUF2QixDQUF2QixDQURKO0lBRUksSUFBSVgsT0FBTyxDQUFDWSxDQUFSLENBQVVDLFFBQWQsQ0FBdUJJLFdBQXZCLENBUEEsQ0FEUTs7SUFVaEIsRUFBRWpCLE9BQUYsRUFWZ0IsQ0FIdEI7O0lBZUVPLFFBZkYsQ0FlV1IsS0FmWCxDQURZO0lBaUJaTCwwQkFBMEIsQ0FBQ08sSUFBRCxDQWpCZCxDQURLLENBQXJCOzs7O0lBc0JBYSxTQUFTLENBQUNmLEtBQUQsRUFBUU0sWUFBUixDQUFUO0VBQ0Q7QUFDRjs7QUFFRCxTQUFTUyxTQUFULENBQW1CZixLQUFuQixFQUFpQ00sWUFBakMsRUFBdUQ7RUFDckQsTUFBTWEsYUFBYSxHQUFHbkIsS0FBSyxDQUFDb0IsS0FBTixDQUFZVCxHQUFaLENBQWdCLENBQUNVLENBQUQ7TUFDcEMsa0JBQUFBLENBQUMsQ0FBQ2xCLFVBQUYsZ0VBQWNDLElBQWQsQ0FBbUJDLElBQW5CLE1BQTRCLHFCQUE1QixHQUFvRGdCLENBQUMsQ0FBQ2xCLFVBQXRELEdBQW1Fa0IsQ0FEL0IsR0FBaEIsQ0FBdEI7OztFQUlBQyxnQkFBZ0IsQ0FBQ0gsYUFBYSxDQUFDLENBQUQsQ0FBZCxFQUFtQmIsWUFBWSxDQUFDLENBQUQsQ0FBL0IsRUFBb0MsRUFBRWlCLE9BQU8sRUFBRSxJQUFYLEVBQXBDLENBQWhCO0VBQ0FELGdCQUFnQixDQUFDeEIsSUFBSSxDQUFDcUIsYUFBRCxDQUFMLEVBQXNCckIsSUFBSSxDQUFDUSxZQUFELENBQTFCLEVBQTBDLEVBQUVrQixRQUFRLEVBQUUsSUFBWixFQUExQyxDQUFoQjs7RUFFQSxtQkFBQUwsYUFBYSxDQUFDLENBQUQsQ0FBYixvRUFBa0JwQixPQUFsQixDQUEwQixHQUFHTyxZQUE3QjtFQUNBLEtBQUssSUFBSW1CLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdOLGFBQWEsQ0FBQ08sTUFBbEMsRUFBMENELENBQUMsRUFBM0MsRUFBK0M7SUFDN0NOLGFBQWEsQ0FBQ00sQ0FBRCxDQUFiLENBQWlCRSxLQUFqQjtFQUNEO0FBQ0Y7O0FBRUQsU0FBU0wsZ0JBQVQ7QUFDRU0sSUFERjtBQUVFQyxFQUZGO0FBR0VDLE9BSEY7QUFJRTtFQUNBLElBQUksQ0FBQ0YsSUFBRCxJQUFTLENBQUNDLEVBQWQsRUFBa0I7RUFDbEIsTUFBTXpCLElBQVMsR0FBR3dCLElBQUksQ0FBQ3hCLElBQXZCO0VBQ0EsTUFBTW1CLE9BQU8sR0FBR08sT0FBTyxDQUFDUCxPQUFSO0VBQ1osbUJBQUFuQixJQUFJLENBQUMyQixRQUFMLGtFQUFlQyxNQUFmLENBQXNCLENBQUNDLENBQUQsS0FBWUEsQ0FBQyxDQUFDVixPQUFwQyxNQUFnRG5CLElBQUksQ0FBQzhCLGVBRHpDO0VBRVpDLFNBRko7RUFHQSxJQUFJWixPQUFKLGFBQUlBLE9BQUosZUFBSUEsT0FBTyxDQUFFRyxNQUFiLEVBQXFCO0lBQ25CLE1BQU1VLElBQUksR0FBR2hDLElBQUksQ0FBQzJCLFFBQUw7SUFDUkYsRUFBRCxDQUFZRSxRQUFaLEtBQTBCRixFQUFELENBQVlFLFFBQVosR0FBdUIsRUFBaEQsQ0FEUztJQUVSRixFQUFELENBQVlLLGVBQVosS0FBaUNMLEVBQUQsQ0FBWUssZUFBWixHQUE4QixFQUE5RCxDQUZKO0lBR0EsS0FBSyxNQUFNRCxDQUFYLElBQWdCVixPQUFoQixFQUF5QmEsSUFBSSxDQUFDQyxJQUFMLENBQVVKLENBQVY7RUFDMUI7RUFDRCxNQUFNVCxRQUFRLEdBQUdNLE9BQU8sQ0FBQ04sUUFBUjtFQUNiLG9CQUFBcEIsSUFBSSxDQUFDMkIsUUFBTCxvRUFBZUMsTUFBZixDQUFzQixDQUFDQyxDQUFELEtBQVlBLENBQUMsQ0FBQ1QsUUFBcEMsTUFBaURwQixJQUFJLENBQUNrQyxnQkFEekM7RUFFYkgsU0FGSjtFQUdBLElBQUlYLFFBQUosYUFBSUEsUUFBSixlQUFJQSxRQUFRLENBQUVFLE1BQWQsRUFBc0I7SUFDcEIsTUFBTVUsSUFBSSxHQUFHaEMsSUFBSSxDQUFDMkIsUUFBTDtJQUNSRixFQUFELENBQVlFLFFBQVosS0FBMEJGLEVBQUQsQ0FBWUUsUUFBWixHQUF1QixFQUFoRCxDQURTO0lBRVJGLEVBQUQsQ0FBWVMsZ0JBQVosS0FBa0NULEVBQUQsQ0FBWVMsZ0JBQVosR0FBK0IsRUFBaEUsQ0FGSjtJQUdBLEtBQUssTUFBTUwsQ0FBWCxJQUFnQlQsUUFBaEIsRUFBMEJZLElBQUksQ0FBQ0MsSUFBTCxDQUFVSixDQUFWO0VBQzNCO0FBQ0YifQ==