UNPKG

wisp

Version:

Homoiconic JS with clojure syntax, s-expressions & macros

779 lines 137 kB
{ var _ns_ = { id: 'wisp.expander', doc: 'wisp syntax and macro expander module' }; var wisp_ast = require('./ast'); var meta = wisp_ast.meta; var withMeta = wisp_ast.withMeta; var isSymbol = wisp_ast.isSymbol; var isKeyword = wisp_ast.isKeyword; var keyword = wisp_ast.keyword; var isQuote = wisp_ast.isQuote; var symbol = wisp_ast.symbol; var namespace = wisp_ast.namespace; var name = wisp_ast.name; var gensym = wisp_ast.gensym; var isUnquote = wisp_ast.isUnquote; var isUnquoteSplicing = wisp_ast.isUnquoteSplicing; var wisp_sequence = require('./sequence'); var isList = wisp_sequence.isList; var list = wisp_sequence.list; var conj = wisp_sequence.conj; var partition = wisp_sequence.partition; var seq = wisp_sequence.seq; var repeatedly = wisp_sequence.repeatedly; var isEmpty = wisp_sequence.isEmpty; var map = wisp_sequence.map; var mapv = wisp_sequence.mapv; var vec = wisp_sequence.vec; var set = wisp_sequence.set; var isEvery = wisp_sequence.isEvery; var concat = wisp_sequence.concat; var first = wisp_sequence.first; var second = wisp_sequence.second; var third = wisp_sequence.third; var rest = wisp_sequence.rest; var last = wisp_sequence.last; var mapcat = wisp_sequence.mapcat; var nth = wisp_sequence.nth; var butlast = wisp_sequence.butlast; var interleave = wisp_sequence.interleave; var cons = wisp_sequence.cons; var count = wisp_sequence.count; var take = wisp_sequence.take; var dissoc = wisp_sequence.dissoc; var some = wisp_sequence.some; var assoc = wisp_sequence.assoc; var reduce = wisp_sequence.reduce; var filter = wisp_sequence.filter; var isSeq = wisp_sequence.isSeq; var zipmap = wisp_sequence.zipmap; var drop = wisp_sequence.drop; var lazySeq = wisp_sequence.lazySeq; var range = wisp_sequence.range; var reverse = wisp_sequence.reverse; var dorun = wisp_sequence.dorun; var mapIndexed = wisp_sequence.mapIndexed; var wisp_runtime = require('./runtime'); var isNil = wisp_runtime.isNil; var isDictionary = wisp_runtime.isDictionary; var isVector = wisp_runtime.isVector; var keys = wisp_runtime.keys; var get = wisp_runtime.get; var vals = wisp_runtime.vals; var isString = wisp_runtime.isString; var isNumber = wisp_runtime.isNumber; var isBoolean = wisp_runtime.isBoolean; var isDate = wisp_runtime.isDate; var isRePattern = wisp_runtime.isRePattern; var isEven = wisp_runtime.isEven; var isOdd = wisp_runtime.isOdd; var isEqual = wisp_runtime.isEqual; var max = wisp_runtime.max; var inc = wisp_runtime.inc; var dec = wisp_runtime.dec; var dictionary = wisp_runtime.dictionary; var merge = wisp_runtime.merge; var subs = wisp_runtime.subs; var wisp_string = require('./string'); var split = wisp_string.split; var join = wisp_string.join; var capitalize = wisp_string.capitalize; } var __macros__ = exports.__macros__ = {}; var expand = function expand(expander, form, env) { return function () { var metadataø1 = meta(form) || {}; var parmasø1 = rest(form); var implicitø1 = map(function ($1) { return isEqual('&form', $1) ? form : isEqual('&env', $1) ? env : 'else' ? $1 : void 0; }, (meta(expander) || 0)['implicit'] || []); var paramsø1 = vec(concat(implicitø1, vec(rest(form)))); var expansionø1 = expander.apply(void 0, paramsø1); return expansionø1 ? withMeta(expansionø1, conj(metadataø1, meta(expansionø1))) : expansionø1; }.call(this); }; var installMacro = exports.installMacro = function installMacro(op, expander) { return (__macros__ || 0)[name(op)] = expander; }; var macro = function macro(op) { return isSymbol(op) && (__macros__ || 0)[name(op)]; }; var isDotSyntax = exports.isDotSyntax = function isDotSyntax(op) { return isSymbol(op) && '.' === name(op); }; var isMethodSyntax = exports.isMethodSyntax = function isMethodSyntax(op) { return function () { var idø1 = isSymbol(op) && name(op); return idø1 && '.' === first(idø1) && !('-' === second(idø1)) && !('.' === idø1); }.call(this); }; var isFieldSyntax = exports.isFieldSyntax = function isFieldSyntax(op) { return function () { var idø1 = isSymbol(op) && name(op); return idø1 && '.' === first(idø1) && '-' === second(idø1); }.call(this); }; var isNewSyntax = exports.isNewSyntax = function isNewSyntax(op) { return function () { var idø1 = isSymbol(op) && name(op); return idø1 && '.' === last(idø1) && !('.' === idø1); }.call(this); }; var methodSyntax = exports.methodSyntax = function methodSyntax(op, target) { var params = Array.prototype.slice.call(arguments, 2); return function () { var opMetaø1 = meta(op); var formStartø1 = (opMetaø1 || 0)['start']; var targetMetaø1 = meta(target); var memberø1 = withMeta(symbol(subs(name(op), 1)), conj(opMetaø1, { 'start': { 'line': (formStartø1 || 0)['line'], 'column': inc((formStartø1 || 0)['column']) } })); var agetø1 = withMeta(symbol(void 0, 'aget'), conj(opMetaø1, { 'end': { 'line': (formStartø1 || 0)['line'], 'column': inc((formStartø1 || 0)['column']) } })); var methodø1 = withMeta(list.apply(void 0, [agetø1].concat([target], [list.apply(void 0, [symbol(void 0, 'quote')].concat([memberø1]))])), conj(opMetaø1, { 'end': (meta(target) || 0)['end'] })); return isNil(target) ? (function () { throw Error('Malformed method expression, expecting (.method object ...)'); })() : list.apply(void 0, [methodø1].concat(vec(params))); }.call(this); }; var fieldSyntax = exports.fieldSyntax = function fieldSyntax(field, target) { var more = Array.prototype.slice.call(arguments, 2); return function () { var metadataø1 = meta(field); var startø1 = (metadataø1 || 0)['start']; var endø1 = (metadataø1 || 0)['end']; var memberø1 = withMeta(symbol(subs(name(field), 2)), conj(metadataø1, { 'start': { 'line': (startø1 || 0)['line'], 'column': (startø1 || 0)['column'] + 2 } })); return isNil(target) || count(more) ? (function () { throw Error('Malformed member expression, expecting (.-member target)'); })() : list.apply(void 0, [symbol(void 0, 'aget')].concat([target], [list.apply(void 0, [symbol(void 0, 'quote')].concat([memberø1]))])); }.call(this); }; var dotSyntax = exports.dotSyntax = function dotSyntax(op, target, field) { var params = Array.prototype.slice.call(arguments, 3); !isSymbol(field) ? (function () { throw Error('Malformed . form'); })() : void 0; return function () { var _fieldø1 = name(field); return ('-' === first(_fieldø1) ? fieldSyntax : methodSyntax).apply(void 0, [ symbol('' + '.' + _fieldø1), target ].concat(params)); }.call(this); }; var newSyntax = exports.newSyntax = function newSyntax(op) { var params = Array.prototype.slice.call(arguments, 1); return function () { var idø1 = name(op); var idMetaø1 = (idø1 || 0)['meta']; var renameø1 = subs(idø1, 0, dec(count(idø1))); var constructorø1 = withMeta(symbol(renameø1), conj(idMetaø1, { 'end': { 'line': ((idMetaø1 || 0)['end'] || 0)['line'], 'column': dec(((idMetaø1 || 0)['end'] || 0)['column']) } })); var operatorø1 = withMeta(symbol(void 0, 'new'), conj(idMetaø1, { 'start': { 'line': ((idMetaø1 || 0)['end'] || 0)['line'], 'column': dec(((idMetaø1 || 0)['end'] || 0)['column']) } })); return list.apply(void 0, [symbol(void 0, 'new')].concat([constructorø1], vec(params))); }.call(this); }; var keywordInvoke = exports.keywordInvoke = function keywordInvoke() { switch (arguments.length) { case 2: var keyword = arguments[0]; var target = arguments[1]; return list.apply(void 0, [symbol(void 0, 'get')].concat([target], [keyword])); case 3: var keyword = arguments[0]; var target = arguments[1]; var default_ = arguments[2]; return list.apply(void 0, [symbol(void 0, 'get')].concat([target], [keyword], [default_])); default: throw RangeError('Wrong number of arguments passed'); } }; var desugar = function desugar(expander, form) { return function () { var desugaredø1 = expander.apply(void 0, vec(form)); var metadataø1 = conj({}, meta(form), meta(desugaredø1)); return withMeta(desugaredø1, metadataø1); }.call(this); }; var macroexpand1 = exports.macroexpand1 = function macroexpand1(form, env) { return function () { var opø1 = isList(form) && first(form); var expanderø1 = macro(opø1); return expanderø1 ? expand(expanderø1, form, env) : isKeyword(opø1) ? desugar(keywordInvoke, form) : isDotSyntax(opø1) ? desugar(dotSyntax, form) : isFieldSyntax(opø1) ? desugar(fieldSyntax, form) : isMethodSyntax(opø1) ? desugar(methodSyntax, form) : isNewSyntax(opø1) ? desugar(newSyntax, form) : 'else' ? form : void 0; }.call(this); }; var macroexpand = exports.macroexpand = function macroexpand(form, env) { return function loop() { var recur = loop; var originalø1 = form; var expandedø1 = macroexpand1(form, env); do { recur = originalø1 === expandedø1 ? originalø1 : (loop[0] = expandedø1, loop[1] = macroexpand1(expandedø1, env), loop); } while (originalø1 = loop[0], expandedø1 = loop[1], recur === loop); return recur; }.call(this); }; var syntaxQuote = exports.syntaxQuote = function syntaxQuote(form) { return isSymbol(form) ? list(symbol(void 0, 'quote'), form) : isKeyword(form) ? list(symbol(void 0, 'quote'), form) : isNumber(form) || isString(form) || isBoolean(form) || isNil(form) || isRePattern(form) ? form : isUnquote(form) ? second(form) : isUnquoteSplicing(form) ? readerError('Illegal use of `~@` expression, can only be present in a list') : isEmpty(form) ? form : isDictionary(form) ? list(symbol(void 0, 'apply'), symbol(void 0, 'dictionary'), cons(symbol(void 0, '.concat'), sequenceExpand(concat.apply(void 0, seq(form))))) : isVector(form) ? cons(symbol(void 0, '.concat'), sequenceExpand(form)) : isList(form) ? isEmpty(form) ? cons(symbol(void 0, 'list'), void 0) : list(symbol(void 0, 'apply'), symbol(void 0, 'list'), cons(symbol(void 0, '.concat'), sequenceExpand(form))) : 'else' ? readerError('Unknown Collection type') : void 0; }; var syntaxQuoteExpand = exports.syntaxQuoteExpand = syntaxQuote; var unquoteSplicingExpand = exports.unquoteSplicingExpand = function unquoteSplicingExpand(form) { return isVector(form) ? form : list(symbol(void 0, 'vec'), form); }; var sequenceExpand = exports.sequenceExpand = function sequenceExpand(forms) { return map(function (form) { return isUnquote(form) ? [second(form)] : isUnquoteSplicing(form) ? unquoteSplicingExpand(second(form)) : 'else' ? [syntaxQuoteExpand(form)] : void 0; }, forms); }; installMacro('syntax-quote', syntaxQuoteExpand); var expandNotEqual = exports.expandNotEqual = function expandNotEqual() { var body = Array.prototype.slice.call(arguments, 0); return list.apply(void 0, [symbol(void 0, 'not')].concat([list.apply(void 0, [symbol(void 0, '=')].concat(vec(body)))])); }; installMacro('not=', expandNotEqual); var expandIfNot = exports.expandIfNot = function expandIfNot(condition, truthy, alternative) { return list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'not')].concat([condition]))], [truthy], [alternative])); }; installMacro('if-not', expandIfNot); var expandComment = exports.expandComment = function expandComment() { var body = Array.prototype.slice.call(arguments, 0); return void 0; }; installMacro('comment', expandComment); var expandThreadFirst = exports.expandThreadFirst = function expandThreadFirst() { var operations = Array.prototype.slice.call(arguments, 0); return reduce(function (form, operation) { return cons(first(operation), cons(form, rest(operation))); }, first(operations), map(function ($1) { return isList($1) ? $1 : list.apply(void 0, [$1].concat()); }, rest(operations))); }; installMacro('->', expandThreadFirst); var expandThreadLast = exports.expandThreadLast = function expandThreadLast() { var operations = Array.prototype.slice.call(arguments, 0); return reduce(function (form, operation) { return concat(operation, [form]); }, first(operations), map(function ($1) { return isList($1) ? $1 : list.apply(void 0, [$1].concat()); }, rest(operations))); }; installMacro('->>', expandThreadLast); var expandDots = exports.expandDots = function expandDots(x) { var forms = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, '->')].concat([x], vec(map(function ($1) { return isList($1) ? cons(symbol(void 0, '.'), $1) : list(symbol(void 0, '.'), $1); }, forms)))); }; installMacro('..', expandDots); var expandThreadAs = exports.expandThreadAs = function expandThreadAs(expr, name) { var forms = Array.prototype.slice.call(arguments, 2); return list.apply(void 0, [symbol(void 0, 'let')].concat([[name].concat([expr], vec(mapcat(function (form) { return [ name, form ]; }, forms)))], [name])); }; installMacro('as->', expandThreadAs); var expandCond = exports.expandCond = function expandCond() { var clauses = Array.prototype.slice.call(arguments, 0); return !isEmpty(clauses) ? list(symbol(void 0, 'if'), first(clauses), isEmpty(rest(clauses)) ? (function () { throw Error('cond requires an even number of forms'); })() : second(clauses), cons(symbol(void 0, 'cond'), rest(rest(clauses)))) : void 0; }; installMacro('cond', expandCond); var expandCase = exports.expandCase = function expandCase(e) { var clauses = Array.prototype.slice.call(arguments, 1); return function () { var symø1 = isSymbol(e) ? e : gensym('case-binding'); var pairsø1 = partition(2, clauses); var eq_ø1 = function (c) { return list.apply(void 0, [symbol(void 0, '=')].concat([symø1], [list.apply(void 0, [symbol(void 0, 'quote')].concat([c]))])); }; var tailø1 = isOdd(count(clauses)) ? last(clauses) : list.apply(void 0, [symbol(void 0, 'throw')].concat([list.apply(void 0, [symbol(void 0, 'Error')].concat([list.apply(void 0, [symbol(void 0, 'str')].concat(['No matching clause: '], [symø1]))]))])); return function loop() { var recur = loop; var pairsø2 = pairsø1; var condsø1 = []; do { recur = isEmpty(pairsø2) ? function () { var resultø1 = list.apply(void 0, [symbol(void 0, 'cond')].concat(vec(condsø1), ['\uA789else'], [tailø1])); return isEqual(e, symø1) ? resultø1 : list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([e])], [resultø1])); }.call(this) : function () { var xø1 = first(pairsø2); var xsø1 = rest(pairsø2); var constsø1 = first(xø1); var resø1 = second(xø1); return loop[0] = xsø1, loop[1] = conj(condsø1, !isList(constsø1) ? eq_ø1(constsø1) : list.apply(void 0, [symbol(void 0, 'or')].concat(vec(map(eq_ø1, constsø1)))), resø1), loop; }.call(this); } while (pairsø2 = loop[0], condsø1 = loop[1], recur === loop); return recur; }.call(this); }.call(this); }; installMacro('case', expandCase); var expandCondp = exports.expandCondp = function expandCondp(pred, expr) { var clauses = Array.prototype.slice.call(arguments, 2); return function () { var sym_ø1 = gensym('condp-binding'); var symø1 = isSymbol(expr) ? expr : sym_ø1; var compareø1 = function (x) { return list.apply(void 0, [pred].concat([x], [symø1])); }; var splitsø1 = function splits(xs) { return isEmpty(xs) ? list.apply(void 0, [symbol(void 0, 'throw')].concat([list.apply(void 0, [symbol(void 0, 'Error')].concat([list.apply(void 0, [symbol(void 0, 'str')].concat(['No matching clause: '], [symø1]))]))])) : isEqual(1, count(xs)) ? first(xs) : isEqual('\uA789>>', second(xs)) ? list.apply(void 0, [symbol(void 0, 'if-let')].concat([[sym_ø1].concat([compareø1(first(xs))])], [list.apply(void 0, [third(xs)].concat([sym_ø1]))], [splits(drop(3, xs))])) : 'else' ? list.apply(void 0, [symbol(void 0, 'if')].concat([compareø1(first(xs))], [second(xs)], [splits(drop(2, xs))])) : void 0; }; return isEqual(symø1, expr) ? splitsø1(clauses) : list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([expr])], [splitsø1(clauses)])); }.call(this); }; installMacro('condp', expandCondp); var _thread = function _thread(insert, sym, test, form) { return function () { var formø2 = isList(form) ? form : list(form); return list.apply(void 0, [symbol(void 0, 'if')].concat([test], [sym], [insert(sym, formø2)])); }.call(this); }; var _condThread = function _condThread(expr, clauses, insert) { return function () { var symø1 = gensym('cond-thread-binding'); return list.apply(void 0, [symbol(void 0, 'as->')].concat([expr], [symø1], vec(map(function ($1) { return _thread(insert, symø1, list.apply(void 0, [symbol(void 0, 'not')].concat([first($1)])), second($1)); }, partition(2, clauses))))); }.call(this); }; var expandCondThreadFirst = exports.expandCondThreadFirst = function expandCondThreadFirst(expr) { var clauses = Array.prototype.slice.call(arguments, 1); return _condThread(expr, clauses, function (sym, form) { return list.apply(void 0, [ first(form), sym ].concat(vec(rest(form)))); }); }; installMacro('cond->', expandCondThreadFirst); var expandCondThreadLast = exports.expandCondThreadLast = function expandCondThreadLast(expr) { var clauses = Array.prototype.slice.call(arguments, 1); return _condThread(expr, clauses, function (sym, form) { return list.apply(void 0, vec(concat(form, [sym]))); }); }; installMacro('cond->>', expandCondThreadLast); var _someThread = function _someThread(expr, forms, insert) { return function () { var symø1 = gensym('some-thread-binding'); return list.apply(void 0, [symbol(void 0, 'as->')].concat([expr], [symø1], vec(map(function ($1) { return _thread(insert, symø1, list.apply(void 0, [symbol(void 0, 'nil?')].concat([symø1])), $1); }, forms)))); }.call(this); }; var expandSomeThreadFirst = exports.expandSomeThreadFirst = function expandSomeThreadFirst(expr) { var forms = Array.prototype.slice.call(arguments, 1); return _someThread(expr, forms, function (sym, form) { return list.apply(void 0, [ first(form), sym ].concat(vec(rest(form)))); }); }; installMacro('some->', expandSomeThreadFirst); var expandSomeThreadLast = exports.expandSomeThreadLast = function expandSomeThreadLast(expr) { var forms = Array.prototype.slice.call(arguments, 1); return _someThread(expr, forms, function (sym, form) { return list.apply(void 0, vec(concat(form, [sym]))); }); }; installMacro('some->>', expandSomeThreadLast); var expandDefn = exports.expandDefn = function expandDefn(_andForm, name) { var docPlusMetaPlusBody = Array.prototype.slice.call(arguments, 2); return function () { var docø1 = isString(first(docPlusMetaPlusBody)) ? first(docPlusMetaPlusBody) : void 0; var metaPlusBodyø1 = docø1 ? rest(docPlusMetaPlusBody) : docPlusMetaPlusBody; var metadataø1 = isDictionary(first(metaPlusBodyø1)) ? conj({ 'doc': docø1 }, first(metaPlusBodyø1)) : void 0; var bodyø1 = metadataø1 ? rest(metaPlusBodyø1) : metaPlusBodyø1; var idø1 = withMeta(name, conj(meta(name) || {}, metadataø1)); var fnø1 = withMeta(list.apply(void 0, [symbol(void 0, 'fn')].concat([idø1], vec(bodyø1))), meta(_andForm)); return list.apply(void 0, [symbol(void 0, 'def')].concat([idø1], [fnø1])); }.call(this); }; installMacro('defn', withMeta(expandDefn, { 'implicit': ['&form'] })); var expandPrivateDefn = exports.expandPrivateDefn = function expandPrivateDefn(name) { var body = Array.prototype.slice.call(arguments, 1); return function () { var metadataø1 = conj(meta(name) || {}, { 'private': true }); var idø1 = withMeta(name, metadataø1); return list.apply(void 0, [symbol(void 0, 'defn')].concat([idø1], vec(body))); }.call(this); }; installMacro('defn-', expandPrivateDefn); var expandLazySeq = exports.expandLazySeq = function expandLazySeq() { var body = Array.prototype.slice.call(arguments, 0); return list.apply(void 0, [symbol(void 0, '.call')].concat([symbol(void 0, 'lazy-seq')], [void 0], [false], [list.apply(void 0, [symbol(void 0, 'fn')].concat([[]], vec(body)))])); }; installMacro('lazy-seq', expandLazySeq); var expandWhen = exports.expandWhen = function expandWhen(test) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'if')].concat([test], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))])); }; installMacro('when', expandWhen); var expandWhenNot = exports.expandWhenNot = function expandWhenNot(test) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'when')].concat([list.apply(void 0, [symbol(void 0, 'not')].concat([test]))], vec(body))); }; installMacro('when-not', expandWhenNot); var expandIfLet = exports.expandIfLet = function expandIfLet(bindings, then, else_) { return function () { var nameø1 = first(bindings); var testø1 = second(bindings); var symø1 = gensym('if-let-binding'); return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([testø1])], [list.apply(void 0, [symbol(void 0, 'if')].concat([symø1], [list.apply(void 0, [symbol(void 0, 'let')].concat([[nameø1].concat([symø1])], [then]))], [else_]))])); }.call(this); }; installMacro('if-let', expandIfLet); var expandWhenLet = exports.expandWhenLet = function expandWhenLet(bindings) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'if-let')].concat([bindings], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))])); }; installMacro('when-let', expandWhenLet); var expandIfSome = exports.expandIfSome = function expandIfSome(bindings, then, else_) { return function () { var nameø1 = first(bindings); var testø1 = second(bindings); var symø1 = isSymbol(nameø1) ? nameø1 : gensym('if-some-binding'); return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([testø1])], [list.apply(void 0, [symbol(void 0, 'if-not')].concat([list.apply(void 0, [symbol(void 0, 'nil?')].concat([symø1]))], [list.apply(void 0, [symbol(void 0, 'let')].concat([[nameø1].concat([symø1])], [then]))], [else_]))])); }.call(this); }; installMacro('if-some', expandIfSome); var expandWhenSome = exports.expandWhenSome = function expandWhenSome(bindings) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'if-some')].concat([bindings], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))])); }; installMacro('when-some', expandWhenSome); var expandWhenFirst = exports.expandWhenFirst = function expandWhenFirst(bindings) { var body = Array.prototype.slice.call(arguments, 1); return function () { var nameø1 = first(bindings); var testø1 = second(bindings); return list.apply(void 0, [symbol(void 0, 'when-let')].concat([[[nameø1].concat()].concat([list.apply(void 0, [symbol(void 0, 'seq*')].concat([testø1]))])], vec(body))); }.call(this); }; installMacro('when-first', expandWhenFirst); var expandWhile = exports.expandWhile = function expandWhile(test) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'loop')].concat([[]], [list.apply(void 0, [symbol(void 0, 'when')].concat([test], vec(body), [list.apply(void 0, [symbol(void 0, 'recur')].concat())]))])); }; installMacro('while', expandWhile); var expandDoto = exports.expandDoto = function expandDoto(x) { var forms = Array.prototype.slice.call(arguments, 1); return function () { var symø1 = gensym('doto-binding'); return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([x])], vec(map(function ($1) { return concat([ first($1), symø1 ], rest($1)); }, forms)), [symø1])); }.call(this); }; installMacro('doto', expandDoto); var expandDotimes = exports.expandDotimes = function expandDotimes(bindings) { var body = Array.prototype.slice.call(arguments, 1); return function () { var nameø1 = first(bindings); var nø1 = second(bindings); var symø1 = gensym('dotimes-binding'); return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([nø1])], [list.apply(void 0, [symbol(void 0, 'loop')].concat([[nameø1].concat([0])], [list.apply(void 0, [symbol(void 0, 'when')].concat([list.apply(void 0, [symbol(void 0, '<')].concat([nameø1], [symø1]))], vec(body), [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'inc')].concat([nameø1]))]))]))]))])); }.call(this); }; installMacro('dotimes', expandDotimes); var forStep = function forStep(context, loop) { var modifiers = Array.prototype.slice.call(arguments, 2); return function () { var iterø1 = (context || 0)['iter']; var collø1 = (context || 0)['coll']; var bodyø1 = (context || 0)['body']; var subseqø1 = (context || 0)['subseq']; var body_ø1 = !subseqø1 ? bodyø1 : list.apply(void 0, [symbol(void 0, 'let')].concat([[subseqø1].concat([bodyø1])], [list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'empty?')].concat([subseqø1]))], [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))], [list.apply(void 0, [symbol(void 0, 'lazy-concat')].concat([subseqø1], [list.apply(void 0, [iterø1].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))]))]))])); var nextø1 = function loop() { var recur = loop; var modsø1 = reverse(modifiers); var bodyø2 = body_ø1; do { recur = isEmpty(modsø1) ? bodyø2 : function () { var mø1 = first(modsø1); var itemø1 = first(mø1); var argø1 = second(mø1); return loop[0] = rest(modsø1), loop[1] = isEqual(itemø1, '\uA789let') ? list.apply(void 0, [symbol(void 0, 'let')].concat([argø1], [bodyø2])) : isEqual(itemø1, '\uA789while') ? list.apply(void 0, [symbol(void 0, 'if')].concat([argø1], [bodyø2])) : isEqual(itemø1, '\uA789when') ? list.apply(void 0, [symbol(void 0, 'if')].concat([argø1], [bodyø2], [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))])) : void 0, loop; }.call(this); } while (modsø1 = loop[0], bodyø2 = loop[1], recur === loop); return recur; }.call(this); return merge(context, { 'subseq': gensym('for-subseq'), 'body': list.apply(void 0, [list.apply(void 0, [symbol(void 0, 'fn')].concat([iterø1], [[collø1].concat()], [list.apply(void 0, [symbol(void 0, 'lazy-seq')].concat([list.apply(void 0, [symbol(void 0, 'loop')].concat([[collø1].concat([collø1])], [list.apply(void 0, [symbol(void 0, 'if-not')].concat([list.apply(void 0, [symbol(void 0, 'empty?')].concat([collø1]))], [list.apply(void 0, [symbol(void 0, 'let')].concat([[first(loop)].concat([list.apply(void 0, [symbol(void 0, 'first')].concat([collø1]))])], [nextø1]))]))]))]))]))].concat([second(loop)])) }); }.call(this); }; var forModifiers = set('\uA789let', '\uA789while', '\uA789when'); var forParts = function forParts(seqExprPairs) { return function () { var nø1 = count(seqExprPairs); var indicesø1 = filter(function ($1) { return !forModifiers(first(seqExprPairs[$1])); }, range(nø1)); var segmentsø1 = partition(2, 1, conj(indicesø1, nø1)); return map(function ($1) { return seqExprPairs.slice(first($1), second($1)); }, segmentsø1); }.call(this); }; var expandFor = exports.expandFor = function expandFor(seqExprs, bodyExpr) { return function () { var iterø1 = gensym('for-iter'); var collø1 = gensym('for-coll'); var partsø1 = forParts(partition(2, seqExprs)); return (reduce(function ($1, $2) { return forStep.apply(void 0, [$1].concat($2)); }, { 'iter': iterø1, 'coll': collø1, 'body': list.apply(void 0, [symbol(void 0, 'cons')].concat([bodyExpr], [list.apply(void 0, [iterø1].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))])) }, reverse(partsø1)) || 0)['body']; }.call(this); }; installMacro('for', expandFor); var expandDoseq = exports.expandDoseq = function expandDoseq(seqExprs) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'dorun')].concat([list.apply(void 0, [symbol(void 0, 'for')].concat([seqExprs], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body), [void 0]))]))])); }; installMacro('doseq', expandDoseq); var sym_ = function sym_(string) { return function () { var wordsø1 = split(name(string), /-/); return join(cons(first(wordsø1), map(capitalize, rest(wordsø1)))); }.call(this); }; var bindSym_ = function bindSym_(s, b) { !isSymbol(s) ? (function () { throw Error('' + 'Assert failed: ' + 'Expected a symbol here!' + '(symbol? s)'); })() : void 0; return [ s, b ]; }; var conjSyms_ = function conjSyms_(get_, result, k, v, f, quote) { return function () { var kNsø1 = namespace(k); var gø1 = function ($1) { return f(kNsø1, name($1)); }; return vec(concat(result, mapcat(function ($1) { return bindSym_($1, get_($1, gø1($1), quote)); }, v))); }.call(this); }; var dictGet_ = function dictGet_(dictName, defaults) { return function (binding, key, quote) { return function () { var sø1 = name(key); var kø1 = keyword(namespace(key), isSymbol(key) ? sym_(sø1) : sø1); return list.apply(void 0, [symbol(void 0, 'get')].concat([dictName], [!quote ? kø1 : list.apply(void 0, [symbol(void 0, 'quote')].concat([kø1]))], [binding && defaults[binding]])); }.call(this); }; }; var destructureDict = exports.destructureDict = function destructureDict(binding, from) { return function () { var dictNameø1 = binding['\uA789as'] || gensym('destructure-bind'); var dictBindø1 = list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'dictionary?')].concat([dictNameø1]))], [dictNameø1], [list.apply(void 0, [symbol(void 0, 'apply')].concat([symbol(void 0, 'dictionary')], [list.apply(void 0, [symbol(void 0, 'vec')].concat([dictNameø1]))]))])); var get_ø1 = dictGet_(dictNameø1, get.apply(void 0, [ binding, '\uA789or', {} ])); return function loop() { var recur = loop; var ksø1 = keys(dissoc(binding, '\uA789as', '\uA789or')); var resultø1 = [ dictNameø1, from, dictNameø1, dictBindø1 ]; do { recur = isEmpty(ksø1) ? resultø1 : function () { var kø1 = first(ksø1); var vø1 = (binding || 0)[kø1]; var k_ø1 = isKeyword(kø1) && name(kø1); !(isSymbol(kø1) || k_ø1 && set('keys', 'strs', 'syms')(k_ø1)) ? (function () { throw Error('' + 'Assert failed: ' + ('' + 'Invalid destructure key ' + kø1) + '(or (symbol? k) (and k* ((set :keys :strs :syms) k*)))'); })() : void 0; return loop[0] = rest(ksø1), loop[1] = isEqual(k_ø1, 'strs') ? conjSyms_(get_ø1, resultø1, kø1, vø1, keyword) : isEqual(k_ø1, 'syms') ? conjSyms_(get_ø1, resultø1, kø1, vø1, function ($1, $2) { return symbol($1, sym_($2)); }) : isEqual(k_ø1, 'keys') ? conjSyms_(get_ø1, resultø1, kø1, vø1, keyword, 'quote') : isNumber(vø1) ? conj(resultø1, kø1, get_ø1(kø1, symbol('' + vø1))) : 'else' ? conj(resultø1, kø1, get_ø1(kø1, vø1)) : void 0, loop; }.call(this); } while (ksø1 = loop[0], resultø1 = loop[1], recur === loop); return recur; }.call(this); }.call(this); }; var destructureSeq = exports.destructureSeq = function destructureSeq(binding, from) { return function () { var asø1 = binding.findIndex(function ($1) { return isEqual($1, '\uA789as'); }); var seqNameø1 = asø1 < 0 ? gensym('destructure-bind') : nth(binding, inc(asø1)); var binding1ø1 = asø1 < 0 ? binding : take(asø1, binding); var moreø1 = binding1ø1.findIndex(function ($1) { return isEqual($1, symbol(void 0, '&')); }); var tailø1 = moreø1 >= 0 ? nth(binding1ø1, inc(moreø1)) : void 0; var binding2ø1 = moreø1 < 0 ? binding1ø1 : take(moreø1, binding); !(asø1 < 0 || isEqual(asø1, count(binding) - 2)) ? (function () { throw Error('' + 'Assert failed: ' + 'invalid :as in seq-destructuring' + '(or (< as 0) (= as (- (count binding) 2)))'); })() : void 0; !(moreø1 < 0 || isEqual(moreø1, count(binding1ø1) - 2)) ? (function () { throw Error('' + 'Assert failed: ' + 'invalid & in seq-destructuring' + '(or (< more 0) (= more (- (count binding1) 2)))'); })() : void 0; return function loop() { var recur = loop; var xsø1 = binding2ø1; var iø1 = 0; var resultø1 = [ seqNameø1, from ]; do { recur = function () { var xø1 = first(xsø1); return isEmpty(xsø1) ? !tailø1 ? resultø1 : conj(resultø1, tailø1, list.apply(void 0, [symbol(void 0, 'drop')].concat([moreø1], [seqNameø1]))) : isEqual(xø1, symbol(void 0, '_')) ? (loop[0] = rest(xsø1), loop[1] = inc(iø1), loop[2] = resultø1, loop) : 'else' ? (loop[0] = rest(xsø1), loop[1] = inc(iø1), loop[2] = conj(resultø1, xø1, list.apply(void 0, [symbol(void 0, 'nth')].concat([seqNameø1], [iø1]))), loop) : void 0; }.call(this); } while (xsø1 = loop[0], iø1 = loop[1], resultø1 = loop[2], recur === loop); return recur; }.call(this); }.call(this); }; var destructure = exports.destructure = function destructure(bindings) { return function () { var pairsø1 = partition(2, bindings); return isEvery(function ($1) { return isSymbol(first($1)); }, pairsø1) ? bindings : destructure(vec(mapcat(function ($1) { return isVector(first($1)) ? destructureSeq.apply(void 0, $1) : isDictionary(first($1)) ? destructureDict.apply(void 0, $1) : isSymbol(first($1)) ? $1 : 'else' ? (function () { throw 'Invalid binding'; })() : void 0; }, pairsø1))); }.call(this); }; var bindNames_ = function bindNames_(keys) { return zipmap(keys, repeatedly(count(keys), function () { return gensym('destructure-bind'); })); }; var bindIndices_ = function bindIndices_(names) { return filter(function ($1) { return !isSymbol(nth(names, $1)); }, range(count(names))); }; var expandLet = exports.expandLet = function expandLet(bindings) { var body = Array.prototype.slice.call(arguments, 1); return list.apply(void 0, [symbol(void 0, 'let*')].concat([destructure(bindings)], vec(body))); }; installMacro('let', expandLet); var expandFn = exports.expandFn = function expandFn() { var args = Array.prototype.slice.call(arguments, 0); return function () { var nameø1 = isSymbol(first(args)) ? first(args) : void 0; var defsø1 = nameø1 ? rest(args) : args; var mkfnø1 = function ($1) { return nameø1 ? list.apply(void 0, [symbol(void 0, 'fn*')].concat([nameø1], vec($1))) : list.apply(void 0, [symbol(void 0, 'fn*')].concat(vec($1))); }; var def_ø1 = function (args) { var body = Array.prototype.slice.call(arguments, 1); return function () { var indicesø1 = bindIndices_(args); var namesø1 = bindNames_(indicesø1); return isEmpty(namesø1) ? cons(args, body) : list.apply(void 0, [vec(mapIndexed(function ($1, $2) { return get.apply(void 0, [ namesø1, $1, $2 ]); }, args))].concat([list.apply(void 0, [symbol(void 0, 'let')].concat([vec(mapcat(function (i) { return [ args[i], namesø1[i] ]; }, indicesø1))], vec(body)))])); }.call(this); }; return isVector(first(defsø1)) ? mkfnø1(def_ø1.apply(void 0, defsø1)) : mkfnø1(map(function ($1) { return def_ø1.apply(void 0, vec($1)); }, defsø1)); }.call(this); }; installMacro('fn', expandFn); var expandLoop = exports.expandLoop = function expandLoop(bindings) { var body = Array.prototype.slice.call(arguments, 1); return function () { var pairsø1 = partition(2, bindings); var indicesø1 = bindIndices_(mapv(first, pairsø1)); var namesø1 = bindNames_(indicesø1); var get_ø1 = function ($1, $2) { return function () { var ifLetBinding1ø1 = namesø1[$1]; return ifLetBinding1ø1 ? function () { var xø1 = ifLetBinding1ø1; return [ xø1, second($2), first($2), xø1 ]; }.call(this) : $2; }.call(this); }; return isEmpty(namesø1) ? list.apply(void 0, [symbol(void 0, 'loop*')].concat([bindings], vec(body))) : list.apply(void 0, [symbol(void 0, 'let')].concat([vec(concat.apply(void 0, mapIndexed(get_ø1, pairsø1)))], [list.apply(void 0, [symbol(void 0, 'loop*')].concat([vec(concat.apply(void 0, mapIndexed(function ($1, $2) { return function () { var xø1 = get.apply(void 0, [ namesø1, $1, first($2) ]); return [ xø1, xø1 ]; }.call(this); }, pairsø1)))], [list.apply(void 0, [symbol(void 0, 'let')].concat([vec(mapcat(function (i) { return [ first(pairsø1[i]), namesø1[i] ]; }, indicesø1))], vec(body)))]))])); }.call(this); }; installMacro('loop', expandLoop); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsIm1ldGEiLCJ3aXRoTWV0YSIsImlzU3ltYm9sIiwiaXNLZXl3b3JkIiwia2V5d29yZCIsImlzUXVvdGUiLCJzeW1ib2wiLCJuYW1lc3BhY2UiLCJuYW1lIiwiZ2Vuc3ltIiwiaXNVbnF1b3RlIiwiaXNVbnF1b3RlU3BsaWNpbmciLCJpc0xpc3QiLCJsaXN0IiwiY29uaiIsInBhcnRpdGlvbiIsInNlcSIsInJlcGVhdGVkbHkiLCJpc0VtcHR5IiwibWFwIiwibWFwdiIsInZlYyIsInNldCIsImlzRXZlcnkiLCJjb25jYXQiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwicmVzdCIsImxhc3QiLCJtYXBjYXQiLCJudGgiLCJidXRsYXN0IiwiaW50ZXJsZWF2ZSIsImNvbnMiLCJjb3VudCIsInRha2UiLCJkaXNzb2MiLCJzb21lIiwiYXNzb2MiLCJyZWR1Y2UiLCJmaWx0ZXIiLCJpc1NlcSIsInppcG1hcCIsImRyb3AiLCJsYXp5U2VxIiwicmFuZ2UiLCJyZXZlcnNlIiwiZG9ydW4iLCJtYXBJbmRleGVkIiwiaXNOaWwiLCJpc0RpY3Rpb25hcnkiLCJpc1ZlY3RvciIsImtleXMiLCJnZXQiLCJ2YWxzIiwiaXNTdHJpbmciLCJpc051bWJlciIsImlzQm9vbGVhbiIsImlzRGF0ZSIsImlzUmVQYXR0ZXJuIiwiaXNFdmVuIiwiaXNPZGQiLCJpc0VxdWFsIiwibWF4IiwiaW5jIiwiZGVjIiwiZGljdGlvbmFyeSIsIm1lcmdlIiwic3VicyIsInNwbGl0Iiwiam9pbiIsImNhcGl0YWxpemUiLCJfX21hY3Jvc19fIiwiZXhwb3J0cyIsImV4cGFuZCIsImV4cGFuZGVyIiwiZm9ybSIsImVudiIsIm1ldGFkYXRhw7gxIiwicGFybWFzw7gxIiwiaW1wbGljaXTDuDEiLCIkMSIsInBhcmFtc8O4MSIsImV4cGFuc2lvbsO4MSIsImluc3RhbGxNYWNybyIsIm9wIiwibWFjcm8iLCJpc0RvdFN5bnRheCIsImlzTWV0aG9kU3ludGF4IiwiaWTDuDEiLCJpc0ZpZWxkU3ludGF4IiwiaXNOZXdTeW50YXgiLCJtZXRob2RTeW50YXgiLCJ0YXJnZXQiLCJwYXJhbXMiLCJvcE1ldGHDuDEiLCJmb3JtU3RhcnTDuDEiLCJ0YXJnZXRNZXRhw7gxIiwibWVtYmVyw7gxIiwiYWdldMO4MSIsIm1ldGhvZMO4MSIsIkVycm9yIiwiZmllbGRTeW50YXgiLCJmaWVsZCIsIm1vcmUiLCJzdGFydMO4MSIsImVuZMO4MSIsImRvdFN5bnRheCIsIl9maWVsZMO4MSIsIm5ld1N5bnRheCIsImlkTWV0YcO4MSIsInJlbmFtZcO4MSIsImNvbnN0cnVjdG9yw7gxIiwib3BlcmF0b3LDuDEiLCJrZXl3b3JkSW52b2tlIiwiZGVmYXVsdF8iLCJkZXN1Z2FyIiwiZGVzdWdhcmVkw7gxIiwibWFjcm9leHBhbmQxIiwib3DDuDEiLCJleHBhbmRlcsO4MSIsIm1hY3JvZXhwYW5kIiwib3JpZ2luYWzDuDEiLCJleHBhbmRlZMO4MSIsInN5bnRheFF1b3RlIiwicmVhZGVyRXJyb3IiLCJzZXF1ZW5jZUV4cGFuZCIsInN5bnRheFF1b3RlRXhwYW5kIiwidW5xdW90ZVNwbGljaW5nRXhwYW5kIiwiZm9ybXMiLCJleHBhbmROb3RFcXVhbCIsImJvZHkiLCJleHBhbmRJZk5vdCIsImNvbmRpdGlvbiIsInRydXRoeSIsImFsdGVybmF0aXZlIiwiZXhwYW5kQ29tbWVudCIsImV4cGFuZFRocmVhZEZpcnN0Iiwib3BlcmF0aW9ucyIsIm9wZXJhdGlvbiIsImV4cGFuZFRocmVhZExhc3QiLCJleHBhbmREb3RzIiwieCIsImV4cGFuZFRocmVhZEFzIiwiZXhwciIsImV4cGFuZENvbmQiLCJjbGF1c2VzIiwiZXhwYW5kQ2FzZSIsImUiLCJzeW3DuDEiLCJwYWlyc8O4MSIsImVxX8O4MSIsImMiLCJ0YWlsw7gxIiwicGFpcnPDuDIiLCJjb25kc8O4MSIsInJlc3VsdMO4MSIsInjDuDEiLCJ4c8O4MSIsImNvbnN0c8O4MSIsInJlc8O4MSIsImV4cGFuZENvbmRwIiwicHJlZCIsInN5bV/DuDEiLCJjb21wYXJlw7gxIiwic3BsaXRzw7gxIiwic3BsaXRzIiwieHMiLCJfdGhyZWFkIiwiaW5zZXJ0Iiwic3ltIiwidGVzdCIsImZvcm3DuDIiLCJfY29uZFRocmVhZCIsImV4cGFuZENvbmRUaHJlYWRGaXJzdCIsImV4cGFuZENvbmRUaHJlYWRMYXN0IiwiX3NvbWVUaHJlYWQiLCJleHBhbmRTb21lVGhyZWFkRmlyc3QiLCJleHBhbmRTb21lVGhyZWFkTGFzdCIsImV4cGFuZERlZm4iLCJfYW5kRm9ybSIsImRvY1BsdXNNZXRhUGx1c0JvZHkiLCJkb2PDuDEiLCJtZXRhUGx1c0JvZHnDuDEiLCJib2R5w7gxIiwiZm7DuDEiLCJleHBhbmRQcml2YXRlRGVmbiIsImV4cGFuZExhenlTZXEiLCJleHBhbmRXaGVuIiwiZXhwYW5kV2hlbk5vdCIsImV4cGFuZElmTGV0IiwiYmluZGluZ3MiLCJ0aGVuIiwiZWxzZV8iLCJuYW1lw7gxIiwidGVzdMO4MSIsImV4cGFuZFdoZW5MZXQiLCJleHBhbmRJZlNvbWUiLCJleHBhbmRXaGVuU29tZSIsImV4cGFuZFdoZW5GaXJzdCIsImV4cGFuZFdoaWxlIiwiZXhwYW5kRG90byIsImV4cGFuZERvdGltZXMiLCJuw7gxIiwiZm9yU3RlcCIsImNvbnRleHQiLCJsb29wIiwibW9kaWZpZXJzIiwiaXRlcsO4MSIsImNvbGzDuDEiLCJzdWJzZXHDuDEiLCJib2R5X8O4MSIsIm5leHTDuDEiLCJtb2Rzw7gxIiwiYm9kecO4MiIsIm3DuDEiLCJpdGVtw7gxIiwiYXJnw7gxIiwiZm9yTW9kaWZpZXJzIiwiZm9yUGFydHMiLCJzZXFFeHByUGFpcnMiLCJpbmRpY2Vzw7gxIiwic2VnbWVudHPDuDEiLCJzbGljZSIsImV4cGFuZEZvciIsInNlcUV4cHJzIiwiYm9keUV4cHIiLCJwYXJ0c8O4MSIsIiQyIiwiZXhwYW5kRG9zZXEiLCJzeW1fIiwic3RyaW5nIiwid29yZHPDuDEiLCJiaW5kU3ltXyIsInMiLCJiIiwiY29ualN5bXNfIiwiZ2V0XyIsInJlc3VsdCIsImsiLCJ2IiwiZiIsInF1b3RlIiwia05zw7gxIiwiZ8O4MSIsImRpY3RHZXRfIiwiZGljdE5hbWUiLCJkZWZhdWx0cyIsImJpbmRpbmciLCJrZXkiLCJzw7gxIiwia8O4MSIsImRlc3RydWN0dXJlRGljdCIsImZyb20iLCJkaWN0TmFtZcO4MSIsImRpY3RCaW5kw7gxIiwiZ2V0X8O4MSIsImtzw7gxIiwidsO4MSIsImtfw7gxIiwiZGVzdHJ1Y3R1cmVTZXEiLCJhc8O4MSIsImZpbmRJbmRleCIsInNlcU5hbWXDuDEiLCJiaW5kaW5nMcO4MSIsIm1vcmXDuDEiLCJiaW5kaW5nMsO4MSIsImnDuDEiLCJkZXN0cnVjdHVyZSIsImJpbmROYW1lc18iLCJiaW5kSW5kaWNlc18iLCJuYW1lcyIsImV4cGFuZExldCIsImV4cGFuZEZuIiwiYXJncyIsImRlZnPDuDEiLCJta2Zuw7gxIiwiZGVmX8O4MSIsIm5hbWVzw7gxIiwiaSIsImV4cGFuZExvb3AiXSwibWFwcGluZ3MiOiI7SUFBQSxJQUFDQSxJLEdBQUQ7QUFBQSxZQUFBQyxFLEVBQUksZUFBSjtBQUFBLFlBQUFDLEcsRUFDRSx1Q0FERjtBQUFBLFU7O1FBRThCQyxJQUFBLEcsU0FBQUEsSTtRQUFLQyxRQUFBLEcsU0FBQUEsUTtRQUFVQyxRQUFBLEcsU0FBQUEsUTtRQUFRQyxTQUFBLEcsU0FBQUEsUztRQUFTQyxPQUFBLEcsU0FBQUEsTztRQUNoQ0MsT0FBQSxHLFNBQUFBLE87UUFBT0MsTUFBQSxHLFNBQUFBLE07UUFBT0MsU0FBQSxHLFNBQUFBLFM7UUFBVUMsSUFBQSxHLFNBQUFBLEk7UUFBS0MsTUFBQSxHLFNBQUFBLE07UUFDN0JDLFNBQUEsRyxTQUFBQSxTO1FBQVNDLGlCQUFBLEcsU0FBQUEsaUI7O1FBQ0pDLE1BQUEsRyxjQUFBQSxNO1FBQU1DLElBQUEsRyxjQUFBQSxJO1FBQUtDLElBQUEsRyxjQUFBQSxJO1FBQUtDLFNBQUEsRyxjQUFBQSxTO1FBQVVDLEdBQUEsRyxjQUFBQSxHO1FBQUlDLFVBQUEsRyxjQUFBQSxVO1FB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