{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { checkFederationCompat } from \"../mf\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n  return {\n    sync: builder.sync.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            updated: [],\n            skipped: [],\n            added: [],\n            error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        const result = await syncTemplate(projectDir, input);\n\n        if (result.status === \"synced\" || result.status === \"dry-run\") {\n          const syncedConfig = await openResolution({ cwd: projectDir });\n          if (syncedConfig?.config) {\n            await generateCodeArtifacts(projectDir, syncedConfig.config);\n          }\n        }\n\n        return result;\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          updated: [],\n          skipped: [],\n          added: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    upgrade: builder.upgrade.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            packages: [],\n            error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        return await upgradeTemplate(projectDir, input);\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          packages: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    typesGen: builder.typesGen.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            generated: [],\n            fetched: [],\n            skipped: [],\n            failed: [],\n            error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        const env =\n          input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n        const refreshed = await openResolution({\n          cwd: projectDir,\n          env,\n          remotePlugins: input.remotePlugins,\n        });\n        if (!refreshed?.config || !refreshed.runtime) {\n          return {\n            status: \"error\" as const,\n            generated: [],\n            fetched: [],\n            skipped: [],\n            failed: [],\n            error: \"Failed to load the authored config\",\n          };\n        }\n\n        const runtime = refreshed.runtime;\n        const resolvedConfig = refreshed.config;\n\n        if (input.dryRun) {\n          const pluginEntries = Object.entries(runtime.plugins ?? {});\n          const fetched: string[] = [];\n          const skipped: string[] = [];\n          const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n          if (runtime.api.source !== \"local\") {\n            fetched.push(`api remote (${runtime.api.url})`);\n          } else {\n            const path = runtime.api.localPath\n              ? ` (${relative(projectDir, runtime.api.localPath)})`\n              : \"\";\n            skipped.push(`api local${path}`);\n          }\n\n          if (runtime.auth) {\n            if (runtime.auth.source !== \"local\") {\n              fetched.push(`auth remote (${runtime.auth.url})`);\n            } else {\n              const path = runtime.auth.localPath\n                ? ` (${relative(projectDir, runtime.auth.localPath)})`\n                : \"\";\n              skipped.push(`auth local${path}`);\n            }\n          }\n\n          for (const [key, plugin] of pluginEntries) {\n            if (plugin.url && plugin.source !== \"local\") {\n              fetched.push(`${key} remote (${plugin.url})`);\n            } else if (plugin.localPath) {\n              skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n            } else {\n              skipped.push(`${key} no URL resolved`);\n            }\n          }\n\n          const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n          if (hasLocalApiWorkspace) {\n            generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n          }\n          if (existsSync(join(projectDir, \"host\", \"src\"))) {\n            generated.push(\"host/src/lib/auth-types.gen.ts\");\n          }\n          for (const [_key, plugin] of pluginEntries) {\n            const localPath = plugin.localPath;\n            if (!localPath) continue;\n            const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n            if (existsSync(pluginSrc)) {\n              generated.push(relative(projectDir, pluginSrc));\n            }\n          }\n          if (runtime.auth?.localPath) {\n            const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n            if (existsSync(authSrc)) {\n              generated.push(relative(projectDir, authSrc));\n            }\n          }\n\n          return {\n            status: \"success\" as const,\n            generated,\n            fetched,\n            skipped,\n            failed: [],\n          };\n        }\n\n        const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n          runtimeConfig: runtime,\n        });\n\n        const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n        const generated = [\"ui/src/lib/api-types.gen.ts\"];\n        if (hasLocalApiWorkspace) {\n          generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n        }\n        if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n          generated.push(\"ui/src/lib/auth-types.gen.ts\");\n        }\n        if (existsSync(join(projectDir, \"host\", \"src\"))) {\n          generated.push(\"host/src/lib/auth-types.gen.ts\");\n        }\n        for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n          const localPath = plugin.localPath;\n          if (!localPath) continue;\n          const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n          if (existsSync(pluginSrc)) {\n            generated.push(relative(projectDir, pluginSrc));\n          }\n        }\n        if (runtime.auth?.localPath) {\n          const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n          if (existsSync(authSrc)) {\n            generated.push(relative(projectDir, authSrc));\n          }\n        }\n\n        const contractStatus = artifacts?.contractStatus ?? [];\n        const fetched: string[] = [];\n        const skipped: string[] = [];\n        const failed: string[] = [];\n        for (const entry of contractStatus) {\n          if (entry.source === \"remote\") {\n            fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n          } else if (entry.source === \"local\") {\n            const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n            skipped.push(`${entry.key} local${path}`);\n          } else if (entry.source === \"skipped\") {\n            skipped.push(`${entry.key} no URL resolved`);\n          } else if (entry.source === \"failed\") {\n            const detail = entry.error ? `: ${entry.error}` : \"\";\n            failed.push(`${entry.key}${detail}`);\n          }\n        }\n\n        return {\n          status: \"success\" as const,\n          generated,\n          fetched,\n          skipped,\n          failed,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          generated: [],\n          fetched: [],\n          skipped: [],\n          failed: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    typecheck: builder.typecheck.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            checked: [],\n            skipped: [],\n            results: [],\n            error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        const refreshed = await openResolution({ cwd: projectDir });\n        if (!refreshed?.config || !refreshed.runtime) {\n          return {\n            status: \"error\" as const,\n            checked: [],\n            skipped: [],\n            results: [],\n            error: \"Failed to load the authored config\",\n          };\n        }\n\n        const runtime = refreshed.runtime;\n        const resolvedConfig = refreshed.config;\n\n        await generateCodeArtifacts(projectDir, resolvedConfig, {\n          runtimeConfig: runtime,\n        });\n        type AppTarget = { source?: string; localPath?: string };\n        const workspaceEntries: Array<{\n          key: string;\n          label: string;\n          dir: string;\n        }> = [];\n        const skipped: Array<{ key: string; label: string }> = [];\n\n        const appTargets: Array<{\n          key: string;\n          label: string;\n          target: AppTarget | undefined;\n        }> = [\n          { key: \"host\", label: \"host\", target: runtime.host },\n          { key: \"ui\", label: \"ui\", target: runtime.ui },\n          { key: \"api\", label: \"api\", target: runtime.api },\n        ];\n        if (runtime.auth) {\n          appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n        }\n\n        for (const entry of appTargets) {\n          if (\n            entry.target?.source === \"local\" &&\n            entry.target.localPath &&\n            existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n          ) {\n            workspaceEntries.push({\n              key: entry.key,\n              label: entry.label,\n              dir: entry.target.localPath,\n            });\n          } else {\n            skipped.push({ key: entry.key, label: entry.label });\n          }\n        }\n\n        for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n          const label = `plugins/${key}`;\n          if (\n            plugin.source === \"local\" &&\n            plugin.localPath &&\n            existsSync(join(plugin.localPath, \"tsconfig.json\"))\n          ) {\n            workspaceEntries.push({ key, label, dir: plugin.localPath });\n          } else {\n            skipped.push({ key, label });\n          }\n        }\n\n        const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n        const targets =\n          input.packages === \"all\"\n            ? workspaceEntries\n            : workspaceEntries.filter((entry) => selected.includes(entry.key));\n        const skippedEntries =\n          input.packages === \"all\"\n            ? skipped\n            : skipped.filter((entry) => selected.includes(entry.key));\n\n        const checked: string[] = [];\n        const results: Array<{\n          workspace: string;\n          passed: boolean;\n          error?: string;\n        }> = [];\n\n        for (const entry of targets) {\n          const packageJsonPath = join(entry.dir, \"package.json\");\n          let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n          if (existsSync(packageJsonPath)) {\n            try {\n              const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n                scripts?: Record<string, string>;\n              };\n              if (pkg.scripts?.typecheck) {\n                args = [\"run\", \"typecheck\"];\n              }\n            } catch {}\n          }\n\n          console.log(`\\n  ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n          const child = spawnSync(\"pnpm\", args, {\n            cwd: entry.dir,\n            stdio: \"inherit\",\n          });\n          const passed = child.status === 0;\n          checked.push(entry.label);\n          results.push({\n            workspace: entry.label,\n            passed,\n            error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n          });\n        }\n\n        return {\n          status: \"success\" as const,\n          checked,\n          skipped: skippedEntries.map((entry) => entry.label),\n          results,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          checked: [],\n          skipped: [],\n          results: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    mfCheck: builder.mfCheck.handler(async ({ input }) => {\n      let authored: BosConfig | null = null;\n      try {\n        authored = (await readAuthoredConfigInput()) as BosConfig | null;\n      } catch (e) {\n        return {\n          status: \"fail\" as const,\n          hostVersion: null,\n          hostReachable: false,\n          hostReason: e instanceof Error ? e.message : String(e),\n          remotes: [],\n        };\n      }\n      if (!authored) {\n        return {\n          status: \"fail\" as const,\n          hostVersion: null,\n          hostReachable: false,\n          hostReason: MISSING_CONFIG_MESSAGE,\n          remotes: [],\n        };\n      }\n\n      const report = await checkFederationCompat(authored, {\n        timeoutMs: input.timeoutMs,\n      });\n      return {\n        status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n        hostVersion: report.hostVersion,\n        hostReachable: report.hostReachable,\n        hostReason: report.hostReason,\n        remotes: report.remotes,\n      };\n    }),\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,gBAAgB,SAAqB;CACnD,OAAO;EACL,MAAM,QAAQ,KAAK,QAAQ,OAAO,EAAE,YAAY;GAC9C,IAAI;IACF,MAAM,aAAa,eAAe;IAClC,IAAI,CAAC,YACH,OAAO;KACL,QAAQ;KACR,SAAS,CAAC;KACV,SAAS,CAAC;KACV,OAAO,CAAC;KACR,OAAO,GAAG,uBAAuB;IACnC;IAGF,MAAM,aAAa,QAAQ,QAAQ,UAAU,CAAC;IAC9C,MAAM,SAAS,MAAM,aAAa,YAAY,KAAK;IAEnD,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,WAAW;KAC7D,MAAM,eAAe,MAAM,eAAe,EAAE,KAAK,WAAW,CAAC;KAC7D,IAAI,cAAc,QAChB,MAAM,sBAAsB,YAAY,aAAa,MAAM;IAE/D;IAEA,OAAO;GACT,SAAS,OAAO;IACd,OAAO;KACL,QAAQ;KACR,SAAS,CAAC;KACV,SAAS,CAAC;KACV,OAAO,CAAC;KACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU;IAClD;GACF;EACF,CAAC;EAED,SAAS,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY;GACpD,IAAI;IACF,MAAM,aAAa,eAAe;IAClC,IAAI,CAAC,YACH,OAAO;KACL,QAAQ;KACR,UAAU,CAAC;KACX,OAAO,GAAG,uBAAuB;IACnC;IAGF,MAAM,aAAa,QAAQ,QAAQ,UAAU,CAAC;IAC9C,OAAO,MAAM,gBAAgB,YAAY,KAAK;GAChD,SAAS,OAAO;IACd,OAAO;KACL,QAAQ;KACR,UAAU,CAAC;KACX,OAAO,iBAAiB,QAAQ,MAAM,UAAU;IAClD;GACF;EACF,CAAC;EAED,UAAU,QAAQ,SAAS,QAAQ,OAAO,EAAE,YAAY;GACtD,IAAI;IACF,MAAM,aAAa,eAAe;IAClC,IAAI,CAAC,YACH,OAAO;KACL,QAAQ;KACR,WAAW,CAAC;KACZ,SAAS,CAAC;KACV,SAAS,CAAC;KACV,QAAQ,CAAC;KACT,OAAO,GAAG,uBAAuB;IACnC;IAGF,MAAM,aAAa,QAAQ,QAAQ,UAAU,CAAC;IAC9C,MAAM,MACJ,MAAM,QAAQ,QAAQ,IAAI,aAAa,eAAe,eAAe;IAEvE,MAAM,YAAY,MAAM,eAAe;KACrC,KAAK;KACL;KACA,eAAe,MAAM;IACvB,CAAC;IACD,IAAI,CAAC,WAAW,UAAU,CAAC,UAAU,SACnC,OAAO;KACL,QAAQ;KACR,WAAW,CAAC;KACZ,SAAS,CAAC;KACV,SAAS,CAAC;KACV,QAAQ,CAAC;KACT,OAAO;IACT;IAGF,MAAM,UAAU,UAAU;IAC1B,MAAM,iBAAiB,UAAU;IAEjC,IAAI,MAAM,QAAQ;KAChB,MAAM,gBAAgB,OAAO,QAAQ,QAAQ,WAAW,CAAC,CAAC;KAC1D,MAAM,UAAoB,CAAC;KAC3B,MAAM,UAAoB,CAAC;KAC3B,MAAM,uBAAuB,WAAW,KAAK,YAAY,OAAO,KAAK,CAAC;KAEtE,IAAI,QAAQ,IAAI,WAAW,SACzB,QAAQ,KAAK,eAAe,QAAQ,IAAI,IAAI,EAAE;UACzC;MACL,MAAM,OAAO,QAAQ,IAAI,YACrB,KAAK,SAAS,YAAY,QAAQ,IAAI,SAAS,EAAE,KACjD;MACJ,QAAQ,KAAK,YAAY,MAAM;KACjC;KAEA,IAAI,QAAQ,MAAM;MAChB,IAAI,QAAQ,KAAK,WAAW,SAC1B,QAAQ,KAAK,gBAAgB,QAAQ,KAAK,IAAI,EAAE;WAC3C;OACL,MAAM,OAAO,QAAQ,KAAK,YACtB,KAAK,SAAS,YAAY,QAAQ,KAAK,SAAS,EAAE,KAClD;OACJ,QAAQ,KAAK,aAAa,MAAM;MAClC;KACF;KAEA,KAAK,MAAM,CAAC,KAAK,WAAW,eAC1B,IAAI,OAAO,OAAO,OAAO,WAAW,SAClC,QAAQ,KAAK,GAAG,IAAI,WAAW,OAAO,IAAI,EAAE;UACvC,IAAI,OAAO,WAChB,QAAQ,KAAK,GAAG,IAAI,UAAU,SAAS,YAAY,OAAO,SAAS,EAAE,EAAE;UAEvE,QAAQ,KAAK,GAAG,IAAI,iBAAiB;KAIzC,MAAM,YAAY,CAAC,+BAA+B,8BAA8B;KAChF,IAAI,sBACF,UAAU,KAAK,oCAAoC,+BAA+B;KAEpF,IAAI,WAAW,KAAK,YAAY,QAAQ,KAAK,CAAC,GAC5C,UAAU,KAAK,gCAAgC;KAEjD,KAAK,MAAM,CAAC,MAAM,WAAW,eAAe;MAC1C,MAAM,YAAY,OAAO;MACzB,IAAI,CAAC,WAAW;MAChB,MAAM,YAAY,KAAK,WAAW,OAAO,OAAO,uBAAuB;MACvE,IAAI,WAAW,SAAS,GACtB,UAAU,KAAK,SAAS,YAAY,SAAS,CAAC;KAElD;KACA,IAAI,QAAQ,MAAM,WAAW;MAC3B,MAAM,UAAU,KAAK,QAAQ,KAAK,WAAW,OAAO,OAAO,uBAAuB;MAClF,IAAI,WAAW,OAAO,GACpB,UAAU,KAAK,SAAS,YAAY,OAAO,CAAC;KAEhD;KAEA,OAAO;MACL,QAAQ;MACR;MACA;MACA;MACA,QAAQ,CAAC;KACX;IACF;IAEA,MAAM,YAAY,MAAM,sBAAsB,YAAY,gBAAgB,EACxE,eAAe,QACjB,CAAC;IAED,MAAM,uBAAuB,WAAW,KAAK,YAAY,OAAO,KAAK,CAAC;IACtE,MAAM,YAAY,CAAC,6BAA6B;IAChD,IAAI,sBACF,UAAU,KAAK,oCAAoC,+BAA+B;IAEpF,IAAI,QAAQ,SAAS,QAAQ,KAAK,WAAW,WAAW,QAAQ,KAAK,YACnE,UAAU,KAAK,8BAA8B;IAE/C,IAAI,WAAW,KAAK,YAAY,QAAQ,KAAK,CAAC,GAC5C,UAAU,KAAK,gCAAgC;IAEjD,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,WAAW,CAAC,CAAC,GAAG;KAClE,MAAM,YAAY,OAAO;KACzB,IAAI,CAAC,WAAW;KAChB,MAAM,YAAY,KAAK,WAAW,OAAO,OAAO,uBAAuB;KACvE,IAAI,WAAW,SAAS,GACtB,UAAU,KAAK,SAAS,YAAY,SAAS,CAAC;IAElD;IACA,IAAI,QAAQ,MAAM,WAAW;KAC3B,MAAM,UAAU,KAAK,QAAQ,KAAK,WAAW,OAAO,OAAO,uBAAuB;KAClF,IAAI,WAAW,OAAO,GACpB,UAAU,KAAK,SAAS,YAAY,OAAO,CAAC;IAEhD;IAEA,MAAM,iBAAiB,WAAW,kBAAkB,CAAC;IACrD,MAAM,UAAoB,CAAC;IAC3B,MAAM,UAAoB,CAAC;IAC3B,MAAM,SAAmB,CAAC;IAC1B,KAAK,MAAM,SAAS,gBAClB,IAAI,MAAM,WAAW,UACnB,QAAQ,KAAK,MAAM,MAAM,GAAG,MAAM,IAAI,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG;SACpE,IAAI,MAAM,WAAW,SAAS;KACnC,MAAM,OAAO,MAAM,YAAY,KAAK,SAAS,YAAY,MAAM,SAAS,EAAE,KAAK;KAC/E,QAAQ,KAAK,GAAG,MAAM,IAAI,QAAQ,MAAM;IAC1C,OAAO,IAAI,MAAM,WAAW,WAC1B,QAAQ,KAAK,GAAG,MAAM,IAAI,iBAAiB;SACtC,IAAI,MAAM,WAAW,UAAU;KACpC,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,UAAU;KAClD,OAAO,KAAK,GAAG,MAAM,MAAM,QAAQ;IACrC;IAGF,OAAO;KACL,QAAQ;KACR;KACA;KACA;KACA;IACF;GACF,SAAS,OAAO;IACd,OAAO;KACL,QAAQ;KACR,WAAW,CAAC;KACZ,SAAS,CAAC;KACV,SAAS,CAAC;KACV,QAAQ,CAAC;KACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;IAClD;GACF;EACF,CAAC;EAED,WAAW,QAAQ,UAAU,QAAQ,OAAO,EAAE,YAAY;GACxD,IAAI;IACF,MAAM,aAAa,eAAe;IAClC,IAAI,CAAC,YACH,OAAO;KACL,QAAQ;KACR,SAAS,CAAC;KACV,SAAS,CAAC;KACV,SAAS,CAAC;KACV,OAAO,GAAG,uBAAuB;IACnC;IAGF,MAAM,aAAa,QAAQ,QAAQ,UAAU,CAAC;IAC9C,MAAM,YAAY,MAAM,eAAe,EAAE,KAAK,WAAW,CAAC;IAC1D,IAAI,CAAC,WAAW,UAAU,CAAC,UAAU,SACnC,OAAO;KACL,QAAQ;KACR,SAAS,CAAC;KACV,SAAS,CAAC;KACV,SAAS,CAAC;KACV,OAAO;IACT;IAGF,MAAM,UAAU,UAAU;IAC1B,MAAM,iBAAiB,UAAU;IAEjC,MAAM,sBAAsB,YAAY,gBAAgB,EACtD,eAAe,QACjB,CAAC;IAED,MAAM,mBAID,CAAC;IACN,MAAM,UAAiD,CAAC;IAExD,MAAM,aAID;KACH;MAAE,KAAK;MAAQ,OAAO;MAAQ,QAAQ,QAAQ;KAAK;KACnD;MAAE,KAAK;MAAM,OAAO;MAAM,QAAQ,QAAQ;KAAG;KAC7C;MAAE,KAAK;MAAO,OAAO;MAAO,QAAQ,QAAQ;KAAI;IAClD;IACA,IAAI,QAAQ,MACV,WAAW,KAAK;KAAE,KAAK;KAAQ,OAAO;KAAQ,QAAQ,QAAQ;IAAK,CAAC;IAGtE,KAAK,MAAM,SAAS,YAClB,IACE,MAAM,QAAQ,WAAW,WACzB,MAAM,OAAO,aACb,WAAW,KAAK,MAAM,OAAO,WAAW,eAAe,CAAC,GAExD,iBAAiB,KAAK;KACpB,KAAK,MAAM;KACX,OAAO,MAAM;KACb,KAAK,MAAM,OAAO;IACpB,CAAC;SAED,QAAQ,KAAK;KAAE,KAAK,MAAM;KAAK,OAAO,MAAM;IAAM,CAAC;IAIvD,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,QAAQ,WAAW,CAAC,CAAC,GAAG;KACjE,MAAM,QAAQ,WAAW;KACzB,IACE,OAAO,WAAW,WAClB,OAAO,aACP,WAAW,KAAK,OAAO,WAAW,eAAe,CAAC,GAElD,iBAAiB,KAAK;MAAE;MAAK;MAAO,KAAK,OAAO;KAAU,CAAC;UAE3D,QAAQ,KAAK;MAAE;MAAK;KAAM,CAAC;IAE/B;IAEA,MAAM,WAAW,uBAAuB,MAAM,UAAU,cAAc;IACtE,MAAM,UACJ,MAAM,aAAa,QACf,mBACA,iBAAiB,QAAQ,UAAU,SAAS,SAAS,MAAM,GAAG,CAAC;IACrE,MAAM,iBACJ,MAAM,aAAa,QACf,UACA,QAAQ,QAAQ,UAAU,SAAS,SAAS,MAAM,GAAG,CAAC;IAE5D,MAAM,UAAoB,CAAC;IAC3B,MAAM,UAID,CAAC;IAEN,KAAK,MAAM,SAAS,SAAS;KAC3B,MAAM,kBAAkB,KAAK,MAAM,KAAK,cAAc;KACtD,IAAI,OAAiB;MAAC;MAAQ;MAAO;KAAU;KAC/C,IAAI,WAAW,eAAe,GAC5B,IAAI;MAIF,IAHY,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAGtD,CAAC,CAAC,SAAS,WACf,OAAO,CAAC,OAAO,WAAW;KAE9B,QAAQ,CAAC;KAGX,QAAQ,IAAI,OAAO,OAAO,IAAI,UAAU,EAAE,GAAG,OAAO,KAAK,MAAM,KAAK,GAAG;KACvE,MAAM,QAAQ,UAAU,QAAQ,MAAM;MACpC,KAAK,MAAM;MACX,OAAO;KACT,CAAC;KACD,MAAM,SAAS,MAAM,WAAW;KAChC,QAAQ,KAAK,MAAM,KAAK;KACxB,QAAQ,KAAK;MACX,WAAW,MAAM;MACjB;MACA,OAAO,SAAS,SAAY,+BAA+B,MAAM,UAAU,MAAM;KACnF,CAAC;IACH;IAEA,OAAO;KACL,QAAQ;KACR;KACA,SAAS,eAAe,KAAK,UAAU,MAAM,KAAK;KAClD;IACF;GACF,SAAS,OAAO;IACd,OAAO;KACL,QAAQ;KACR,SAAS,CAAC;KACV,SAAS,CAAC;KACV,SAAS,CAAC;KACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU;IAClD;GACF;EACF,CAAC;EAED,SAAS,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY;GACpD,IAAI,WAA6B;GACjC,IAAI;IACF,WAAY,MAAM,wBAAwB;GAC5C,SAAS,GAAG;IACV,OAAO;KACL,QAAQ;KACR,aAAa;KACb,eAAe;KACf,YAAY,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KACrD,SAAS,CAAC;IACZ;GACF;GACA,IAAI,CAAC,UACH,OAAO;IACL,QAAQ;IACR,aAAa;IACb,eAAe;IACf,YAAY;IACZ,SAAS,CAAC;GACZ;GAGF,MAAM,SAAS,MAAM,sBAAsB,UAAU,EACnD,WAAW,MAAM,UACnB,CAAC;GACD,OAAO;IACL,QAAQ,OAAO,KAAM,OAAkB;IACvC,aAAa,OAAO;IACpB,eAAe,OAAO;IACtB,YAAY,OAAO;IACnB,SAAS,OAAO;GAClB;EACF,CAAC;CACH;AACF"}