UNPKG

astx

Version:

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

113 lines (104 loc) 14.1 kB
import ensureArray from '../util/ensureArray.mjs' import forEachNode from '../util/forEachNode.mjs' function parse0(backend, strings, ...quasis) { try { const result = backend.template.statements(strings, ...quasis) if (result.length === 0) return backend.template.expression(strings, ...quasis) if (result.length > 1) return result const node = result[0] return node.type === 'ExpressionStatement' ? node.expression : node } catch (error) { // fallthrough } return backend.template.expression(strings, ...quasis) } export function parsePattern(strings, ...quasis) { const ast = parse0(this, strings, ...quasis) let result = ensureArray(ast).map((n) => new this.t.NodePath(n)) const allComments = [] forEachNode(this.t, result, ['Node'], (path) => { if (allComments.length >= 2) return const { node } = path for (const comment of this.comments(node)) { allComments.push(comment) } }) let done = false if (allComments.length >= 2) { let from = Infinity, to = -Infinity for (const comment of allComments) { const { start, end } = this.location(comment) if (start != null && start > to) to = start if (end != null && end < from) from = end } if (from != null && to != null && from < to) { const pathInRange = (path) => { const { start, end } = this.location(path.node) return start != null && end != null && start >= from && end <= to } forEachNode(this.t, result, ['Node'], (path) => { if (done) return if (pathInRange(path)) { while (path.parentPath != null && pathInRange(path.parentPath)) path = path.parentPath result = path done = true } }) if (done) return result } } let extractNext = false forEachNode(this.t, result, ['Node'], (path) => { if (done) return if (extractNext) { result = path done = true return } const { node } = path const { comments, leadingComments, innerComments } = node if (comments) { for (let i = 0; i < comments.length; i++) { const c = comments[i] if (!c.value && c.leading) { comments.splice(i, 1) result = path done = true return } else if (!c.value && c.inner) { extractNext = true return } } } if (leadingComments) { for (let i = 0; i < leadingComments.length; i++) { const c = leadingComments[i] if (!c.value) { leadingComments.splice(i, 1) result = path done = true return } } } if (innerComments) { for (let i = 0; i < innerComments.length; i++) { const c = innerComments[i] if (!c.value) { innerComments.splice(i, 1) extractNext = true return } } } }) return result } export function parsePatternToNodes(strings, ...quasis) { const paths = this.parsePattern(strings, ...quasis) return Array.isArray(paths) ? paths.map((p) => p.node) : paths.node } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVBcnJheSIsImZvckVhY2hOb2RlIiwicGFyc2UwIiwiYmFja2VuZCIsInN0cmluZ3MiLCJxdWFzaXMiLCJyZXN1bHQiLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiLCJsZW5ndGgiLCJleHByZXNzaW9uIiwibm9kZSIsInR5cGUiLCJlcnJvciIsInBhcnNlUGF0dGVybiIsImFzdCIsIm1hcCIsIm4iLCJ0IiwiTm9kZVBhdGgiLCJhbGxDb21tZW50cyIsInBhdGgiLCJjb21tZW50IiwiY29tbWVudHMiLCJwdXNoIiwiZG9uZSIsImZyb20iLCJJbmZpbml0eSIsInRvIiwic3RhcnQiLCJlbmQiLCJsb2NhdGlvbiIsInBhdGhJblJhbmdlIiwicGFyZW50UGF0aCIsImV4dHJhY3ROZXh0IiwibGVhZGluZ0NvbW1lbnRzIiwiaW5uZXJDb21tZW50cyIsImkiLCJjIiwidmFsdWUiLCJsZWFkaW5nIiwic3BsaWNlIiwiaW5uZXIiLCJwYXJzZVBhdHRlcm5Ub05vZGVzIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JhY2tlbmQvcGFyc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFja2VuZCB9IGZyb20gJy4vQmFja2VuZCdcbmltcG9ydCB7IE5vZGVQYXRoLCBFeHByZXNzaW9uLCBTdGF0ZW1lbnQsIE5vZGUsIENvbW1lbnQgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCBlbnN1cmVBcnJheSBmcm9tICcuLi91dGlsL2Vuc3VyZUFycmF5J1xuaW1wb3J0IGZvckVhY2hOb2RlIGZyb20gJy4uL3V0aWwvZm9yRWFjaE5vZGUnXG5cbmZ1bmN0aW9uIHBhcnNlMChcbiAgYmFja2VuZDogQmFja2VuZCxcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgLi4ucXVhc2lzOiBhbnlbXVxuKTogRXhwcmVzc2lvbiB8IFN0YXRlbWVudCB8IFN0YXRlbWVudFtdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnRlbXBsYXRlLnN0YXRlbWVudHMoc3RyaW5ncywgLi4ucXVhc2lzKVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGJhY2tlbmQudGVtcGxhdGUuZXhwcmVzc2lvbihzdHJpbmdzLCAuLi5xdWFzaXMpXG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAxKSByZXR1cm4gcmVzdWx0XG4gICAgY29uc3Qgbm9kZSA9IHJlc3VsdFswXVxuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyA/IG5vZGUuZXhwcmVzc2lvbiA6IG5vZGVcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG4gIHJldHVybiBiYWNrZW5kLnRlbXBsYXRlLmV4cHJlc3Npb24oc3RyaW5ncywgLi4ucXVhc2lzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuKFxuICB0aGlzOiBCYWNrZW5kLFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZyB8IHN0cmluZ1tdLFxuICAuLi5xdWFzaXM6IGFueVtdXG4pOiBOb2RlUGF0aCB8IE5vZGVQYXRoW10ge1xuICBjb25zdCBhc3QgPSBwYXJzZTAodGhpcywgc3RyaW5ncywgLi4ucXVhc2lzKVxuICBsZXQgcmVzdWx0OiBOb2RlUGF0aCB8IE5vZGVQYXRoW10gPSBlbnN1cmVBcnJheShhc3QpLm1hcChcbiAgICAobikgPT4gbmV3IHRoaXMudC5Ob2RlUGF0aChuKVxuICApXG4gIGNvbnN0IGFsbENvbW1lbnRzOiBDb21tZW50W10gPSBbXVxuICBmb3JFYWNoTm9kZSh0aGlzLnQsIHJlc3VsdCwgWydOb2RlJ10sIChwYXRoOiBOb2RlUGF0aCkgPT4ge1xuICAgIGlmIChhbGxDb21tZW50cy5sZW5ndGggPj0gMikgcmV0dXJuXG4gICAgY29uc3QgeyBub2RlIH0gPSBwYXRoXG4gICAgZm9yIChjb25zdCBjb21tZW50IG9mIHRoaXMuY29tbWVudHMobm9kZSkpIHtcbiAgICAgIGFsbENvbW1lbnRzLnB1c2goY29tbWVudClcbiAgICB9XG4gIH0pXG4gIGxldCBkb25lID0gZmFsc2VcbiAgaWYgKGFsbENvbW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGZyb20gPSBJbmZpbml0eSxcbiAgICAgIHRvID0gLUluZmluaXR5XG4gICAgZm9yIChjb25zdCBjb21tZW50IG9mIGFsbENvbW1lbnRzKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMubG9jYXRpb24oY29tbWVudClcbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIHN0YXJ0ID4gdG8pIHRvID0gc3RhcnRcbiAgICAgIGlmIChlbmQgIT0gbnVsbCAmJiBlbmQgPCBmcm9tKSBmcm9tID0gZW5kXG4gICAgfVxuICAgIGlmIChmcm9tICE9IG51bGwgJiYgdG8gIT0gbnVsbCAmJiBmcm9tIDwgdG8pIHtcbiAgICAgIGNvbnN0IHBhdGhJblJhbmdlID0gKHBhdGg6IE5vZGVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5sb2NhdGlvbihwYXRoLm5vZGUpXG4gICAgICAgIHJldHVybiBzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsICYmIHN0YXJ0ID49IGZyb20gJiYgZW5kIDw9IHRvXG4gICAgICB9XG4gICAgICBmb3JFYWNoTm9kZSh0aGlzLnQsIHJlc3VsdCwgWydOb2RlJ10sIChwYXRoOiBOb2RlUGF0aCkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgICAgIGlmIChwYXRoSW5SYW5nZShwYXRoKSkge1xuICAgICAgICAgIHdoaWxlIChwYXRoLnBhcmVudFBhdGggIT0gbnVsbCAmJiBwYXRoSW5SYW5nZShwYXRoLnBhcmVudFBhdGgpKVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucGFyZW50UGF0aFxuICAgICAgICAgIHJlc3VsdCA9IHBhdGhcbiAgICAgICAgICBkb25lID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGRvbmUpIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbiAgbGV0IGV4dHJhY3ROZXh0ID0gZmFsc2VcbiAgZm9yRWFjaE5vZGUodGhpcy50LCByZXN1bHQsIFsnTm9kZSddLCAocGF0aDogTm9kZVBhdGgpID0+IHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgaWYgKGV4dHJhY3ROZXh0KSB7XG4gICAgICByZXN1bHQgPSBwYXRoXG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgbm9kZSB9ID0gcGF0aFxuICAgIGNvbnN0IHsgY29tbWVudHMsIGxlYWRpbmdDb21tZW50cywgaW5uZXJDb21tZW50cyB9ID0gbm9kZSBhcyBhbnlcbiAgICBpZiAoY29tbWVudHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGNvbW1lbnRzW2ldXG4gICAgICAgIGlmICghYy52YWx1ZSAmJiBjLmxlYWRpbmcpIHtcbiAgICAgICAgICBjb21tZW50cy5zcGxpY2UoaSwgMSlcbiAgICAgICAgICByZXN1bHQgPSBwYXRoXG4gICAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmICghYy52YWx1ZSAmJiBjLmlubmVyKSB7XG4gICAgICAgICAgZXh0cmFjdE5leHQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxlYWRpbmdDb21tZW50cykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGxlYWRpbmdDb21tZW50c1tpXVxuICAgICAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgICAgICBsZWFkaW5nQ29tbWVudHMuc3BsaWNlKGksIDEpXG4gICAgICAgICAgcmVzdWx0ID0gcGF0aFxuICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlubmVyQ29tbWVudHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5uZXJDb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gaW5uZXJDb21tZW50c1tpXVxuICAgICAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgICAgICBpbm5lckNvbW1lbnRzLnNwbGljZShpLCAxKVxuICAgICAgICAgIGV4dHJhY3ROZXh0ID0gdHJ1ZVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdHRlcm5Ub05vZGVzKFxuICB0aGlzOiBCYWNrZW5kLFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZyB8IHN0cmluZ1tdLFxuICAuLi5xdWFzaXM6IGFueVtdXG4pOiBOb2RlIHwgTm9kZVtdIHtcbiAgY29uc3QgcGF0aHMgPSB0aGlzLnBhcnNlUGF0dGVybihzdHJpbmdzLCAuLi5xdWFzaXMpXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzLm1hcCgocCkgPT4gcC5ub2RlKSA6IHBhdGhzLm5vZGVcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxPQUFPQSxXQUFQLE1BQXdCLHFCQUF4QjtBQUNBLE9BQU9DLFdBQVAsTUFBd0IscUJBQXhCOztBQUVBLFNBQVNDLE1BQVQ7QUFDRUMsT0FERjtBQUVFQyxPQUZGO0FBR0UsR0FBR0MsTUFITDtBQUl3QztFQUN0QyxJQUFJO0lBQ0YsTUFBTUMsTUFBTSxHQUFHSCxPQUFPLENBQUNJLFFBQVIsQ0FBaUJDLFVBQWpCLENBQTRCSixPQUE1QixFQUFxQyxHQUFHQyxNQUF4QyxDQUFmO0lBQ0EsSUFBSUMsTUFBTSxDQUFDRyxNQUFQLEtBQWtCLENBQXRCO0lBQ0UsT0FBT04sT0FBTyxDQUFDSSxRQUFSLENBQWlCRyxVQUFqQixDQUE0Qk4sT0FBNUIsRUFBcUMsR0FBR0MsTUFBeEMsQ0FBUDtJQUNGLElBQUlDLE1BQU0sQ0FBQ0csTUFBUCxHQUFnQixDQUFwQixFQUF1QixPQUFPSCxNQUFQO0lBQ3ZCLE1BQU1LLElBQUksR0FBR0wsTUFBTSxDQUFDLENBQUQsQ0FBbkI7SUFDQSxPQUFPSyxJQUFJLENBQUNDLElBQUwsS0FBYyxxQkFBZCxHQUFzQ0QsSUFBSSxDQUFDRCxVQUEzQyxHQUF3REMsSUFBL0Q7RUFDRCxDQVBELENBT0UsT0FBT0UsS0FBUCxFQUFjO0lBQ2Q7RUFDRDtFQUNELE9BQU9WLE9BQU8sQ0FBQ0ksUUFBUixDQUFpQkcsVUFBakIsQ0FBNEJOLE9BQTVCLEVBQXFDLEdBQUdDLE1BQXhDLENBQVA7QUFDRDs7QUFFRCxPQUFPLFNBQVNTLFlBQVQ7O0FBRUxWLE9BRks7QUFHTCxHQUFHQyxNQUhFO0FBSWtCO0VBQ3ZCLE1BQU1VLEdBQUcsR0FBR2IsTUFBTSxDQUFDLElBQUQsRUFBT0UsT0FBUCxFQUFnQixHQUFHQyxNQUFuQixDQUFsQjtFQUNBLElBQUlDLE1BQTZCLEdBQUdOLFdBQVcsQ0FBQ2UsR0FBRCxDQUFYLENBQWlCQyxHQUFqQjtFQUNsQyxDQUFDQyxDQUFELEtBQU8sSUFBSSxLQUFLQyxDQUFMLENBQU9DLFFBQVgsQ0FBb0JGLENBQXBCLENBRDJCLENBQXBDOztFQUdBLE1BQU1HLFdBQXNCLEdBQUcsRUFBL0I7RUFDQW5CLFdBQVcsQ0FBQyxLQUFLaUIsQ0FBTixFQUFTWixNQUFULEVBQWlCLENBQUMsTUFBRCxDQUFqQixFQUEyQixDQUFDZSxJQUFELEtBQW9CO0lBQ3hELElBQUlELFdBQVcsQ0FBQ1gsTUFBWixJQUFzQixDQUExQixFQUE2QjtJQUM3QixNQUFNLEVBQUVFLElBQUYsS0FBV1UsSUFBakI7SUFDQSxLQUFLLE1BQU1DLE9BQVgsSUFBc0IsS0FBS0MsUUFBTCxDQUFjWixJQUFkLENBQXRCLEVBQTJDO01BQ3pDUyxXQUFXLENBQUNJLElBQVosQ0FBaUJGLE9BQWpCO0lBQ0Q7RUFDRixDQU5VLENBQVg7RUFPQSxJQUFJRyxJQUFJLEdBQUcsS0FBWDtFQUNBLElBQUlMLFdBQVcsQ0FBQ1gsTUFBWixJQUFzQixDQUExQixFQUE2QjtJQUMzQixJQUFJaUIsSUFBSSxHQUFHQyxRQUFYO0lBQ0VDLEVBQUUsR0FBRyxDQUFDRCxRQURSO0lBRUEsS0FBSyxNQUFNTCxPQUFYLElBQXNCRixXQUF0QixFQUFtQztNQUNqQyxNQUFNLEVBQUVTLEtBQUYsRUFBU0MsR0FBVCxLQUFpQixLQUFLQyxRQUFMLENBQWNULE9BQWQsQ0FBdkI7TUFDQSxJQUFJTyxLQUFLLElBQUksSUFBVCxJQUFpQkEsS0FBSyxHQUFHRCxFQUE3QixFQUFpQ0EsRUFBRSxHQUFHQyxLQUFMO01BQ2pDLElBQUlDLEdBQUcsSUFBSSxJQUFQLElBQWVBLEdBQUcsR0FBR0osSUFBekIsRUFBK0JBLElBQUksR0FBR0ksR0FBUDtJQUNoQztJQUNELElBQUlKLElBQUksSUFBSSxJQUFSLElBQWdCRSxFQUFFLElBQUksSUFBdEIsSUFBOEJGLElBQUksR0FBR0UsRUFBekMsRUFBNkM7TUFDM0MsTUFBTUksV0FBVyxHQUFHLENBQUNYLElBQUQsS0FBb0I7UUFDdEMsTUFBTSxFQUFFUSxLQUFGLEVBQVNDLEdBQVQsS0FBaUIsS0FBS0MsUUFBTCxDQUFjVixJQUFJLENBQUNWLElBQW5CLENBQXZCO1FBQ0EsT0FBT2tCLEtBQUssSUFBSSxJQUFULElBQWlCQyxHQUFHLElBQUksSUFBeEIsSUFBZ0NELEtBQUssSUFBSUgsSUFBekMsSUFBaURJLEdBQUcsSUFBSUYsRUFBL0Q7TUFDRCxDQUhEO01BSUEzQixXQUFXLENBQUMsS0FBS2lCLENBQU4sRUFBU1osTUFBVCxFQUFpQixDQUFDLE1BQUQsQ0FBakIsRUFBMkIsQ0FBQ2UsSUFBRCxLQUFvQjtRQUN4RCxJQUFJSSxJQUFKLEVBQVU7UUFDVixJQUFJTyxXQUFXLENBQUNYLElBQUQsQ0FBZixFQUF1QjtVQUNyQixPQUFPQSxJQUFJLENBQUNZLFVBQUwsSUFBbUIsSUFBbkIsSUFBMkJELFdBQVcsQ0FBQ1gsSUFBSSxDQUFDWSxVQUFOLENBQTdDO1VBQ0VaLElBQUksR0FBR0EsSUFBSSxDQUFDWSxVQUFaO1VBQ0YzQixNQUFNLEdBQUdlLElBQVQ7VUFDQUksSUFBSSxHQUFHLElBQVA7UUFDRDtNQUNGLENBUlUsQ0FBWDtNQVNBLElBQUlBLElBQUosRUFBVSxPQUFPbkIsTUFBUDtJQUNYO0VBQ0Y7RUFDRCxJQUFJNEIsV0FBVyxHQUFHLEtBQWxCO0VBQ0FqQyxXQUFXLENBQUMsS0FBS2lCLENBQU4sRUFBU1osTUFBVCxFQUFpQixDQUFDLE1BQUQsQ0FBakIsRUFBMkIsQ0FBQ2UsSUFBRCxLQUFvQjtJQUN4RCxJQUFJSSxJQUFKLEVBQVU7SUFDVixJQUFJUyxXQUFKLEVBQWlCO01BQ2Y1QixNQUFNLEdBQUdlLElBQVQ7TUFDQUksSUFBSSxHQUFHLElBQVA7TUFDQTtJQUNEO0lBQ0QsTUFBTSxFQUFFZCxJQUFGLEtBQVdVLElBQWpCO0lBQ0EsTUFBTSxFQUFFRSxRQUFGLEVBQVlZLGVBQVosRUFBNkJDLGFBQTdCLEtBQStDekIsSUFBckQ7SUFDQSxJQUFJWSxRQUFKLEVBQWM7TUFDWixLQUFLLElBQUljLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdkLFFBQVEsQ0FBQ2QsTUFBN0IsRUFBcUM0QixDQUFDLEVBQXRDLEVBQTBDO1FBQ3hDLE1BQU1DLENBQUMsR0FBR2YsUUFBUSxDQUFDYyxDQUFELENBQWxCO1FBQ0EsSUFBSSxDQUFDQyxDQUFDLENBQUNDLEtBQUgsSUFBWUQsQ0FBQyxDQUFDRSxPQUFsQixFQUEyQjtVQUN6QmpCLFFBQVEsQ0FBQ2tCLE1BQVQsQ0FBZ0JKLENBQWhCLEVBQW1CLENBQW5CO1VBQ0EvQixNQUFNLEdBQUdlLElBQVQ7VUFDQUksSUFBSSxHQUFHLElBQVA7VUFDQTtRQUNELENBTEQsTUFLTyxJQUFJLENBQUNhLENBQUMsQ0FBQ0MsS0FBSCxJQUFZRCxDQUFDLENBQUNJLEtBQWxCLEVBQXlCO1VBQzlCUixXQUFXLEdBQUcsSUFBZDtVQUNBO1FBQ0Q7TUFDRjtJQUNGO0lBQ0QsSUFBSUMsZUFBSixFQUFxQjtNQUNuQixLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdGLGVBQWUsQ0FBQzFCLE1BQXBDLEVBQTRDNEIsQ0FBQyxFQUE3QyxFQUFpRDtRQUMvQyxNQUFNQyxDQUFDLEdBQUdILGVBQWUsQ0FBQ0UsQ0FBRCxDQUF6QjtRQUNBLElBQUksQ0FBQ0MsQ0FBQyxDQUFDQyxLQUFQLEVBQWM7VUFDWkosZUFBZSxDQUFDTSxNQUFoQixDQUF1QkosQ0FBdkIsRUFBMEIsQ0FBMUI7VUFDQS9CLE1BQU0sR0FBR2UsSUFBVDtVQUNBSSxJQUFJLEdBQUcsSUFBUDtVQUNBO1FBQ0Q7TUFDRjtJQUNGO0lBQ0QsSUFBSVcsYUFBSixFQUFtQjtNQUNqQixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELGFBQWEsQ0FBQzNCLE1BQWxDLEVBQTBDNEIsQ0FBQyxFQUEzQyxFQUErQztRQUM3QyxNQUFNQyxDQUFDLEdBQUdGLGFBQWEsQ0FBQ0MsQ0FBRCxDQUF2QjtRQUNBLElBQUksQ0FBQ0MsQ0FBQyxDQUFDQyxLQUFQLEVBQWM7VUFDWkgsYUFBYSxDQUFDSyxNQUFkLENBQXFCSixDQUFyQixFQUF3QixDQUF4QjtVQUNBSCxXQUFXLEdBQUcsSUFBZDtVQUNBO1FBQ0Q7TUFDRjtJQUNGO0VBQ0YsQ0E1Q1UsQ0FBWDtFQTZDQSxPQUFPNUIsTUFBUDtBQUNEOztBQUVELE9BQU8sU0FBU3FDLG1CQUFUOztBQUVMdkMsT0FGSztBQUdMLEdBQUdDLE1BSEU7QUFJVTtFQUNmLE1BQU11QyxLQUFLLEdBQUcsS0FBSzlCLFlBQUwsQ0FBa0JWLE9BQWxCLEVBQTJCLEdBQUdDLE1BQTlCLENBQWQ7RUFDQSxPQUFPd0MsS0FBSyxDQUFDQyxPQUFOLENBQWNGLEtBQWQsSUFBdUJBLEtBQUssQ0FBQzVCLEdBQU4sQ0FBVSxDQUFDK0IsQ0FBRCxLQUFPQSxDQUFDLENBQUNwQyxJQUFuQixDQUF2QixHQUFrRGlDLEtBQUssQ0FBQ2pDLElBQS9EO0FBQ0QifQ==