@vforsh/argus 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/argus.js +3008 -572
  3. package/dist/cli/plugins/pluginHost.d.ts.map +1 -1
  4. package/dist/cli/plugins/pluginHost.js +1 -0
  5. package/dist/cli/plugins/pluginHost.js.map +1 -1
  6. package/dist/cli/register/extensionCommands.d.ts.map +1 -1
  7. package/dist/cli/register/extensionCommands.js +131 -6
  8. package/dist/cli/register/extensionCommands.js.map +1 -1
  9. package/dist/cli/register/index.d.ts.map +1 -1
  10. package/dist/cli/register/index.js +6 -0
  11. package/dist/cli/register/index.js.map +1 -1
  12. package/dist/cli/register/recordCommands.d.ts +3 -0
  13. package/dist/cli/register/recordCommands.d.ts.map +1 -0
  14. package/dist/cli/register/recordCommands.js +90 -0
  15. package/dist/cli/register/recordCommands.js.map +1 -0
  16. package/dist/cli/register/skillCommands.d.ts +3 -0
  17. package/dist/cli/register/skillCommands.d.ts.map +1 -0
  18. package/dist/cli/register/skillCommands.js +13 -0
  19. package/dist/cli/register/skillCommands.js.map +1 -0
  20. package/dist/commands/domDrag.d.ts +21 -0
  21. package/dist/commands/domDrag.d.ts.map +1 -0
  22. package/dist/commands/domDrag.js +179 -0
  23. package/dist/commands/domDrag.js.map +1 -0
  24. package/dist/commands/extension/attach.d.ts +2 -0
  25. package/dist/commands/extension/attach.d.ts.map +1 -1
  26. package/dist/commands/extension/attach.js +31 -6
  27. package/dist/commands/extension/attach.js.map +1 -1
  28. package/dist/commands/extension/doctor.d.ts +6 -0
  29. package/dist/commands/extension/doctor.d.ts.map +1 -0
  30. package/dist/commands/extension/doctor.js +185 -0
  31. package/dist/commands/extension/doctor.js.map +1 -0
  32. package/dist/commands/extension/extensionId.d.ts +27 -0
  33. package/dist/commands/extension/extensionId.d.ts.map +1 -0
  34. package/dist/commands/extension/extensionId.js +37 -0
  35. package/dist/commands/extension/extensionId.js.map +1 -0
  36. package/dist/commands/extension/extensionPath.d.ts +15 -0
  37. package/dist/commands/extension/extensionPath.d.ts.map +1 -0
  38. package/dist/commands/extension/extensionPath.js +61 -0
  39. package/dist/commands/extension/extensionPath.js.map +1 -0
  40. package/dist/commands/extension/install.d.ts +16 -0
  41. package/dist/commands/extension/install.d.ts.map +1 -0
  42. package/dist/commands/extension/install.js +154 -0
  43. package/dist/commands/extension/install.js.map +1 -0
  44. package/dist/commands/extension/select.d.ts +7 -0
  45. package/dist/commands/extension/select.d.ts.map +1 -0
  46. package/dist/commands/extension/select.js +73 -0
  47. package/dist/commands/extension/select.js.map +1 -0
  48. package/dist/commands/extension/setup.d.ts +2 -1
  49. package/dist/commands/extension/setup.d.ts.map +1 -1
  50. package/dist/commands/extension/setup.js +5 -2
  51. package/dist/commands/extension/setup.js.map +1 -1
  52. package/dist/commands/extension/show.d.ts +4 -0
  53. package/dist/commands/extension/show.d.ts.map +1 -1
  54. package/dist/commands/extension/show.js +12 -88
  55. package/dist/commands/extension/show.js.map +1 -1
  56. package/dist/commands/extension/tabAttach.d.ts +28 -0
  57. package/dist/commands/extension/tabAttach.d.ts.map +1 -0
  58. package/dist/commands/extension/tabAttach.js +106 -0
  59. package/dist/commands/extension/tabAttach.js.map +1 -0
  60. package/dist/commands/extension/tabWatcher.d.ts +22 -0
  61. package/dist/commands/extension/tabWatcher.d.ts.map +1 -0
  62. package/dist/commands/extension/tabWatcher.js +89 -0
  63. package/dist/commands/extension/tabWatcher.js.map +1 -0
  64. package/dist/commands/extension/targetSelection.d.ts +62 -0
  65. package/dist/commands/extension/targetSelection.d.ts.map +1 -0
  66. package/dist/commands/extension/targetSelection.js +210 -0
  67. package/dist/commands/extension/targetSelection.js.map +1 -0
  68. package/dist/commands/extension/targets.d.ts +7 -0
  69. package/dist/commands/extension/targets.d.ts.map +1 -0
  70. package/dist/commands/extension/targets.js +73 -0
  71. package/dist/commands/extension/targets.js.map +1 -0
  72. package/dist/commands/extension/use.d.ts +13 -0
  73. package/dist/commands/extension/use.d.ts.map +1 -0
  74. package/dist/commands/extension/use.js +66 -0
  75. package/dist/commands/extension/use.js.map +1 -0
  76. package/dist/commands/record.d.ts +35 -0
  77. package/dist/commands/record.d.ts.map +1 -0
  78. package/dist/commands/record.js +210 -0
  79. package/dist/commands/record.js.map +1 -0
  80. package/dist/commands/skill.d.ts +6 -0
  81. package/dist/commands/skill.d.ts.map +1 -0
  82. package/dist/commands/skill.js +42 -0
  83. package/dist/commands/skill.js.map +1 -0
  84. package/dist/commands/watcherNativeHost.js +48 -1
  85. package/dist/commands/watcherNativeHost.js.map +1 -1
  86. package/dist/extension/dist/background/auth-header-monitor.js +77 -0
  87. package/dist/extension/dist/background/bridge-client.js +120 -0
  88. package/dist/extension/dist/background/cdp-proxy.js +201 -0
  89. package/dist/extension/dist/background/debugger-manager.js +296 -0
  90. package/dist/extension/dist/background/service-worker.js +2004 -0
  91. package/dist/extension/dist/background/service-worker.js.map +7 -0
  92. package/dist/extension/dist/popup/popup.js +730 -0
  93. package/dist/extension/dist/popup/popup.js.map +7 -0
  94. package/dist/extension/dist/popup/tabMarkup.js +104 -0
  95. package/dist/extension/dist/popup/viewState.js +60 -0
  96. package/dist/extension/dist/types/messages.js +5 -0
  97. package/dist/extension/icons/icon-128.png +0 -0
  98. package/dist/extension/icons/icon-16.png +0 -0
  99. package/dist/extension/icons/icon-48.png +0 -0
  100. package/dist/extension/manifest.json +26 -0
  101. package/dist/extension/src/popup/popup.html +756 -0
  102. package/dist/skill/argus/SKILL.md +202 -0
  103. package/dist/skill/argus/reference/CAPTURE.md +77 -0
  104. package/dist/skill/argus/reference/DIALOG.md +31 -0
  105. package/dist/skill/argus/reference/EVAL.md +137 -0
  106. package/dist/skill/argus/reference/EXTENSION.md +43 -0
  107. package/dist/skill/argus/reference/EXTENSION_IFRAME_EVAL.md +58 -0
  108. package/dist/skill/argus/reference/IFRAMES.md +46 -0
  109. package/dist/skill/argus/reference/INJECT.md +145 -0
  110. package/dist/skill/argus/reference/INSPECT.md +175 -0
  111. package/dist/skill/argus/reference/NET.md +108 -0
  112. package/dist/skill/argus/reference/PLUGINS.md +172 -0
  113. package/dist/skill/argus/reference/RUNTIME_CODE.md +42 -0
  114. package/dist/skill/argus/reference/START.md +120 -0
  115. package/dist/skill/argus/start-watcher.ts +108 -0
  116. package/package.json +2 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/background/debugger-manager.ts", "../../src/background/bridge-client.ts", "../../src/background/tab-list.ts", "../../src/background/cdp-proxy.ts", "../../src/background/native-hosts.ts", "../../src/background/tab-bridge-session.ts", "../../src/background/control-bridge-session.ts", "../../src/background/target-selection-history.ts", "../../src/background/target-visibility-history.ts", "../../src/background/action-badge.ts", "../../src/background/popup-targets.ts", "../../src/background/watcher-status.ts", "../../src/background/service-worker.ts"],
4
+ "sourcesContent": ["/**\n * Manages chrome.debugger attachment lifecycle.\n * Handles root tab attachment, recursive child-target auto-attach, frame discovery,\n * and session-aware CDP command routing.\n */\n\ntype ChildSession = {\n\tsessionId: string\n\ttargetId: string\n\ttype: string\n\turl: string\n\ttitle: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n}\n\ntype DebuggeeWithSession = chrome.debugger.Debuggee & {\n\tsessionId?: string\n}\n\ntype FrameRecord = {\n\tframeId: string\n\tparentFrameId: string | null\n\turl: string\n\ttitle: string | null\n\tsessionId: string | null\n}\n\ntype CookieQuery = {\n\tdomain?: string\n\turl?: string\n}\n\ntype CdpFrameTreeNode = {\n\tframe?: { id?: string; parentId?: string; name?: string; url?: string }\n\tchildFrames?: CdpFrameTreeNode[]\n}\n\ntype NativeCookie = {\n\tname: string\n\tvalue: string\n\tdomain: string\n\tpath: string\n\tsecure: boolean\n\thttpOnly: boolean\n\tsession: boolean\n\texpires: number | null\n\tsameSite: string | null\n}\n\nconst FRAME_TREE_SYNC_DELAY_MS = 150\n\nexport type AttachedTarget = {\n\ttabId: number\n\tdebuggeeId: chrome.debugger.Debuggee\n\turl: string\n\ttitle: string\n\tfaviconUrl?: string\n\tattachedAt: number\n\tenabledDomains: Set<string>\n\tchildSessions: Map<string, ChildSession>\n\tframes: Map<string, FrameRecord>\n\ttopFrameId: string | null\n}\n\nexport type CdpEventHandler = (tabId: number, method: string, params: unknown, meta?: { sessionId?: string | null }) => void\nexport type DebuggerDetachHandler = (tabId: number, reason: string) => void\n\nexport class DebuggerManager {\n\tprivate attached = new Map<number, AttachedTarget>()\n\tprivate eventHandlers = new Set<CdpEventHandler>()\n\tprivate detachHandlers = new Set<DebuggerDetachHandler>()\n\tprivate frameTreeSyncTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n\tconstructor() {\n\t\tchrome.debugger.onEvent.addListener((debuggee, method, params) => {\n\t\t\tthis.handleCdpEvent(debuggee, method, params)\n\t\t})\n\n\t\tchrome.debugger.onDetach.addListener((debuggee, reason) => {\n\t\t\tif (debuggee.tabId) {\n\t\t\t\tthis.handleDetach(debuggee.tabId, (debuggee as DebuggeeWithSession).sessionId ?? null, reason)\n\t\t\t}\n\t\t})\n\t}\n\n\tonEvent(handler: CdpEventHandler): () => void {\n\t\tthis.eventHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.eventHandlers.delete(handler)\n\t\t}\n\t}\n\n\tonDetach(handler: DebuggerDetachHandler): () => void {\n\t\tthis.detachHandlers.add(handler)\n\t\treturn () => {\n\t\t\tthis.detachHandlers.delete(handler)\n\t\t}\n\t}\n\n\tprivate emitEvent(tabId: number, method: string, params: unknown, sessionId: string | null): void {\n\t\tfor (const handler of this.eventHandlers) {\n\t\t\thandler(tabId, method, params, { sessionId })\n\t\t}\n\t}\n\n\tprivate emitDetach(tabId: number, reason: string): void {\n\t\tfor (const handler of this.detachHandlers) {\n\t\t\thandler(tabId, reason)\n\t\t}\n\t}\n\n\tasync attach(tabId: number): Promise<AttachedTarget> {\n\t\tif (this.attached.has(tabId)) {\n\t\t\treturn this.attached.get(tabId)!\n\t\t}\n\n\t\tconst debuggee: chrome.debugger.Debuggee = { tabId }\n\t\tawait chrome.debugger.attach(debuggee, '1.3')\n\n\t\tconst tab = await chrome.tabs.get(tabId)\n\t\tconst target: AttachedTarget = {\n\t\t\ttabId,\n\t\t\tdebuggeeId: debuggee,\n\t\t\turl: tab.url ?? '',\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t\tchildSessions: new Map(),\n\t\t\tframes: new Map(),\n\t\t\ttopFrameId: null,\n\t\t}\n\n\t\tthis.attached.set(tabId, target)\n\t\tawait this.configureAutoAttach(tabId)\n\t\tawait this.refreshFrameTree(tabId, null)\n\t\treturn target\n\t}\n\n\tasync detach(tabId: number): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) return\n\n\t\ttry {\n\t\t\tawait chrome.debugger.detach(target.debuggeeId)\n\t\t} catch {\n\t\t\t// Tab may already be closed\n\t\t}\n\t\tthis.attached.delete(tabId)\n\t}\n\n\tasync sendCommand<T = unknown>(tabId: number, method: string, params?: Record<string, unknown>, sessionId?: string | null): Promise<T> {\n\t\tconst target = this.getRequiredTarget(tabId)\n\t\tconst debuggee = this.toDebuggee(target, sessionId)\n\t\tconst result = await chrome.debugger.sendCommand(debuggee, method, params)\n\t\treturn result as T\n\t}\n\n\tasync enableDomain(tabId: number, domain: string, sessionId?: string | null): Promise<void> {\n\t\tconst enabledDomains = this.getRequiredEnabledDomains(tabId, sessionId)\n\t\tif (enabledDomains.has(domain)) {\n\t\t\treturn\n\t\t}\n\n\t\tawait this.sendCommand(tabId, `${domain}.enable`, undefined, sessionId)\n\t\tenabledDomains.add(domain)\n\t}\n\n\tisAttached(tabId: number): boolean {\n\t\treturn this.attached.has(tabId)\n\t}\n\n\tlistAttached(): AttachedTarget[] {\n\t\treturn [...this.attached.values()]\n\t}\n\n\tgetTarget(tabId: number): AttachedTarget | undefined {\n\t\treturn this.attached.get(tabId)\n\t}\n\n\tgetFrames(tabId: number): FrameRecord[] {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn []\n\t\t}\n\n\t\treturn [...target.frames.values()]\n\t}\n\n\t/**\n\t * Read cookies from the attached tab's cookie store so extension-mode auth export can keep\n\t * sibling subdomain session cookies such as `auth.example.com`.\n\t */\n\tasync getCookies(tabId: number, query: CookieQuery = {}): Promise<NativeCookie[]> {\n\t\tthis.getRequiredTarget(tabId)\n\t\tconst storeId = await this.findCookieStoreId(tabId)\n\t\tconst cookies = await chrome.cookies.getAll({\n\t\t\tdomain: query.domain,\n\t\t\tstoreId: storeId ?? undefined,\n\t\t\turl: query.domain ? undefined : query.url,\n\t\t})\n\n\t\treturn cookies.map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\tsecure: cookie.secure,\n\t\t\thttpOnly: cookie.httpOnly,\n\t\t\tsession: cookie.session,\n\t\t\texpires: typeof cookie.expirationDate === 'number' ? cookie.expirationDate : null,\n\t\t\tsameSite: cookie.sameSite ?? null,\n\t\t}))\n\t}\n\n\tprivate async configureAutoAttach(tabId: number, sessionId?: string | null): Promise<void> {\n\t\tawait this.sendCommand(\n\t\t\ttabId,\n\t\t\t'Target.setAutoAttach',\n\t\t\t{\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t\tfilter: [{ type: 'iframe', exclude: false }],\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\t}\n\n\tprivate getEnabledDomains(tabId: number, sessionId?: string | null): Set<string> | null {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!sessionId) {\n\t\t\treturn target.enabledDomains\n\t\t}\n\n\t\treturn target.childSessions.get(sessionId)?.enabledDomains ?? null\n\t}\n\n\tprivate getRequiredTarget(tabId: number): AttachedTarget {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn target\n\t}\n\n\tprivate getRequiredEnabledDomains(tabId: number, sessionId?: string | null): Set<string> {\n\t\tconst enabledDomains = this.getEnabledDomains(tabId, sessionId)\n\t\tif (!enabledDomains) {\n\t\t\tthrow new Error(`Tab ${tabId} is not attached`)\n\t\t}\n\t\treturn enabledDomains\n\t}\n\n\tprivate toDebuggee(target: AttachedTarget, sessionId?: string | null): chrome.debugger.Debuggee {\n\t\tif (!sessionId) {\n\t\t\treturn target.debuggeeId\n\t\t}\n\n\t\treturn { tabId: target.tabId, sessionId } as chrome.debugger.Debuggee\n\t}\n\n\tprivate async findCookieStoreId(tabId: number): Promise<string | null> {\n\t\tconst stores = await chrome.cookies.getAllCookieStores()\n\t\tconst store = stores.find((candidate) => candidate.tabIds.includes(tabId))\n\t\treturn store?.id ?? null\n\t}\n\n\tprivate handleCdpEvent(debuggee: chrome.debugger.Debuggee, method: string, params?: object): void {\n\t\tconst tabId = debuggee.tabId\n\t\tif (!tabId || !this.attached.has(tabId)) return\n\n\t\tconst sessionId = (debuggee as DebuggeeWithSession).sessionId ?? null\n\t\tif (method === 'Target.attachedToTarget' && params) {\n\t\t\tvoid this.handleAttachedToTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Target.detachedFromTarget' && params) {\n\t\t\tthis.handleDetachedFromTarget(tabId, params)\n\t\t\treturn\n\t\t}\n\n\t\tthis.updateStateFromEvent(tabId, sessionId, method, params)\n\t\tthis.emitEvent(tabId, method, params ?? {}, sessionId)\n\t\tthis.scheduleFrameTreeSyncIfNeeded(tabId, sessionId, method, params)\n\t}\n\n\tprivate async handleAttachedToTarget(tabId: number, params: object): Promise<void> {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst record = params as {\n\t\t\tsessionId?: string\n\t\t\ttargetInfo?: { targetId?: string; type?: string; title?: string; url?: string }\n\t\t}\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.set(record.sessionId, {\n\t\t\tsessionId: record.sessionId,\n\t\t\ttargetId: record.targetInfo?.targetId ?? record.sessionId,\n\t\t\ttype: record.targetInfo?.type ?? 'unknown',\n\t\t\turl: record.targetInfo?.url ?? '',\n\t\t\ttitle: record.targetInfo?.title ?? '',\n\t\t\tattachedAt: Date.now(),\n\t\t\tenabledDomains: new Set(),\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.configureAutoAttach(tabId, record.sessionId)\n\t\t\tawait this.enableChildSessionDomains(tabId, record.sessionId)\n\t\t\tawait this.refreshFrameTree(tabId, record.sessionId)\n\t\t} catch (error) {\n\t\t\tconsole.warn('[DebuggerManager] Failed to bootstrap child target:', error)\n\t\t}\n\t}\n\n\tprivate async enableChildSessionDomains(tabId: number, sessionId: string): Promise<void> {\n\t\t// Keep child sessions aligned with the root tab so watcher features can observe iframe traffic too.\n\t\tfor (const domain of ['Runtime', 'Page', 'Network'] as const) {\n\t\t\tawait this.enableDomain(tabId, domain, sessionId)\n\t\t}\n\t}\n\n\tprivate handleDetachedFromTarget(tabId: number, params: object): void {\n\t\tconst record = params as { sessionId?: string }\n\t\tif (!record.sessionId) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(record.sessionId, tabId)\n\t\tthis.dropChildSession(tabId, record.sessionId)\n\t}\n\n\tprivate async refreshFrameTree(tabId: number, sessionId: string | null): Promise<void> {\n\t\tconst result = (await this.sendCommand(tabId, 'Page.getFrameTree', undefined, sessionId)) as { frameTree?: CdpFrameTreeNode }\n\t\tthis.replaceFrameTreeSnapshot(tabId, sessionId, result.frameTree)\n\t}\n\n\t/**\n\t * Each `Page.getFrameTree` result is a full snapshot for that session, so merge the refreshed\n\t * nodes and then prune frames from the same session that no longer exist after reload.\n\t */\n\tprivate replaceFrameTreeSnapshot(tabId: number, sessionId: string | null, node: CdpFrameTreeNode | undefined): void {\n\t\tif (!node?.frame?.id) {\n\t\t\treturn\n\t\t}\n\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst nextFrameIds = new Set<string>()\n\t\tthis.mergeFrameTree(tabId, sessionId, node, nextFrameIds)\n\t\tthis.pruneMissingSessionFrames(tabId, sessionId, nextFrameIds)\n\t}\n\n\tprivate mergeFrameTree(tabId: number, sessionId: string | null, node: CdpFrameTreeNode | undefined, nextFrameIds: Set<string>): void {\n\t\tif (!node?.frame?.id) {\n\t\t\treturn\n\t\t}\n\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frameId = node.frame.id\n\t\tnextFrameIds.add(frameId)\n\t\ttarget.frames.set(frameId, this.toFrameRecord(node.frame, sessionId))\n\n\t\tif (!node.frame.parentId && !sessionId) {\n\t\t\ttarget.topFrameId = frameId\n\t\t}\n\n\t\tthis.emitEvent(\n\t\t\ttabId,\n\t\t\t'Page.frameNavigated',\n\t\t\t{\n\t\t\t\tframe: {\n\t\t\t\t\tid: frameId,\n\t\t\t\t\tparentId: node.frame.parentId ?? null,\n\t\t\t\t\turl: node.frame.url ?? '',\n\t\t\t\t\tname: node.frame.name ?? null,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\n\t\tfor (const child of node.childFrames ?? []) {\n\t\t\tthis.mergeFrameTree(tabId, sessionId, child, nextFrameIds)\n\t\t}\n\t}\n\n\tprivate pruneMissingSessionFrames(tabId: number, sessionId: string | null, nextFrameIds: Set<string>): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tfor (const [frameId, frame] of target.frames.entries()) {\n\t\t\tif (frame.sessionId !== sessionId || nextFrameIds.has(frameId)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttarget.frames.delete(frameId)\n\t\t\tthis.emitEvent(tabId, 'Page.frameDetached', { frameId }, sessionId)\n\t\t}\n\t}\n\n\tprivate updateStateFromEvent(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameNavigated' && params) {\n\t\t\tconst frame = (params as { frame?: { id?: string; parentId?: string | null; url?: string; name?: string } }).frame\n\t\t\tif (!frame?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttarget.frames.set(frame.id, this.toFrameRecord(frame, sessionId))\n\n\t\t\tif (!frame.parentId && !sessionId && frame.url) {\n\t\t\t\ttarget.url = frame.url\n\t\t\t\ttarget.topFrameId = frame.id\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameAttached' && params) {\n\t\t\tconst frame = params as { frameId?: string; parentFrameId?: string }\n\t\t\tif (!frame.frameId) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst existing = target.frames.get(frame.frameId)\n\t\t\ttarget.frames.set(frame.frameId, {\n\t\t\t\tframeId: frame.frameId,\n\t\t\t\tparentFrameId: frame.parentFrameId ?? target.topFrameId,\n\t\t\t\turl: existing?.url ?? '',\n\t\t\t\ttitle: existing?.title ?? null,\n\t\t\t\tsessionId: existing?.sessionId ?? sessionId,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (method === 'Page.frameDetached' && params) {\n\t\t\tconst frame = params as { frameId?: string }\n\t\t\tif (!frame.frameId) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttarget.frames.delete(frame.frameId)\n\t\t}\n\t}\n\n\t/**\n\t * Chrome's frame attach/detach events during reload are not always complete. When the root frame\n\t * for a session navigates, refresh that session's full frame tree shortly afterward and treat it\n\t * as authoritative so stale iframe records do not linger in extension state.\n\t */\n\tprivate scheduleFrameTreeSyncIfNeeded(tabId: number, sessionId: string | null, method: string, params?: object): void {\n\t\tif (!shouldSyncFrameTreeSnapshot(method, params)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tif (this.frameTreeSyncTimers.has(key)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t\tvoid this.refreshFrameTree(tabId, sessionId).catch((error) => {\n\t\t\t\tconsole.warn('[DebuggerManager] Failed to refresh frame tree after navigation:', error)\n\t\t\t})\n\t\t}, FRAME_TREE_SYNC_DELAY_MS)\n\n\t\tthis.frameTreeSyncTimers.set(key, timer)\n\t}\n\n\tprivate clearFrameTreeSync(sessionId: string | null, tabId: number): void {\n\t\tconst key = getFrameTreeSyncKey(tabId, sessionId)\n\t\tconst timer = this.frameTreeSyncTimers.get(key)\n\t\tif (!timer) {\n\t\t\treturn\n\t\t}\n\n\t\tclearTimeout(timer)\n\t\tthis.frameTreeSyncTimers.delete(key)\n\t}\n\n\tprivate clearAllFrameTreeSync(tabId: number): void {\n\t\tfor (const [key, timer] of this.frameTreeSyncTimers.entries()) {\n\t\t\tif (!key.startsWith(`${tabId}:`)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tclearTimeout(timer)\n\t\t\tthis.frameTreeSyncTimers.delete(key)\n\t\t}\n\t}\n\n\tprivate toFrameRecord(frame: { id?: string; parentId?: string | null; url?: string; name?: string }, sessionId: string | null): FrameRecord {\n\t\treturn {\n\t\t\tframeId: frame.id!,\n\t\t\tparentFrameId: frame.parentId ?? null,\n\t\t\turl: frame.url ?? '',\n\t\t\ttitle: frame.name ?? null,\n\t\t\tsessionId,\n\t\t}\n\t}\n\n\tprivate handleDetach(tabId: number, sessionId: string | null, reason: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearFrameTreeSync(sessionId, tabId)\n\n\t\tif (sessionId) {\n\t\t\tthis.dropChildSession(tabId, sessionId)\n\t\t\treturn\n\t\t}\n\n\t\tthis.clearAllFrameTreeSync(tabId)\n\t\tthis.attached.delete(tabId)\n\t\tthis.emitDetach(tabId, reason)\n\t}\n\n\tprivate dropChildSession(tabId: number, sessionId: string): void {\n\t\tconst target = this.attached.get(tabId)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\n\t\ttarget.childSessions.delete(sessionId)\n\t\tfor (const [frameId, frame] of target.frames.entries()) {\n\t\t\tif (frame.sessionId !== sessionId) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttarget.frames.delete(frameId)\n\t\t\tthis.emitEvent(tabId, 'Page.frameDetached', { frameId }, sessionId)\n\t\t}\n\t}\n}\n\nfunction shouldSyncFrameTreeSnapshot(method: string, params?: object): boolean {\n\tif (method !== 'Page.frameNavigated' || !params) {\n\t\treturn false\n\t}\n\n\tconst frame = (params as { frame?: { parentId?: string | null } }).frame\n\treturn frame?.parentId == null\n}\n\nfunction getFrameTreeSyncKey(tabId: number, sessionId: string | null): string {\n\treturn `${tabId}:${sessionId ?? 'root'}`\n}\n", "/**\n * Native Messaging client for communicating with argus-watcher (extension mode).\n * Handles connection lifecycle, message serialization, and reconnection.\n */\n\nimport type { ExtensionToHost, HostToExtension } from '../types/messages.js'\n\nexport type MessageHandler<Inbound> = (message: Inbound) => void\nexport type ConnectionHandler = () => void\nexport type BridgeClientOptions = {\n\tautoReconnect?: boolean\n}\n\nexport class BridgeClient<Inbound = HostToExtension, Outbound = ExtensionToHost> {\n\tprivate port: chrome.runtime.Port | null = null\n\tprivate hostName: string\n\tprivate messageHandlers = new Set<MessageHandler<Inbound>>()\n\tprivate connectHandler: ConnectionHandler | null = null\n\tprivate disconnectHandler: ConnectionHandler | null = null\n\tprivate reconnectAttempts = 0\n\tprivate maxReconnectAttempts = 5\n\tprivate reconnectDelay = 1000\n\tprivate autoReconnect: boolean\n\tprivate reconnectEnabled = true\n\n\tconstructor(hostName: string = 'com.vforsh.argus.bridge', options: BridgeClientOptions = {}) {\n\t\tthis.hostName = hostName\n\t\tthis.autoReconnect = options.autoReconnect ?? true\n\t}\n\n\t/**\n\t * Set handler for incoming messages from the host.\n\t */\n\tonMessage(handler: MessageHandler<Inbound>): void {\n\t\tthis.messageHandlers.add(handler)\n\t}\n\n\t/**\n\t * Set handler for successful connection.\n\t */\n\tonConnect(handler: ConnectionHandler): void {\n\t\tthis.connectHandler = handler\n\t}\n\n\t/**\n\t * Set handler for disconnection.\n\t */\n\tonDisconnect(handler: ConnectionHandler): void {\n\t\tthis.disconnectHandler = handler\n\t}\n\n\t/**\n\t * Connect to the Native Messaging host.\n\t */\n\tconnect(): boolean {\n\t\tif (this.port) {\n\t\t\treturn true // Already connected\n\t\t}\n\n\t\tthis.reconnectEnabled = true\n\n\t\ttry {\n\t\t\tthis.port = chrome.runtime.connectNative(this.hostName)\n\n\t\t\tthis.port.onMessage.addListener((message: Inbound) => {\n\t\t\t\tthis.reconnectAttempts = 0 // Reset on successful message\n\t\t\t\tfor (const handler of this.messageHandlers) {\n\t\t\t\t\thandler(message)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tthis.port.onDisconnect.addListener(() => {\n\t\t\t\tconst error = chrome.runtime.lastError\n\t\t\t\tconsole.log('[BridgeClient] Disconnected:', error?.message ?? 'unknown reason')\n\n\t\t\t\tthis.port = null\n\n\t\t\t\tif (this.disconnectHandler) {\n\t\t\t\t\tthis.disconnectHandler()\n\t\t\t\t}\n\n\t\t\t\t// Attempt reconnection\n\t\t\t\tthis.scheduleReconnect()\n\t\t\t})\n\n\t\t\tconsole.log('[BridgeClient] Connected to', this.hostName)\n\t\t\tthis.reconnectAttempts = 0\n\n\t\t\tif (this.connectHandler) {\n\t\t\t\tthis.connectHandler()\n\t\t\t}\n\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Failed to connect:', err)\n\t\t\tthis.scheduleReconnect()\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the Native Messaging host.\n\t */\n\tdisconnect(): void {\n\t\tthis.reconnectEnabled = false\n\t\tif (this.port) {\n\t\t\tthis.port.disconnect()\n\t\t\tthis.port = null\n\t\t}\n\t}\n\n\t/**\n\t * Send a message to the Native Messaging host.\n\t */\n\tsend(message: Outbound): boolean {\n\t\tif (!this.port) {\n\t\t\tconsole.warn('[BridgeClient] Cannot send, not connected')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.port.postMessage(message)\n\t\t\treturn true\n\t\t} catch (err) {\n\t\t\tconsole.error('[BridgeClient] Send failed:', err)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Check if connected to the host.\n\t */\n\tisConnected(): boolean {\n\t\treturn this.port !== null\n\t}\n\n\t/**\n\t * Schedule a reconnection attempt with exponential backoff.\n\t */\n\tprivate scheduleReconnect(): void {\n\t\tif (!this.autoReconnect || !this.reconnectEnabled) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[BridgeClient] Max reconnection attempts reached')\n\t\t\treturn\n\t\t}\n\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts)\n\t\tthis.reconnectAttempts++\n\n\t\tconsole.log(`[BridgeClient] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect()\n\t\t}, delay)\n\t}\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\nimport type { TabInfo } from '../types/messages.js'\n\ntype TabFilter = {\n\turl?: string\n\ttitle?: string\n}\n\ntype TabListOptions = {\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n}\n\n/**\n * Shared tab-list query for popup UI and native-host requests so both surfaces stay in sync.\n */\nexport const listBrowserTabs = async (debuggerManager: DebuggerManager, filter?: TabFilter, options: TabListOptions = {}): Promise<TabInfo[]> => {\n\tconst chromeTabs = await chrome.tabs.query({})\n\tconst attachedTargets = debuggerManager.listAttached()\n\tconst attachedTabIds = new Set(attachedTargets.map((target) => target.tabId))\n\n\tlet tabs = chromeTabs\n\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number; url: string } => tab.id !== undefined && tab.url !== undefined)\n\t\t.filter((tab) => !tab.url.startsWith('chrome://') && !tab.url.startsWith('chrome-extension://'))\n\t\t.map((tab) => ({\n\t\t\ttabId: tab.id,\n\t\t\turl: tab.url,\n\t\t\ttitle: tab.title ?? '',\n\t\t\tfaviconUrl: tab.favIconUrl,\n\t\t\tattached: attachedTabIds.has(tab.id),\n\t\t\twatcherId: options.getWatcherIdForTab?.(tab.id) ?? undefined,\n\t\t}))\n\n\tif (filter?.url) {\n\t\tconst urlFilter = filter.url.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.url.toLowerCase().includes(urlFilter))\n\t}\n\n\tif (filter?.title) {\n\t\tconst titleFilter = filter.title.toLowerCase()\n\t\ttabs = tabs.filter((tab) => tab.title.toLowerCase().includes(titleFilter))\n\t}\n\n\ttabs.sort((left, right) => Number(right.attached) - Number(left.attached))\n\n\treturn tabs\n}\n", "/**\n * CDP Proxy - Routes CDP commands and events between the Native Messaging\n * host (argus-watcher in extension mode) and the chrome.debugger API.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { BridgeClient } from './bridge-client.js'\nimport type {\n\tCdpCommandMessage,\n\tAttachTabMessage,\n\tDetachTabMessage,\n\tEnableDomainMessage,\n\tCookieQueryMessage,\n\tExtensionToTabHost,\n\tTabInfo,\n\tTabHostToExtension,\n} from '../types/messages.js'\nimport { listBrowserTabs } from './tab-list.js'\n\nexport class CdpProxy {\n\tprivate debuggerManager: DebuggerManager\n\tprivate bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate removeDebuggerEventForwarding: (() => void) | null = null\n\tprivate removeDebuggerDetachForwarding: (() => void) | null = null\n\n\tconstructor(debuggerManager: DebuggerManager, bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.bridgeClient = bridgeClient\n\n\t\tthis.setupEventForwarding()\n\t\tthis.setupMessageHandling()\n\t}\n\n\t/**\n\t * Forward CDP events from debugger to bridge.\n\t */\n\tprivate setupEventForwarding(): void {\n\t\tthis.removeDebuggerEventForwarding = this.debuggerManager.onEvent((tabId, method, params, meta) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_event',\n\t\t\t\ttabId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tsessionId: meta?.sessionId ?? undefined,\n\t\t\t})\n\t\t})\n\n\t\tthis.removeDebuggerDetachForwarding = this.debuggerManager.onDetach((tabId, reason) => {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId,\n\t\t\t\treason,\n\t\t\t})\n\t\t})\n\t}\n\n\tdispose(): void {\n\t\tthis.removeDebuggerEventForwarding?.()\n\t\tthis.removeDebuggerEventForwarding = null\n\t\tthis.removeDebuggerDetachForwarding?.()\n\t\tthis.removeDebuggerDetachForwarding = null\n\t}\n\n\t/**\n\t * Handle messages from the bridge.\n\t */\n\tprivate setupMessageHandling(): void {\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tthis.handleMessage(message)\n\t\t})\n\t}\n\n\t/**\n\t * Process a message from the bridge.\n\t */\n\tprivate async handleMessage(message: TabHostToExtension): Promise<void> {\n\t\tswitch (message.type) {\n\t\t\tcase 'attach_tab':\n\t\t\t\tawait this.handleAttachTab(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'detach_tab':\n\t\t\t\tawait this.handleDetachTab(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cdp_command':\n\t\t\t\tawait this.handleCdpCommand(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'cookie_query':\n\t\t\t\tawait this.handleCookieQuery(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'enable_domain':\n\t\t\t\tawait this.handleEnableDomain(message)\n\t\t\t\tbreak\n\n\t\t\tcase 'host_info':\n\t\t\tcase 'host_ready':\n\t\t\tcase 'target_info':\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn('[CdpProxy] Unknown message type:', (message as { type: string }).type)\n\t\t}\n\t}\n\n\t/**\n\t * Attach to a tab.\n\t */\n\tprivate async handleAttachTab(message: AttachTabMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst target = await this.debuggerManager.attach(message.tabId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_attached',\n\t\t\t\ttabId: target.tabId,\n\t\t\t\turl: target.url,\n\t\t\t\ttitle: target.title,\n\t\t\t\tfaviconUrl: target.faviconUrl,\n\t\t\t\ttopFrameId: target.topFrameId,\n\t\t\t\tframes: this.debuggerManager.getFrames(target.tabId),\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('[CdpProxy] Failed to attach:', err)\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_detached',\n\t\t\t\ttabId: message.tabId,\n\t\t\t\treason: err instanceof Error ? err.message : 'attach_failed',\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Detach from a tab.\n\t */\n\tprivate async handleDetachTab(message: DetachTabMessage): Promise<void> {\n\t\tawait this.debuggerManager.detach(message.tabId)\n\t}\n\n\t/**\n\t * Execute a CDP command.\n\t */\n\tprivate async handleCdpCommand(message: CdpCommandMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await this.debuggerManager.sendCommand(message.tabId, message.method, message.params, message.sessionId)\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tresult,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cdp_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Query browser cookies from the attached tab's cookie store.\n\t */\n\tprivate async handleCookieQuery(message: CookieQueryMessage): Promise<void> {\n\t\ttry {\n\t\t\tconst cookies = await this.debuggerManager.getCookies(message.tabId, {\n\t\t\t\tdomain: message.domain,\n\t\t\t\turl: message.url,\n\t\t\t})\n\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\tcookies,\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'cookie_query_response',\n\t\t\t\trequestId: message.requestId,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: err instanceof Error ? err.message : 'Unknown error',\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Enable a CDP domain for a tab.\n\t */\n\tprivate async handleEnableDomain(message: EnableDomainMessage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.debuggerManager.enableDomain(message.tabId, message.domain)\n\t\t} catch (err) {\n\t\t\tconsole.error('[CdpProxy] Failed to enable domain:', err)\n\t\t}\n\t}\n\n\t/**\n\t * Manually attach to a tab (called from popup).\n\t */\n\tasync attachTab(tabId: number): Promise<void> {\n\t\tawait this.handleAttachTab({ type: 'attach_tab', tabId })\n\t}\n\n\t/**\n\t * Manually detach from a tab (called from popup).\n\t */\n\tasync detachTab(tabId: number): Promise<void> {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'tab_detached',\n\t\t\ttabId,\n\t\t\treason: 'user_requested',\n\t\t})\n\t\tawait this.debuggerManager.detach(tabId)\n\t}\n\n\t/**\n\t * Get list of tabs for popup UI.\n\t */\n\tasync getTabsForPopup(): Promise<TabInfo[]> {\n\t\treturn await listBrowserTabs(this.debuggerManager)\n\t}\n}\n", "export const BRIDGE_HOST_NAME = 'com.vforsh.argus.bridge'\nexport const CONTROL_HOST_NAME = 'com.vforsh.argus.control'\n", "import type { ExtensionToTabHost, TabHostToExtension } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport { CdpProxy } from './cdp-proxy.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { BRIDGE_HOST_NAME } from './native-hosts.js'\n\nexport type TabWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type TabTargetInfo = {\n\ttargetId: string\n\ttitle: string | null\n\turl: string | null\n\tattachedAt: number\n\ttargetReady: boolean | null\n}\n\nexport type TabBridgeSessionEvents = {\n\tonWatcherInfo?: (info: TabWatcherInfo) => void\n\tonTargetInfo?: (info: TabTargetInfo) => void\n\tonDisconnect?: () => void\n}\n\nexport type TabBridgeSessionOptions = {\n\twatcherId?: string\n}\n\n/**\n * Owns one Native Messaging bridge + one watcher process for a single attached tab.\n * Each session stays tab-scoped so the extension can expose true one-watcher-per-tab semantics.\n */\nexport class TabBridgeSession {\n\tprivate readonly tabId: number\n\tprivate readonly bridgeClient: BridgeClient<TabHostToExtension, ExtensionToTabHost>\n\tprivate readonly cdpProxy: CdpProxy\n\tprivate readonly events: TabBridgeSessionEvents\n\tprivate watcherInfo: TabWatcherInfo | null = null\n\tprivate targetInfo: TabTargetInfo | null = null\n\tprivate desiredWatcherId: string | undefined\n\tprivate lastMessageAt: number | null = null\n\tprivate ready = false\n\tprivate readyWaiters: Array<() => void> = []\n\tprivate watcherInfoWaiters: Array<() => void> = []\n\tprivate disposed = false\n\n\tconstructor(tabId: number, debuggerManager: DebuggerManager, events: TabBridgeSessionEvents = {}, options: TabBridgeSessionOptions = {}) {\n\t\tthis.tabId = tabId\n\t\tthis.events = events\n\t\tthis.desiredWatcherId = options.watcherId\n\t\tthis.bridgeClient = new BridgeClient(BRIDGE_HOST_NAME, { autoReconnect: false })\n\t\tthis.cdpProxy = new CdpProxy(debuggerManager, this.bridgeClient)\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tthis.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tasync connectAndAttach(): Promise<void> {\n\t\tthis.assertOpen()\n\t\tconst connected = this.bridgeClient.connect()\n\t\tif (!connected) {\n\t\t\tthrow new Error(`Failed to connect native host for tab ${this.tabId}`)\n\t\t}\n\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'init_tab_watcher',\n\t\t\twatcherId: this.desiredWatcherId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to initialize watcher for tab ${this.tabId}`)\n\t\t}\n\t\tawait this.waitUntilReady()\n\t\tawait this.waitForWatcherInfo()\n\t\tawait this.cdpProxy.attachTab(this.tabId)\n\t}\n\n\tasync waitUntilReady(timeoutMs = 3_000): Promise<void> {\n\t\tthis.assertOpen()\n\t\tif (this.ready) {\n\t\t\treturn\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.readyWaiters = this.readyWaiters.filter((waiter) => waiter !== onReady)\n\t\t\t\treject(new Error(`Native host session for tab ${this.tabId} did not become ready`))\n\t\t\t}, timeoutMs)\n\t\t\tconst onReady = (): void => {\n\t\t\t\tclearTimeout(timer)\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\tthis.readyWaiters.push(onReady)\n\t\t})\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.cdpProxy.detachTab(this.tabId)\n\t\t} finally {\n\t\t\tthis.dispose()\n\t\t}\n\t}\n\n\tselectTarget(frameId: string | null): void {\n\t\tthis.assertOpen()\n\t\tconst sent = this.bridgeClient.send({\n\t\t\ttype: 'target_selected',\n\t\t\ttabId: this.tabId,\n\t\t\tframeId,\n\t\t})\n\t\tif (!sent) {\n\t\t\tthrow new Error(`Failed to select target for tab ${this.tabId}`)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.cdpProxy.dispose()\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): TabWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetTargetInfo(): TabTargetInfo | null {\n\t\treturn this.targetInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async waitForWatcherInfo(timeoutMs = 3_000): Promise<void> {\n\t\tthis.assertOpen()\n\t\tif (this.watcherInfo) {\n\t\t\treturn\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.watcherInfoWaiters = this.watcherInfoWaiters.filter((waiter) => waiter !== onWatcherInfo)\n\t\t\t\treject(new Error(`Native host session for tab ${this.tabId} did not report watcher info`))\n\t\t\t}, timeoutMs)\n\t\t\tconst onWatcherInfo = (): void => {\n\t\t\t\tclearTimeout(timer)\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\tthis.watcherInfoWaiters.push(onWatcherInfo)\n\t\t})\n\t}\n\n\tprivate handleMessage(message: TabHostToExtension): void {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info':\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\tthis.resolveWatcherInfoWaiters()\n\t\t\t\treturn\n\n\t\t\tcase 'host_ready':\n\t\t\t\tthis.resolveReadyWaiters()\n\t\t\t\treturn\n\n\t\t\tcase 'target_info':\n\t\t\t\tthis.targetInfo = {\n\t\t\t\t\ttargetId: message.targetId,\n\t\t\t\t\ttitle: message.title,\n\t\t\t\t\turl: message.url,\n\t\t\t\t\tattachedAt: message.attachedAt,\n\t\t\t\t\ttargetReady: message.targetReady ?? null,\n\t\t\t\t}\n\t\t\t\tthis.events.onTargetInfo?.(this.targetInfo)\n\t\t}\n\t}\n\n\tprivate resolveReadyWaiters(): void {\n\t\tthis.ready = true\n\t\tconst waiters = this.readyWaiters\n\t\tthis.readyWaiters = []\n\t\tfor (const waiter of waiters) {\n\t\t\twaiter()\n\t\t}\n\t}\n\n\tprivate resolveWatcherInfoWaiters(): void {\n\t\tconst waiters = this.watcherInfoWaiters\n\t\tthis.watcherInfoWaiters = []\n\t\tfor (const waiter of waiters) {\n\t\t\twaiter()\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error(`Native host session for tab ${this.tabId} is already closed`)\n\t\t}\n\t}\n}\n", "import type { ControlDiagnostics, ControlHostToExtension, ExtensionToControlHost, TabInfo } from '../types/messages.js'\nimport { BridgeClient } from './bridge-client.js'\nimport type { DebuggerManager } from './debugger-manager.js'\nimport { CONTROL_HOST_NAME } from './native-hosts.js'\nimport { listBrowserTabs } from './tab-list.js'\n\nexport type ControlWatcherInfo = {\n\twatcherId: string\n\twatcherHost: string\n\twatcherPort: number\n\tpid: number\n}\n\nexport type ControlBridgeSessionEvents = {\n\tonWatcherInfo?: (info: ControlWatcherInfo) => void\n\tonAttachTabWatcher?: (tabId: number, options: { watcherId?: string }) => Promise<TabActionResult>\n\tonDetachTabWatcher?: (tabId: number) => Promise<TabActionResult>\n\tgetWatcherIdForTab?: (tabId: number) => string | null | undefined\n\tgetDiagnostics?: () => ControlDiagnostics\n\tonDisconnect?: () => void\n}\n\nexport type TabActionResult = { ok: true; tab: TabInfo; watcherId?: string } | { ok: false; error: string }\n\n/**\n * Owns the extension-level native host. It never attaches chrome.debugger to a tab;\n * it only gives Argus a stable HTTP transport for browser-level extension commands.\n */\nexport class ControlBridgeSession {\n\tprivate readonly bridgeClient: BridgeClient<ControlHostToExtension, ExtensionToControlHost>\n\tprivate readonly debuggerManager: DebuggerManager\n\tprivate readonly events: ControlBridgeSessionEvents\n\tprivate watcherInfo: ControlWatcherInfo | null = null\n\tprivate lastMessageAt: number | null = null\n\tprivate disposed = false\n\n\tconstructor(debuggerManager: DebuggerManager, events: ControlBridgeSessionEvents = {}) {\n\t\tthis.debuggerManager = debuggerManager\n\t\tthis.events = events\n\t\tthis.bridgeClient = new BridgeClient(CONTROL_HOST_NAME, { autoReconnect: true })\n\n\t\tthis.bridgeClient.onMessage((message) => {\n\t\t\tvoid this.handleMessage(message)\n\t\t})\n\t\tthis.bridgeClient.onDisconnect(() => {\n\t\t\tif (this.disposed) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.events.onDisconnect?.()\n\t\t})\n\t}\n\n\tconnect(): boolean {\n\t\tthis.assertOpen()\n\t\treturn this.bridgeClient.connect()\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.disposed = true\n\t\tthis.bridgeClient.disconnect()\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.bridgeClient.isConnected()\n\t}\n\n\tgetWatcherInfo(): ControlWatcherInfo | null {\n\t\treturn this.watcherInfo\n\t}\n\n\tgetLastMessageAt(): number | null {\n\t\treturn this.lastMessageAt\n\t}\n\n\tprivate async handleMessage(message: ControlHostToExtension): Promise<void> {\n\t\tthis.lastMessageAt = Date.now()\n\n\t\tswitch (message.type) {\n\t\t\tcase 'host_info':\n\t\t\t\tthis.watcherInfo = {\n\t\t\t\t\twatcherId: message.watcherId,\n\t\t\t\t\twatcherHost: message.watcherHost,\n\t\t\t\t\twatcherPort: message.watcherPort,\n\t\t\t\t\tpid: message.pid,\n\t\t\t\t}\n\t\t\t\tthis.events.onWatcherInfo?.(this.watcherInfo)\n\t\t\t\treturn\n\n\t\t\tcase 'attach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onAttachTabWatcher?.(message.tabId, { watcherId: message.watcherId }))\n\t\t\t\treturn\n\n\t\t\tcase 'detach_tab_watcher':\n\t\t\t\tawait this.handleTabAction(message.requestId, () => this.events.onDetachTabWatcher?.(message.tabId))\n\t\t\t\treturn\n\n\t\t\tcase 'list_tabs':\n\t\t\t\tawait this.handleListTabs(message.requestId, message.filter)\n\t\t\t\treturn\n\n\t\t\tcase 'control_status':\n\t\t\t\tthis.handleControlStatus(message.requestId)\n\t\t\t\treturn\n\n\t\t\tcase 'host_ready':\n\t\t\t\treturn\n\t\t}\n\t}\n\n\tprivate async handleTabAction(requestId: number, action: () => Promise<TabActionResult> | undefined): Promise<void> {\n\t\ttry {\n\t\t\tconst result = (await action()) ?? { ok: false, error: 'Extension control action is not available' }\n\t\t\tif (!result.ok) {\n\t\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: false, error: { message: result.error } })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.bridgeClient.send({ type: 'tab_action_response', requestId, ok: true, tab: result.tab, watcherId: result.watcherId })\n\t\t} catch (error) {\n\t\t\tthis.bridgeClient.send({\n\t\t\t\ttype: 'tab_action_response',\n\t\t\t\trequestId,\n\t\t\t\tok: false,\n\t\t\t\terror: { message: error instanceof Error ? error.message : String(error) },\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate async handleListTabs(requestId: number, filter?: { url?: string; title?: string }): Promise<void> {\n\t\tconst tabs: TabInfo[] = await listBrowserTabs(this.debuggerManager, filter, {\n\t\t\tgetWatcherIdForTab: this.events.getWatcherIdForTab,\n\t\t})\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'list_tabs_response',\n\t\t\trequestId,\n\t\t\ttabs,\n\t\t})\n\t}\n\n\tprivate handleControlStatus(requestId: number): void {\n\t\tthis.bridgeClient.send({\n\t\t\ttype: 'control_status_response',\n\t\t\trequestId,\n\t\t\tdiagnostics: this.events.getDiagnostics?.() ?? this.buildFallbackDiagnostics(),\n\t\t})\n\t}\n\n\tprivate buildFallbackDiagnostics(): ControlDiagnostics {\n\t\treturn {\n\t\t\textensionId: null,\n\t\t\textensionVersion: null,\n\t\t\tcontrol: {\n\t\t\t\tconnected: this.isConnected(),\n\t\t\t\twatcherId: this.watcherInfo?.watcherId ?? null,\n\t\t\t\twatcherHost: this.watcherInfo?.watcherHost ?? null,\n\t\t\t\twatcherPort: this.watcherInfo?.watcherPort ?? null,\n\t\t\t\tpid: this.watcherInfo?.pid ?? null,\n\t\t\t\tlastMessageAt: this.lastMessageAt,\n\t\t\t},\n\t\t\ttabWatchers: [],\n\t\t\trecentEvents: [],\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error('Native host control session is already closed')\n\t\t}\n\t}\n}\n", "export type SelectionTarget = {\n\ttype: 'page' | 'iframe'\n\tframeId: string | null\n\ttitle: string | null\n\turl: string | null\n}\n\nexport type RememberedTargetSelection =\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: { type: 'page' }\n\t }\n\t| {\n\t\t\tpageKey: string\n\t\t\tpageUrl: string\n\t\t\tupdatedAt: number\n\t\t\ttarget: {\n\t\t\t\ttype: 'iframe'\n\t\t\t\turl: string | null\n\t\t\t\ttitle: string | null\n\t\t\t}\n\t }\n\nexport type TargetSelectionHistoryPersistence = {\n\tload: () => Promise<RememberedTargetSelection[]>\n\tsave: (entries: RememberedTargetSelection[]) => Promise<void>\n}\n\ntype RememberedSelectionDraft = Partial<RememberedTargetSelection> & {\n\ttarget?: { type?: string; url?: unknown; title?: unknown }\n}\n\nconst DEFAULT_STORAGE_KEY = 'targetSelectionHistory'\nconst DEFAULT_MAX_ENTRIES = 20\n\n/**\n * Group history by the stable document path instead of the full URL so replay survives\n * nonce/hash/query churn. The iframe hint itself still uses strict matching and fails closed.\n */\nexport const normalizeSelectionPageKey = (pageUrl: string): string => {\n\ttry {\n\t\tconst parsed = new URL(pageUrl)\n\t\treturn `${parsed.origin}${parsed.pathname || '/'}`\n\t} catch {\n\t\treturn pageUrl.split('#', 1)[0] || pageUrl\n\t}\n}\n\nexport const matchRememberedIframeTarget = (entry: RememberedTargetSelection, targets: SelectionTarget[]): SelectionTarget | null => {\n\tif (entry.target.type !== 'iframe') {\n\t\treturn null\n\t}\n\tconst rememberedIframe = entry.target\n\tconst iframeTargets = getIframeTargets(targets)\n\n\tif (rememberedIframe.url) {\n\t\treturn pickSingleTargetMatch(iframeTargets, (target) => target.url === rememberedIframe.url)\n\t}\n\n\tif (!rememberedIframe.title) {\n\t\treturn null\n\t}\n\n\treturn pickSingleTargetMatch(iframeTargets, (target) => normalizeTargetTitle(target.title) === rememberedIframe.title)\n}\n\nexport class TargetSelectionHistoryStore {\n\tprivate readonly persistence: TargetSelectionHistoryPersistence\n\tprivate readonly maxEntries: number\n\tprivate entries: RememberedTargetSelection[] = []\n\tprivate loadPromise: Promise<void> | null = null\n\tprivate saveChain: Promise<void> = Promise.resolve()\n\n\tconstructor(persistence: TargetSelectionHistoryPersistence = createChromeStoragePersistence(), options: { maxEntries?: number } = {}) {\n\t\tthis.persistence = persistence\n\t\tthis.maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES\n\t}\n\n\tasync getByPageUrl(pageUrl: string): Promise<RememberedTargetSelection | null> {\n\t\tawait this.ensureLoaded()\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\treturn this.entries.find((entry) => entry.pageKey === pageKey) ?? null\n\t}\n\n\tasync remember(pageUrl: string, target: SelectionTarget): Promise<RememberedTargetSelection> {\n\t\tawait this.ensureLoaded()\n\n\t\tconst entry = buildRememberedSelection(pageUrl, target)\n\t\tthis.entries = [entry, ...this.entries.filter((candidate) => candidate.pageKey !== entry.pageKey)].slice(0, this.maxEntries)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n\n\tprivate async ensureLoaded(): Promise<void> {\n\t\tif (!this.loadPromise) {\n\t\t\tthis.loadPromise = this.persistence\n\t\t\t\t.load()\n\t\t\t\t.then((entries) => {\n\t\t\t\t\tthis.entries = sanitizeRememberedSelections(entries).slice(0, this.maxEntries)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('[TargetSelectionHistoryStore] Failed to load history:', error)\n\t\t\t\t\tthis.entries = []\n\t\t\t\t})\n\t\t}\n\n\t\tawait this.loadPromise\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => undefined)\n\t\t\t.then(() => this.persistence.save(this.entries))\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TargetSelectionHistoryStore] Failed to save history:', error)\n\t\t\t})\n\n\t\tawait this.saveChain\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetSelectionHistoryPersistence => ({\n\tload: async () => {\n\t\tconst stored = await readStorageValue<unknown>(storageArea, storageKey)\n\t\treturn sanitizeRememberedSelections(Array.isArray(stored) ? stored : [])\n\t},\n\tsave: async (entries) => {\n\t\tawait writeStorageValue(storageArea, { [storageKey]: entries })\n\t},\n})\n\nconst buildRememberedSelection = (pageUrl: string, target: SelectionTarget): RememberedTargetSelection => {\n\tconst base = {\n\t\tpageKey: normalizeSelectionPageKey(pageUrl),\n\t\tpageUrl,\n\t\tupdatedAt: Date.now(),\n\t}\n\n\tif (target.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(target.url),\n\t\t\ttitle: normalizeTargetTitle(target.title),\n\t\t},\n\t}\n}\n\nconst pickSingleTargetMatch = <T>(targets: T[], predicate: (target: T) => boolean): T | null => {\n\tconst matches = targets.filter(predicate)\n\treturn matches.length === 1 ? matches[0] : null\n}\n\nconst getIframeTargets = (targets: SelectionTarget[]): Array<SelectionTarget & { type: 'iframe'; frameId: string }> => {\n\treturn targets.filter((target): target is SelectionTarget & { type: 'iframe'; frameId: string } => {\n\t\treturn target.type === 'iframe' && typeof target.frameId === 'string' && target.frameId.length > 0\n\t})\n}\n\nconst sanitizeRememberedSelections = (entries: unknown[]): RememberedTargetSelection[] => {\n\treturn entries\n\t\t.map(sanitizeRememberedSelection)\n\t\t.filter((entry): entry is RememberedTargetSelection => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nconst sanitizeRememberedSelection = (entry: unknown): RememberedTargetSelection | null => {\n\tconst candidate = entry as RememberedSelectionDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0) {\n\t\treturn null\n\t}\n\n\tconst base = {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t}\n\n\tif (candidate.target?.type === 'page') {\n\t\treturn {\n\t\t\t...base,\n\t\t\ttarget: { type: 'page' },\n\t\t}\n\t}\n\n\tif (candidate.target?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...base,\n\t\ttarget: {\n\t\t\ttype: 'iframe',\n\t\t\turl: normalizeTargetUrl(typeof candidate.target.url === 'string' ? candidate.target.url : null),\n\t\t\ttitle: normalizeTargetTitle(typeof candidate.target.title === 'string' ? candidate.target.title : null),\n\t\t},\n\t}\n}\n\nfunction normalizeTargetUrl(url: string | null | undefined): string | null {\n\treturn normalizeOptionalText(url)\n}\n\nfunction normalizeTargetTitle(title: string | null | undefined): string | null {\n\treturn normalizeOptionalText(title)\n}\n\nfunction normalizeOptionalText(value: string | null | undefined): string | null {\n\treturn typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nconst sortByUpdatedAtDesc = (left: RememberedTargetSelection, right: RememberedTargetSelection): number => right.updatedAt - left.updatedAt\n\nconst readStorageValue = async <T>(storageArea: chrome.storage.StorageArea, key: string): Promise<T | undefined> => {\n\treturn await new Promise<T | undefined>((resolve, reject) => {\n\t\tstorageArea.get(key, (items) => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(items[key] as T | undefined)\n\t\t})\n\t})\n}\n\nconst writeStorageValue = async (storageArea: chrome.storage.StorageArea, items: Record<string, unknown>): Promise<void> => {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tstorageArea.set(items, () => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve()\n\t\t})\n\t})\n}\n", "import { normalizeSelectionPageKey, type SelectionTarget } from './target-selection-history.js'\n\nexport type HiddenTarget = {\n\ttype: 'iframe'\n\turl: string | null\n\ttitle: string | null\n}\n\nexport type HiddenTargetPageEntry = {\n\tpageKey: string\n\tpageUrl: string\n\tupdatedAt: number\n\ttargets: HiddenTarget[]\n}\n\nexport type TargetVisibilityPersistence = {\n\tload: () => Promise<HiddenTargetPageEntry[]>\n\tsave: (entries: HiddenTargetPageEntry[]) => Promise<void>\n}\n\ntype HiddenTargetPageDraft = Partial<HiddenTargetPageEntry> & {\n\ttargets?: unknown\n}\n\ntype HiddenTargetDraft = Partial<HiddenTarget> & {\n\ttype?: unknown\n\turl?: unknown\n\ttitle?: unknown\n}\n\nconst DEFAULT_STORAGE_KEY = 'hiddenTargetHistory'\nconst DEFAULT_MAX_PAGE_ENTRIES = 20\n\n/**\n * Persists page-scoped iframe hide preferences. Frame ids are intentionally not stored:\n * Chrome regenerates them often, while URL/title signatures survive reloads well enough.\n */\nexport class TargetVisibilityHistoryStore {\n\tprivate readonly persistence: TargetVisibilityPersistence\n\tprivate readonly maxPageEntries: number\n\tprivate entries: HiddenTargetPageEntry[] = []\n\tprivate loadPromise: Promise<void> | null = null\n\tprivate saveChain: Promise<void> = Promise.resolve()\n\n\tconstructor(persistence: TargetVisibilityPersistence = createChromeStoragePersistence(), options: { maxPageEntries?: number } = {}) {\n\t\tthis.persistence = persistence\n\t\tthis.maxPageEntries = options.maxPageEntries ?? DEFAULT_MAX_PAGE_ENTRIES\n\t}\n\n\tasync getHiddenTargets(pageUrl: string): Promise<HiddenTarget[]> {\n\t\tawait this.ensureLoaded()\n\t\treturn [...(this.findEntry(pageUrl)?.targets ?? [])]\n\t}\n\n\tasync hide(pageUrl: string, target: SelectionTarget): Promise<HiddenTargetPageEntry | null> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\tconst existing = this.findEntry(pageUrl)\n\t\tconst targets = uniqueHiddenTargets([hiddenTarget, ...(existing?.targets ?? [])])\n\t\tconst entry = { pageKey, pageUrl, updatedAt: Date.now(), targets }\n\t\tthis.upsertEntry(entry)\n\t\tawait this.persist()\n\t\treturn entry\n\t}\n\n\tasync show(pageUrl: string, target: SelectionTarget): Promise<void> {\n\t\tawait this.ensureLoaded()\n\t\tconst hiddenTarget = toHiddenTarget(target)\n\t\tif (!hiddenTarget) {\n\t\t\treturn\n\t\t}\n\n\t\tconst existing = this.findEntry(pageUrl)\n\t\tif (!existing) {\n\t\t\treturn\n\t\t}\n\n\t\tconst targets = existing.targets.filter((candidate) => !isSameHiddenTarget(candidate, hiddenTarget))\n\t\tif (targets.length === 0) {\n\t\t\tthis.entries = this.entries.filter((entry) => entry.pageKey !== existing.pageKey)\n\t\t\tawait this.persist()\n\t\t\treturn\n\t\t}\n\n\t\tthis.entries = this.entries.map((entry) => (entry.pageKey === existing.pageKey ? { ...entry, targets, updatedAt: Date.now() } : entry))\n\t\tawait this.persist()\n\t}\n\n\tasync isHidden(pageUrl: string, target: SelectionTarget): Promise<boolean> {\n\t\tconst hiddenTargets = await this.getHiddenTargets(pageUrl)\n\t\treturn hiddenTargets.some((hiddenTarget) => matchesHiddenTarget(hiddenTarget, target))\n\t}\n\n\tprivate findEntry(pageUrl: string): HiddenTargetPageEntry | null {\n\t\tconst pageKey = normalizeSelectionPageKey(pageUrl)\n\t\treturn this.entries.find((entry) => entry.pageKey === pageKey) ?? null\n\t}\n\n\tprivate upsertEntry(entry: HiddenTargetPageEntry): void {\n\t\tthis.entries = [entry, ...this.entries.filter((candidate) => candidate.pageKey !== entry.pageKey)].slice(0, this.maxPageEntries)\n\t}\n\n\tprivate async ensureLoaded(): Promise<void> {\n\t\tif (!this.loadPromise) {\n\t\t\tthis.loadPromise = this.persistence\n\t\t\t\t.load()\n\t\t\t\t.then((entries) => {\n\t\t\t\t\tthis.entries = sanitizeHiddenTargetEntries(entries).slice(0, this.maxPageEntries)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('[TargetVisibilityHistoryStore] Failed to load history:', error)\n\t\t\t\t\tthis.entries = []\n\t\t\t\t})\n\t\t}\n\n\t\tawait this.loadPromise\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => undefined)\n\t\t\t.then(() => this.persistence.save(this.entries))\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TargetVisibilityHistoryStore] Failed to save history:', error)\n\t\t\t})\n\n\t\tawait this.saveChain\n\t}\n}\n\nexport const createChromeStoragePersistence = (\n\tstorageArea: chrome.storage.StorageArea = chrome.storage.local,\n\tstorageKey: string = DEFAULT_STORAGE_KEY,\n): TargetVisibilityPersistence => ({\n\tload: async () => {\n\t\tconst stored = await readStorageValue<unknown>(storageArea, storageKey)\n\t\treturn sanitizeHiddenTargetEntries(Array.isArray(stored) ? stored : [])\n\t},\n\tsave: async (entries) => {\n\t\tawait writeStorageValue(storageArea, { [storageKey]: entries })\n\t},\n})\n\nexport function matchesHiddenTarget(hiddenTarget: HiddenTarget, target: SelectionTarget): boolean {\n\tif (target.type !== 'iframe') {\n\t\treturn false\n\t}\n\n\tconst candidate = toHiddenTarget(target)\n\treturn candidate ? isSameHiddenTarget(hiddenTarget, candidate) : false\n}\n\nfunction toHiddenTarget(target: SelectionTarget): HiddenTarget | null {\n\tif (target.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(target.url)\n\tconst title = normalizeOptionalText(target.title)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n\nfunction uniqueHiddenTargets(targets: HiddenTarget[]): HiddenTarget[] {\n\tconst unique: HiddenTarget[] = []\n\tfor (const target of targets) {\n\t\tif (!unique.some((candidate) => isSameHiddenTarget(candidate, target))) {\n\t\t\tunique.push(target)\n\t\t}\n\t}\n\treturn unique\n}\n\nfunction isSameHiddenTarget(left: HiddenTarget, right: HiddenTarget): boolean {\n\tif (left.url || right.url) {\n\t\treturn left.url === right.url\n\t}\n\n\treturn left.title === right.title\n}\n\nfunction sanitizeHiddenTargetEntries(entries: unknown[]): HiddenTargetPageEntry[] {\n\treturn entries\n\t\t.map(sanitizeHiddenTargetEntry)\n\t\t.filter((entry): entry is HiddenTargetPageEntry => entry !== null)\n\t\t.sort(sortByUpdatedAtDesc)\n}\n\nfunction sanitizeHiddenTargetEntry(entry: unknown): HiddenTargetPageEntry | null {\n\tconst candidate = entry as HiddenTargetPageDraft\n\tif (typeof candidate?.pageUrl !== 'string' || candidate.pageUrl.length === 0 || !Array.isArray(candidate.targets)) {\n\t\treturn null\n\t}\n\n\tconst targets = uniqueHiddenTargets(candidate.targets.map(sanitizeHiddenTarget).filter((target): target is HiddenTarget => target !== null))\n\tif (targets.length === 0) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\tpageKey:\n\t\t\ttypeof candidate.pageKey === 'string' && candidate.pageKey.length > 0 ? candidate.pageKey : normalizeSelectionPageKey(candidate.pageUrl),\n\t\tpageUrl: candidate.pageUrl,\n\t\tupdatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : 0,\n\t\ttargets,\n\t}\n}\n\nfunction sanitizeHiddenTarget(target: unknown): HiddenTarget | null {\n\tconst candidate = target as HiddenTargetDraft\n\tif (candidate?.type !== 'iframe') {\n\t\treturn null\n\t}\n\n\tconst url = normalizeOptionalText(typeof candidate.url === 'string' ? candidate.url : null)\n\tconst title = normalizeOptionalText(typeof candidate.title === 'string' ? candidate.title : null)\n\tif (!url && !title) {\n\t\treturn null\n\t}\n\n\treturn { type: 'iframe', url, title }\n}\n\nfunction normalizeOptionalText(value: string | null | undefined): string | null {\n\treturn typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nconst sortByUpdatedAtDesc = (left: HiddenTargetPageEntry, right: HiddenTargetPageEntry): number => right.updatedAt - left.updatedAt\n\nconst readStorageValue = async <T>(storageArea: chrome.storage.StorageArea, key: string): Promise<T | undefined> => {\n\treturn await new Promise<T | undefined>((resolve, reject) => {\n\t\tstorageArea.get(key, (items) => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(items[key] as T | undefined)\n\t\t})\n\t})\n}\n\nconst writeStorageValue = async (storageArea: chrome.storage.StorageArea, items: Record<string, unknown>): Promise<void> => {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tstorageArea.set(items, () => {\n\t\t\tconst error = chrome.runtime.lastError\n\t\t\tif (error) {\n\t\t\t\treject(new Error(error.message))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve()\n\t\t})\n\t})\n}\n", "import type { DebuggerManager } from './debugger-manager.js'\n\nlet badgeSyncChain: Promise<void> = Promise.resolve()\n\n/**\n * Serialize badge writes and reconcile on popup reads so an external detach from Chrome's\n * debugger infobar cannot leave stale badge text behind.\n */\nexport function syncActionBadge(debuggerManager: DebuggerManager): Promise<void> {\n\tbadgeSyncChain = badgeSyncChain\n\t\t.catch(() => undefined)\n\t\t.then(async () => {\n\t\t\tconst attachedCount = debuggerManager.listAttached().length\n\t\t\tawait applyBadgeState(attachedCount)\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error('[ServiceWorker] Failed to sync action badge:', error)\n\t\t})\n\n\treturn badgeSyncChain\n}\n\nasync function applyBadgeState(attachedCount: number): Promise<void> {\n\tconst badgeText = attachedCount > 0 ? String(attachedCount) : ''\n\tconst tabs = await chrome.tabs.query({})\n\n\t// Clear any tab-specific badge text Chrome may still be holding onto, then keep the default in sync.\n\tawait Promise.all(\n\t\ttabs\n\t\t\t.filter((tab): tab is chrome.tabs.Tab & { id: number } => tab.id !== undefined)\n\t\t\t.map((tab) => chrome.action.setBadgeText({ tabId: tab.id, text: badgeText })),\n\t)\n\tawait chrome.action.setBadgeText({ text: badgeText })\n\n\tif (attachedCount > 0) {\n\t\tawait chrome.action.setBadgeBackgroundColor({ color: '#4CAF50' })\n\t}\n}\n", "/**\n * Read-only views of the debugger frame tree, shaped for the popup UI.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { SelectionTarget } from './target-selection-history.js'\nimport type { PopupTarget } from './popup-protocol.js'\n\n/** Parse watcher target ids (`tab:<id>` / `frame:<tabId>:<frameId>`). Returns null for unknown formats. */\nexport function parseWatcherTargetId(targetId: string): { tabId: number; frameId: string | null } | null {\n\tif (targetId.startsWith('tab:')) {\n\t\tconst tabId = Number.parseInt(targetId.slice(4), 10)\n\t\treturn Number.isFinite(tabId) ? { tabId, frameId: null } : null\n\t}\n\n\tif (targetId.startsWith('frame:')) {\n\t\tconst [, tabIdRaw, ...frameIdParts] = targetId.split(':')\n\t\tconst tabId = Number.parseInt(tabIdRaw ?? '', 10)\n\t\tconst frameId = frameIdParts.join(':')\n\t\treturn Number.isFinite(tabId) && frameId ? { tabId, frameId } : null\n\t}\n\n\treturn null\n}\n\n/** List the page plus iframe targets for an attached tab, in popup display shape. */\nexport function getPopupTargets(debuggerManager: DebuggerManager, tabId: number): PopupTarget[] {\n\tconst frames = debuggerManager.getFrames(tabId)\n\tconst topFrameId = debuggerManager.getTarget(tabId)?.topFrameId ?? null\n\tconst topFrame = frames.find((frame) => frame.frameId === topFrameId) ?? frames.find((frame) => frame.parentFrameId == null)\n\tif (!topFrame) {\n\t\treturn []\n\t}\n\n\treturn [\n\t\t{\n\t\t\ttype: 'page',\n\t\t\tframeId: null,\n\t\t\tparentFrameId: null,\n\t\t\ttitle: topFrame.title || 'Page',\n\t\t\turl: topFrame.url,\n\t\t},\n\t\t...frames\n\t\t\t.filter((frame) => frame.frameId !== topFrame.frameId)\n\t\t\t.map((frame) => ({\n\t\t\t\ttype: 'iframe' as const,\n\t\t\t\tframeId: frame.frameId,\n\t\t\t\tparentFrameId: frame.parentFrameId === topFrame.frameId ? null : frame.parentFrameId,\n\t\t\t\ttitle: frame.title || frame.url || `iframe ${frame.frameId.slice(0, 8)}`,\n\t\t\t\turl: frame.url,\n\t\t\t})),\n\t]\n}\n\nexport function getPopupTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget | null {\n\treturn getPopupTargets(debuggerManager, tabId).find((target) => (target.frameId ?? null) === frameId) ?? null\n}\n\nexport function getRequiredIframeTarget(debuggerManager: DebuggerManager, tabId: number, frameId: string | null): PopupTarget {\n\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\tif (!target || target.type !== 'iframe' || !target.frameId) {\n\t\tthrow new Error(`Unknown iframe target for tab ${tabId}`)\n\t}\n\n\treturn target\n}\n\nexport function getPageUrlForTab(debuggerManager: DebuggerManager, tabId: number): string | null {\n\treturn getPopupTarget(debuggerManager, tabId, null)?.url ?? debuggerManager.getTarget(tabId)?.url ?? null\n}\n\n/** Project a popup target to the shape persisted by selection/visibility history stores. */\nexport function toSelectionTarget(target: PopupTarget): SelectionTarget {\n\treturn {\n\t\ttype: target.type,\n\t\tframeId: target.frameId,\n\t\ttitle: target.title,\n\t\turl: target.url,\n\t}\n}\n", "/**\n * Build per-tab watcher status payloads for the popup from a live bridge session.\n */\n\nimport type { DebuggerManager } from './debugger-manager.js'\nimport type { TabBridgeSession } from './tab-bridge-session.js'\nimport type { PopupWatcherStatus } from './popup-protocol.js'\nimport { parseWatcherTargetId } from './popup-targets.js'\n\nexport function buildWatcherStatus(debuggerManager: DebuggerManager, tabId: number, session: TabBridgeSession): PopupWatcherStatus | null {\n\tconst watcherInfo = session.getWatcherInfo()\n\tconst targetInfo = session.getTargetInfo()\n\tconst parsedTarget = targetInfo ? parseWatcherTargetId(targetInfo.targetId) : null\n\n\tif (!watcherInfo && !targetInfo) {\n\t\treturn createWatcherStatus(debuggerManager, tabId, session, null, null)\n\t}\n\n\treturn createWatcherStatus(\n\t\tdebuggerManager,\n\t\ttabId,\n\t\tsession,\n\t\twatcherInfo ?? null,\n\t\ttargetInfo && parsedTarget\n\t\t\t? {\n\t\t\t\t\ttype: parsedTarget.frameId ? 'iframe' : 'page',\n\t\t\t\t\ttitle: targetInfo.title,\n\t\t\t\t\turl: targetInfo.url,\n\t\t\t\t\ttargetId: targetInfo.targetId,\n\t\t\t\t\tframeId: parsedTarget.frameId,\n\t\t\t\t\tattachedAt: targetInfo.attachedAt,\n\t\t\t\t\ttargetReady: targetInfo.targetReady,\n\t\t\t\t}\n\t\t\t: null,\n\t)\n}\n\nfunction createWatcherStatus(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): PopupWatcherStatus {\n\tconst readiness = buildWatcherReadiness(debuggerManager, tabId, session, watcherInfo, currentTarget)\n\treturn {\n\t\ttabId,\n\t\tbridgeConnected: readiness.nativeHostConnected,\n\t\tnativeHostConnected: readiness.nativeHostConnected,\n\t\twatcherReady: readiness.watcherReady,\n\t\ttargetReady: readiness.targetReady,\n\t\ttargetState: readiness.targetState,\n\t\twatcherId: watcherInfo?.watcherId ?? null,\n\t\twatcherHost: watcherInfo?.watcherHost ?? null,\n\t\twatcherPort: watcherInfo?.watcherPort ?? null,\n\t\tnativeHostPid: watcherInfo?.pid ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t\tcurrentTarget,\n\t}\n}\n\nfunction buildWatcherReadiness(\n\tdebuggerManager: DebuggerManager,\n\ttabId: number,\n\tsession: TabBridgeSession,\n\twatcherInfo: ReturnType<TabBridgeSession['getWatcherInfo']>,\n\tcurrentTarget: PopupWatcherStatus['currentTarget'],\n): Pick<PopupWatcherStatus, 'nativeHostConnected' | 'watcherReady' | 'targetReady' | 'targetState'> {\n\tconst nativeHostConnected = session.isConnected()\n\tconst watcherReady = nativeHostConnected && Boolean(watcherInfo?.watcherId && watcherInfo.watcherHost && watcherInfo.watcherPort != null)\n\tconst targetReady = currentTarget?.targetReady ?? getTargetReadiness(debuggerManager, tabId, currentTarget)\n\n\treturn {\n\t\tnativeHostConnected,\n\t\twatcherReady,\n\t\ttargetReady,\n\t\ttargetState: targetReady == null ? 'not-selected' : targetReady ? 'ready' : 'rebinding',\n\t}\n}\n\n/**\n * The watcher can be connected while a remembered iframe is still rebinding after reload.\n * Treat the extension's live frame map as the source of truth for whether frame-scoped\n * commands have a concrete execution target again.\n */\nfunction getTargetReadiness(debuggerManager: DebuggerManager, tabId: number, target: PopupWatcherStatus['currentTarget']): boolean | null {\n\tif (!target) {\n\t\treturn null\n\t}\n\n\tif (!target.frameId) {\n\t\treturn debuggerManager.isAttached(tabId)\n\t}\n\n\tconst frame = debuggerManager.getFrames(tabId).find((candidate) => candidate.frameId === target.frameId)\n\treturn Boolean(frame?.sessionId)\n}\n", "/**\n * Service Worker - Main entry point for the Argus CDP Bridge extension.\n * Owns one debugger manager plus one Native Messaging bridge session per attached tab,\n * and answers popup messages (see `popup-protocol.ts` for the message shapes).\n */\n\nimport { DebuggerManager } from './debugger-manager.js'\nimport { TabBridgeSession, type TabBridgeSessionOptions } from './tab-bridge-session.js'\nimport { ControlBridgeSession, type TabActionResult } from './control-bridge-session.js'\nimport { type RememberedTargetSelection, TargetSelectionHistoryStore, matchRememberedIframeTarget } from './target-selection-history.js'\nimport { TargetVisibilityHistoryStore, matchesHiddenTarget } from './target-visibility-history.js'\nimport { listBrowserTabs } from './tab-list.js'\nimport { syncActionBadge } from './action-badge.js'\nimport { buildWatcherStatus } from './watcher-status.js'\nimport {\n\tgetPageUrlForTab,\n\tgetPopupTarget,\n\tgetPopupTargets,\n\tgetRequiredIframeTarget,\n\tparseWatcherTargetId,\n\ttoSelectionTarget,\n} from './popup-targets.js'\nimport type {\n\tPopupActionMessage,\n\tPopupEvent,\n\tPopupResponse,\n\tPopupStatusPayload,\n\tPopupTabWithTargets,\n\tPopupTarget,\n\tPopupWatcherStatus,\n} from './popup-protocol.js'\nimport type { ControlDiagnostics, TabInfo } from '../types/messages.js'\n\nconst debuggerManager = new DebuggerManager()\nconst controlBridgeSession = new ControlBridgeSession(debuggerManager, {\n\tonWatcherInfo: (info) => {\n\t\trecordEvent('info', 'bridge', `Control watcher ready: ${info.watcherId} (pid ${info.pid})`)\n\t},\n\tonAttachTabWatcher: attachTabFromControl,\n\tonDetachTabWatcher: detachTabFromControl,\n\tgetWatcherIdForTab,\n\tgetDiagnostics: buildControlDiagnostics,\n\tonDisconnect: () => {\n\t\trecordEvent('error', 'bridge', 'Control native host disconnected')\n\t},\n})\nconst bridgeSessions = new Map<number, TabBridgeSession>()\nconst selectedFrameByTabId = new Map<number, string | null>()\n// Re-try a remembered iframe while Chrome is still populating frame metadata for a fresh attach.\nconst pendingRememberedTargetByTabId = new Map<number, RememberedTargetSelection>()\nconst targetSelectionHistory = new TargetSelectionHistoryStore()\nconst targetVisibilityHistory = new TargetVisibilityHistoryStore()\nconst recentEvents: PopupEvent[] = []\nconst MAX_RECENT_EVENTS = 8\nconst REMEMBERED_TARGET_RETRY_EVENTS = new Set(['Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated'])\n\nfunction recordEvent(level: PopupEvent['level'], source: PopupEvent['source'], message: string): void {\n\trecentEvents.unshift({\n\t\tts: Date.now(),\n\t\tlevel,\n\t\tsource,\n\t\tmessage,\n\t})\n\n\tif (recentEvents.length > MAX_RECENT_EVENTS) {\n\t\trecentEvents.length = MAX_RECENT_EVENTS\n\t}\n}\n\ndebuggerManager.onDetach((tabId, reason) => {\n\tclearTabState(tabId)\n\trecordEvent('error', 'debugger', `Tab ${tabId} detached: ${reason}`)\n\tvoid syncActionBadge(debuggerManager)\n})\n\ndebuggerManager.onEvent((tabId, method) => {\n\tif (!shouldReplayRememberedTarget(tabId, method)) {\n\t\treturn\n\t}\n\n\tvoid replayRememberedTargetSelection(tabId)\n})\n\nchrome.runtime.onMessage.addListener(\n\t(message: PopupActionMessage, _sender: chrome.runtime.MessageSender, sendResponse: (response: unknown) => void) => {\n\t\tvoid handlePopupMessage(message, sendResponse)\n\t\treturn true\n\t},\n)\n\nchrome.runtime.onStartup.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nchrome.runtime.onInstalled.addListener(() => {\n\tensureControlBridgeSession()\n})\n\nasync function handlePopupMessage(message: PopupActionMessage, sendResponse: (response: unknown) => void): Promise<void> {\n\tensureControlBridgeSession()\n\tpruneStaleBridgeSessions()\n\tconst response = await buildPopupResponse(message)\n\tawait syncActionBadge(debuggerManager)\n\tsendResponse(response)\n}\n\nfunction ensureControlBridgeSession(): void {\n\tif (controlBridgeSession.isConnected()) {\n\t\treturn\n\t}\n\tcontrolBridgeSession.connect()\n}\n\nensureControlBridgeSession()\n\nasync function attachTabFromControl(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabActionResult> {\n\ttry {\n\t\tconst session = await attachBridgeSession(tabId, options)\n\t\tsetSelectedFrame(tabId, null)\n\t\tawait prepareRememberedTargetSelection(tabId)\n\t\trecordEvent('info', 'bridge', `Control attached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab, watcherId: session.getWatcherInfo()?.watcherId }\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) }\n\t}\n}\n\nasync function detachTabFromControl(tabId: number): Promise<TabActionResult> {\n\ttry {\n\t\tawait detachTab(tabId)\n\t\trecordEvent('info', 'bridge', `Control detached tab ${tabId}`)\n\t\tvoid syncActionBadge(debuggerManager)\n\n\t\tconst tab = await getTabInfo(tabId)\n\t\tif (!tab) {\n\t\t\treturn { ok: false, error: `Tab ${tabId} is no longer available` }\n\t\t}\n\n\t\treturn { ok: true, tab }\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) }\n\t}\n}\n\nasync function buildPopupResponse(message: PopupActionMessage): Promise<PopupResponse> {\n\ttry {\n\t\tswitch (message.action) {\n\t\t\tcase 'getTargets':\n\t\t\t\treturn { success: true, tabs: await getTabsWithTargets() }\n\n\t\t\tcase 'attach': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait attachBridgeSession(tabId)\n\t\t\t\tsetSelectedFrame(tabId, null)\n\t\t\t\tawait prepareRememberedTargetSelection(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Attached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'detach': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait detachTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Detached tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'focusTab': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tawait focusTab(tabId)\n\t\t\t\trecordEvent('info', 'popup', `Focused tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'selectTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst session = bridgeSessions.get(tabId)\n\t\t\t\tif (!session) {\n\t\t\t\t\treturn { success: false, error: `No watcher bridge for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tconst frameId = message.frameId ?? null\n\t\t\t\tconst target = getPopupTarget(debuggerManager, tabId, frameId)\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn { success: false, error: `Unknown target for tab ${tabId}` }\n\t\t\t\t}\n\n\t\t\t\tsession.selectTarget(frameId)\n\t\t\t\tclearPendingRememberedTarget(tabId)\n\t\t\t\tsetSelectedFrame(tabId, frameId)\n\t\t\t\tawait rememberTargetSelection(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Selected ${frameId ? `iframe ${frameId}` : 'page'} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'hideTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, message.frameId ?? null)\n\t\t\t\tawait hideTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Hid iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'showTarget': {\n\t\t\t\tconst tabId = requireTabId(message)\n\t\t\t\tconst target = getRequiredIframeTarget(debuggerManager, tabId, message.frameId ?? null)\n\t\t\t\tawait showTarget(tabId, target)\n\t\t\t\trecordEvent('info', 'popup', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t\t\t\treturn { success: true }\n\t\t\t}\n\n\t\t\tcase 'getStatus':\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstatus: buildPopupStatusPayload(),\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn { success: false, error: `Unknown action: ${message.action}` }\n\t\t}\n\t} catch (err) {\n\t\trecordEvent('error', 'popup', err instanceof Error ? err.message : 'Unknown popup error')\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: err instanceof Error ? err.message : 'Unknown error',\n\t\t}\n\t}\n}\n\nfunction requireTabId(message: PopupActionMessage): number {\n\tif (message.tabId !== undefined) {\n\t\treturn message.tabId\n\t}\n\n\tthrow new Error('No tabId provided')\n}\n\nasync function attachBridgeSession(tabId: number, options: TabBridgeSessionOptions = {}): Promise<TabBridgeSession> {\n\tconst existing = bridgeSessions.get(tabId)\n\tif (existing) {\n\t\tawait connectBridgeSession(tabId, existing)\n\t\treturn existing\n\t}\n\n\tconst session = new TabBridgeSession(\n\t\ttabId,\n\t\tdebuggerManager,\n\t\t{\n\t\t\tonWatcherInfo: (info) => {\n\t\t\t\trecordEvent('info', 'bridge', `Watcher ready for tab ${tabId}: ${info.watcherId} (pid ${info.pid})`)\n\t\t\t},\n\t\t\tonTargetInfo: (info) => {\n\t\t\t\tsyncSelectedFrameFromWatcher(info.targetId)\n\t\t\t},\n\t\t\tonDisconnect: () => {\n\t\t\t\trecordEvent('error', 'bridge', `Native host disconnected for tab ${tabId}`)\n\t\t\t\tvoid debuggerManager.detach(tabId).catch(() => {})\n\t\t\t\tclearTabState(tabId)\n\t\t\t\tvoid syncActionBadge(debuggerManager)\n\t\t\t},\n\t\t},\n\t\toptions,\n\t)\n\tbridgeSessions.set(tabId, session)\n\tawait connectBridgeSession(tabId, session)\n\treturn session\n}\n\nasync function detachTab(tabId: number): Promise<void> {\n\tconst session = bridgeSessions.get(tabId)\n\tif (session) {\n\t\tawait session.detach()\n\t} else {\n\t\tawait debuggerManager.detach(tabId)\n\t}\n\n\tclearTabState(tabId)\n}\n\n/**\n * Activating the tab is not enough when it lives in a background window, so explicitly focus the host window too.\n */\nasync function focusTab(tabId: number): Promise<void> {\n\tconst tab = await chrome.tabs.get(tabId)\n\tawait chrome.tabs.update(tabId, { active: true })\n\tawait chrome.windows.update(tab.windowId, { focused: true })\n}\n\nasync function connectBridgeSession(tabId: number, session: TabBridgeSession): Promise<void> {\n\ttry {\n\t\tawait session.connectAndAttach()\n\t} catch (error) {\n\t\tdestroyBridgeSession(tabId)\n\t\tthrow error\n\t}\n}\n\nfunction clearTabState(tabId: number): void {\n\tselectedFrameByTabId.delete(tabId)\n\tclearPendingRememberedTarget(tabId)\n\tdestroyBridgeSession(tabId)\n}\n\n/**\n * Chrome can drop the root debugger attachment from the infobar while the native host is still\n * alive long enough to keep reporting its last selected target. Trim those orphaned bridge\n * sessions before serving popup state so the badge and popup stay aligned with actual attachments.\n */\nfunction pruneStaleBridgeSessions(): void {\n\tfor (const [tabId, session] of bridgeSessions.entries()) {\n\t\tif (debuggerManager.isAttached(tabId)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!session.getTargetInfo()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tclearTabState(tabId)\n\t\trecordEvent('error', 'bridge', `Pruned stale watcher state for tab ${tabId}`)\n\t}\n}\n\nfunction destroyBridgeSession(tabId: number): void {\n\tconst session = bridgeSessions.get(tabId)\n\tif (!session) {\n\t\treturn\n\t}\n\n\tbridgeSessions.delete(tabId)\n\tsession.dispose()\n}\n\nfunction buildPopupStatusPayload(): PopupStatusPayload {\n\treturn {\n\t\tbridgeConnected: [...bridgeSessions.values()].some((session) => session.isConnected()),\n\t\tattachedTabs: debuggerManager.listAttached().map((target) => ({\n\t\t\ttabId: target.tabId,\n\t\t\turl: target.url,\n\t\t\ttitle: target.title,\n\t\t})),\n\t\twatchers: getWatcherStatuses(),\n\t\trecentEvents,\n\t}\n}\n\nfunction buildControlDiagnostics(): ControlDiagnostics {\n\tconst controlInfo = controlBridgeSession.getWatcherInfo()\n\treturn {\n\t\textensionId: chrome.runtime.id ?? null,\n\t\textensionVersion: chrome.runtime.getManifest().version ?? null,\n\t\tcontrol: {\n\t\t\tconnected: controlBridgeSession.isConnected(),\n\t\t\twatcherId: controlInfo?.watcherId ?? null,\n\t\t\twatcherHost: controlInfo?.watcherHost ?? null,\n\t\t\twatcherPort: controlInfo?.watcherPort ?? null,\n\t\t\tpid: controlInfo?.pid ?? null,\n\t\t\tlastMessageAt: controlBridgeSession.getLastMessageAt(),\n\t\t},\n\t\ttabWatchers: [...bridgeSessions.entries()].map(([tabId, session]) => buildTabBridgeStatus(tabId, session)),\n\t\trecentEvents,\n\t}\n}\n\nfunction buildTabBridgeStatus(tabId: number, session: TabBridgeSession): ControlDiagnostics['tabWatchers'][number] {\n\tconst watcher = session.getWatcherInfo()\n\tconst target = session.getTargetInfo()\n\treturn {\n\t\ttabId,\n\t\tconnected: session.isConnected(),\n\t\twatcherId: watcher?.watcherId ?? null,\n\t\twatcherHost: watcher?.watcherHost ?? null,\n\t\twatcherPort: watcher?.watcherPort ?? null,\n\t\tpid: watcher?.pid ?? null,\n\t\ttargetId: target?.targetId ?? null,\n\t\ttargetTitle: target?.title ?? null,\n\t\ttargetUrl: target?.url ?? null,\n\t\ttargetReady: target?.targetReady ?? null,\n\t\tlastMessageAt: session.getLastMessageAt(),\n\t}\n}\n\nasync function getTabInfo(tabId: number): Promise<TabInfo | null> {\n\tconst tabs = await listBrowserTabs(debuggerManager, undefined, {\n\t\tgetWatcherIdForTab,\n\t})\n\treturn tabs.find((tab) => tab.tabId === tabId) ?? null\n}\n\nfunction getWatcherIdForTab(tabId: number): string | null {\n\treturn bridgeSessions.get(tabId)?.getWatcherInfo()?.watcherId ?? null\n}\n\nfunction getWatcherStatuses(): PopupWatcherStatus[] {\n\treturn [...bridgeSessions.entries()]\n\t\t.map(([tabId, session]) => buildWatcherStatus(debuggerManager, tabId, session))\n\t\t.filter((status): status is PopupWatcherStatus => status !== null)\n}\n\nasync function getTabsWithTargets(): Promise<PopupTabWithTargets[]> {\n\tconst tabs = await listBrowserTabs(debuggerManager)\n\treturn await Promise.all(\n\t\ttabs.map(async (tab) => {\n\t\t\tconst session = bridgeSessions.get(tab.tabId)\n\t\t\tconst { visibleTargets, hiddenTargets } = await getPopupTargetVisibility(tab.tabId, tab.attached)\n\t\t\treturn {\n\t\t\t\t...tab,\n\t\t\t\ttargets: visibleTargets,\n\t\t\t\thiddenTargets,\n\t\t\t\tselectedFrameId: getSelectedFrameId(tab.tabId),\n\t\t\t\twatcher: session ? buildWatcherStatus(debuggerManager, tab.tabId, session) : null,\n\t\t\t}\n\t\t}),\n\t)\n}\n\nasync function getPopupTargetVisibility(tabId: number, attached: boolean): Promise<{ visibleTargets: PopupTarget[]; hiddenTargets: PopupTarget[] }> {\n\tconst targets = attached ? getPopupTargets(debuggerManager, tabId) : []\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn { visibleTargets: targets, hiddenTargets: [] }\n\t}\n\n\tconst hiddenTargets = await filterHiddenTargets(pageUrl, targets)\n\tif (hiddenTargets.length === 0) {\n\t\treturn { visibleTargets: targets, hiddenTargets }\n\t}\n\n\treturn {\n\t\tvisibleTargets: targets.filter((target) => !hiddenTargets.includes(target)),\n\t\thiddenTargets,\n\t}\n}\n\nfunction syncSelectedFrameFromWatcher(targetId: string): void {\n\tconst target = parseWatcherTargetId(targetId)\n\tif (!target) {\n\t\treturn\n\t}\n\n\tsetSelectedFrame(target.tabId, target.frameId)\n}\n\nfunction getSelectedFrameId(tabId: number): string | null | undefined {\n\tif (!selectedFrameByTabId.has(tabId)) {\n\t\treturn undefined\n\t}\n\n\treturn selectedFrameByTabId.get(tabId) ?? null\n}\n\nasync function rememberTargetSelection(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetSelectionHistory.remember(pageUrl, toSelectionTarget(target))\n}\n\nasync function hideTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.hide(pageUrl, toSelectionTarget(target))\n\tif (getSelectedFrameId(tabId) !== target.frameId) {\n\t\treturn\n\t}\n\n\tconst session = bridgeSessions.get(tabId)\n\tsession?.selectTarget(null)\n\tsetSelectedFrame(tabId, null)\n\tconst pageTarget = getPopupTarget(debuggerManager, tabId, null)\n\tif (pageTarget) {\n\t\tawait rememberTargetSelection(tabId, pageTarget)\n\t}\n}\n\nasync function showTarget(tabId: number, target: PopupTarget): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\treturn\n\t}\n\n\tawait targetVisibilityHistory.show(pageUrl, toSelectionTarget(target))\n}\n\nasync function filterHiddenTargets(pageUrl: string, targets: PopupTarget[]): Promise<PopupTarget[]> {\n\tconst hiddenTargets = await targetVisibilityHistory.getHiddenTargets(pageUrl)\n\tif (hiddenTargets.length === 0) {\n\t\treturn []\n\t}\n\n\treturn targets.filter((target) => hiddenTargets.some((hiddenTarget) => matchesHiddenTarget(hiddenTarget, toSelectionTarget(target))))\n}\n\nasync function prepareRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst pageUrl = getPageUrlForTab(debuggerManager, tabId)\n\tif (!pageUrl) {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tconst remembered = await targetSelectionHistory.getByPageUrl(pageUrl)\n\tif (!remembered || remembered.target.type === 'page') {\n\t\tclearPendingRememberedTarget(tabId)\n\t\treturn\n\t}\n\n\tsetPendingRememberedTarget(tabId, remembered)\n\tawait replayRememberedTargetSelection(tabId)\n}\n\nasync function replayRememberedTargetSelection(tabId: number): Promise<void> {\n\tconst remembered = pendingRememberedTargetByTabId.get(tabId)\n\tconst session = bridgeSessions.get(tabId)\n\tif (!remembered || !session) {\n\t\treturn\n\t}\n\n\tconst target = matchRememberedIframeTarget(\n\t\tremembered,\n\t\tgetPopupTargets(debuggerManager, tabId).map((candidate) => toSelectionTarget(candidate)),\n\t)\n\tif (!target?.frameId) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tsession.selectTarget(target.frameId)\n\t\tsetSelectedFrame(tabId, target.frameId)\n\t\tclearPendingRememberedTarget(tabId)\n\t\trecordEvent('info', 'bridge', `Restored iframe ${target.frameId} on tab ${tabId}`)\n\t} catch (error) {\n\t\tconsole.warn(`[ServiceWorker] Failed to restore remembered iframe for tab ${tabId}:`, error)\n\t}\n}\n\nfunction shouldReplayRememberedTarget(tabId: number, method: string): boolean {\n\treturn pendingRememberedTargetByTabId.has(tabId) && REMEMBERED_TARGET_RETRY_EVENTS.has(method)\n}\n\nfunction setSelectedFrame(tabId: number, frameId: string | null): void {\n\tselectedFrameByTabId.set(tabId, frameId)\n}\n\nfunction setPendingRememberedTarget(tabId: number, remembered: RememberedTargetSelection): void {\n\tpendingRememberedTargetByTabId.set(tabId, remembered)\n}\n\nfunction clearPendingRememberedTarget(tabId: number): void {\n\tpendingRememberedTargetByTabId.delete(tabId)\n}\n\nconsole.log('[ServiceWorker] Argus CDP Bridge extension loaded')\nvoid syncActionBadge(debuggerManager)\n\nexport { debuggerManager, bridgeSessions }\n"],
5
+ "mappings": ";AAkDA,IAAM,2BAA2B;AAkB1B,IAAM,kBAAN,MAAsB;AAAA,EACpB,WAAW,oBAAI,IAA4B;AAAA,EAC3C,gBAAgB,oBAAI,IAAqB;AAAA,EACzC,iBAAiB,oBAAI,IAA2B;AAAA,EAChD,sBAAsB,oBAAI,IAA2C;AAAA,EAE7E,cAAc;AACb,WAAO,SAAS,QAAQ,YAAY,CAAC,UAAU,QAAQ,WAAW;AACjE,WAAK,eAAe,UAAU,QAAQ,MAAM;AAAA,IAC7C,CAAC;AAED,WAAO,SAAS,SAAS,YAAY,CAAC,UAAU,WAAW;AAC1D,UAAI,SAAS,OAAO;AACnB,aAAK,aAAa,SAAS,OAAQ,SAAiC,aAAa,MAAM,MAAM;AAAA,MAC9F;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ,SAAsC;AAC7C,SAAK,cAAc,IAAI,OAAO;AAC9B,WAAO,MAAM;AACZ,WAAK,cAAc,OAAO,OAAO;AAAA,IAClC;AAAA,EACD;AAAA,EAEA,SAAS,SAA4C;AACpD,SAAK,eAAe,IAAI,OAAO;AAC/B,WAAO,MAAM;AACZ,WAAK,eAAe,OAAO,OAAO;AAAA,IACnC;AAAA,EACD;AAAA,EAEQ,UAAU,OAAe,QAAgB,QAAiB,WAAgC;AACjG,eAAW,WAAW,KAAK,eAAe;AACzC,cAAQ,OAAO,QAAQ,QAAQ,EAAE,UAAU,CAAC;AAAA,IAC7C;AAAA,EACD;AAAA,EAEQ,WAAW,OAAe,QAAsB;AACvD,eAAW,WAAW,KAAK,gBAAgB;AAC1C,cAAQ,OAAO,MAAM;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,MAAM,OAAO,OAAwC;AACpD,QAAI,KAAK,SAAS,IAAI,KAAK,GAAG;AAC7B,aAAO,KAAK,SAAS,IAAI,KAAK;AAAA,IAC/B;AAEA,UAAM,WAAqC,EAAE,MAAM;AACnD,UAAM,OAAO,SAAS,OAAO,UAAU,KAAK;AAE5C,UAAM,MAAM,MAAM,OAAO,KAAK,IAAI,KAAK;AACvC,UAAM,SAAyB;AAAA,MAC9B;AAAA,MACA,YAAY;AAAA,MACZ,KAAK,IAAI,OAAO;AAAA,MAChB,OAAO,IAAI,SAAS;AAAA,MACpB,YAAY,IAAI;AAAA,MAChB,YAAY,KAAK,IAAI;AAAA,MACrB,gBAAgB,oBAAI,IAAI;AAAA,MACxB,eAAe,oBAAI,IAAI;AAAA,MACvB,QAAQ,oBAAI,IAAI;AAAA,MAChB,YAAY;AAAA,IACb;AAEA,SAAK,SAAS,IAAI,OAAO,MAAM;AAC/B,UAAM,KAAK,oBAAoB,KAAK;AACpC,UAAM,KAAK,iBAAiB,OAAO,IAAI;AACvC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,OAA8B;AAC1C,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,OAAQ;AAEb,QAAI;AACH,YAAM,OAAO,SAAS,OAAO,OAAO,UAAU;AAAA,IAC/C,QAAQ;AAAA,IAER;AACA,SAAK,SAAS,OAAO,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,YAAyB,OAAe,QAAgB,QAAkC,WAAuC;AACtI,UAAM,SAAS,KAAK,kBAAkB,KAAK;AAC3C,UAAM,WAAW,KAAK,WAAW,QAAQ,SAAS;AAClD,UAAM,SAAS,MAAM,OAAO,SAAS,YAAY,UAAU,QAAQ,MAAM;AACzE,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,aAAa,OAAe,QAAgB,WAA0C;AAC3F,UAAM,iBAAiB,KAAK,0BAA0B,OAAO,SAAS;AACtE,QAAI,eAAe,IAAI,MAAM,GAAG;AAC/B;AAAA,IACD;AAEA,UAAM,KAAK,YAAY,OAAO,GAAG,MAAM,WAAW,QAAW,SAAS;AACtE,mBAAe,IAAI,MAAM;AAAA,EAC1B;AAAA,EAEA,WAAW,OAAwB;AAClC,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAC/B;AAAA,EAEA,eAAiC;AAChC,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,UAAU,OAA2C;AACpD,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAC/B;AAAA,EAEA,UAAU,OAA8B;AACvC,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ,aAAO,CAAC;AAAA,IACT;AAEA,WAAO,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,OAAe,QAAqB,CAAC,GAA4B;AACjF,SAAK,kBAAkB,KAAK;AAC5B,UAAM,UAAU,MAAM,KAAK,kBAAkB,KAAK;AAClD,UAAM,UAAU,MAAM,OAAO,QAAQ,OAAO;AAAA,MAC3C,QAAQ,MAAM;AAAA,MACd,SAAS,WAAW;AAAA,MACpB,KAAK,MAAM,SAAS,SAAY,MAAM;AAAA,IACvC,CAAC;AAED,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC/B,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AAAA,MAC7E,UAAU,OAAO,YAAY;AAAA,IAC9B,EAAE;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,OAAe,WAA0C;AAC1F,UAAM,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,QACC,YAAY;AAAA,QACZ,wBAAwB;AAAA,QACxB,SAAS;AAAA,QACT,QAAQ,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM,CAAC;AAAA,MAC5C;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,kBAAkB,OAAe,WAA+C;AACvF,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ,aAAO;AAAA,IACR;AAEA,QAAI,CAAC,WAAW;AACf,aAAO,OAAO;AAAA,IACf;AAEA,WAAO,OAAO,cAAc,IAAI,SAAS,GAAG,kBAAkB;AAAA,EAC/D;AAAA,EAEQ,kBAAkB,OAA+B;AACxD,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI,MAAM,OAAO,KAAK,kBAAkB;AAAA,IAC/C;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,0BAA0B,OAAe,WAAwC;AACxF,UAAM,iBAAiB,KAAK,kBAAkB,OAAO,SAAS;AAC9D,QAAI,CAAC,gBAAgB;AACpB,YAAM,IAAI,MAAM,OAAO,KAAK,kBAAkB;AAAA,IAC/C;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,WAAW,QAAwB,WAAqD;AAC/F,QAAI,CAAC,WAAW;AACf,aAAO,OAAO;AAAA,IACf;AAEA,WAAO,EAAE,OAAO,OAAO,OAAO,UAAU;AAAA,EACzC;AAAA,EAEA,MAAc,kBAAkB,OAAuC;AACtE,UAAM,SAAS,MAAM,OAAO,QAAQ,mBAAmB;AACvD,UAAM,QAAQ,OAAO,KAAK,CAAC,cAAc,UAAU,OAAO,SAAS,KAAK,CAAC;AACzE,WAAO,OAAO,MAAM;AAAA,EACrB;AAAA,EAEQ,eAAe,UAAoC,QAAgB,QAAuB;AACjG,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,KAAK,EAAG;AAEzC,UAAM,YAAa,SAAiC,aAAa;AACjE,QAAI,WAAW,6BAA6B,QAAQ;AACnD,WAAK,KAAK,uBAAuB,OAAO,MAAM;AAC9C;AAAA,IACD;AAEA,QAAI,WAAW,+BAA+B,QAAQ;AACrD,WAAK,yBAAyB,OAAO,MAAM;AAC3C;AAAA,IACD;AAEA,SAAK,qBAAqB,OAAO,WAAW,QAAQ,MAAM;AAC1D,SAAK,UAAU,OAAO,QAAQ,UAAU,CAAC,GAAG,SAAS;AACrD,SAAK,8BAA8B,OAAO,WAAW,QAAQ,MAAM;AAAA,EACpE;AAAA,EAEA,MAAc,uBAAuB,OAAe,QAA+B;AAClF,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,UAAM,SAAS;AAIf,QAAI,CAAC,OAAO,WAAW;AACtB;AAAA,IACD;AAEA,WAAO,cAAc,IAAI,OAAO,WAAW;AAAA,MAC1C,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO,YAAY,YAAY,OAAO;AAAA,MAChD,MAAM,OAAO,YAAY,QAAQ;AAAA,MACjC,KAAK,OAAO,YAAY,OAAO;AAAA,MAC/B,OAAO,OAAO,YAAY,SAAS;AAAA,MACnC,YAAY,KAAK,IAAI;AAAA,MACrB,gBAAgB,oBAAI,IAAI;AAAA,IACzB,CAAC;AAED,QAAI;AACH,YAAM,KAAK,oBAAoB,OAAO,OAAO,SAAS;AACtD,YAAM,KAAK,0BAA0B,OAAO,OAAO,SAAS;AAC5D,YAAM,KAAK,iBAAiB,OAAO,OAAO,SAAS;AAAA,IACpD,SAAS,OAAO;AACf,cAAQ,KAAK,uDAAuD,KAAK;AAAA,IAC1E;AAAA,EACD;AAAA,EAEA,MAAc,0BAA0B,OAAe,WAAkC;AAExF,eAAW,UAAU,CAAC,WAAW,QAAQ,SAAS,GAAY;AAC7D,YAAM,KAAK,aAAa,OAAO,QAAQ,SAAS;AAAA,IACjD;AAAA,EACD;AAAA,EAEQ,yBAAyB,OAAe,QAAsB;AACrE,UAAM,SAAS;AACf,QAAI,CAAC,OAAO,WAAW;AACtB;AAAA,IACD;AAEA,SAAK,mBAAmB,OAAO,WAAW,KAAK;AAC/C,SAAK,iBAAiB,OAAO,OAAO,SAAS;AAAA,EAC9C;AAAA,EAEA,MAAc,iBAAiB,OAAe,WAAyC;AACtF,UAAM,SAAU,MAAM,KAAK,YAAY,OAAO,qBAAqB,QAAW,SAAS;AACvF,SAAK,yBAAyB,OAAO,WAAW,OAAO,SAAS;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,OAAe,WAA0B,MAA0C;AACnH,QAAI,CAAC,MAAM,OAAO,IAAI;AACrB;AAAA,IACD;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,UAAM,eAAe,oBAAI,IAAY;AACrC,SAAK,eAAe,OAAO,WAAW,MAAM,YAAY;AACxD,SAAK,0BAA0B,OAAO,WAAW,YAAY;AAAA,EAC9D;AAAA,EAEQ,eAAe,OAAe,WAA0B,MAAoC,cAAiC;AACpI,QAAI,CAAC,MAAM,OAAO,IAAI;AACrB;AAAA,IACD;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,UAAM,UAAU,KAAK,MAAM;AAC3B,iBAAa,IAAI,OAAO;AACxB,WAAO,OAAO,IAAI,SAAS,KAAK,cAAc,KAAK,OAAO,SAAS,CAAC;AAEpE,QAAI,CAAC,KAAK,MAAM,YAAY,CAAC,WAAW;AACvC,aAAO,aAAa;AAAA,IACrB;AAEA,SAAK;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,QACC,OAAO;AAAA,UACN,IAAI;AAAA,UACJ,UAAU,KAAK,MAAM,YAAY;AAAA,UACjC,KAAK,KAAK,MAAM,OAAO;AAAA,UACvB,MAAM,KAAK,MAAM,QAAQ;AAAA,QAC1B;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAEA,eAAW,SAAS,KAAK,eAAe,CAAC,GAAG;AAC3C,WAAK,eAAe,OAAO,WAAW,OAAO,YAAY;AAAA,IAC1D;AAAA,EACD;AAAA,EAEQ,0BAA0B,OAAe,WAA0B,cAAiC;AAC3G,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,OAAO,QAAQ,GAAG;AACvD,UAAI,MAAM,cAAc,aAAa,aAAa,IAAI,OAAO,GAAG;AAC/D;AAAA,MACD;AAEA,aAAO,OAAO,OAAO,OAAO;AAC5B,WAAK,UAAU,OAAO,sBAAsB,EAAE,QAAQ,GAAG,SAAS;AAAA,IACnE;AAAA,EACD;AAAA,EAEQ,qBAAqB,OAAe,WAA0B,QAAgB,QAAuB;AAC5G,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,QAAI,WAAW,yBAAyB,QAAQ;AAC/C,YAAM,QAAS,OAA8F;AAC7G,UAAI,CAAC,OAAO,IAAI;AACf;AAAA,MACD;AAEA,aAAO,OAAO,IAAI,MAAM,IAAI,KAAK,cAAc,OAAO,SAAS,CAAC;AAEhE,UAAI,CAAC,MAAM,YAAY,CAAC,aAAa,MAAM,KAAK;AAC/C,eAAO,MAAM,MAAM;AACnB,eAAO,aAAa,MAAM;AAAA,MAC3B;AACA;AAAA,IACD;AAEA,QAAI,WAAW,wBAAwB,QAAQ;AAC9C,YAAM,QAAQ;AACd,UAAI,CAAC,MAAM,SAAS;AACnB;AAAA,MACD;AAEA,YAAM,WAAW,OAAO,OAAO,IAAI,MAAM,OAAO;AAChD,aAAO,OAAO,IAAI,MAAM,SAAS;AAAA,QAChC,SAAS,MAAM;AAAA,QACf,eAAe,MAAM,iBAAiB,OAAO;AAAA,QAC7C,KAAK,UAAU,OAAO;AAAA,QACtB,OAAO,UAAU,SAAS;AAAA,QAC1B,WAAW,UAAU,aAAa;AAAA,MACnC,CAAC;AACD;AAAA,IACD;AAEA,QAAI,WAAW,wBAAwB,QAAQ;AAC9C,YAAM,QAAQ;AACd,UAAI,CAAC,MAAM,SAAS;AACnB;AAAA,MACD;AAEA,aAAO,OAAO,OAAO,MAAM,OAAO;AAAA,IACnC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,8BAA8B,OAAe,WAA0B,QAAgB,QAAuB;AACrH,QAAI,CAAC,4BAA4B,QAAQ,MAAM,GAAG;AACjD;AAAA,IACD;AAEA,UAAM,MAAM,oBAAoB,OAAO,SAAS;AAChD,QAAI,KAAK,oBAAoB,IAAI,GAAG,GAAG;AACtC;AAAA,IACD;AAEA,UAAM,QAAQ,WAAW,MAAM;AAC9B,WAAK,oBAAoB,OAAO,GAAG;AACnC,WAAK,KAAK,iBAAiB,OAAO,SAAS,EAAE,MAAM,CAAC,UAAU;AAC7D,gBAAQ,KAAK,oEAAoE,KAAK;AAAA,MACvF,CAAC;AAAA,IACF,GAAG,wBAAwB;AAE3B,SAAK,oBAAoB,IAAI,KAAK,KAAK;AAAA,EACxC;AAAA,EAEQ,mBAAmB,WAA0B,OAAqB;AACzE,UAAM,MAAM,oBAAoB,OAAO,SAAS;AAChD,UAAM,QAAQ,KAAK,oBAAoB,IAAI,GAAG;AAC9C,QAAI,CAAC,OAAO;AACX;AAAA,IACD;AAEA,iBAAa,KAAK;AAClB,SAAK,oBAAoB,OAAO,GAAG;AAAA,EACpC;AAAA,EAEQ,sBAAsB,OAAqB;AAClD,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,oBAAoB,QAAQ,GAAG;AAC9D,UAAI,CAAC,IAAI,WAAW,GAAG,KAAK,GAAG,GAAG;AACjC;AAAA,MACD;AAEA,mBAAa,KAAK;AAClB,WAAK,oBAAoB,OAAO,GAAG;AAAA,IACpC;AAAA,EACD;AAAA,EAEQ,cAAc,OAA+E,WAAuC;AAC3I,WAAO;AAAA,MACN,SAAS,MAAM;AAAA,MACf,eAAe,MAAM,YAAY;AAAA,MACjC,KAAK,MAAM,OAAO;AAAA,MAClB,OAAO,MAAM,QAAQ;AAAA,MACrB;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,aAAa,OAAe,WAA0B,QAAsB;AACnF,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,SAAK,mBAAmB,WAAW,KAAK;AAExC,QAAI,WAAW;AACd,WAAK,iBAAiB,OAAO,SAAS;AACtC;AAAA,IACD;AAEA,SAAK,sBAAsB,KAAK;AAChC,SAAK,SAAS,OAAO,KAAK;AAC1B,SAAK,WAAW,OAAO,MAAM;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,OAAe,WAAyB;AAChE,UAAM,SAAS,KAAK,SAAS,IAAI,KAAK;AACtC,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,WAAO,cAAc,OAAO,SAAS;AACrC,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,OAAO,QAAQ,GAAG;AACvD,UAAI,MAAM,cAAc,WAAW;AAClC;AAAA,MACD;AACA,aAAO,OAAO,OAAO,OAAO;AAC5B,WAAK,UAAU,OAAO,sBAAsB,EAAE,QAAQ,GAAG,SAAS;AAAA,IACnE;AAAA,EACD;AACD;AAEA,SAAS,4BAA4B,QAAgB,QAA0B;AAC9E,MAAI,WAAW,yBAAyB,CAAC,QAAQ;AAChD,WAAO;AAAA,EACR;AAEA,QAAM,QAAS,OAAoD;AACnE,SAAO,OAAO,YAAY;AAC3B;AAEA,SAAS,oBAAoB,OAAe,WAAkC;AAC7E,SAAO,GAAG,KAAK,IAAI,aAAa,MAAM;AACvC;;;AC9iBO,IAAM,eAAN,MAA0E;AAAA,EACxE,OAAmC;AAAA,EACnC;AAAA,EACA,kBAAkB,oBAAI,IAA6B;AAAA,EACnD,iBAA2C;AAAA,EAC3C,oBAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB;AAAA,EACA,mBAAmB;AAAA,EAE3B,YAAY,WAAmB,2BAA2B,UAA+B,CAAC,GAAG;AAC5F,SAAK,WAAW;AAChB,SAAK,gBAAgB,QAAQ,iBAAiB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAwC;AACjD,SAAK,gBAAgB,IAAI,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAkC;AAC3C,SAAK,iBAAiB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAkC;AAC9C,SAAK,oBAAoB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AAClB,QAAI,KAAK,MAAM;AACd,aAAO;AAAA,IACR;AAEA,SAAK,mBAAmB;AAExB,QAAI;AACH,WAAK,OAAO,OAAO,QAAQ,cAAc,KAAK,QAAQ;AAEtD,WAAK,KAAK,UAAU,YAAY,CAAC,YAAqB;AACrD,aAAK,oBAAoB;AACzB,mBAAW,WAAW,KAAK,iBAAiB;AAC3C,kBAAQ,OAAO;AAAA,QAChB;AAAA,MACD,CAAC;AAED,WAAK,KAAK,aAAa,YAAY,MAAM;AACxC,cAAM,QAAQ,OAAO,QAAQ;AAC7B,gBAAQ,IAAI,gCAAgC,OAAO,WAAW,gBAAgB;AAE9E,aAAK,OAAO;AAEZ,YAAI,KAAK,mBAAmB;AAC3B,eAAK,kBAAkB;AAAA,QACxB;AAGA,aAAK,kBAAkB;AAAA,MACxB,CAAC;AAED,cAAQ,IAAI,+BAA+B,KAAK,QAAQ;AACxD,WAAK,oBAAoB;AAEzB,UAAI,KAAK,gBAAgB;AACxB,aAAK,eAAe;AAAA,MACrB;AAEA,aAAO;AAAA,IACR,SAAS,KAAK;AACb,cAAQ,MAAM,qCAAqC,GAAG;AACtD,WAAK,kBAAkB;AACvB,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AAClB,SAAK,mBAAmB;AACxB,QAAI,KAAK,MAAM;AACd,WAAK,KAAK,WAAW;AACrB,WAAK,OAAO;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAA4B;AAChC,QAAI,CAAC,KAAK,MAAM;AACf,cAAQ,KAAK,2CAA2C;AACxD,aAAO;AAAA,IACR;AAEA,QAAI;AACH,WAAK,KAAK,YAAY,OAAO;AAC7B,aAAO;AAAA,IACR,SAAS,KAAK;AACb,cAAQ,MAAM,+BAA+B,GAAG;AAChD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACtB,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AACjC,QAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,kBAAkB;AAClD;AAAA,IACD;AAEA,QAAI,KAAK,qBAAqB,KAAK,sBAAsB;AACxD,cAAQ,IAAI,kDAAkD;AAC9D;AAAA,IACD;AAEA,UAAM,QAAQ,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,iBAAiB;AACtE,SAAK;AAEL,YAAQ,IAAI,kCAAkC,KAAK,eAAe,KAAK,iBAAiB,GAAG;AAE3F,eAAW,MAAM;AAChB,WAAK,QAAQ;AAAA,IACd,GAAG,KAAK;AAAA,EACT;AACD;;;AC/IO,IAAM,kBAAkB,OAAOA,kBAAkC,QAAoB,UAA0B,CAAC,MAA0B;AAChJ,QAAM,aAAa,MAAM,OAAO,KAAK,MAAM,CAAC,CAAC;AAC7C,QAAM,kBAAkBA,iBAAgB,aAAa;AACrD,QAAM,iBAAiB,IAAI,IAAI,gBAAgB,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AAE5E,MAAI,OAAO,WACT,OAAO,CAAC,QAA8D,IAAI,OAAO,UAAa,IAAI,QAAQ,MAAS,EACnH,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,WAAW,KAAK,CAAC,IAAI,IAAI,WAAW,qBAAqB,CAAC,EAC9F,IAAI,CAAC,SAAS;AAAA,IACd,OAAO,IAAI;AAAA,IACX,KAAK,IAAI;AAAA,IACT,OAAO,IAAI,SAAS;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,UAAU,eAAe,IAAI,IAAI,EAAE;AAAA,IACnC,WAAW,QAAQ,qBAAqB,IAAI,EAAE,KAAK;AAAA,EACpD,EAAE;AAEH,MAAI,QAAQ,KAAK;AAChB,UAAM,YAAY,OAAO,IAAI,YAAY;AACzC,WAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,YAAY,EAAE,SAAS,SAAS,CAAC;AAAA,EACtE;AAEA,MAAI,QAAQ,OAAO;AAClB,UAAM,cAAc,OAAO,MAAM,YAAY;AAC7C,WAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,MAAM,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,EAC1E;AAEA,OAAK,KAAK,CAAC,MAAM,UAAU,OAAO,MAAM,QAAQ,IAAI,OAAO,KAAK,QAAQ,CAAC;AAEzE,SAAO;AACR;;;AC1BO,IAAM,WAAN,MAAe;AAAA,EACb;AAAA,EACA;AAAA,EACA,gCAAqD;AAAA,EACrD,iCAAsD;AAAA,EAE9D,YAAYC,kBAAkC,cAAoE;AACjH,SAAK,kBAAkBA;AACvB,SAAK,eAAe;AAEpB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AACpC,SAAK,gCAAgC,KAAK,gBAAgB,QAAQ,CAAC,OAAO,QAAQ,QAAQ,SAAS;AAClG,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,MAAM,aAAa;AAAA,MAC/B,CAAC;AAAA,IACF,CAAC;AAED,SAAK,iCAAiC,KAAK,gBAAgB,SAAS,CAAC,OAAO,WAAW;AACtF,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAAA,EAEA,UAAgB;AACf,SAAK,gCAAgC;AACrC,SAAK,gCAAgC;AACrC,SAAK,iCAAiC;AACtC,SAAK,iCAAiC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AACpC,SAAK,aAAa,UAAU,CAAC,YAAY;AACxC,WAAK,cAAc,OAAO;AAAA,IAC3B,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAA4C;AACvE,YAAQ,QAAQ,MAAM;AAAA,MACrB,KAAK;AACJ,cAAM,KAAK,gBAAgB,OAAO;AAClC;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,gBAAgB,OAAO;AAClC;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,iBAAiB,OAAO;AACnC;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,kBAAkB,OAAO;AACpC;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,mBAAmB,OAAO;AACrC;AAAA,MAED,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACJ;AAAA,MAED;AACC,gBAAQ,KAAK,oCAAqC,QAA6B,IAAI;AAAA,IACrF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,SAA0C;AACvE,QAAI;AACH,YAAM,SAAS,MAAM,KAAK,gBAAgB,OAAO,QAAQ,KAAK;AAE9D,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,OAAO,OAAO;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO;AAAA,QACnB,QAAQ,KAAK,gBAAgB,UAAU,OAAO,KAAK;AAAA,MACpD,CAAC;AAAA,IACF,SAAS,KAAK;AACb,cAAQ,MAAM,gCAAgC,GAAG;AACjD,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC9C,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,SAA0C;AACvE,UAAM,KAAK,gBAAgB,OAAO,QAAQ,KAAK;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,SAA2C;AACzE,QAAI;AACH,YAAM,SAAS,MAAM,KAAK,gBAAgB,YAAY,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAEtH,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB;AAAA,MACD,CAAC;AAAA,IACF,SAAS,KAAK;AACb,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO;AAAA,UACN,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,QAC/C;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,SAA4C;AAC3E,QAAI;AACH,YAAM,UAAU,MAAM,KAAK,gBAAgB,WAAW,QAAQ,OAAO;AAAA,QACpE,QAAQ,QAAQ;AAAA,QAChB,KAAK,QAAQ;AAAA,MACd,CAAC;AAED,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB;AAAA,MACD,CAAC;AAAA,IACF,SAAS,KAAK;AACb,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO;AAAA,UACN,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,QAC/C;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,SAA6C;AAC7E,QAAI;AACH,YAAM,KAAK,gBAAgB,aAAa,QAAQ,OAAO,QAAQ,MAAM;AAAA,IACtE,SAAS,KAAK;AACb,cAAQ,MAAM,uCAAuC,GAAG;AAAA,IACzD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAA8B;AAC7C,UAAM,KAAK,gBAAgB,EAAE,MAAM,cAAc,MAAM,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAA8B;AAC7C,SAAK,aAAa,KAAK;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,IACT,CAAC;AACD,UAAM,KAAK,gBAAgB,OAAO,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAsC;AAC3C,WAAO,MAAM,gBAAgB,KAAK,eAAe;AAAA,EAClD;AACD;;;ACjOO,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;;;ACkC1B,IAAM,mBAAN,MAAuB;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,cAAqC;AAAA,EACrC,aAAmC;AAAA,EACnC;AAAA,EACA,gBAA+B;AAAA,EAC/B,QAAQ;AAAA,EACR,eAAkC,CAAC;AAAA,EACnC,qBAAwC,CAAC;AAAA,EACzC,WAAW;AAAA,EAEnB,YAAY,OAAeC,kBAAkC,SAAiC,CAAC,GAAG,UAAmC,CAAC,GAAG;AACxI,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,mBAAmB,QAAQ;AAChC,SAAK,eAAe,IAAI,aAAa,kBAAkB,EAAE,eAAe,MAAM,CAAC;AAC/E,SAAK,WAAW,IAAI,SAASA,kBAAiB,KAAK,YAAY;AAE/D,SAAK,aAAa,UAAU,CAAC,YAAY;AACxC,WAAK,cAAc,OAAO;AAAA,IAC3B,CAAC;AACD,SAAK,aAAa,aAAa,MAAM;AACpC,UAAI,KAAK,UAAU;AAClB;AAAA,MACD;AACA,WAAK,OAAO,eAAe;AAAA,IAC5B,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,mBAAkC;AACvC,SAAK,WAAW;AAChB,UAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,QAAI,CAAC,WAAW;AACf,YAAM,IAAI,MAAM,yCAAyC,KAAK,KAAK,EAAE;AAAA,IACtE;AAEA,UAAM,OAAO,KAAK,aAAa,KAAK;AAAA,MACnC,MAAM;AAAA,MACN,WAAW,KAAK;AAAA,IACjB,CAAC;AACD,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,wCAAwC,KAAK,KAAK,EAAE;AAAA,IACrE;AACA,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,SAAS,UAAU,KAAK,KAAK;AAAA,EACzC;AAAA,EAEA,MAAM,eAAe,YAAY,KAAsB;AACtD,SAAK,WAAW;AAChB,QAAI,KAAK,OAAO;AACf;AAAA,IACD;AAEA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAM,QAAQ,WAAW,MAAM;AAC9B,aAAK,eAAe,KAAK,aAAa,OAAO,CAAC,WAAW,WAAW,OAAO;AAC3E,eAAO,IAAI,MAAM,+BAA+B,KAAK,KAAK,uBAAuB,CAAC;AAAA,MACnF,GAAG,SAAS;AACZ,YAAM,UAAU,MAAY;AAC3B,qBAAa,KAAK;AAClB,gBAAQ;AAAA,MACT;AACA,WAAK,aAAa,KAAK,OAAO;AAAA,IAC/B,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,SAAwB;AAC7B,QAAI,KAAK,UAAU;AAClB;AAAA,IACD;AAEA,QAAI;AACH,YAAM,KAAK,SAAS,UAAU,KAAK,KAAK;AAAA,IACzC,UAAE;AACD,WAAK,QAAQ;AAAA,IACd;AAAA,EACD;AAAA,EAEA,aAAa,SAA8B;AAC1C,SAAK,WAAW;AAChB,UAAM,OAAO,KAAK,aAAa,KAAK;AAAA,MACnC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ;AAAA,IACD,CAAC;AACD,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mCAAmC,KAAK,KAAK,EAAE;AAAA,IAChE;AAAA,EACD;AAAA,EAEA,UAAgB;AACf,QAAI,KAAK,UAAU;AAClB;AAAA,IACD;AAEA,SAAK,WAAW;AAChB,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,WAAW;AAAA,EAC9B;AAAA,EAEA,cAAuB;AACtB,WAAO,KAAK,aAAa,YAAY;AAAA,EACtC;AAAA,EAEA,iBAAwC;AACvC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,gBAAsC;AACrC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,mBAAkC;AACjC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,mBAAmB,YAAY,KAAsB;AAClE,SAAK,WAAW;AAChB,QAAI,KAAK,aAAa;AACrB;AAAA,IACD;AAEA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAM,QAAQ,WAAW,MAAM;AAC9B,aAAK,qBAAqB,KAAK,mBAAmB,OAAO,CAAC,WAAW,WAAW,aAAa;AAC7F,eAAO,IAAI,MAAM,+BAA+B,KAAK,KAAK,8BAA8B,CAAC;AAAA,MAC1F,GAAG,SAAS;AACZ,YAAM,gBAAgB,MAAY;AACjC,qBAAa,KAAK;AAClB,gBAAQ;AAAA,MACT;AACA,WAAK,mBAAmB,KAAK,aAAa;AAAA,IAC3C,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,SAAmC;AACxD,SAAK,gBAAgB,KAAK,IAAI;AAE9B,YAAQ,QAAQ,MAAM;AAAA,MACrB,KAAK;AACJ,aAAK,cAAc;AAAA,UAClB,WAAW,QAAQ;AAAA,UACnB,aAAa,QAAQ;AAAA,UACrB,aAAa,QAAQ;AAAA,UACrB,KAAK,QAAQ;AAAA,QACd;AACA,aAAK,OAAO,gBAAgB,KAAK,WAAW;AAC5C,aAAK,0BAA0B;AAC/B;AAAA,MAED,KAAK;AACJ,aAAK,oBAAoB;AACzB;AAAA,MAED,KAAK;AACJ,aAAK,aAAa;AAAA,UACjB,UAAU,QAAQ;AAAA,UAClB,OAAO,QAAQ;AAAA,UACf,KAAK,QAAQ;AAAA,UACb,YAAY,QAAQ;AAAA,UACpB,aAAa,QAAQ,eAAe;AAAA,QACrC;AACA,aAAK,OAAO,eAAe,KAAK,UAAU;AAAA,IAC5C;AAAA,EACD;AAAA,EAEQ,sBAA4B;AACnC,SAAK,QAAQ;AACb,UAAM,UAAU,KAAK;AACrB,SAAK,eAAe,CAAC;AACrB,eAAW,UAAU,SAAS;AAC7B,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEQ,4BAAkC;AACzC,UAAM,UAAU,KAAK;AACrB,SAAK,qBAAqB,CAAC;AAC3B,eAAW,UAAU,SAAS;AAC7B,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEQ,aAAmB;AAC1B,QAAI,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,+BAA+B,KAAK,KAAK,oBAAoB;AAAA,IAC9E;AAAA,EACD;AACD;;;ACvMO,IAAM,uBAAN,MAA2B;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACT,cAAyC;AAAA,EACzC,gBAA+B;AAAA,EAC/B,WAAW;AAAA,EAEnB,YAAYC,kBAAkC,SAAqC,CAAC,GAAG;AACtF,SAAK,kBAAkBA;AACvB,SAAK,SAAS;AACd,SAAK,eAAe,IAAI,aAAa,mBAAmB,EAAE,eAAe,KAAK,CAAC;AAE/E,SAAK,aAAa,UAAU,CAAC,YAAY;AACxC,WAAK,KAAK,cAAc,OAAO;AAAA,IAChC,CAAC;AACD,SAAK,aAAa,aAAa,MAAM;AACpC,UAAI,KAAK,UAAU;AAClB;AAAA,MACD;AACA,WAAK,OAAO,eAAe;AAAA,IAC5B,CAAC;AAAA,EACF;AAAA,EAEA,UAAmB;AAClB,SAAK,WAAW;AAChB,WAAO,KAAK,aAAa,QAAQ;AAAA,EAClC;AAAA,EAEA,UAAgB;AACf,QAAI,KAAK,UAAU;AAClB;AAAA,IACD;AAEA,SAAK,WAAW;AAChB,SAAK,aAAa,WAAW;AAAA,EAC9B;AAAA,EAEA,cAAuB;AACtB,WAAO,KAAK,aAAa,YAAY;AAAA,EACtC;AAAA,EAEA,iBAA4C;AAC3C,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,mBAAkC;AACjC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,cAAc,SAAgD;AAC3E,SAAK,gBAAgB,KAAK,IAAI;AAE9B,YAAQ,QAAQ,MAAM;AAAA,MACrB,KAAK;AACJ,aAAK,cAAc;AAAA,UAClB,WAAW,QAAQ;AAAA,UACnB,aAAa,QAAQ;AAAA,UACrB,aAAa,QAAQ;AAAA,UACrB,KAAK,QAAQ;AAAA,QACd;AACA,aAAK,OAAO,gBAAgB,KAAK,WAAW;AAC5C;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,gBAAgB,QAAQ,WAAW,MAAM,KAAK,OAAO,qBAAqB,QAAQ,OAAO,EAAE,WAAW,QAAQ,UAAU,CAAC,CAAC;AACrI;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,gBAAgB,QAAQ,WAAW,MAAM,KAAK,OAAO,qBAAqB,QAAQ,KAAK,CAAC;AACnG;AAAA,MAED,KAAK;AACJ,cAAM,KAAK,eAAe,QAAQ,WAAW,QAAQ,MAAM;AAC3D;AAAA,MAED,KAAK;AACJ,aAAK,oBAAoB,QAAQ,SAAS;AAC1C;AAAA,MAED,KAAK;AACJ;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAc,gBAAgB,WAAmB,QAAmE;AACnH,QAAI;AACH,YAAM,SAAU,MAAM,OAAO,KAAM,EAAE,IAAI,OAAO,OAAO,4CAA4C;AACnG,UAAI,CAAC,OAAO,IAAI;AACf,aAAK,aAAa,KAAK,EAAE,MAAM,uBAAuB,WAAW,IAAI,OAAO,OAAO,EAAE,SAAS,OAAO,MAAM,EAAE,CAAC;AAC9G;AAAA,MACD;AAEA,WAAK,aAAa,KAAK,EAAE,MAAM,uBAAuB,WAAW,IAAI,MAAM,KAAK,OAAO,KAAK,WAAW,OAAO,UAAU,CAAC;AAAA,IAC1H,SAAS,OAAO;AACf,WAAK,aAAa,KAAK;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,MAC1E,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAc,eAAe,WAAmB,QAA0D;AACzG,UAAM,OAAkB,MAAM,gBAAgB,KAAK,iBAAiB,QAAQ;AAAA,MAC3E,oBAAoB,KAAK,OAAO;AAAA,IACjC,CAAC;AACD,SAAK,aAAa,KAAK;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,oBAAoB,WAAyB;AACpD,SAAK,aAAa,KAAK;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA,aAAa,KAAK,OAAO,iBAAiB,KAAK,KAAK,yBAAyB;AAAA,IAC9E,CAAC;AAAA,EACF;AAAA,EAEQ,2BAA+C;AACtD,WAAO;AAAA,MACN,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACR,WAAW,KAAK,YAAY;AAAA,QAC5B,WAAW,KAAK,aAAa,aAAa;AAAA,QAC1C,aAAa,KAAK,aAAa,eAAe;AAAA,QAC9C,aAAa,KAAK,aAAa,eAAe;AAAA,QAC9C,KAAK,KAAK,aAAa,OAAO;AAAA,QAC9B,eAAe,KAAK;AAAA,MACrB;AAAA,MACA,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,IAChB;AAAA,EACD;AAAA,EAEQ,aAAmB;AAC1B,QAAI,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IAChE;AAAA,EACD;AACD;;;AC3IA,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAMrB,IAAM,4BAA4B,CAAC,YAA4B;AACrE,MAAI;AACH,UAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,WAAO,GAAG,OAAO,MAAM,GAAG,OAAO,YAAY,GAAG;AAAA,EACjD,QAAQ;AACP,WAAO,QAAQ,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AAAA,EACpC;AACD;AAEO,IAAM,8BAA8B,CAAC,OAAkC,YAAuD;AACpI,MAAI,MAAM,OAAO,SAAS,UAAU;AACnC,WAAO;AAAA,EACR;AACA,QAAM,mBAAmB,MAAM;AAC/B,QAAM,gBAAgB,iBAAiB,OAAO;AAE9C,MAAI,iBAAiB,KAAK;AACzB,WAAO,sBAAsB,eAAe,CAAC,WAAW,OAAO,QAAQ,iBAAiB,GAAG;AAAA,EAC5F;AAEA,MAAI,CAAC,iBAAiB,OAAO;AAC5B,WAAO;AAAA,EACR;AAEA,SAAO,sBAAsB,eAAe,CAAC,WAAW,qBAAqB,OAAO,KAAK,MAAM,iBAAiB,KAAK;AACtH;AAEO,IAAM,8BAAN,MAAkC;AAAA,EACvB;AAAA,EACA;AAAA,EACT,UAAuC,CAAC;AAAA,EACxC,cAAoC;AAAA,EACpC,YAA2B,QAAQ,QAAQ;AAAA,EAEnD,YAAY,cAAiD,+BAA+B,GAAG,UAAmC,CAAC,GAAG;AACrI,SAAK,cAAc;AACnB,SAAK,aAAa,QAAQ,cAAc;AAAA,EACzC;AAAA,EAEA,MAAM,aAAa,SAA4D;AAC9E,UAAM,KAAK,aAAa;AACxB,UAAM,UAAU,0BAA0B,OAAO;AACjD,WAAO,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,OAAO,KAAK;AAAA,EACnE;AAAA,EAEA,MAAM,SAAS,SAAiB,QAA6D;AAC5F,UAAM,KAAK,aAAa;AAExB,UAAM,QAAQ,yBAAyB,SAAS,MAAM;AACtD,SAAK,UAAU,CAAC,OAAO,GAAG,KAAK,QAAQ,OAAO,CAAC,cAAc,UAAU,YAAY,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,UAAU;AAC3H,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,eAA8B;AAC3C,QAAI,CAAC,KAAK,aAAa;AACtB,WAAK,cAAc,KAAK,YACtB,KAAK,EACL,KAAK,CAAC,YAAY;AAClB,aAAK,UAAU,6BAA6B,OAAO,EAAE,MAAM,GAAG,KAAK,UAAU;AAAA,MAC9E,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,gBAAQ,MAAM,yDAAyD,KAAK;AAC5E,aAAK,UAAU,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,UAAyB;AACtC,SAAK,YAAY,KAAK,UACpB,MAAM,MAAM,MAAS,EACrB,KAAK,MAAM,KAAK,YAAY,KAAK,KAAK,OAAO,CAAC,EAC9C,MAAM,CAAC,UAAU;AACjB,cAAQ,MAAM,yDAAyD,KAAK;AAAA,IAC7E,CAAC;AAEF,UAAM,KAAK;AAAA,EACZ;AACD;AAEO,IAAM,iCAAiC,CAC7C,cAA0C,OAAO,QAAQ,OACzD,aAAqB,yBACmB;AAAA,EACxC,MAAM,YAAY;AACjB,UAAM,SAAS,MAAM,iBAA0B,aAAa,UAAU;AACtE,WAAO,6BAA6B,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,EACxE;AAAA,EACA,MAAM,OAAO,YAAY;AACxB,UAAM,kBAAkB,aAAa,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAC;AAAA,EAC/D;AACD;AAEA,IAAM,2BAA2B,CAAC,SAAiB,WAAuD;AACzG,QAAM,OAAO;AAAA,IACZ,SAAS,0BAA0B,OAAO;AAAA,IAC1C;AAAA,IACA,WAAW,KAAK,IAAI;AAAA,EACrB;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC3B,WAAO;AAAA,MACN,GAAG;AAAA,MACH,QAAQ,EAAE,MAAM,OAAO;AAAA,IACxB;AAAA,EACD;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,KAAK,mBAAmB,OAAO,GAAG;AAAA,MAClC,OAAO,qBAAqB,OAAO,KAAK;AAAA,IACzC;AAAA,EACD;AACD;AAEA,IAAM,wBAAwB,CAAI,SAAc,cAAgD;AAC/F,QAAM,UAAU,QAAQ,OAAO,SAAS;AACxC,SAAO,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAC5C;AAEA,IAAM,mBAAmB,CAAC,YAA6F;AACtH,SAAO,QAAQ,OAAO,CAAC,WAA4E;AAClG,WAAO,OAAO,SAAS,YAAY,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS;AAAA,EAClG,CAAC;AACF;AAEA,IAAM,+BAA+B,CAAC,YAAoD;AACzF,SAAO,QACL,IAAI,2BAA2B,EAC/B,OAAO,CAAC,UAA8C,UAAU,IAAI,EACpE,KAAK,mBAAmB;AAC3B;AAEA,IAAM,8BAA8B,CAAC,UAAqD;AACzF,QAAM,YAAY;AAClB,MAAI,OAAO,WAAW,YAAY,YAAY,UAAU,QAAQ,WAAW,GAAG;AAC7E,WAAO;AAAA,EACR;AAEA,QAAM,OAAO;AAAA,IACZ,SACC,OAAO,UAAU,YAAY,YAAY,UAAU,QAAQ,SAAS,IAAI,UAAU,UAAU,0BAA0B,UAAU,OAAO;AAAA,IACxI,SAAS,UAAU;AAAA,IACnB,WAAW,OAAO,UAAU,cAAc,WAAW,UAAU,YAAY;AAAA,EAC5E;AAEA,MAAI,UAAU,QAAQ,SAAS,QAAQ;AACtC,WAAO;AAAA,MACN,GAAG;AAAA,MACH,QAAQ,EAAE,MAAM,OAAO;AAAA,IACxB;AAAA,EACD;AAEA,MAAI,UAAU,QAAQ,SAAS,UAAU;AACxC,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,KAAK,mBAAmB,OAAO,UAAU,OAAO,QAAQ,WAAW,UAAU,OAAO,MAAM,IAAI;AAAA,MAC9F,OAAO,qBAAqB,OAAO,UAAU,OAAO,UAAU,WAAW,UAAU,OAAO,QAAQ,IAAI;AAAA,IACvG;AAAA,EACD;AACD;AAEA,SAAS,mBAAmB,KAA+C;AAC1E,SAAO,sBAAsB,GAAG;AACjC;AAEA,SAAS,qBAAqB,OAAiD;AAC9E,SAAO,sBAAsB,KAAK;AACnC;AAEA,SAAS,sBAAsB,OAAiD;AAC/E,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAC9E;AAEA,IAAM,sBAAsB,CAAC,MAAiC,UAA6C,MAAM,YAAY,KAAK;AAElI,IAAM,mBAAmB,OAAU,aAAyC,QAAwC;AACnH,SAAO,MAAM,IAAI,QAAuB,CAAC,SAAS,WAAW;AAC5D,gBAAY,IAAI,KAAK,CAAC,UAAU;AAC/B,YAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAI,OAAO;AACV,eAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAC/B;AAAA,MACD;AACA,cAAQ,MAAM,GAAG,CAAkB;AAAA,IACpC,CAAC;AAAA,EACF,CAAC;AACF;AAEA,IAAM,oBAAoB,OAAO,aAAyC,UAAkD;AAC3H,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,gBAAY,IAAI,OAAO,MAAM;AAC5B,YAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAI,OAAO;AACV,eAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAC/B;AAAA,MACD;AACA,cAAQ;AAAA,IACT,CAAC;AAAA,EACF,CAAC;AACF;;;AC5NA,IAAMC,uBAAsB;AAC5B,IAAM,2BAA2B;AAM1B,IAAM,+BAAN,MAAmC;AAAA,EACxB;AAAA,EACA;AAAA,EACT,UAAmC,CAAC;AAAA,EACpC,cAAoC;AAAA,EACpC,YAA2B,QAAQ,QAAQ;AAAA,EAEnD,YAAY,cAA2CC,gCAA+B,GAAG,UAAuC,CAAC,GAAG;AACnI,SAAK,cAAc;AACnB,SAAK,iBAAiB,QAAQ,kBAAkB;AAAA,EACjD;AAAA,EAEA,MAAM,iBAAiB,SAA0C;AAChE,UAAM,KAAK,aAAa;AACxB,WAAO,CAAC,GAAI,KAAK,UAAU,OAAO,GAAG,WAAW,CAAC,CAAE;AAAA,EACpD;AAAA,EAEA,MAAM,KAAK,SAAiB,QAAgE;AAC3F,UAAM,KAAK,aAAa;AACxB,UAAM,eAAe,eAAe,MAAM;AAC1C,QAAI,CAAC,cAAc;AAClB,aAAO;AAAA,IACR;AAEA,UAAM,UAAU,0BAA0B,OAAO;AACjD,UAAM,WAAW,KAAK,UAAU,OAAO;AACvC,UAAM,UAAU,oBAAoB,CAAC,cAAc,GAAI,UAAU,WAAW,CAAC,CAAE,CAAC;AAChF,UAAM,QAAQ,EAAE,SAAS,SAAS,WAAW,KAAK,IAAI,GAAG,QAAQ;AACjE,SAAK,YAAY,KAAK;AACtB,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,KAAK,SAAiB,QAAwC;AACnE,UAAM,KAAK,aAAa;AACxB,UAAM,eAAe,eAAe,MAAM;AAC1C,QAAI,CAAC,cAAc;AAClB;AAAA,IACD;AAEA,UAAM,WAAW,KAAK,UAAU,OAAO;AACvC,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AAEA,UAAM,UAAU,SAAS,QAAQ,OAAO,CAAC,cAAc,CAAC,mBAAmB,WAAW,YAAY,CAAC;AACnG,QAAI,QAAQ,WAAW,GAAG;AACzB,WAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,SAAS,OAAO;AAChF,YAAM,KAAK,QAAQ;AACnB;AAAA,IACD;AAEA,SAAK,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAW,MAAM,YAAY,SAAS,UAAU,EAAE,GAAG,OAAO,SAAS,WAAW,KAAK,IAAI,EAAE,IAAI,KAAM;AACtI,UAAM,KAAK,QAAQ;AAAA,EACpB;AAAA,EAEA,MAAM,SAAS,SAAiB,QAA2C;AAC1E,UAAM,gBAAgB,MAAM,KAAK,iBAAiB,OAAO;AACzD,WAAO,cAAc,KAAK,CAAC,iBAAiB,oBAAoB,cAAc,MAAM,CAAC;AAAA,EACtF;AAAA,EAEQ,UAAU,SAA+C;AAChE,UAAM,UAAU,0BAA0B,OAAO;AACjD,WAAO,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,OAAO,KAAK;AAAA,EACnE;AAAA,EAEQ,YAAY,OAAoC;AACvD,SAAK,UAAU,CAAC,OAAO,GAAG,KAAK,QAAQ,OAAO,CAAC,cAAc,UAAU,YAAY,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,cAAc;AAAA,EAChI;AAAA,EAEA,MAAc,eAA8B;AAC3C,QAAI,CAAC,KAAK,aAAa;AACtB,WAAK,cAAc,KAAK,YACtB,KAAK,EACL,KAAK,CAAC,YAAY;AAClB,aAAK,UAAU,4BAA4B,OAAO,EAAE,MAAM,GAAG,KAAK,cAAc;AAAA,MACjF,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,gBAAQ,MAAM,0DAA0D,KAAK;AAC7E,aAAK,UAAU,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,UAAyB;AACtC,SAAK,YAAY,KAAK,UACpB,MAAM,MAAM,MAAS,EACrB,KAAK,MAAM,KAAK,YAAY,KAAK,KAAK,OAAO,CAAC,EAC9C,MAAM,CAAC,UAAU;AACjB,cAAQ,MAAM,0DAA0D,KAAK;AAAA,IAC9E,CAAC;AAEF,UAAM,KAAK;AAAA,EACZ;AACD;AAEO,IAAMA,kCAAiC,CAC7C,cAA0C,OAAO,QAAQ,OACzD,aAAqBD,0BACa;AAAA,EAClC,MAAM,YAAY;AACjB,UAAM,SAAS,MAAME,kBAA0B,aAAa,UAAU;AACtE,WAAO,4BAA4B,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,EACvE;AAAA,EACA,MAAM,OAAO,YAAY;AACxB,UAAMC,mBAAkB,aAAa,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAC;AAAA,EAC/D;AACD;AAEO,SAAS,oBAAoB,cAA4B,QAAkC;AACjG,MAAI,OAAO,SAAS,UAAU;AAC7B,WAAO;AAAA,EACR;AAEA,QAAM,YAAY,eAAe,MAAM;AACvC,SAAO,YAAY,mBAAmB,cAAc,SAAS,IAAI;AAClE;AAEA,SAAS,eAAe,QAA8C;AACrE,MAAI,OAAO,SAAS,UAAU;AAC7B,WAAO;AAAA,EACR;AAEA,QAAM,MAAMC,uBAAsB,OAAO,GAAG;AAC5C,QAAM,QAAQA,uBAAsB,OAAO,KAAK;AAChD,MAAI,CAAC,OAAO,CAAC,OAAO;AACnB,WAAO;AAAA,EACR;AAEA,SAAO,EAAE,MAAM,UAAU,KAAK,MAAM;AACrC;AAEA,SAAS,oBAAoB,SAAyC;AACrE,QAAM,SAAyB,CAAC;AAChC,aAAW,UAAU,SAAS;AAC7B,QAAI,CAAC,OAAO,KAAK,CAAC,cAAc,mBAAmB,WAAW,MAAM,CAAC,GAAG;AACvE,aAAO,KAAK,MAAM;AAAA,IACnB;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,mBAAmB,MAAoB,OAA8B;AAC7E,MAAI,KAAK,OAAO,MAAM,KAAK;AAC1B,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO,KAAK,UAAU,MAAM;AAC7B;AAEA,SAAS,4BAA4B,SAA6C;AACjF,SAAO,QACL,IAAI,yBAAyB,EAC7B,OAAO,CAAC,UAA0C,UAAU,IAAI,EAChE,KAAKC,oBAAmB;AAC3B;AAEA,SAAS,0BAA0B,OAA8C;AAChF,QAAM,YAAY;AAClB,MAAI,OAAO,WAAW,YAAY,YAAY,UAAU,QAAQ,WAAW,KAAK,CAAC,MAAM,QAAQ,UAAU,OAAO,GAAG;AAClH,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,oBAAoB,UAAU,QAAQ,IAAI,oBAAoB,EAAE,OAAO,CAAC,WAAmC,WAAW,IAAI,CAAC;AAC3I,MAAI,QAAQ,WAAW,GAAG;AACzB,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,SACC,OAAO,UAAU,YAAY,YAAY,UAAU,QAAQ,SAAS,IAAI,UAAU,UAAU,0BAA0B,UAAU,OAAO;AAAA,IACxI,SAAS,UAAU;AAAA,IACnB,WAAW,OAAO,UAAU,cAAc,WAAW,UAAU,YAAY;AAAA,IAC3E;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB,QAAsC;AACnE,QAAM,YAAY;AAClB,MAAI,WAAW,SAAS,UAAU;AACjC,WAAO;AAAA,EACR;AAEA,QAAM,MAAMD,uBAAsB,OAAO,UAAU,QAAQ,WAAW,UAAU,MAAM,IAAI;AAC1F,QAAM,QAAQA,uBAAsB,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,IAAI;AAChG,MAAI,CAAC,OAAO,CAAC,OAAO;AACnB,WAAO;AAAA,EACR;AAEA,SAAO,EAAE,MAAM,UAAU,KAAK,MAAM;AACrC;AAEA,SAASA,uBAAsB,OAAiD;AAC/E,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAC9E;AAEA,IAAMC,uBAAsB,CAAC,MAA6B,UAAyC,MAAM,YAAY,KAAK;AAE1H,IAAMH,oBAAmB,OAAU,aAAyC,QAAwC;AACnH,SAAO,MAAM,IAAI,QAAuB,CAAC,SAAS,WAAW;AAC5D,gBAAY,IAAI,KAAK,CAAC,UAAU;AAC/B,YAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAI,OAAO;AACV,eAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAC/B;AAAA,MACD;AACA,cAAQ,MAAM,GAAG,CAAkB;AAAA,IACpC,CAAC;AAAA,EACF,CAAC;AACF;AAEA,IAAMC,qBAAoB,OAAO,aAAyC,UAAkD;AAC3H,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,gBAAY,IAAI,OAAO,MAAM;AAC5B,YAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAI,OAAO;AACV,eAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAC/B;AAAA,MACD;AACA,cAAQ;AAAA,IACT,CAAC;AAAA,EACF,CAAC;AACF;;;ACnQA,IAAI,iBAAgC,QAAQ,QAAQ;AAM7C,SAAS,gBAAgBG,kBAAiD;AAChF,mBAAiB,eACf,MAAM,MAAM,MAAS,EACrB,KAAK,YAAY;AACjB,UAAM,gBAAgBA,iBAAgB,aAAa,EAAE;AACrD,UAAM,gBAAgB,aAAa;AAAA,EACpC,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,YAAQ,MAAM,gDAAgD,KAAK;AAAA,EACpE,CAAC;AAEF,SAAO;AACR;AAEA,eAAe,gBAAgB,eAAsC;AACpE,QAAM,YAAY,gBAAgB,IAAI,OAAO,aAAa,IAAI;AAC9D,QAAM,OAAO,MAAM,OAAO,KAAK,MAAM,CAAC,CAAC;AAGvC,QAAM,QAAQ;AAAA,IACb,KACE,OAAO,CAAC,QAAiD,IAAI,OAAO,MAAS,EAC7E,IAAI,CAAC,QAAQ,OAAO,OAAO,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC;AAAA,EAC9E;AACA,QAAM,OAAO,OAAO,aAAa,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAI,gBAAgB,GAAG;AACtB,UAAM,OAAO,OAAO,wBAAwB,EAAE,OAAO,UAAU,CAAC;AAAA,EACjE;AACD;;;AC5BO,SAAS,qBAAqB,UAAoE;AACxG,MAAI,SAAS,WAAW,MAAM,GAAG;AAChC,UAAM,QAAQ,OAAO,SAAS,SAAS,MAAM,CAAC,GAAG,EAAE;AACnD,WAAO,OAAO,SAAS,KAAK,IAAI,EAAE,OAAO,SAAS,KAAK,IAAI;AAAA,EAC5D;AAEA,MAAI,SAAS,WAAW,QAAQ,GAAG;AAClC,UAAM,CAAC,EAAE,UAAU,GAAG,YAAY,IAAI,SAAS,MAAM,GAAG;AACxD,UAAM,QAAQ,OAAO,SAAS,YAAY,IAAI,EAAE;AAChD,UAAM,UAAU,aAAa,KAAK,GAAG;AACrC,WAAO,OAAO,SAAS,KAAK,KAAK,UAAU,EAAE,OAAO,QAAQ,IAAI;AAAA,EACjE;AAEA,SAAO;AACR;AAGO,SAAS,gBAAgBC,kBAAkC,OAA8B;AAC/F,QAAM,SAASA,iBAAgB,UAAU,KAAK;AAC9C,QAAM,aAAaA,iBAAgB,UAAU,KAAK,GAAG,cAAc;AACnE,QAAM,WAAW,OAAO,KAAK,CAAC,UAAU,MAAM,YAAY,UAAU,KAAK,OAAO,KAAK,CAAC,UAAU,MAAM,iBAAiB,IAAI;AAC3H,MAAI,CAAC,UAAU;AACd,WAAO,CAAC;AAAA,EACT;AAEA,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,eAAe;AAAA,MACf,OAAO,SAAS,SAAS;AAAA,MACzB,KAAK,SAAS;AAAA,IACf;AAAA,IACA,GAAG,OACD,OAAO,CAAC,UAAU,MAAM,YAAY,SAAS,OAAO,EACpD,IAAI,CAAC,WAAW;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,eAAe,MAAM,kBAAkB,SAAS,UAAU,OAAO,MAAM;AAAA,MACvE,OAAO,MAAM,SAAS,MAAM,OAAO,UAAU,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,MACtE,KAAK,MAAM;AAAA,IACZ,EAAE;AAAA,EACJ;AACD;AAEO,SAAS,eAAeA,kBAAkC,OAAe,SAA4C;AAC3H,SAAO,gBAAgBA,kBAAiB,KAAK,EAAE,KAAK,CAAC,YAAY,OAAO,WAAW,UAAU,OAAO,KAAK;AAC1G;AAEO,SAAS,wBAAwBA,kBAAkC,OAAe,SAAqC;AAC7H,QAAM,SAAS,eAAeA,kBAAiB,OAAO,OAAO;AAC7D,MAAI,CAAC,UAAU,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS;AAC3D,UAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,EACzD;AAEA,SAAO;AACR;AAEO,SAAS,iBAAiBA,kBAAkC,OAA8B;AAChG,SAAO,eAAeA,kBAAiB,OAAO,IAAI,GAAG,OAAOA,iBAAgB,UAAU,KAAK,GAAG,OAAO;AACtG;AAGO,SAAS,kBAAkB,QAAsC;AACvE,SAAO;AAAA,IACN,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,KAAK,OAAO;AAAA,EACb;AACD;;;ACtEO,SAAS,mBAAmBC,kBAAkC,OAAe,SAAsD;AACzI,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,eAAe,aAAa,qBAAqB,WAAW,QAAQ,IAAI;AAE9E,MAAI,CAAC,eAAe,CAAC,YAAY;AAChC,WAAO,oBAAoBA,kBAAiB,OAAO,SAAS,MAAM,IAAI;AAAA,EACvE;AAEA,SAAO;AAAA,IACNA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,cAAc,eACX;AAAA,MACA,MAAM,aAAa,UAAU,WAAW;AAAA,MACxC,OAAO,WAAW;AAAA,MAClB,KAAK,WAAW;AAAA,MAChB,UAAU,WAAW;AAAA,MACrB,SAAS,aAAa;AAAA,MACtB,YAAY,WAAW;AAAA,MACvB,aAAa,WAAW;AAAA,IACzB,IACC;AAAA,EACJ;AACD;AAEA,SAAS,oBACRA,kBACA,OACA,SACA,aACA,eACqB;AACrB,QAAM,YAAY,sBAAsBA,kBAAiB,OAAO,SAAS,aAAa,aAAa;AACnG,SAAO;AAAA,IACN;AAAA,IACA,iBAAiB,UAAU;AAAA,IAC3B,qBAAqB,UAAU;AAAA,IAC/B,cAAc,UAAU;AAAA,IACxB,aAAa,UAAU;AAAA,IACvB,aAAa,UAAU;AAAA,IACvB,WAAW,aAAa,aAAa;AAAA,IACrC,aAAa,aAAa,eAAe;AAAA,IACzC,aAAa,aAAa,eAAe;AAAA,IACzC,eAAe,aAAa,OAAO;AAAA,IACnC,eAAe,QAAQ,iBAAiB;AAAA,IACxC;AAAA,EACD;AACD;AAEA,SAAS,sBACRA,kBACA,OACA,SACA,aACA,eACmG;AACnG,QAAM,sBAAsB,QAAQ,YAAY;AAChD,QAAM,eAAe,uBAAuB,QAAQ,aAAa,aAAa,YAAY,eAAe,YAAY,eAAe,IAAI;AACxI,QAAM,cAAc,eAAe,eAAe,mBAAmBA,kBAAiB,OAAO,aAAa;AAE1G,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,eAAe,OAAO,iBAAiB,cAAc,UAAU;AAAA,EAC7E;AACD;AAOA,SAAS,mBAAmBA,kBAAkC,OAAe,QAA6D;AACzI,MAAI,CAAC,QAAQ;AACZ,WAAO;AAAA,EACR;AAEA,MAAI,CAAC,OAAO,SAAS;AACpB,WAAOA,iBAAgB,WAAW,KAAK;AAAA,EACxC;AAEA,QAAM,QAAQA,iBAAgB,UAAU,KAAK,EAAE,KAAK,CAAC,cAAc,UAAU,YAAY,OAAO,OAAO;AACvG,SAAO,QAAQ,OAAO,SAAS;AAChC;;;AC/DA,IAAM,kBAAkB,IAAI,gBAAgB;AAC5C,IAAM,uBAAuB,IAAI,qBAAqB,iBAAiB;AAAA,EACtE,eAAe,CAAC,SAAS;AACxB,gBAAY,QAAQ,UAAU,0BAA0B,KAAK,SAAS,SAAS,KAAK,GAAG,GAAG;AAAA,EAC3F;AAAA,EACA,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB;AAAA,EACA,gBAAgB;AAAA,EAChB,cAAc,MAAM;AACnB,gBAAY,SAAS,UAAU,kCAAkC;AAAA,EAClE;AACD,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAA8B;AACzD,IAAM,uBAAuB,oBAAI,IAA2B;AAE5D,IAAM,iCAAiC,oBAAI,IAAuC;AAClF,IAAM,yBAAyB,IAAI,4BAA4B;AAC/D,IAAM,0BAA0B,IAAI,6BAA6B;AACjE,IAAM,eAA6B,CAAC;AACpC,IAAM,oBAAoB;AAC1B,IAAM,iCAAiC,oBAAI,IAAI,CAAC,sBAAsB,sBAAsB,qBAAqB,CAAC;AAElH,SAAS,YAAY,OAA4B,QAA8B,SAAuB;AACrG,eAAa,QAAQ;AAAA,IACpB,IAAI,KAAK,IAAI;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,MAAI,aAAa,SAAS,mBAAmB;AAC5C,iBAAa,SAAS;AAAA,EACvB;AACD;AAEA,gBAAgB,SAAS,CAAC,OAAO,WAAW;AAC3C,gBAAc,KAAK;AACnB,cAAY,SAAS,YAAY,OAAO,KAAK,cAAc,MAAM,EAAE;AACnE,OAAK,gBAAgB,eAAe;AACrC,CAAC;AAED,gBAAgB,QAAQ,CAAC,OAAO,WAAW;AAC1C,MAAI,CAAC,6BAA6B,OAAO,MAAM,GAAG;AACjD;AAAA,EACD;AAEA,OAAK,gCAAgC,KAAK;AAC3C,CAAC;AAED,OAAO,QAAQ,UAAU;AAAA,EACxB,CAAC,SAA6B,SAAuC,iBAA8C;AAClH,SAAK,mBAAmB,SAAS,YAAY;AAC7C,WAAO;AAAA,EACR;AACD;AAEA,OAAO,QAAQ,UAAU,YAAY,MAAM;AAC1C,6BAA2B;AAC5B,CAAC;AAED,OAAO,QAAQ,YAAY,YAAY,MAAM;AAC5C,6BAA2B;AAC5B,CAAC;AAED,eAAe,mBAAmB,SAA6B,cAA0D;AACxH,6BAA2B;AAC3B,2BAAyB;AACzB,QAAM,WAAW,MAAM,mBAAmB,OAAO;AACjD,QAAM,gBAAgB,eAAe;AACrC,eAAa,QAAQ;AACtB;AAEA,SAAS,6BAAmC;AAC3C,MAAI,qBAAqB,YAAY,GAAG;AACvC;AAAA,EACD;AACA,uBAAqB,QAAQ;AAC9B;AAEA,2BAA2B;AAE3B,eAAe,qBAAqB,OAAe,UAAmC,CAAC,GAA6B;AACnH,MAAI;AACH,UAAM,UAAU,MAAM,oBAAoB,OAAO,OAAO;AACxD,qBAAiB,OAAO,IAAI;AAC5B,UAAM,iCAAiC,KAAK;AAC5C,gBAAY,QAAQ,UAAU,wBAAwB,KAAK,EAAE;AAC7D,SAAK,gBAAgB,eAAe;AAEpC,UAAM,MAAM,MAAM,WAAW,KAAK;AAClC,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,0BAA0B;AAAA,IAClE;AAEA,WAAO,EAAE,IAAI,MAAM,KAAK,WAAW,QAAQ,eAAe,GAAG,UAAU;AAAA,EACxE,SAAS,OAAO;AACf,WAAO,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,EACnF;AACD;AAEA,eAAe,qBAAqB,OAAyC;AAC5E,MAAI;AACH,UAAM,UAAU,KAAK;AACrB,gBAAY,QAAQ,UAAU,wBAAwB,KAAK,EAAE;AAC7D,SAAK,gBAAgB,eAAe;AAEpC,UAAM,MAAM,MAAM,WAAW,KAAK;AAClC,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,0BAA0B;AAAA,IAClE;AAEA,WAAO,EAAE,IAAI,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACf,WAAO,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,EACnF;AACD;AAEA,eAAe,mBAAmB,SAAqD;AACtF,MAAI;AACH,YAAQ,QAAQ,QAAQ;AAAA,MACvB,KAAK;AACJ,eAAO,EAAE,SAAS,MAAM,MAAM,MAAM,mBAAmB,EAAE;AAAA,MAE1D,KAAK,UAAU;AACd,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,oBAAoB,KAAK;AAC/B,yBAAiB,OAAO,IAAI;AAC5B,cAAM,iCAAiC,KAAK;AAC5C,oBAAY,QAAQ,SAAS,gBAAgB,KAAK,EAAE;AACpD,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK,UAAU;AACd,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,UAAU,KAAK;AACrB,oBAAY,QAAQ,SAAS,gBAAgB,KAAK,EAAE;AACpD,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK,YAAY;AAChB,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,SAAS,KAAK;AACpB,oBAAY,QAAQ,SAAS,eAAe,KAAK,EAAE;AACnD,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK,gBAAgB;AACpB,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,UAAU,eAAe,IAAI,KAAK;AACxC,YAAI,CAAC,SAAS;AACb,iBAAO,EAAE,SAAS,OAAO,OAAO,6BAA6B,KAAK,GAAG;AAAA,QACtE;AAEA,cAAM,UAAU,QAAQ,WAAW;AACnC,cAAM,SAAS,eAAe,iBAAiB,OAAO,OAAO;AAC7D,YAAI,CAAC,QAAQ;AACZ,iBAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B,KAAK,GAAG;AAAA,QACnE;AAEA,gBAAQ,aAAa,OAAO;AAC5B,qCAA6B,KAAK;AAClC,yBAAiB,OAAO,OAAO;AAC/B,cAAM,wBAAwB,OAAO,MAAM;AAC3C,oBAAY,QAAQ,SAAS,YAAY,UAAU,UAAU,OAAO,KAAK,MAAM,WAAW,KAAK,EAAE;AACjG,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK,cAAc;AAClB,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,SAAS,wBAAwB,iBAAiB,OAAO,QAAQ,WAAW,IAAI;AACtF,cAAM,WAAW,OAAO,MAAM;AAC9B,oBAAY,QAAQ,SAAS,cAAc,OAAO,OAAO,WAAW,KAAK,EAAE;AAC3E,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK,cAAc;AAClB,cAAM,QAAQ,aAAa,OAAO;AAClC,cAAM,SAAS,wBAAwB,iBAAiB,OAAO,QAAQ,WAAW,IAAI;AACtF,cAAM,WAAW,OAAO,MAAM;AAC9B,oBAAY,QAAQ,SAAS,mBAAmB,OAAO,OAAO,WAAW,KAAK,EAAE;AAChF,eAAO,EAAE,SAAS,KAAK;AAAA,MACxB;AAAA,MAEA,KAAK;AACJ,eAAO;AAAA,UACN,SAAS;AAAA,UACT,QAAQ,wBAAwB;AAAA,QACjC;AAAA,MAED;AACC,eAAO,EAAE,SAAS,OAAO,OAAO,mBAAmB,QAAQ,MAAM,GAAG;AAAA,IACtE;AAAA,EACD,SAAS,KAAK;AACb,gBAAY,SAAS,SAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AACxF,WAAO;AAAA,MACN,SAAS;AAAA,MACT,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,IAC7C;AAAA,EACD;AACD;AAEA,SAAS,aAAa,SAAqC;AAC1D,MAAI,QAAQ,UAAU,QAAW;AAChC,WAAO,QAAQ;AAAA,EAChB;AAEA,QAAM,IAAI,MAAM,mBAAmB;AACpC;AAEA,eAAe,oBAAoB,OAAe,UAAmC,CAAC,GAA8B;AACnH,QAAM,WAAW,eAAe,IAAI,KAAK;AACzC,MAAI,UAAU;AACb,UAAM,qBAAqB,OAAO,QAAQ;AAC1C,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,MACC,eAAe,CAAC,SAAS;AACxB,oBAAY,QAAQ,UAAU,yBAAyB,KAAK,KAAK,KAAK,SAAS,SAAS,KAAK,GAAG,GAAG;AAAA,MACpG;AAAA,MACA,cAAc,CAAC,SAAS;AACvB,qCAA6B,KAAK,QAAQ;AAAA,MAC3C;AAAA,MACA,cAAc,MAAM;AACnB,oBAAY,SAAS,UAAU,oCAAoC,KAAK,EAAE;AAC1E,aAAK,gBAAgB,OAAO,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjD,sBAAc,KAAK;AACnB,aAAK,gBAAgB,eAAe;AAAA,MACrC;AAAA,IACD;AAAA,IACA;AAAA,EACD;AACA,iBAAe,IAAI,OAAO,OAAO;AACjC,QAAM,qBAAqB,OAAO,OAAO;AACzC,SAAO;AACR;AAEA,eAAe,UAAU,OAA8B;AACtD,QAAM,UAAU,eAAe,IAAI,KAAK;AACxC,MAAI,SAAS;AACZ,UAAM,QAAQ,OAAO;AAAA,EACtB,OAAO;AACN,UAAM,gBAAgB,OAAO,KAAK;AAAA,EACnC;AAEA,gBAAc,KAAK;AACpB;AAKA,eAAe,SAAS,OAA8B;AACrD,QAAM,MAAM,MAAM,OAAO,KAAK,IAAI,KAAK;AACvC,QAAM,OAAO,KAAK,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,QAAM,OAAO,QAAQ,OAAO,IAAI,UAAU,EAAE,SAAS,KAAK,CAAC;AAC5D;AAEA,eAAe,qBAAqB,OAAe,SAA0C;AAC5F,MAAI;AACH,UAAM,QAAQ,iBAAiB;AAAA,EAChC,SAAS,OAAO;AACf,yBAAqB,KAAK;AAC1B,UAAM;AAAA,EACP;AACD;AAEA,SAAS,cAAc,OAAqB;AAC3C,uBAAqB,OAAO,KAAK;AACjC,+BAA6B,KAAK;AAClC,uBAAqB,KAAK;AAC3B;AAOA,SAAS,2BAAiC;AACzC,aAAW,CAAC,OAAO,OAAO,KAAK,eAAe,QAAQ,GAAG;AACxD,QAAI,gBAAgB,WAAW,KAAK,GAAG;AACtC;AAAA,IACD;AAEA,QAAI,CAAC,QAAQ,cAAc,GAAG;AAC7B;AAAA,IACD;AAEA,kBAAc,KAAK;AACnB,gBAAY,SAAS,UAAU,sCAAsC,KAAK,EAAE;AAAA,EAC7E;AACD;AAEA,SAAS,qBAAqB,OAAqB;AAClD,QAAM,UAAU,eAAe,IAAI,KAAK;AACxC,MAAI,CAAC,SAAS;AACb;AAAA,EACD;AAEA,iBAAe,OAAO,KAAK;AAC3B,UAAQ,QAAQ;AACjB;AAEA,SAAS,0BAA8C;AACtD,SAAO;AAAA,IACN,iBAAiB,CAAC,GAAG,eAAe,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,QAAQ,YAAY,CAAC;AAAA,IACrF,cAAc,gBAAgB,aAAa,EAAE,IAAI,CAAC,YAAY;AAAA,MAC7D,OAAO,OAAO;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO;AAAA,IACf,EAAE;AAAA,IACF,UAAU,mBAAmB;AAAA,IAC7B;AAAA,EACD;AACD;AAEA,SAAS,0BAA8C;AACtD,QAAM,cAAc,qBAAqB,eAAe;AACxD,SAAO;AAAA,IACN,aAAa,OAAO,QAAQ,MAAM;AAAA,IAClC,kBAAkB,OAAO,QAAQ,YAAY,EAAE,WAAW;AAAA,IAC1D,SAAS;AAAA,MACR,WAAW,qBAAqB,YAAY;AAAA,MAC5C,WAAW,aAAa,aAAa;AAAA,MACrC,aAAa,aAAa,eAAe;AAAA,MACzC,aAAa,aAAa,eAAe;AAAA,MACzC,KAAK,aAAa,OAAO;AAAA,MACzB,eAAe,qBAAqB,iBAAiB;AAAA,IACtD;AAAA,IACA,aAAa,CAAC,GAAG,eAAe,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,qBAAqB,OAAO,OAAO,CAAC;AAAA,IACzG;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB,OAAe,SAAsE;AAClH,QAAM,UAAU,QAAQ,eAAe;AACvC,QAAM,SAAS,QAAQ,cAAc;AACrC,SAAO;AAAA,IACN;AAAA,IACA,WAAW,QAAQ,YAAY;AAAA,IAC/B,WAAW,SAAS,aAAa;AAAA,IACjC,aAAa,SAAS,eAAe;AAAA,IACrC,aAAa,SAAS,eAAe;AAAA,IACrC,KAAK,SAAS,OAAO;AAAA,IACrB,UAAU,QAAQ,YAAY;AAAA,IAC9B,aAAa,QAAQ,SAAS;AAAA,IAC9B,WAAW,QAAQ,OAAO;AAAA,IAC1B,aAAa,QAAQ,eAAe;AAAA,IACpC,eAAe,QAAQ,iBAAiB;AAAA,EACzC;AACD;AAEA,eAAe,WAAW,OAAwC;AACjE,QAAM,OAAO,MAAM,gBAAgB,iBAAiB,QAAW;AAAA,IAC9D;AAAA,EACD,CAAC;AACD,SAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,KAAK;AACnD;AAEA,SAAS,mBAAmB,OAA8B;AACzD,SAAO,eAAe,IAAI,KAAK,GAAG,eAAe,GAAG,aAAa;AAClE;AAEA,SAAS,qBAA2C;AACnD,SAAO,CAAC,GAAG,eAAe,QAAQ,CAAC,EACjC,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,mBAAmB,iBAAiB,OAAO,OAAO,CAAC,EAC7E,OAAO,CAAC,WAAyC,WAAW,IAAI;AACnE;AAEA,eAAe,qBAAqD;AACnE,QAAM,OAAO,MAAM,gBAAgB,eAAe;AAClD,SAAO,MAAM,QAAQ;AAAA,IACpB,KAAK,IAAI,OAAO,QAAQ;AACvB,YAAM,UAAU,eAAe,IAAI,IAAI,KAAK;AAC5C,YAAM,EAAE,gBAAgB,cAAc,IAAI,MAAM,yBAAyB,IAAI,OAAO,IAAI,QAAQ;AAChG,aAAO;AAAA,QACN,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA,iBAAiB,mBAAmB,IAAI,KAAK;AAAA,QAC7C,SAAS,UAAU,mBAAmB,iBAAiB,IAAI,OAAO,OAAO,IAAI;AAAA,MAC9E;AAAA,IACD,CAAC;AAAA,EACF;AACD;AAEA,eAAe,yBAAyB,OAAe,UAA6F;AACnJ,QAAM,UAAU,WAAW,gBAAgB,iBAAiB,KAAK,IAAI,CAAC;AACtE,QAAM,UAAU,iBAAiB,iBAAiB,KAAK;AACvD,MAAI,CAAC,SAAS;AACb,WAAO,EAAE,gBAAgB,SAAS,eAAe,CAAC,EAAE;AAAA,EACrD;AAEA,QAAM,gBAAgB,MAAM,oBAAoB,SAAS,OAAO;AAChE,MAAI,cAAc,WAAW,GAAG;AAC/B,WAAO,EAAE,gBAAgB,SAAS,cAAc;AAAA,EACjD;AAEA,SAAO;AAAA,IACN,gBAAgB,QAAQ,OAAO,CAAC,WAAW,CAAC,cAAc,SAAS,MAAM,CAAC;AAAA,IAC1E;AAAA,EACD;AACD;AAEA,SAAS,6BAA6B,UAAwB;AAC7D,QAAM,SAAS,qBAAqB,QAAQ;AAC5C,MAAI,CAAC,QAAQ;AACZ;AAAA,EACD;AAEA,mBAAiB,OAAO,OAAO,OAAO,OAAO;AAC9C;AAEA,SAAS,mBAAmB,OAA0C;AACrE,MAAI,CAAC,qBAAqB,IAAI,KAAK,GAAG;AACrC,WAAO;AAAA,EACR;AAEA,SAAO,qBAAqB,IAAI,KAAK,KAAK;AAC3C;AAEA,eAAe,wBAAwB,OAAe,QAAoC;AACzF,QAAM,UAAU,iBAAiB,iBAAiB,KAAK;AACvD,MAAI,CAAC,SAAS;AACb;AAAA,EACD;AAEA,QAAM,uBAAuB,SAAS,SAAS,kBAAkB,MAAM,CAAC;AACzE;AAEA,eAAe,WAAW,OAAe,QAAoC;AAC5E,QAAM,UAAU,iBAAiB,iBAAiB,KAAK;AACvD,MAAI,CAAC,SAAS;AACb;AAAA,EACD;AAEA,QAAM,wBAAwB,KAAK,SAAS,kBAAkB,MAAM,CAAC;AACrE,MAAI,mBAAmB,KAAK,MAAM,OAAO,SAAS;AACjD;AAAA,EACD;AAEA,QAAM,UAAU,eAAe,IAAI,KAAK;AACxC,WAAS,aAAa,IAAI;AAC1B,mBAAiB,OAAO,IAAI;AAC5B,QAAM,aAAa,eAAe,iBAAiB,OAAO,IAAI;AAC9D,MAAI,YAAY;AACf,UAAM,wBAAwB,OAAO,UAAU;AAAA,EAChD;AACD;AAEA,eAAe,WAAW,OAAe,QAAoC;AAC5E,QAAM,UAAU,iBAAiB,iBAAiB,KAAK;AACvD,MAAI,CAAC,SAAS;AACb;AAAA,EACD;AAEA,QAAM,wBAAwB,KAAK,SAAS,kBAAkB,MAAM,CAAC;AACtE;AAEA,eAAe,oBAAoB,SAAiB,SAAgD;AACnG,QAAM,gBAAgB,MAAM,wBAAwB,iBAAiB,OAAO;AAC5E,MAAI,cAAc,WAAW,GAAG;AAC/B,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,QAAQ,OAAO,CAAC,WAAW,cAAc,KAAK,CAAC,iBAAiB,oBAAoB,cAAc,kBAAkB,MAAM,CAAC,CAAC,CAAC;AACrI;AAEA,eAAe,iCAAiC,OAA8B;AAC7E,QAAM,UAAU,iBAAiB,iBAAiB,KAAK;AACvD,MAAI,CAAC,SAAS;AACb,iCAA6B,KAAK;AAClC;AAAA,EACD;AAEA,QAAM,aAAa,MAAM,uBAAuB,aAAa,OAAO;AACpE,MAAI,CAAC,cAAc,WAAW,OAAO,SAAS,QAAQ;AACrD,iCAA6B,KAAK;AAClC;AAAA,EACD;AAEA,6BAA2B,OAAO,UAAU;AAC5C,QAAM,gCAAgC,KAAK;AAC5C;AAEA,eAAe,gCAAgC,OAA8B;AAC5E,QAAM,aAAa,+BAA+B,IAAI,KAAK;AAC3D,QAAM,UAAU,eAAe,IAAI,KAAK;AACxC,MAAI,CAAC,cAAc,CAAC,SAAS;AAC5B;AAAA,EACD;AAEA,QAAM,SAAS;AAAA,IACd;AAAA,IACA,gBAAgB,iBAAiB,KAAK,EAAE,IAAI,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,EACxF;AACA,MAAI,CAAC,QAAQ,SAAS;AACrB;AAAA,EACD;AAEA,MAAI;AACH,YAAQ,aAAa,OAAO,OAAO;AACnC,qBAAiB,OAAO,OAAO,OAAO;AACtC,iCAA6B,KAAK;AAClC,gBAAY,QAAQ,UAAU,mBAAmB,OAAO,OAAO,WAAW,KAAK,EAAE;AAAA,EAClF,SAAS,OAAO;AACf,YAAQ,KAAK,+DAA+D,KAAK,KAAK,KAAK;AAAA,EAC5F;AACD;AAEA,SAAS,6BAA6B,OAAe,QAAyB;AAC7E,SAAO,+BAA+B,IAAI,KAAK,KAAK,+BAA+B,IAAI,MAAM;AAC9F;AAEA,SAAS,iBAAiB,OAAe,SAA8B;AACtE,uBAAqB,IAAI,OAAO,OAAO;AACxC;AAEA,SAAS,2BAA2B,OAAe,YAA6C;AAC/F,iCAA+B,IAAI,OAAO,UAAU;AACrD;AAEA,SAAS,6BAA6B,OAAqB;AAC1D,iCAA+B,OAAO,KAAK;AAC5C;AAEA,QAAQ,IAAI,mDAAmD;AAC/D,KAAK,gBAAgB,eAAe;",
6
+ "names": ["debuggerManager", "debuggerManager", "debuggerManager", "debuggerManager", "DEFAULT_STORAGE_KEY", "createChromeStoragePersistence", "readStorageValue", "writeStorageValue", "normalizeOptionalText", "sortByUpdatedAtDesc", "debuggerManager", "debuggerManager", "debuggerManager"]
7
+ }