mirror of https://github.com/jkjoy/sunpeiwen.git
1 line
21 KiB
Plaintext
1 line
21 KiB
Plaintext
{"version":3,"names":["collectLoopBodyBindingsVisitor","path","skip","Scope","state","isFunctionParent","bindings","scope","name","Object","keys","binding","kind","blockScoped","push","getLoopBodyBindings","loopPath","traverse","getUsageInBody","seen","WeakSet","capturedInClosure","constantViolations","filterMap","inBody","inClosure","relativeLoopLocation","id","isUpdateExpression","get","isAssignmentExpression","add","node","references","referencePaths","has","hasConstantViolations","length","usages","concat","bodyPath","currPath","parentPath","isFunction","isClass","Error","collectCompletionsAndVarsVisitor","Function","LabeledStatement","enter","labelsStack","label","exit","popped","pop","Loop","_","labellessContinueTargets","labellessBreakTargets","SwitchStatement","includes","isBreakStatement","breaksContinues","ReturnStatement","returns","VariableDeclaration","parent","loopNode","isVarInLoopHead","vars","wrapLoopBody","captured","updatedBindingsUsages","callArgs","closureParams","updater","updatedUsage","t","identifier","innerName","generateUid","assignmentExpression","replaceWith","fn","functionExpression","toBlock","body","call","callExpression","fnParent","findParent","p","async","generator","yieldExpression","awaitExpression","updaterNode","expressionStatement","sequenceExpression","varPath","insertBefore","variableDeclaration","variableDeclarator","bodyStmts","varNames","assign","decl","declarations","getBindingIdentifiers","init","replacement","isForStatement","isForXStatement","left","remove","map","completionId","injected","Set","type","returnStatement","stringLiteral","cloneNode","template","statement","ast","arg","argument","buildUndefinedNode","blockStatement","key","list","result","item","mapped"],"sources":["../src/loop.ts"],"sourcesContent":["import { template, types as t } from \"@babel/core\";\nimport type { NodePath, Visitor, Binding } from \"@babel/traverse\";\n\ninterface LoopBodyBindingsState {\n blockScoped: Binding[];\n}\n\nconst collectLoopBodyBindingsVisitor: Visitor<LoopBodyBindingsState> = {\n \"Expression|Declaration|Loop\"(path) {\n path.skip();\n },\n Scope(path, state) {\n if (path.isFunctionParent()) path.skip();\n\n const { bindings } = path.scope;\n for (const name of Object.keys(bindings)) {\n const binding = bindings[name];\n if (\n binding.kind === \"let\" ||\n binding.kind === \"const\" ||\n binding.kind === \"hoisted\"\n ) {\n state.blockScoped.push(binding);\n }\n }\n },\n};\n\nexport function getLoopBodyBindings(loopPath: NodePath<t.Loop>) {\n const state: LoopBodyBindingsState = { blockScoped: [] };\n loopPath.traverse(collectLoopBodyBindingsVisitor, state);\n return state.blockScoped;\n}\n\nexport function getUsageInBody(binding: Binding, loopPath: NodePath<t.Loop>) {\n // UpdateExpressions are counted both as a reference and a mutation,\n // so we need to de-duplicate them.\n const seen = new WeakSet<t.Node>();\n\n let capturedInClosure = false;\n\n const constantViolations = filterMap(binding.constantViolations, path => {\n const { inBody, inClosure } = relativeLoopLocation(path, loopPath);\n if (!inBody) return null;\n capturedInClosure ||= inClosure;\n\n const id = path.isUpdateExpression()\n ? path.get(\"argument\")\n : path.isAssignmentExpression()\n ? path.get(\"left\")\n : null;\n if (id) seen.add(id.node);\n return id as NodePath<t.Identifier> | null;\n });\n\n const references = filterMap(binding.referencePaths, path => {\n if (seen.has(path.node)) return null;\n\n const { inBody, inClosure } = relativeLoopLocation(path, loopPath);\n if (!inBody) return null;\n capturedInClosure ||= inClosure;\n\n return path as NodePath<t.Identifier>;\n });\n\n return {\n capturedInClosure,\n hasConstantViolations: constantViolations.length > 0,\n usages: references.concat(constantViolations),\n };\n}\n\nfunction relativeLoopLocation(path: NodePath, loopPath: NodePath<t.Loop>) {\n const bodyPath = loopPath.get(\"body\");\n let inClosure = false;\n\n for (let currPath = path; currPath; currPath = currPath.parentPath) {\n if (currPath.isFunction() || currPath.isClass()) inClosure = true;\n if (currPath === bodyPath) {\n return { inBody: true, inClosure };\n } else if (currPath === loopPath) {\n return { inBody: false, inClosure };\n }\n }\n\n throw new Error(\n \"Internal Babel error: path is not in loop. Please report this as a bug.\",\n );\n}\n\ninterface CompletionsAndVarsState {\n breaksContinues: NodePath<t.BreakStatement | t.ContinueStatement>[];\n returns: NodePath<t.ReturnStatement>[];\n labelsStack: string[];\n labellessContinueTargets: number;\n labellessBreakTargets: number;\n\n vars: NodePath<t.VariableDeclaration>[];\n loopNode: t.Loop;\n}\n\nconst collectCompletionsAndVarsVisitor: Visitor<CompletionsAndVarsState> = {\n Function(path) {\n path.skip();\n },\n LabeledStatement: {\n enter({ node }, state) {\n state.labelsStack.push(node.label.name);\n },\n exit({ node }, state) {\n const popped = state.labelsStack.pop();\n if (popped !== node.label.name) {\n throw new Error(\"Assertion failure. Please report this bug to Babel.\");\n }\n },\n },\n Loop: {\n enter(_, state) {\n state.labellessContinueTargets++;\n state.labellessBreakTargets++;\n },\n exit(_, state) {\n state.labellessContinueTargets--;\n state.labellessBreakTargets--;\n },\n },\n SwitchStatement: {\n enter(_, state) {\n state.labellessBreakTargets++;\n },\n exit(_, state) {\n state.labellessBreakTargets--;\n },\n },\n \"BreakStatement|ContinueStatement\"(\n path: NodePath<t.BreakStatement | t.ContinueStatement>,\n state,\n ) {\n const { label } = path.node;\n if (label) {\n if (state.labelsStack.includes(label.name)) return;\n } else if (\n path.isBreakStatement()\n ? state.labellessBreakTargets > 0\n : state.labellessContinueTargets > 0\n ) {\n return;\n }\n state.breaksContinues.push(path);\n },\n ReturnStatement(path, state) {\n state.returns.push(path);\n },\n VariableDeclaration(path, state) {\n if (path.parent === state.loopNode && isVarInLoopHead(path)) return;\n if (path.node.kind === \"var\") state.vars.push(path);\n },\n};\n\nexport function wrapLoopBody(\n loopPath: NodePath<t.Loop>,\n captured: string[],\n updatedBindingsUsages: Map<string, NodePath<t.Identifier>[]>,\n) {\n const loopNode = loopPath.node;\n const state: CompletionsAndVarsState = {\n breaksContinues: [],\n returns: [],\n labelsStack: [],\n labellessBreakTargets: 0,\n labellessContinueTargets: 0,\n vars: [],\n loopNode,\n };\n loopPath.traverse(collectCompletionsAndVarsVisitor, state);\n\n const callArgs = [];\n const closureParams = [];\n const updater = [];\n for (const [name, updatedUsage] of updatedBindingsUsages) {\n callArgs.push(t.identifier(name));\n\n const innerName = loopPath.scope.generateUid(name);\n closureParams.push(t.identifier(innerName));\n updater.push(\n t.assignmentExpression(\"=\", t.identifier(name), t.identifier(innerName)),\n );\n for (const path of updatedUsage) path.replaceWith(t.identifier(innerName));\n }\n for (const name of captured) {\n if (updatedBindingsUsages.has(name)) continue; // already injected\n callArgs.push(t.identifier(name));\n closureParams.push(t.identifier(name));\n }\n\n const id = loopPath.scope.generateUid(\"loop\");\n const fn = t.functionExpression(\n null,\n closureParams,\n t.toBlock(loopNode.body),\n );\n let call: t.Expression = t.callExpression(t.identifier(id), callArgs);\n\n const fnParent = loopPath.findParent(p => p.isFunction());\n if (fnParent) {\n const { async, generator } = fnParent.node as t.Function;\n fn.async = async;\n fn.generator = generator;\n if (generator) call = t.yieldExpression(call, true);\n else if (async) call = t.awaitExpression(call);\n }\n\n const updaterNode =\n updater.length > 0\n ? t.expressionStatement(t.sequenceExpression(updater))\n : null;\n if (updaterNode) fn.body.body.push(updaterNode);\n\n // NOTE: Calling .insertBefore on the loop path might cause the\n // loop to be moved in the AST. For example, in\n // if (true) for (let x of y) ...\n // .insertBefore will replace the loop with a block:\n // if (true) { var _loop = ...; for (let x of y) ... }\n // All subsequent operations in this function on the loop node\n // must not assume that loopPath still represents the loop.\n // TODO: Consider using a function declaration\n const [varPath] = loopPath.insertBefore(\n t.variableDeclaration(\"var\", [t.variableDeclarator(t.identifier(id), fn)]),\n ) as [NodePath<t.VariableDeclaration>];\n\n const bodyStmts: t.Statement[] = [];\n\n const varNames: string[] = [];\n for (const varPath of state.vars) {\n const assign = [];\n for (const decl of varPath.node.declarations) {\n varNames.push(...Object.keys(t.getBindingIdentifiers(decl.id)));\n if (decl.init) {\n assign.push(t.assignmentExpression(\"=\", decl.id, decl.init));\n }\n }\n if (assign.length > 0) {\n let replacement: t.Node =\n assign.length === 1 ? assign[0] : t.sequenceExpression(assign);\n if (\n !t.isForStatement(varPath.parent, { init: varPath.node }) &&\n !t.isForXStatement(varPath.parent, { left: varPath.node })\n ) {\n replacement = t.expressionStatement(replacement);\n }\n varPath.replaceWith(replacement);\n } else {\n varPath.remove();\n }\n }\n if (varNames.length) {\n bodyStmts.push(\n t.variableDeclaration(\n \"var\",\n varNames.map(name => t.variableDeclarator(t.identifier(name))),\n ),\n );\n }\n\n if (state.breaksContinues.length === 0 && state.returns.length === 0) {\n bodyStmts.push(t.expressionStatement(call));\n } else {\n const completionId = loopPath.scope.generateUid(\"ret\");\n bodyStmts.push(\n t.variableDeclaration(\"var\", [\n t.variableDeclarator(t.identifier(completionId), call),\n ]),\n );\n\n const injected = new Set<string>();\n for (const path of state.breaksContinues) {\n const { node } = path;\n const { type, label } = node;\n let name = type === \"BreakStatement\" ? \"break\" : \"continue\";\n if (label) name += \"|\" + label.name;\n path.replaceWith(t.returnStatement(t.stringLiteral(name)));\n if (updaterNode) path.insertBefore(t.cloneNode(updaterNode));\n\n if (injected.has(name)) continue;\n injected.add(name);\n\n bodyStmts.push(\n template.statement.ast`\n if (\n ${t.identifier(completionId)} === ${t.stringLiteral(name)}\n ) ${node}\n `,\n );\n }\n if (state.returns.length) {\n for (const path of state.returns) {\n const arg = path.node.argument || path.scope.buildUndefinedNode();\n path.replaceWith(\n template.statement.ast`\n return { v: ${arg} };\n `,\n );\n }\n\n bodyStmts.push(\n template.statement.ast`\n if (typeof ${t.identifier(completionId)} === \"object\")\n return ${t.identifier(completionId)}.v;\n `,\n );\n }\n }\n\n loopNode.body = t.blockStatement(bodyStmts);\n\n return varPath;\n}\n\nexport function isVarInLoopHead(path: NodePath<t.VariableDeclaration>) {\n if (t.isForStatement(path.parent)) return path.key === \"init\";\n if (t.isForXStatement(path.parent)) return path.key === \"left\";\n return false;\n}\n\nfunction filterMap<T, U extends object>(list: T[], fn: (item: T) => U | null) {\n const result: U[] = [];\n for (const item of list) {\n const mapped = fn(item);\n if (mapped) result.push(mapped);\n }\n return result;\n}\n"],"mappings":";;;;;;;;;AAAA;AAOA,MAAMA,8BAA8D,GAAG;EACrE,6BAA6B,CAACC,IAAI,EAAE;IAClCA,IAAI,CAACC,IAAI,EAAE;EACb,CAAC;EACDC,KAAK,CAACF,IAAI,EAAEG,KAAK,EAAE;IACjB,IAAIH,IAAI,CAACI,gBAAgB,EAAE,EAAEJ,IAAI,CAACC,IAAI,EAAE;IAExC,MAAM;MAAEI;IAAS,CAAC,GAAGL,IAAI,CAACM,KAAK;IAC/B,KAAK,MAAMC,IAAI,IAAIC,MAAM,CAACC,IAAI,CAACJ,QAAQ,CAAC,EAAE;MACxC,MAAMK,OAAO,GAAGL,QAAQ,CAACE,IAAI,CAAC;MAC9B,IACEG,OAAO,CAACC,IAAI,KAAK,KAAK,IACtBD,OAAO,CAACC,IAAI,KAAK,OAAO,IACxBD,OAAO,CAACC,IAAI,KAAK,SAAS,EAC1B;QACAR,KAAK,CAACS,WAAW,CAACC,IAAI,CAACH,OAAO,CAAC;MACjC;IACF;EACF;AACF,CAAC;AAEM,SAASI,mBAAmB,CAACC,QAA0B,EAAE;EAC9D,MAAMZ,KAA4B,GAAG;IAAES,WAAW,EAAE;EAAG,CAAC;EACxDG,QAAQ,CAACC,QAAQ,CAACjB,8BAA8B,EAAEI,KAAK,CAAC;EACxD,OAAOA,KAAK,CAACS,WAAW;AAC1B;AAEO,SAASK,cAAc,CAACP,OAAgB,EAAEK,QAA0B,EAAE;EAG3E,MAAMG,IAAI,GAAG,IAAIC,OAAO,EAAU;EAElC,IAAIC,iBAAiB,GAAG,KAAK;EAE7B,MAAMC,kBAAkB,GAAGC,SAAS,CAACZ,OAAO,CAACW,kBAAkB,EAAErB,IAAI,IAAI;IACvE,MAAM;MAAEuB,MAAM;MAAEC;IAAU,CAAC,GAAGC,oBAAoB,CAACzB,IAAI,EAAEe,QAAQ,CAAC;IAClE,IAAI,CAACQ,MAAM,EAAE,OAAO,IAAI;IACxBH,iBAAiB,KAAjBA,iBAAiB,GAAKI,SAAS;IAE/B,MAAME,EAAE,GAAG1B,IAAI,CAAC2B,kBAAkB,EAAE,GAChC3B,IAAI,CAAC4B,GAAG,CAAC,UAAU,CAAC,GACpB5B,IAAI,CAAC6B,sBAAsB,EAAE,GAC7B7B,IAAI,CAAC4B,GAAG,CAAC,MAAM,CAAC,GAChB,IAAI;IACR,IAAIF,EAAE,EAAER,IAAI,CAACY,GAAG,CAACJ,EAAE,CAACK,IAAI,CAAC;IACzB,OAAOL,EAAE;EACX,CAAC,CAAC;EAEF,MAAMM,UAAU,GAAGV,SAAS,CAACZ,OAAO,CAACuB,cAAc,EAAEjC,IAAI,IAAI;IAC3D,IAAIkB,IAAI,CAACgB,GAAG,CAAClC,IAAI,CAAC+B,IAAI,CAAC,EAAE,OAAO,IAAI;IAEpC,MAAM;MAAER,MAAM;MAAEC;IAAU,CAAC,GAAGC,oBAAoB,CAACzB,IAAI,EAAEe,QAAQ,CAAC;IAClE,IAAI,CAACQ,MAAM,EAAE,OAAO,IAAI;IACxBH,iBAAiB,KAAjBA,iBAAiB,GAAKI,SAAS;IAE/B,OAAOxB,IAAI;EACb,CAAC,CAAC;EAEF,OAAO;IACLoB,iBAAiB;IACjBe,qBAAqB,EAAEd,kBAAkB,CAACe,MAAM,GAAG,CAAC;IACpDC,MAAM,EAAEL,UAAU,CAACM,MAAM,CAACjB,kBAAkB;EAC9C,CAAC;AACH;AAEA,SAASI,oBAAoB,CAACzB,IAAc,EAAEe,QAA0B,EAAE;EACxE,MAAMwB,QAAQ,GAAGxB,QAAQ,CAACa,GAAG,CAAC,MAAM,CAAC;EACrC,IAAIJ,SAAS,GAAG,KAAK;EAErB,KAAK,IAAIgB,QAAQ,GAAGxC,IAAI,EAAEwC,QAAQ,EAAEA,QAAQ,GAAGA,QAAQ,CAACC,UAAU,EAAE;IAClE,IAAID,QAAQ,CAACE,UAAU,EAAE,IAAIF,QAAQ,CAACG,OAAO,EAAE,EAAEnB,SAAS,GAAG,IAAI;IACjE,IAAIgB,QAAQ,KAAKD,QAAQ,EAAE;MACzB,OAAO;QAAEhB,MAAM,EAAE,IAAI;QAAEC;MAAU,CAAC;IACpC,CAAC,MAAM,IAAIgB,QAAQ,KAAKzB,QAAQ,EAAE;MAChC,OAAO;QAAEQ,MAAM,EAAE,KAAK;QAAEC;MAAU,CAAC;IACrC;EACF;EAEA,MAAM,IAAIoB,KAAK,CACb,yEAAyE,CAC1E;AACH;AAaA,MAAMC,gCAAkE,GAAG;EACzEC,QAAQ,CAAC9C,IAAI,EAAE;IACbA,IAAI,CAACC,IAAI,EAAE;EACb,CAAC;EACD8C,gBAAgB,EAAE;IAChBC,KAAK,CAAC;MAAEjB;IAAK,CAAC,EAAE5B,KAAK,EAAE;MACrBA,KAAK,CAAC8C,WAAW,CAACpC,IAAI,CAACkB,IAAI,CAACmB,KAAK,CAAC3C,IAAI,CAAC;IACzC,CAAC;IACD4C,IAAI,CAAC;MAAEpB;IAAK,CAAC,EAAE5B,KAAK,EAAE;MACpB,MAAMiD,MAAM,GAAGjD,KAAK,CAAC8C,WAAW,CAACI,GAAG,EAAE;MACtC,IAAID,MAAM,KAAKrB,IAAI,CAACmB,KAAK,CAAC3C,IAAI,EAAE;QAC9B,MAAM,IAAIqC,KAAK,CAAC,qDAAqD,CAAC;MACxE;IACF;EACF,CAAC;EACDU,IAAI,EAAE;IACJN,KAAK,CAACO,CAAC,EAAEpD,KAAK,EAAE;MACdA,KAAK,CAACqD,wBAAwB,EAAE;MAChCrD,KAAK,CAACsD,qBAAqB,EAAE;IAC/B,CAAC;IACDN,IAAI,CAACI,CAAC,EAAEpD,KAAK,EAAE;MACbA,KAAK,CAACqD,wBAAwB,EAAE;MAChCrD,KAAK,CAACsD,qBAAqB,EAAE;IAC/B;EACF,CAAC;EACDC,eAAe,EAAE;IACfV,KAAK,CAACO,CAAC,EAAEpD,KAAK,EAAE;MACdA,KAAK,CAACsD,qBAAqB,EAAE;IAC/B,CAAC;IACDN,IAAI,CAACI,CAAC,EAAEpD,KAAK,EAAE;MACbA,KAAK,CAACsD,qBAAqB,EAAE;IAC/B;EACF,CAAC;EACD,kCAAkC,CAChCzD,IAAsD,EACtDG,KAAK,EACL;IACA,MAAM;MAAE+C;IAAM,CAAC,GAAGlD,IAAI,CAAC+B,IAAI;IAC3B,IAAImB,KAAK,EAAE;MACT,IAAI/C,KAAK,CAAC8C,WAAW,CAACU,QAAQ,CAACT,KAAK,CAAC3C,IAAI,CAAC,EAAE;IAC9C,CAAC,MAAM,IACLP,IAAI,CAAC4D,gBAAgB,EAAE,GACnBzD,KAAK,CAACsD,qBAAqB,GAAG,CAAC,GAC/BtD,KAAK,CAACqD,wBAAwB,GAAG,CAAC,EACtC;MACA;IACF;IACArD,KAAK,CAAC0D,eAAe,CAAChD,IAAI,CAACb,IAAI,CAAC;EAClC,CAAC;EACD8D,eAAe,CAAC9D,IAAI,EAAEG,KAAK,EAAE;IAC3BA,KAAK,CAAC4D,OAAO,CAAClD,IAAI,CAACb,IAAI,CAAC;EAC1B,CAAC;EACDgE,mBAAmB,CAAChE,IAAI,EAAEG,KAAK,EAAE;IAC/B,IAAIH,IAAI,CAACiE,MAAM,KAAK9D,KAAK,CAAC+D,QAAQ,IAAIC,eAAe,CAACnE,IAAI,CAAC,EAAE;IAC7D,IAAIA,IAAI,CAAC+B,IAAI,CAACpB,IAAI,KAAK,KAAK,EAAER,KAAK,CAACiE,IAAI,CAACvD,IAAI,CAACb,IAAI,CAAC;EACrD;AACF,CAAC;AAEM,SAASqE,YAAY,CAC1BtD,QAA0B,EAC1BuD,QAAkB,EAClBC,qBAA4D,EAC5D;EACA,MAAML,QAAQ,GAAGnD,QAAQ,CAACgB,IAAI;EAC9B,MAAM5B,KAA8B,GAAG;IACrC0D,eAAe,EAAE,EAAE;IACnBE,OAAO,EAAE,EAAE;IACXd,WAAW,EAAE,EAAE;IACfQ,qBAAqB,EAAE,CAAC;IACxBD,wBAAwB,EAAE,CAAC;IAC3BY,IAAI,EAAE,EAAE;IACRF;EACF,CAAC;EACDnD,QAAQ,CAACC,QAAQ,CAAC6B,gCAAgC,EAAE1C,KAAK,CAAC;EAE1D,MAAMqE,QAAQ,GAAG,EAAE;EACnB,MAAMC,aAAa,GAAG,EAAE;EACxB,MAAMC,OAAO,GAAG,EAAE;EAClB,KAAK,MAAM,CAACnE,IAAI,EAAEoE,YAAY,CAAC,IAAIJ,qBAAqB,EAAE;IACxDC,QAAQ,CAAC3D,IAAI,CAAC+D,WAAC,CAACC,UAAU,CAACtE,IAAI,CAAC,CAAC;IAEjC,MAAMuE,SAAS,GAAG/D,QAAQ,CAACT,KAAK,CAACyE,WAAW,CAACxE,IAAI,CAAC;IAClDkE,aAAa,CAAC5D,IAAI,CAAC+D,WAAC,CAACC,UAAU,CAACC,SAAS,CAAC,CAAC;IAC3CJ,OAAO,CAAC7D,IAAI,CACV+D,WAAC,CAACI,oBAAoB,CAAC,GAAG,EAAEJ,WAAC,CAACC,UAAU,CAACtE,IAAI,CAAC,EAAEqE,WAAC,CAACC,UAAU,CAACC,SAAS,CAAC,CAAC,CACzE;IACD,KAAK,MAAM9E,IAAI,IAAI2E,YAAY,EAAE3E,IAAI,CAACiF,WAAW,CAACL,WAAC,CAACC,UAAU,CAACC,SAAS,CAAC,CAAC;EAC5E;EACA,KAAK,MAAMvE,IAAI,IAAI+D,QAAQ,EAAE;IAC3B,IAAIC,qBAAqB,CAACrC,GAAG,CAAC3B,IAAI,CAAC,EAAE;IACrCiE,QAAQ,CAAC3D,IAAI,CAAC+D,WAAC,CAACC,UAAU,CAACtE,IAAI,CAAC,CAAC;IACjCkE,aAAa,CAAC5D,IAAI,CAAC+D,WAAC,CAACC,UAAU,CAACtE,IAAI,CAAC,CAAC;EACxC;EAEA,MAAMmB,EAAE,GAAGX,QAAQ,CAACT,KAAK,CAACyE,WAAW,CAAC,MAAM,CAAC;EAC7C,MAAMG,EAAE,GAAGN,WAAC,CAACO,kBAAkB,CAC7B,IAAI,EACJV,aAAa,EACbG,WAAC,CAACQ,OAAO,CAAClB,QAAQ,CAACmB,IAAI,CAAC,CACzB;EACD,IAAIC,IAAkB,GAAGV,WAAC,CAACW,cAAc,CAACX,WAAC,CAACC,UAAU,CAACnD,EAAE,CAAC,EAAE8C,QAAQ,CAAC;EAErE,MAAMgB,QAAQ,GAAGzE,QAAQ,CAAC0E,UAAU,CAACC,CAAC,IAAIA,CAAC,CAAChD,UAAU,EAAE,CAAC;EACzD,IAAI8C,QAAQ,EAAE;IACZ,MAAM;MAAEG,KAAK;MAAEC;IAAU,CAAC,GAAGJ,QAAQ,CAACzD,IAAkB;IACxDmD,EAAE,CAACS,KAAK,GAAGA,KAAK;IAChBT,EAAE,CAACU,SAAS,GAAGA,SAAS;IACxB,IAAIA,SAAS,EAAEN,IAAI,GAAGV,WAAC,CAACiB,eAAe,CAACP,IAAI,EAAE,IAAI,CAAC,CAAC,KAC/C,IAAIK,KAAK,EAAEL,IAAI,GAAGV,WAAC,CAACkB,eAAe,CAACR,IAAI,CAAC;EAChD;EAEA,MAAMS,WAAW,GACfrB,OAAO,CAACtC,MAAM,GAAG,CAAC,GACdwC,WAAC,CAACoB,mBAAmB,CAACpB,WAAC,CAACqB,kBAAkB,CAACvB,OAAO,CAAC,CAAC,GACpD,IAAI;EACV,IAAIqB,WAAW,EAAEb,EAAE,CAACG,IAAI,CAACA,IAAI,CAACxE,IAAI,CAACkF,WAAW,CAAC;EAU/C,MAAM,CAACG,OAAO,CAAC,GAAGnF,QAAQ,CAACoF,YAAY,CACrCvB,WAAC,CAACwB,mBAAmB,CAAC,KAAK,EAAE,CAACxB,WAAC,CAACyB,kBAAkB,CAACzB,WAAC,CAACC,UAAU,CAACnD,EAAE,CAAC,EAAEwD,EAAE,CAAC,CAAC,CAAC,CACtC;EAEtC,MAAMoB,SAAwB,GAAG,EAAE;EAEnC,MAAMC,QAAkB,GAAG,EAAE;EAC7B,KAAK,MAAML,OAAO,IAAI/F,KAAK,CAACiE,IAAI,EAAE;IAChC,MAAMoC,MAAM,GAAG,EAAE;IACjB,KAAK,MAAMC,IAAI,IAAIP,OAAO,CAACnE,IAAI,CAAC2E,YAAY,EAAE;MAC5CH,QAAQ,CAAC1F,IAAI,CAAC,GAAGL,MAAM,CAACC,IAAI,CAACmE,WAAC,CAAC+B,qBAAqB,CAACF,IAAI,CAAC/E,EAAE,CAAC,CAAC,CAAC;MAC/D,IAAI+E,IAAI,CAACG,IAAI,EAAE;QACbJ,MAAM,CAAC3F,IAAI,CAAC+D,WAAC,CAACI,oBAAoB,CAAC,GAAG,EAAEyB,IAAI,CAAC/E,EAAE,EAAE+E,IAAI,CAACG,IAAI,CAAC,CAAC;MAC9D;IACF;IACA,IAAIJ,MAAM,CAACpE,MAAM,GAAG,CAAC,EAAE;MACrB,IAAIyE,WAAmB,GACrBL,MAAM,CAACpE,MAAM,KAAK,CAAC,GAAGoE,MAAM,CAAC,CAAC,CAAC,GAAG5B,WAAC,CAACqB,kBAAkB,CAACO,MAAM,CAAC;MAChE,IACE,CAAC5B,WAAC,CAACkC,cAAc,CAACZ,OAAO,CAACjC,MAAM,EAAE;QAAE2C,IAAI,EAAEV,OAAO,CAACnE;MAAK,CAAC,CAAC,IACzD,CAAC6C,WAAC,CAACmC,eAAe,CAACb,OAAO,CAACjC,MAAM,EAAE;QAAE+C,IAAI,EAAEd,OAAO,CAACnE;MAAK,CAAC,CAAC,EAC1D;QACA8E,WAAW,GAAGjC,WAAC,CAACoB,mBAAmB,CAACa,WAAW,CAAC;MAClD;MACAX,OAAO,CAACjB,WAAW,CAAC4B,WAAW,CAAC;IAClC,CAAC,MAAM;MACLX,OAAO,CAACe,MAAM,EAAE;IAClB;EACF;EACA,IAAIV,QAAQ,CAACnE,MAAM,EAAE;IACnBkE,SAAS,CAACzF,IAAI,CACZ+D,WAAC,CAACwB,mBAAmB,CACnB,KAAK,EACLG,QAAQ,CAACW,GAAG,CAAC3G,IAAI,IAAIqE,WAAC,CAACyB,kBAAkB,CAACzB,WAAC,CAACC,UAAU,CAACtE,IAAI,CAAC,CAAC,CAAC,CAC/D,CACF;EACH;EAEA,IAAIJ,KAAK,CAAC0D,eAAe,CAACzB,MAAM,KAAK,CAAC,IAAIjC,KAAK,CAAC4D,OAAO,CAAC3B,MAAM,KAAK,CAAC,EAAE;IACpEkE,SAAS,CAACzF,IAAI,CAAC+D,WAAC,CAACoB,mBAAmB,CAACV,IAAI,CAAC,CAAC;EAC7C,CAAC,MAAM;IACL,MAAM6B,YAAY,GAAGpG,QAAQ,CAACT,KAAK,CAACyE,WAAW,CAAC,KAAK,CAAC;IACtDuB,SAAS,CAACzF,IAAI,CACZ+D,WAAC,CAACwB,mBAAmB,CAAC,KAAK,EAAE,CAC3BxB,WAAC,CAACyB,kBAAkB,CAACzB,WAAC,CAACC,UAAU,CAACsC,YAAY,CAAC,EAAE7B,IAAI,CAAC,CACvD,CAAC,CACH;IAED,MAAM8B,QAAQ,GAAG,IAAIC,GAAG,EAAU;IAClC,KAAK,MAAMrH,IAAI,IAAIG,KAAK,CAAC0D,eAAe,EAAE;MACxC,MAAM;QAAE9B;MAAK,CAAC,GAAG/B,IAAI;MACrB,MAAM;QAAEsH,IAAI;QAAEpE;MAAM,CAAC,GAAGnB,IAAI;MAC5B,IAAIxB,IAAI,GAAG+G,IAAI,KAAK,gBAAgB,GAAG,OAAO,GAAG,UAAU;MAC3D,IAAIpE,KAAK,EAAE3C,IAAI,IAAI,GAAG,GAAG2C,KAAK,CAAC3C,IAAI;MACnCP,IAAI,CAACiF,WAAW,CAACL,WAAC,CAAC2C,eAAe,CAAC3C,WAAC,CAAC4C,aAAa,CAACjH,IAAI,CAAC,CAAC,CAAC;MAC1D,IAAIwF,WAAW,EAAE/F,IAAI,CAACmG,YAAY,CAACvB,WAAC,CAAC6C,SAAS,CAAC1B,WAAW,CAAC,CAAC;MAE5D,IAAIqB,QAAQ,CAAClF,GAAG,CAAC3B,IAAI,CAAC,EAAE;MACxB6G,QAAQ,CAACtF,GAAG,CAACvB,IAAI,CAAC;MAElB+F,SAAS,CAACzF,IAAI,CACZ6G,cAAQ,CAACC,SAAS,CAACC,GAAI;AAC/B;AACA,YAAYhD,WAAC,CAACC,UAAU,CAACsC,YAAY,CAAE,QAAOvC,WAAC,CAAC4C,aAAa,CAACjH,IAAI,CAAE;AACpE,YAAYwB,IAAK;AACjB,OAAO,CACA;IACH;IACA,IAAI5B,KAAK,CAAC4D,OAAO,CAAC3B,MAAM,EAAE;MACxB,KAAK,MAAMpC,IAAI,IAAIG,KAAK,CAAC4D,OAAO,EAAE;QAChC,MAAM8D,GAAG,GAAG7H,IAAI,CAAC+B,IAAI,CAAC+F,QAAQ,IAAI9H,IAAI,CAACM,KAAK,CAACyH,kBAAkB,EAAE;QACjE/H,IAAI,CAACiF,WAAW,CACdyC,cAAQ,CAACC,SAAS,CAACC,GAAI;AACjC,wBAAwBC,GAAI;AAC5B,SAAS,CACA;MACH;MAEAvB,SAAS,CAACzF,IAAI,CACZ6G,cAAQ,CAACC,SAAS,CAACC,GAAI;AAC/B,qBAAqBhD,WAAC,CAACC,UAAU,CAACsC,YAAY,CAAE;AAChD,mBAAmBvC,WAAC,CAACC,UAAU,CAACsC,YAAY,CAAE;AAC9C,OAAO,CACA;IACH;EACF;EAEAjD,QAAQ,CAACmB,IAAI,GAAGT,WAAC,CAACoD,cAAc,CAAC1B,SAAS,CAAC;EAE3C,OAAOJ,OAAO;AAChB;AAEO,SAAS/B,eAAe,CAACnE,IAAqC,EAAE;EACrE,IAAI4E,WAAC,CAACkC,cAAc,CAAC9G,IAAI,CAACiE,MAAM,CAAC,EAAE,OAAOjE,IAAI,CAACiI,GAAG,KAAK,MAAM;EAC7D,IAAIrD,WAAC,CAACmC,eAAe,CAAC/G,IAAI,CAACiE,MAAM,CAAC,EAAE,OAAOjE,IAAI,CAACiI,GAAG,KAAK,MAAM;EAC9D,OAAO,KAAK;AACd;AAEA,SAAS3G,SAAS,CAAsB4G,IAAS,EAAEhD,EAAyB,EAAE;EAC5E,MAAMiD,MAAW,GAAG,EAAE;EACtB,KAAK,MAAMC,IAAI,IAAIF,IAAI,EAAE;IACvB,MAAMG,MAAM,GAAGnD,EAAE,CAACkD,IAAI,CAAC;IACvB,IAAIC,MAAM,EAAEF,MAAM,CAACtH,IAAI,CAACwH,MAAM,CAAC;EACjC;EACA,OAAOF,MAAM;AACf"} |