diff --git a/.gitignore b/.gitignore index cd61bd8..d08c173 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ dist/ .env .env.* !.env.example + +# tsc incremental caches — machine-local, and they churn on every build. +*.tsbuildinfo diff --git a/scripts/smoke.cjs b/scripts/smoke.cjs index 4a9baad..10d2d90 100644 --- a/scripts/smoke.cjs +++ b/scripts/smoke.cjs @@ -11,7 +11,7 @@ * would have drifted exactly the way the original bug did and reported success. */ const { spawn } = require('node:child_process'); -const { existsSync } = require('node:fs'); +const { existsSync, readdirSync, statSync } = require('node:fs'); const { join } = require('node:path'); const root = join(__dirname, '..'); @@ -22,6 +22,29 @@ if (!existsSync(entry)) { process.exit(1); } +/** + * Refuse to smoke-test yesterday's build. + * + * `npm run build` typechecks first, so a type error leaves `out/` untouched and this + * script then happily starts the previous build and reports success — a green smoke test + * for code that does not compile. That is the same shape as the bug this file exists to + * catch: every check passing while nothing has actually verified what would ship. + */ +const newestSource = newestMtime(join(root, 'src')); +if (newestSource > statSync(entry).mtimeMs) { + console.error('SMOKE FAIL: out/ is older than src/ — the build did not run, or it failed.'); + process.exit(1); +} + +function newestMtime(dir) { + let newest = 0; + for (const item of readdirSync(dir, { withFileTypes: true })) { + const path = join(dir, item.name); + newest = Math.max(newest, item.isDirectory() ? newestMtime(path) : statSync(path).mtimeMs); + } + return newest; +} + // eslint-disable-next-line @typescript-eslint/no-var-requires const electron = require('electron'); const binary = typeof electron === 'string' ? electron : String(electron); diff --git a/src/main/api.ts b/src/main/api.ts index 7b4cb45..f4ac373 100644 --- a/src/main/api.ts +++ b/src/main/api.ts @@ -1,15 +1,19 @@ import type { AttendanceUploadRequest, AttendanceUploadResult, + CompanionGuild, CompatResponse, } from '../shared/contract'; /** * Everything that leaves this machine goes through here. * - * Deliberately small: two calls, both against the public API as an authenticated user. - * If this file ever grows a third kind of request, that is worth a second look — the - * consent screen promises attendance rows, not a general-purpose channel. + * Deliberately small, and each call earns its place: find out if this build is still + * supported, trade a code for a token, hand the token back, ask which guilds this + * sign-in may write to, and upload one night. Nothing here reads a guild's data. + * + * Anything added is worth a second look — the consent screen promises attendance rows, + * not a general-purpose channel into the officer's account. */ const DEFAULT_BASE_URL = 'https://www.raidify.app'; @@ -78,6 +82,17 @@ export class ApiClient { await this.request('POST', '/api/v1/companion/sign-out', { signal }); } + /** + * Which guilds this sign-in may upload for. + * + * Filtered server-side by the same permission the upload checks, so anything this + * returns is safe to offer — the app never has to reason about permissions itself, and + * cannot get that reasoning subtly wrong on a raid night. + */ + async guilds(signal?: AbortSignal): Promise { + return this.request('GET', '/api/v1/companion/guilds', { signal }); + } + async uploadAttendance( guildId: string, body: AttendanceUploadRequest, diff --git a/src/main/index.ts b/src/main/index.ts index e49b3ad..48c4f52 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -5,9 +5,16 @@ import { buildAuthorizeUrl, createPkcePair, LoopbackReceiver } from './auth'; import { autoDetect, findSavedVariables } from './discovery'; import { canPersist, clearToken, loadToken, saveToken } from './secrets'; import { readNights } from './savedVariables'; -import type { ParsedNight, SavedVariablesCandidate } from '../shared/types'; +import { loadSettings, rememberUpload, saveSettings } from './settings'; +import { nightKey } from '../shared/nightKey'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; import { SavedVariablesWatcher } from './watcher'; -import { evaluateCompat, type CompatVerdict } from '../shared/contract'; +import { + evaluateCompat, + type AttendanceUploadResult, + type CompanionGuild, + type CompatVerdict, +} from '../shared/contract'; /** * Main process. @@ -136,17 +143,19 @@ function createWindow(): void { } /** - * Assert the bridge exists and that IPC round-trips, then exit. + * Assert the bridge exists, that IPC round-trips, and that the window drew something. * * Checks a real `invoke` rather than just the presence of functions: a preload that * loads but whose handlers are missing looks identical from the renderer until something - * is called. + * is called. And it checks the rendered text, because a bridge can be perfect while the + * UI throws on mount — that combination is a blank window that packages and ships. */ async function runSmokeCheck(target: BrowserWindow): Promise { const expected = [ 'appInfo', 'checkCompat', 'authStatus', 'signOut', 'signIn', - 'detectInstalls', 'browseForInstall', 'readNights', 'watch', 'unwatch', - 'onNights', 'onWatchError', + 'detectInstalls', 'browseForInstall', 'readNights', 'watch', 'unwatch', 'resume', + 'getSettings', 'saveSettings', 'listGuilds', 'upload', + 'onNights', 'onEmptyRead', 'onWatchError', ]; try { @@ -158,6 +167,21 @@ async function runSmokeCheck(target: BrowserWindow): Promise { if (missing.length) return { ok: false, reason: 'missing: ' + missing.join(', ') }; const info = await bridge.appInfo(); if (!info || typeof info.version !== 'string') return { ok: false, reason: 'appInfo did not round-trip' }; + + // A working bridge and a blank window is a real combination: a thrown error in + // App() leaves an empty root and every check above still passes. Poll rather + // than sample once — first paint can beat the first render by a frame. + const deadline = Date.now() + 5000; + let text = ''; + while (Date.now() < deadline) { + text = document.body.innerText || ''; + if (text.includes('Raidify Companion')) break; + await new Promise((r) => setTimeout(r, 100)); + } + if (!text.includes('Raidify Companion')) { + return { ok: false, reason: 'the window rendered nothing (body: ' + JSON.stringify(text.slice(0, 120)) + ')' }; + } + return { ok: true, version: info.version }; })()`, ); @@ -168,7 +192,7 @@ async function runSmokeCheck(target: BrowserWindow): Promise { return; } - console.log(`SMOKE OK: bridge exposes ${expected.length} calls, appInfo returned v${report.version}`); + console.log(`SMOKE OK: bridge exposes ${expected.length} calls, appInfo returned v${report.version}, and the window rendered.`); app.exit(0); } catch (error) { console.error(`SMOKE FAIL: ${error instanceof Error ? error.message : String(error)}`); @@ -283,6 +307,29 @@ function remember(candidates: SavedVariablesCandidate[]): SavedVariablesCandidat return candidates; } +/** + * Re-earn the stored path, rather than trusting it. + * + * The remembered file is only usable once this process has found it again the same way it + * found it originally — by scanning the install folder it came from. That keeps one rule + * with no exceptions: nothing is read that discovery did not produce. A settings file + * carried over from another machine, or edited by hand, gets no privileges from having + * been written down. + */ +async function restoreDiscovered(): Promise { + const { savedVariablesPath, installPath } = loadSettings(); + if (!savedVariablesPath || !installPath) return null; + + try { + const candidates = remember(await findSavedVariables(installPath)); + return candidates.some((c) => c.path === savedVariablesPath) ? savedVariablesPath : null; + } catch { + // The drive is gone, or the folder moved. Not an error worth a dialog on launch — + // the officer will be asked to point at it again. + return null; + } +} + function requireDiscovered(path: unknown): string { if (typeof path !== 'string' || !path) throw new Error('No saved-variables path supplied.'); if (!discovered.has(path)) { @@ -303,13 +350,22 @@ ipcMain.handle('wow:read', (_event, path: unknown): Promise => */ ipcMain.handle('wow:watch', async (_event, rawPath: unknown) => { const path = requireDiscovered(rawPath); + await startWatching(path); + return { watching: true, path }; +}); +async function startWatching(path: string): Promise { watcher?.stop(); watcher = new SavedVariablesWatcher( { path }, { onNights: (nights) => emit('wow:nights', nights), onError: (error) => emit('wow:error', { message: error.message }), + // A clean read that found nothing is news. Without this the UI cannot tell "we read + // the file and there are no raid sessions in it" from "we have never read it", and + // the officer stares at the same empty panel in both cases — one of which needs + // them to do something and one of which does not. + onEmpty: () => emit('wow:empty', { at: new Date().toISOString() }), }, ); watcher.start(); @@ -317,8 +373,7 @@ ipcMain.handle('wow:watch', async (_event, rawPath: unknown) => { // Read once immediately: the interesting flush may already have happened while the // app was closed, and a companion that only notices future raids is half a companion. await watcher.readNow(); - return { watching: true, path }; -}); +} ipcMain.handle('wow:unwatch', () => { watcher?.stop(); @@ -326,6 +381,104 @@ ipcMain.handle('wow:unwatch', () => { return { watching: false }; }); +// ── settings, the guild, and sending ──────────────────────────────────────────── + +ipcMain.handle('settings:get', (): Settings => loadSettings()); + +/** + * Pick up where the last launch left off. + * + * One call rather than three, because the renderer should not be able to get the order + * wrong: re-discover the remembered file, and start watching it if that is what the + * officer asked for. A null path means the setup question needs asking again. + */ +ipcMain.handle('wow:resume', async (): Promise<{ path: string | null; watching: boolean }> => { + const path = await restoreDiscovered(); + if (!path) return { path: null, watching: false }; + if (!loadSettings().autoWatch) return { path, watching: false }; + + await startWatching(path); + return { path, watching: true }; +}); + +/** + * Save the setup answers. + * + * Only the three the UI is allowed to set. The upload history is written by the upload + * itself — letting the renderer edit it would mean a UI bug could mark an unsent night as + * sent, which is the one lie this app must never tell. + */ +ipcMain.handle('settings:set', (_event, patch: unknown): Settings => { + const input = (patch ?? {}) as Partial; + const next: Partial = {}; + + if (typeof input.guildId === 'string' || input.guildId === null) next.guildId = input.guildId; + if (typeof input.guildName === 'string' || input.guildName === null) { + next.guildName = input.guildName; + } + if (typeof input.autoWatch === 'boolean') next.autoWatch = input.autoWatch; + if (input.savedVariablesPath === null) { + next.savedVariablesPath = null; + next.installPath = null; + } else if (input.savedVariablesPath !== undefined) { + // Same rule as reading: a path we did not discover ourselves is not a path we store + // and then hand to a file read on the next launch. + next.savedVariablesPath = requireDiscovered(input.savedVariablesPath); + next.installPath = typeof input.installPath === 'string' ? input.installPath : null; + } + + return saveSettings(next); +}); + +ipcMain.handle('guild:list', (): Promise => api.guilds()); + +/** + * Send one night. + * + * `dryRun` runs the identical server path and writes nothing, so the preview the officer + * approves is the work that then happens — not a second implementation of it that can + * disagree. A dry run is never recorded as an upload. + */ +ipcMain.handle( + 'attendance:upload', + async (_event, request: unknown): Promise => { + const { night, dryRun } = (request ?? {}) as { night?: ParsedNight; dryRun?: boolean }; + if (!night) throw new Error('No night to upload.'); + + const { guildId } = loadSettings(); + if (!guildId) throw new Error('Choose which guild this machine reports for first.'); + + const result = await api.uploadAttendance(guildId, { + rows: night.rows, + // Dates cross IPC as strings; the API wants strings anyway. Normalising here rather + // than in the renderer keeps the one place that talks to the server the one place + // that has to know the wire shape. + startedAt: asIso(night.startedAt), + endedAt: asIso(night.endedAt), + raidIdHint: night.raidIdHint, + clientVersion: CLIENT_VERSION, + dryRun: dryRun === true, + }); + + if (!dryRun) { + rememberUpload({ + key: nightKey(night.characterKey, night.startedAt), + uploadedAt: new Date().toISOString(), + raidTitle: result.raidTitle ?? night.raidTitle, + recorded: result.recorded, + updated: result.updated, + }); + } + + return result; + }, +); + +function asIso(value: Date | string | null): string | null { + if (value === null) return null; + return value instanceof Date ? value.toISOString() : value; +} + // ── lifecycle ─────────────────────────────────────────────────────────────────── // One officer, one companion. A second copy watching the same file would upload the diff --git a/src/main/settings.test.ts b/src/main/settings.test.ts new file mode 100644 index 0000000..ae39eac --- /dev/null +++ b/src/main/settings.test.ts @@ -0,0 +1,137 @@ +import { mkdtempSync, readdirSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +// Settings live under `app.getPath('userData')`, which only exists inside a running +// Electron process. Pointing it at a temp folder is the whole mock. +const userData = mkdtempSync(join(tmpdir(), 'raidify-settings-')); +vi.mock('electron', () => ({ app: { getPath: () => userData } })); + +const { loadSettings, saveSettings, rememberUpload, resetSettingsCache } = await import( + './settings' +); +const { nightKey } = await import('../shared/nightKey'); + +const FILE = join(userData, 'settings.json'); + +beforeEach(() => { + resetSettingsCache(); + writeFileSync(FILE, '{}', 'utf8'); + resetSettingsCache(); +}); + +describe('the setup answers', () => { + it('survives a restart', () => { + saveSettings({ guildId: 'g-1', guildName: 'Nerf Inc', autoWatch: false }); + + resetSettingsCache(); + + const reloaded = loadSettings(); + expect(reloaded.guildId).toBe('g-1'); + expect(reloaded.guildName).toBe('Nerf Inc'); + expect(reloaded.autoWatch).toBe(false); + }); + + /** + * A settings file that cannot be parsed must cost the officer a setup screen, not a + * launch. This app's job is to be running when the raid ends. + */ + it('falls back to defaults rather than failing to start', () => { + writeFileSync(FILE, '{ this is not json', 'utf8'); + resetSettingsCache(); + + const loaded = loadSettings(); + expect(loaded.guildId).toBeNull(); + expect(loaded.uploaded).toEqual([]); + }); + + /** + * The type is a claim about what we wrote, not about what is on disk. A hand-edited + * file with the wrong shape must not reach the code that treats these as a path or an + * array. + */ + it('refuses values of the wrong type', () => { + writeFileSync( + FILE, + JSON.stringify({ guildId: 42, savedVariablesPath: { nope: true }, uploaded: 'lots' }), + 'utf8', + ); + resetSettingsCache(); + + const loaded = loadSettings(); + expect(loaded.guildId).toBeNull(); + expect(loaded.savedVariablesPath).toBeNull(); + expect(loaded.uploaded).toEqual([]); + }); + + it('leaves no temporary file behind', () => { + saveSettings({ guildId: 'g-2' }); + + expect(readdirSync(userData).filter((f) => f.endsWith('.tmp'))).toEqual([]); + }); +}); + +describe('the record of what has been sent', () => { + const entry = (key: string) => ({ + key, + uploadedAt: new Date().toISOString(), + raidTitle: 'Naxx', + recorded: 40, + updated: 0, + }); + + /** + * Re-sending a night is a correction, not a second night. Two history rows for one + * session would show the officer a duplicate of something that only happened once. + */ + it('replaces an earlier send of the same night', () => { + rememberUpload(entry('Toon - Nightslayer|2026-08-01T19:00:00.000Z')); + rememberUpload({ + ...entry('Toon - Nightslayer|2026-08-01T19:00:00.000Z'), + recorded: 0, + updated: 3, + }); + + const { uploaded } = loadSettings(); + expect(uploaded).toHaveLength(1); + expect(uploaded[0]?.updated).toBe(3); + }); + + it('keeps a bounded history', () => { + for (let i = 0; i < 260; i++) rememberUpload(entry(`night-${i}`)); + + const { uploaded } = loadSettings(); + expect(uploaded).toHaveLength(200); + // Oldest dropped, newest kept — a history that trims the wrong end is worse than none. + expect(uploaded.at(-1)?.key).toBe('night-259'); + expect(uploaded.some((u) => u.key === 'night-0')).toBe(false); + }); +}); + +/** + * The main process writes this key from a Date; the renderer computes it again from + * whatever survived IPC. If those two disagree by so much as a format, every night + * already sent is offered again forever — which is precisely the nagging the history + * exists to stop. + */ +describe('the night key', () => { + it('is the same whether the time arrives as a Date or a string', () => { + const when = new Date('2026-08-01T19:04:33.000Z'); + + expect(nightKey('Toon - Nightslayer', when)).toBe( + nightKey('Toon - Nightslayer', when.toISOString()), + ); + }); + + it('distinguishes two characters on the same night', () => { + const when = new Date('2026-08-01T19:04:33.000Z'); + + expect(nightKey('Toon - Nightslayer', when)).not.toBe(nightKey('Alt - Nightslayer', when)); + }); + + it('does not collapse every unknown time into a match', () => { + // Two sessions with no start time are still two sessions on different characters. + expect(nightKey('Toon - Nightslayer', null)).not.toBe(nightKey('Alt - Nightslayer', null)); + }); +}); diff --git a/src/main/settings.ts b/src/main/settings.ts new file mode 100644 index 0000000..ebbec96 --- /dev/null +++ b/src/main/settings.ts @@ -0,0 +1,99 @@ +import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { app } from 'electron'; +import type { Settings, UploadedNight } from '../shared/types'; + +/** + * What the officer told us once and should never be asked again. + * + * Plain JSON, deliberately: none of it is a secret. The token lives in `secrets.ts` + * behind the OS credential store; this file holds a guild id, a folder path and a list of + * nights already sent — all of it readable from the officer's own screen anyway. + * + * The setup questions are asked once. An app that forgets which guild it reports for + * every time it launches is an app the officer stops launching. + * + * The shapes live in `shared/types` because the UI renders them; this file is only the + * reading and writing. + */ + +/** Beyond this, the history is scrollback nobody reads and a file that only grows. */ +const MAX_HISTORY = 200; + +const DEFAULTS: Settings = { + guildId: null, + guildName: null, + savedVariablesPath: null, + installPath: null, + autoWatch: true, + uploaded: [], +}; + +const FILE = (): string => join(app.getPath('userData'), 'settings.json'); + +let cache: Settings | null = null; + +export function loadSettings(): Settings { + if (cache) return cache; + + const path = FILE(); + if (!existsSync(path)) { + cache = { ...DEFAULTS }; + return cache; + } + + try { + const parsed = JSON.parse(readFileSync(path, 'utf8')) as Partial; + cache = { + ...DEFAULTS, + ...parsed, + // A hand-edited or half-written file must not take the app down on launch. Every + // field is re-checked rather than trusted, because the type above is a claim about + // what we wrote, not about what is on disk. + guildId: typeof parsed.guildId === 'string' ? parsed.guildId : null, + guildName: typeof parsed.guildName === 'string' ? parsed.guildName : null, + savedVariablesPath: + typeof parsed.savedVariablesPath === 'string' ? parsed.savedVariablesPath : null, + installPath: typeof parsed.installPath === 'string' ? parsed.installPath : null, + autoWatch: typeof parsed.autoWatch === 'boolean' ? parsed.autoWatch : true, + uploaded: Array.isArray(parsed.uploaded) + ? parsed.uploaded.filter((u): u is UploadedNight => typeof u?.key === 'string') + : [], + }; + } catch { + // Corrupt settings are not worth a dialog. Fall back to defaults and let the officer + // answer the setup questions again — annoying, and survivable. + cache = { ...DEFAULTS }; + } + + return cache; +} + +export function saveSettings(next: Partial): Settings { + const merged = { ...loadSettings(), ...next }; + merged.uploaded = merged.uploaded.slice(-MAX_HISTORY); + cache = merged; + + const path = FILE(); + mkdirSync(dirname(path), { recursive: true }); + + // Write-then-rename: the alternative is truncating the real file and then losing power + // (or being killed by a Windows update) before the content lands, which turns "forgot a + // preference" into "settings file is now zero bytes". + const temporary = `${path}.tmp`; + writeFileSync(temporary, JSON.stringify(merged, null, 2), 'utf8'); + renameSync(temporary, path); + + return merged; +} + +/** Record a night as sent. Replaces any earlier entry for the same night. */ +export function rememberUpload(entry: UploadedNight): Settings { + const rest = loadSettings().uploaded.filter((u) => u.key !== entry.key); + return saveSettings({ uploaded: [...rest, entry] }); +} + +/** Test seam. The cache is process-wide and would otherwise leak between cases. */ +export function resetSettingsCache(): void { + cache = null; +} diff --git a/src/preload/index.ts b/src/preload/index.ts index 562a4ae..039ebf6 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,6 +1,10 @@ import { contextBridge, ipcRenderer } from 'electron'; -import type { ParsedNight, SavedVariablesCandidate } from '../shared/types'; -import type { CompatVerdict } from '../shared/contract'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; +import type { + AttendanceUploadResult, + CompanionGuild, + CompatVerdict, +} from '../shared/contract'; /** * The only way the UI can reach anything real. @@ -25,6 +29,19 @@ const bridge = { watch: (path: string): Promise<{ watching: boolean; path: string }> => ipcRenderer.invoke('wow:watch', path), unwatch: (): Promise<{ watching: boolean }> => ipcRenderer.invoke('wow:unwatch'), + /** Re-find the remembered file and, if asked for, start watching it. */ + resume: (): Promise<{ path: string | null; watching: boolean }> => + ipcRenderer.invoke('wow:resume'), + + getSettings: (): Promise => ipcRenderer.invoke('settings:get'), + saveSettings: (patch: Partial): Promise => + ipcRenderer.invoke('settings:set', patch), + + listGuilds: (): Promise => ipcRenderer.invoke('guild:list'), + + /** `dryRun` previews on the real server path and writes nothing. */ + upload: (night: ParsedNight, dryRun: boolean): Promise => + ipcRenderer.invoke('attendance:upload', { night, dryRun }), /** Fires whenever a flush produced a readable night. Returns an unsubscribe. */ onNights: (handler: (nights: ParsedNight[]) => void): (() => void) => { @@ -33,6 +50,13 @@ const bridge = { return () => ipcRenderer.removeListener('wow:nights', listener); }, + /** The file read cleanly and held no raid session. Fires instead of `onNights`. */ + onEmptyRead: (handler: (info: { at: string }) => void): (() => void) => { + const listener = (_event: unknown, info: { at: string }) => handler(info); + ipcRenderer.on('wow:empty', listener); + return () => ipcRenderer.removeListener('wow:empty', listener); + }, + onWatchError: (handler: (error: { message: string }) => void): (() => void) => { const listener = (_event: unknown, error: { message: string }) => handler(error); ipcRenderer.on('wow:error', listener); diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 4820304..33fc1e2 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1,5 +1,9 @@ -import { useEffect, useState } from 'react'; -import type { CompatVerdict } from '../shared/contract'; +import { useCallback, useEffect, useState } from 'react'; +import type { CompanionGuild, CompatVerdict } from '../shared/contract'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; +import { nightKey } from '../shared/nightKey'; +import { NightCard } from './components/NightCard'; +import { SetupPanel } from './components/SetupPanel'; import { StatusBanner } from './components/StatusBanner'; interface AppInfo { @@ -11,24 +15,86 @@ interface AppInfo { /** * The shell. * - * v0's UI is a real deliverable rather than a tray menu, so the frame it will grow into - * is here from the start: a status line the officer can read at a glance, and room below - * it for setup and upload history. What is not here yet is marked as such — an empty - * panel that pretends to work is worse than one that says what it is waiting for. + * Answer three setup questions once, then this window has one job: show the raid nights + * sitting in the saved-variables file and let the officer send one. It never sends on its + * own — see NightCard for why. */ export function App() { const [info, setInfo] = useState(null); const [compat, setCompat] = useState(null); const [signedIn, setSignedIn] = useState(false); + const [settings, setSettings] = useState(null); + const [guilds, setGuilds] = useState(null); + const [installs, setInstalls] = useState(null); + const [watchingPath, setWatchingPath] = useState(null); + const [nights, setNights] = useState([]); + const [watchError, setWatchError] = useState(null); + /** When the file was last read and found to hold no raid session. */ + const [lastEmptyRead, setLastEmptyRead] = useState(null); + + // The guild list needs a working sign-in, and sign-in state changes at runtime. Keeping + // the fetch in one place stops it being fired twice by two callers that both mean "we + // are signed in now". + const loadGuilds = useCallback(async () => { + try { + setGuilds(await window.companion.listGuilds()); + } catch { + // Offline, or the token expired. The banner already says the server is unreachable; + // a second error here would be the same news twice. + setGuilds([]); + } + }, []); useEffect(() => { void (async () => { setInfo(await window.companion.appInfo()); - setSignedIn((await window.companion.authStatus()).signedIn); + setSettings(await window.companion.getSettings()); + + const auth = await window.companion.authStatus(); + setSignedIn(auth.signedIn); + setCompat(await window.companion.checkCompat()); + + if (auth.signedIn) { + void loadGuilds(); + // Pick the file back up from last launch, and watch it again if that is what the + // officer asked for. + setWatchingPath((await window.companion.resume()).path); + } })(); + }, [loadGuilds]); + + // Subscribed once, for the life of the window. A flush landing while the officer reads + // is the normal case — they alt-tab out of the game and the file arrives. + useEffect(() => { + const stopNights = window.companion.onNights((incoming) => { + setNights(incoming); + setLastEmptyRead(null); + setWatchError(null); + }); + const stopEmpty = window.companion.onEmptyRead((info) => { + // A later read finding nothing means the file was rewritten without a session in + // it, so the nights we were showing are gone too. Saying so beats leaving stale + // cards on screen that no longer exist on disk. + setNights([]); + setLastEmptyRead(info.at); + setWatchError(null); + }); + const stopErrors = window.companion.onWatchError((error) => setWatchError(error.message)); + return () => { + stopNights(); + stopEmpty(); + stopErrors(); + }; }, []); + const sent = new Map((settings?.uploaded ?? []).map((u) => [u.key, u])); + + // Newest first: the night just finished is the one the officer opened the app for. + const ordered = [...nights].sort((a, b) => time(b.startedAt) - time(a.startedAt)); + + const uploadsBlocked = compat !== null && compat.kind !== 'ok'; + return (
@@ -46,31 +112,110 @@ export function App() {
-
-

Setup

-
    -
  1. {signedIn ? '✓ Signed in' : '1 · Sign in to Raidify'}
  2. -
  3. 2 · Choose which guild this machine reports for
  4. -
  5. 3 · Point at your World of Warcraft folder
  6. -
-

- Not wired up yet — sign-in, guild picker and folder picker land next. -

- {info && !info.canRememberSignIn && ( -

- This system has no secure credential store, so a sign-in cannot be remembered - between launches. -

- )} -
+ { + await window.companion.signIn(); + setSignedIn(true); + await loadGuilds(); + }} + onSignOut={async () => { + await window.companion.signOut(); + setSignedIn(false); + setGuilds(null); + }} + onChooseGuild={async (guild) => { + setSettings( + await window.companion.saveSettings({ guildId: guild.id, guildName: guild.name }), + ); + }} + onDetect={async () => setInstalls(await window.companion.detectInstalls())} + onBrowse={async () => setInstalls(await window.companion.browseForInstall())} + onChooseInstall={async (candidate) => { + setSettings( + await window.companion.saveSettings({ + savedVariablesPath: candidate.path, + installPath: candidate.installPath, + }), + ); + setWatchingPath((await window.companion.watch(candidate.path)).path); + }} + /> -
-

Recent uploads

-

- Nothing yet. Finished raid nights will appear here with what was sent. + {watchError && ( +

+ Could not read the saved-variables file: {watchError}

+ )} + +
+

Raid nights

+ + {!watchingPath ? ( + Finish setup and your raid nights will appear here. + ) : ordered.length === 0 ? ( + + {lastEmptyRead ? ( + <> + Read your saved-variables file at{' '} + {new Date(lastEmptyRead).toLocaleTimeString()} and found no raid session in + it. Start one in game with /rf start, and + it will appear here after you log out or type{' '} + /reload. + + ) : ( + <> + Nothing yet. A raid night shows up here once you have logged out or typed{' '} + /reload — the game holds the file in + memory until then, so it is not missing, just not written yet. + + )} + + ) : uploadsBlocked ? ( + + {ordered.length} night{ordered.length === 1 ? '' : 's'} ready, held until Raidify + is accepting uploads again. Nothing is lost. + + ) : ( + ordered.map((night) => { + const key = nightKey(night.characterKey, night.startedAt); + return ( + { + const result = await window.companion.upload(target, dryRun); + // The main process is what recorded the send; re-read rather than guess + // at what it wrote, so the "Sent" mark and the file cannot disagree. + if (!dryRun) setSettings(await window.companion.getSettings()); + return result; + }} + /> + ); + }) + )}
); } + +function Empty({ children }: { children: React.ReactNode }) { + return ( +

+ {children} +

+ ); +} + +function time(value: Date | string | null): number { + if (!value) return 0; + const ms = (value instanceof Date ? value : new Date(value)).getTime(); + return Number.isNaN(ms) ? 0 : ms; +} diff --git a/src/renderer/components/NightCard.tsx b/src/renderer/components/NightCard.tsx new file mode 100644 index 0000000..cf8492a --- /dev/null +++ b/src/renderer/components/NightCard.tsx @@ -0,0 +1,265 @@ +import { useState } from 'react'; +import { AttendanceBucket, type AttendanceUploadResult } from '../../shared/contract'; +import type { ParsedNight, UploadedNight } from '../../shared/types'; + +/** + * One raid night, and the decision to send it. + * + * Never sends on its own. The officer is the one who knows whether Tuesday's session on + * an alt was the guild's Naxx run or three people messing about in Deadmines, and this + * app has no way to tell those apart — so it reports what it read and waits. + * + * "Review" runs a dry run against the real server path, so what is shown is what will + * happen rather than a second guess at it. + */ +export function NightCard({ + night, + alreadySent, + onUpload, +}: { + night: ParsedNight; + alreadySent: UploadedNight | undefined; + onUpload: (night: ParsedNight, dryRun: boolean) => Promise; +}) { + const [preview, setPreview] = useState(null); + const [sent, setSent] = useState(null); + const [busy, setBusy] = useState<'review' | 'send' | null>(null); + const [error, setError] = useState(null); + + const counts = summarise(night); + + async function run(dryRun: boolean) { + setBusy(dryRun ? 'review' : 'send'); + setError(null); + try { + const result = await onUpload(night, dryRun); + if (dryRun) setPreview(result); + else setSent(result); + } catch (caught) { + setError(caught instanceof Error ? caught.message : String(caught)); + } finally { + setBusy(null); + } + } + + return ( +
+
+
+

+ {night.raidTitle ?? 'Raid night'}{' '} + · {night.characterKey} +

+

+ {describeWhen(night)} · {counts.total} raiders +

+
+ +
+ {night.stale && Old night} + {!night.finished && Still running} + {alreadySent && Sent} +
+
+ +
    + + + {/* Named plainly. These are people nobody accounted for, and calling them absent + here is exactly the accusation the addon refuses to make. */} + +
+ + {night.stale && ( + + This night is more than two weeks old. Sending it now rewrites the record for that + date — fine if you meant to, worth a second look if you did not. + + )} + + {!night.finished && ( + + The addon has not ended this session. Send it and anyone who joins later will be + missing. Type /rf end in game first if the raid + is over. + + )} + + {alreadySent && !sent && ( + + Sent {relative(alreadySent.uploadedAt)}. Sending again corrects the record rather + than duplicating it. + + )} + + {error && {error}} + + {sent ? ( + + {describeResult(sent)} + {sent.unmatchedRaiders.length > 0 && ( + + )} + + ) : ( + <> + {preview && ( + + {describeResult(preview, true)} + {preview.warnings.map((w) => ( + + {w} + + ))} + {preview.unmatchedRaiders.length > 0 && ( + + )} + + )} + +
+ + + {/* Deliberately gated on a review. The officer sees what a send does before + one happens — and because the preview runs the same server path, seeing it + is not a promise about the send, it is the send with the write turned off. */} + +
+ + )} +
+ ); +} + +function UnmatchedList({ names }: { names: string[] }) { + return ( + + No Raidify account matched: {names.join(', ')}. They are not counted either way — + linking their character on the website fixes it for next time. + + ); +} + +function describeResult(result: AttendanceUploadResult, preview = false): string { + const verb = preview ? 'would be' : 'were'; + const parts: string[] = []; + if (result.recorded) parts.push(`${result.recorded} ${verb} recorded`); + if (result.updated) parts.push(`${result.updated} ${verb} corrected`); + if (result.unchanged) parts.push(`${result.unchanged} already matched`); + + const where = result.raidTitle + ? `“${result.raidTitle}”` + : 'a night not on the schedule, which will be recorded on its own'; + + return parts.length === 0 + ? `Nothing to change against ${where}.` + : `${parts.join(', ')} against ${where}.`; +} + +interface Counts { + total: number; + attended: number; + benched: number; + unresolved: number; +} + +function summarise(night: ParsedNight): Counts { + const counts: Counts = { total: night.rows.length, attended: 0, benched: 0, unresolved: 0 }; + + for (const row of night.rows) { + switch (row.bucket) { + case AttendanceBucket.Present: + case AttendanceBucket.Late: + case AttendanceBucket.LeftEarly: + counts.attended++; + break; + case AttendanceBucket.Benched: + counts.benched++; + break; + default: + counts.unresolved++; + } + } + + return counts; +} + +function describeWhen(night: ParsedNight): string { + if (!night.startedAt) return 'Time unknown'; + + const started = new Date(night.startedAt); + const date = started.toLocaleDateString(undefined, { + weekday: 'short', + day: 'numeric', + month: 'short', + }); + const from = started.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); + if (!night.endedAt) return `${date}, from ${from}`; + + const ended = new Date(night.endedAt); + const to = ended.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); + return `${date}, ${from}–${to}`; +} + +function relative(iso: string): string { + const then = new Date(iso).getTime(); + const minutes = Math.round((Date.now() - then) / 60_000); + if (minutes < 1) return 'just now'; + if (minutes < 60) return `${minutes} min ago`; + const hours = Math.round(minutes / 60); + if (hours < 24) return `${hours}h ago`; + return new Date(iso).toLocaleDateString(); +} + +function Count({ label, value, muted }: { label: string; value: number; muted?: boolean }) { + if (value === 0) return null; + return ( +
  • + {value} {label} +
  • + ); +} + +const TONES = { + success: 'var(--success)', + warning: 'var(--warning)', + error: 'var(--error)', + muted: 'var(--muted)', +} as const; + +function Note({ tone, children }: { tone: keyof typeof TONES; children: React.ReactNode }) { + return ( +

    + {children} +

    + ); +} + +function Tag({ tone, children }: { tone: keyof typeof TONES; children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/src/renderer/components/SetupPanel.tsx b/src/renderer/components/SetupPanel.tsx new file mode 100644 index 0000000..89752f2 --- /dev/null +++ b/src/renderer/components/SetupPanel.tsx @@ -0,0 +1,286 @@ +import { useState } from 'react'; +import type { CompanionGuild } from '../../shared/contract'; +import type { SavedVariablesCandidate, Settings } from '../../shared/types'; + +/** + * The three questions, asked once. + * + * Who are you, which guild does this machine report for, and where is the game. Nothing + * else — every extra question here is a reason to close the app and go back to pasting a + * string, which already works. + * + * Collapses to a single line once answered, because setup is not what the officer opens + * this app to look at. + */ +export function SetupPanel({ + settings, + signedIn, + canRememberSignIn, + guilds, + installs, + watchingPath, + onSignIn, + onSignOut, + onChooseGuild, + onDetect, + onBrowse, + onChooseInstall, +}: { + settings: Settings | null; + signedIn: boolean; + canRememberSignIn: boolean; + guilds: CompanionGuild[] | null; + installs: SavedVariablesCandidate[] | null; + watchingPath: string | null; + onSignIn: () => Promise; + onSignOut: () => Promise; + onChooseGuild: (guild: CompanionGuild) => Promise; + onDetect: () => Promise; + onBrowse: () => Promise; + onChooseInstall: (candidate: SavedVariablesCandidate) => Promise; +}) { + const [busy, setBusy] = useState(null); + const [error, setError] = useState(null); + + const guildChosen = Boolean(settings?.guildId); + const fileChosen = Boolean(watchingPath); + const done = signedIn && guildChosen && fileChosen; + + const [expanded, setExpanded] = useState(false); + + async function attempt(name: string, action: () => Promise) { + setBusy(name); + setError(null); + try { + await action(); + } catch (caught) { + setError(caught instanceof Error ? caught.message : String(caught)); + } finally { + setBusy(null); + } + } + + // Answered and working: one line, and a way back in. Anything more is a permanent + // reminder of a job that is finished. + if (done && !expanded) { + return ( +
    +

    + Watching for {settings?.guildName} ·{' '} + {shortPath(watchingPath)} +

    + +
    + ); + } + + return ( +
    +
    +

    Setup

    + {done && ( + + )} +
    + +
      + + {signedIn ? ( + + ) : ( + <> + void attempt('signin', onSignIn)} + /> +

      + Opens your browser. If you are already signed in to Raidify there, it is one + click and nothing to type. +

      + {!canRememberSignIn && ( +

      + This system has no secure credential store, so the sign-in cannot be + remembered between launches. +

      + )} + + )} +
      + + + {!signedIn ? ( +

      Sign in first.

      + ) : guilds === null ? ( +

      Loading your guilds…

      + ) : guilds.length === 0 ? ( +

      + None of your guilds let you manage raids, so there is nothing this machine can + report for. An officer can grant that on the guild's settings page. +

      + ) : ( +
      + {guilds.map((guild) => ( + + ))} +
      + )} +
      + + +
      + void attempt('detect', onDetect)} + /> + void attempt('browse', onBrowse)} + quiet + /> +
      + + {installs !== null && installs.length === 0 && ( +

      + No Raidify saved-variables file found. That file only appears after the addon + has run at least once and you have logged out or typed{' '} + /reload — the game keeps it in memory until + then. +

      + )} + + {installs !== null && installs.length > 0 && ( +
        + {installs.map((candidate) => ( +
      • + +
      • + ))} +
      + )} +
      +
    + + {error &&

    {error}

    } +
    + ); +} + +function Step({ + index, + title, + complete, + children, +}: { + index: number; + title: string; + complete: boolean; + children: React.ReactNode; +}) { + return ( +
  • +

    + + {complete ? '✓' : index} + + {title} +

    +
    {children}
    +
  • + ); +} + +function Action({ + label, + busy, + disabled, + onClick, + quiet, +}: { + label: string; + busy: boolean; + disabled: boolean; + onClick: () => void; + quiet?: boolean; +}) { + return ( + + ); +} + +/** The middle of a saved-variables path is folder names nobody reads. */ +function shortPath(path: string | null): string { + if (!path) return ''; + const parts = path.split(/[\\/]/); + return parts.slice(-4).join('/'); +} diff --git a/src/shared/contract.ts b/src/shared/contract.ts index 217b87a..a1157af 100644 --- a/src/shared/contract.ts +++ b/src/shared/contract.ts @@ -91,6 +91,21 @@ export interface AttendanceUploadResult { warnings: string[]; } +/** + * A guild this machine may report attendance for. + * + * The saved-variables file says which characters raided; it never says under whose + * banner. So the officer picks once, from the guilds the server says they can already + * manage raids in. + */ +export interface CompanionGuild { + id: string; + name: string; + slug: string; + gameVersion: number; + avatarUrl: string | null; +} + export interface CompatResponse { minimumClientVersion: string; latestClientVersion: string; diff --git a/src/shared/nightKey.ts b/src/shared/nightKey.ts new file mode 100644 index 0000000..fa47eb4 --- /dev/null +++ b/src/shared/nightKey.ts @@ -0,0 +1,21 @@ +/** + * Identify a night without waiting for the server to name it. + * + * The upload result carries the server's own `eventKey`, but that only exists after a + * successful send and says nothing about the local session that produced it. This is + * computed from what is in the saved-variables file, so a night can be recognised — and + * matched against what has already been sent — before it is ever uploaded. + * + * Lives in `shared` because both sides need the same answer: the main process writes the + * key into the upload history, and the renderer looks nights up by it. Two + * implementations that drift by a millisecond would quietly re-offer every sent night. + */ +export function nightKey(characterKey: string, startedAt: Date | string | null): string { + const at = + startedAt === null + ? 'unknown' + : startedAt instanceof Date + ? startedAt.toISOString() + : new Date(startedAt).toISOString(); + return `${characterKey}|${at}`; +} diff --git a/src/shared/types.ts b/src/shared/types.ts index 25f5856..90f7fcd 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -47,3 +47,41 @@ export interface ParsedNight { rows: AttendanceRow[]; } + +export interface Settings { + /** Which guild this machine reports for. Null until setup is done. */ + guildId: string | null; + guildName: string | null; + /** The `RaidifyDB.lua` we watch. */ + savedVariablesPath: string | null; + /** + * The `World of Warcraft` folder it was found under. + * + * Stored so the path can be re-discovered on the next launch rather than trusted. A + * path is only ever read after this app has found it itself; a string sitting in a JSON + * file is not that, and the difference matters for a value that becomes a file read and + * a Lua evaluation. + */ + installPath: string | null; + /** Start watching as soon as the app opens, rather than waiting to be told. */ + autoWatch: boolean; + /** + * Nights already sent from this machine, newest last. + * + * Not a correctness mechanism — the server upserts, so a second send of the same night + * changes nothing. This is so the list stops asking. Every flush of the saved-variables + * file re-reads every session in it, and an app that offers the same finished night at + * every launch until the officer manually clears it teaches them to ignore the list, + * which is the one thing it must not do. + */ + uploaded: UploadedNight[]; +} + +export interface UploadedNight { + /** `characterKey|startedAt` — see `nightKey`. */ + key: string; + uploadedAt: string; + raidTitle: string | null; + recorded: number; + updated: number; +} diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo deleted file mode 100644 index 5707cd0..0000000 --- a/tsconfig.node.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/electron-vite/dist/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./node_modules/@tailwindcss/vite/dist/index.d.mts","./electron.vite.config.ts","./src/shared/contract.ts","./src/main/api.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","./node_modules/tinyrainbow/dist/node.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/runner/dist/tasks.d-cksck4of.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/types.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/vitest/dist/chunks/environment.d.cl3nlxbe.d.ts","./node_modules/@vitest/mocker/dist/registry.d-d765pazg.d.ts","./node_modules/@vitest/mocker/dist/types.d-d_arzrdy.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vite-node/dist/trace-mapping.d-dlvdeqop.d.ts","./node_modules/vite-node/dist/index.d-dgmxd2u7.d.ts","./node_modules/vite-node/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","./node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d.ts","./node_modules/vitest/dist/chunks/config.d.bkdhh7zx.d.ts","./node_modules/vitest/dist/chunks/worker.d.cugipz9v.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.bwvbvtda.d.ts","./node_modules/vite-node/dist/client.d.ts","./node_modules/vitest/dist/chunks/coverage.d.s9rmnxie.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.buron0i0.d.ts","./node_modules/vitest/dist/chunks/worker.d.uzwscv9x.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/dist/chunks/global.d.mamajcmj.d.ts","./node_modules/vitest/dist/chunks/vite.d.bnoppc46.d.ts","./node_modules/vitest/dist/chunks/mocker.d.be_2ls6u.d.ts","./node_modules/vitest/dist/chunks/suite.d.fvehnv49.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/main/auth.ts","./src/main/auth.test.ts","./src/main/build.test.ts","./src/shared/types.ts","./src/main/discovery.ts","./src/main/discovery.test.ts","./node_modules/electron/electron.d.ts","./src/main/secrets.ts","./node_modules/wasmoon/dist/types.d.ts","./node_modules/wasmoon/dist/decoration.d.ts","./node_modules/wasmoon/dist/pointer.d.ts","./node_modules/wasmoon/dist/multireturn.d.ts","./node_modules/@types/emscripten/index.d.ts","./node_modules/wasmoon/dist/luawasm.d.ts","./node_modules/wasmoon/dist/thread.d.ts","./node_modules/wasmoon/dist/type-extension.d.ts","./node_modules/wasmoon/dist/global.d.ts","./node_modules/wasmoon/dist/engine.d.ts","./node_modules/wasmoon/dist/factory.d.ts","./node_modules/wasmoon/dist/raw-result.d.ts","./node_modules/wasmoon/dist/type-extensions/function.d.ts","./node_modules/wasmoon/dist/type-extensions/userdata.d.ts","./node_modules/wasmoon/dist/type-extensions/proxy.d.ts","./node_modules/wasmoon/dist/index.d.ts","./src/main/lua.ts","./src/main/savedvariables.ts","./src/main/watcher.ts","./src/main/index.ts","./src/main/lua.test.ts","./src/main/savedvariables.test.ts","./src/main/watcher.test.ts","./src/preload/index.ts","./src/shared/contract.test.ts","./node_modules/electron-vite/node.d.ts"],"fileIdsList":[[67,116,133,134,138,205,212,213],[67,116,133,134,206],[67,116,133,134],[67,116,133,134,204,258],[67,116,133,134,206,207,208,209,210],[67,116,133,134,206,208],[67,116,133,134,244,245],[67,113,114,116,133,134],[67,115,116,133,134],[116,133,134],[67,116,121,133,134,151],[67,116,117,122,127,133,134,136,148,159],[67,116,117,118,127,133,134,136],[62,63,64,67,116,133,134],[67,116,119,133,134,160],[67,116,120,121,128,133,134,137],[67,116,121,133,134,148,156],[67,116,122,124,127,133,134,136],[67,115,116,123,133,134],[67,116,124,125,133,134],[67,116,126,127,133,134],[67,115,116,127,133,134],[67,116,127,128,129,133,134,148,159],[67,116,127,128,129,133,134,143,148,151],[67,108,116,124,127,130,133,134,136,148,159],[67,116,127,128,130,131,133,134,136,148,156,159],[67,116,130,132,133,134,148,156,159],[65,66,67,68,69,70,71,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,127,133,134],[67,116,133,134,135,159],[67,116,124,127,133,134,136,148],[67,116,133,134,137],[67,116,133,134,138],[67,115,116,133,134,139],[67,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,133,134,141],[67,116,133,134,142],[67,116,127,133,134,143,144],[67,116,133,134,143,145,160,162],[67,116,128,133,134],[67,116,127,133,134,148,149,151],[67,116,133,134,150,151],[67,116,133,134,148,149],[67,116,133,134,151],[67,116,133,134,152],[67,113,116,133,134,148,153,159],[67,116,127,133,134,154,155],[67,116,133,134,154,155],[67,116,121,133,134,136,148,156],[67,116,133,134,157],[67,116,133,134,136,158],[67,116,130,133,134,142,159],[67,116,121,133,134,160],[67,116,133,134,148,161],[67,116,133,134,135,162],[67,116,133,134,163],[67,108,116,133,134],[67,108,116,127,129,133,134,139,148,151,159,161,162,164],[67,116,133,134,148,165],[67,116,133,134,204,211,258],[67,116,133,134,221,222,225,255],[67,116,133,134,231,232],[67,116,133,134,222,223,225,226,227],[67,116,133,134,222],[67,116,133,134,222,223,225],[67,116,133,134,222,223],[67,116,133,134,238],[67,116,133,134,217,238,239],[67,116,133,134,217,238],[67,116,133,134,217,224],[67,116,133,134,218],[67,116,133,134,217,218,219,221],[67,116,133,134,217],[67,116,133,134,164],[67,116,127,128,133,134,166],[67,116,133,134,261,262],[67,116,133,134,261,262,263,264],[67,116,133,134,261,263],[67,116,133,134,261],[67,116,133,134,198,199],[67,116,133,134,192],[67,116,133,134,190,192],[67,116,133,134,181,189,190,191,193,195],[67,116,133,134,179],[67,116,133,134,182,187,192,195],[67,116,133,134,178,195],[67,116,133,134,182,183,186,187,188,195],[67,116,133,134,182,183,184,186,187,195],[67,116,133,134,179,180,181,182,183,187,188,189,191,192,193,195],[67,116,133,134,195],[67,116,133,134,177,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194],[67,116,133,134,177,195],[67,116,133,134,182,184,185,187,188,195],[67,116,133,134,186,195],[67,116,133,134,187,188,192,195],[67,116,133,134,180,190],[67,116,133,134,171,203,204],[67,116,133,134,170,171],[67,116,133,134,220],[67,80,84,116,133,134,159],[67,80,116,133,134,148,159],[67,75,116,133,134],[67,77,80,116,133,134,156,159],[67,116,133,134,136,156],[67,116,133,134,166],[67,75,116,133,134,166],[67,77,80,116,133,134,136,159],[67,72,73,76,79,116,127,133,134,148,159],[67,80,87,116,133,134],[67,72,78,116,133,134],[67,80,101,102,116,133,134],[67,76,80,116,133,134,151,159,166],[67,101,116,133,134,166],[67,74,75,116,133,134,166],[67,80,116,133,134],[67,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,116,133,134],[67,80,95,116,133,134],[67,80,87,88,116,133,134],[67,78,80,88,89,116,133,134],[67,79,116,133,134],[67,72,75,80,116,133,134],[67,80,84,88,89,116,133,134],[67,84,116,133,134],[67,78,80,83,116,133,134,159],[67,72,77,80,87,116,133,134],[67,116,133,134,148],[67,75,80,101,116,133,134,164,166],[67,116,133,134,235,236],[67,116,133,134,235],[67,116,133,134,167],[67,116,127,128,130,131,132,133,134,136,148,156,159,165,166,167,168,169,171,172,174,175,176,196,197,201,202,203,204],[67,116,133,134,167,168,169,173],[67,116,133,134,169],[67,116,133,134,200],[67,116,133,134,171,204],[67,116,133,134,228,247,248,257],[67,116,133,134,217,225,228,240,241,257],[67,116,133,134,250],[67,116,133,134,229],[67,116,133,134,217,228,230,240,249,256,257],[67,116,133,134,233],[67,116,119,128,133,134,148,204,217,222,225,228,230,233,234,237,240,242,243,246,249,251,252,257,258],[67,116,133,134,228,247,248,249,257],[67,116,133,134,204,253,258],[67,116,133,134,228,230,237,240,242,257],[67,116,133,134,164,243],[67,116,119,128,133,134,148,164,204,217,222,225,228,229,230,233,234,237,240,241,242,243,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,265],[67,116,133,134,280,283],[67,116,133,134,275,280,284],[67,116,133,134,275,280,281,282],[67,116,133,134,275,276,278,280,281,282,283,284,285,286,287,288,289],[67,116,133,134,275,279],[67,116,133,134,275,277,278,280,282],[67,116,133,134,275,276,281,283],[67,116,133,134,276,282,283],[67,116,133,134,215],[67,116,121,133,134,266,267],[67,116,121,130,133,134,136],[67,116,128,133,134,138,266],[67,116,129,133,134,137,138,266,271],[67,116,129,133,134,138,270],[67,116,133,134,138,215,216,267,270,271,273,274,292,293],[67,116,133,134,266,291],[67,116,133,134,290],[67,116,129,133,134,137,138,215,266,292],[67,116,129,133,134,215,270,291],[67,116,128,133,134,138,273],[67,116,129,133,134,137,138,266,270,293],[67,116,128,133,134,138,270,292],[67,116,133,134,215,270,273],[67,116,133,134,215,266]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"21944c138a48dc23382cb6558b1d4498908faad2104ba7ff390ba8b27c06f3c0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"3cc8a3d123b6b232d48d34b51b785f9da8d193f5b5817fa521fcd2f3b9315c55","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"354a7f8e1287d9d6b7561bc97fdd8cbc2f7c1dd79e4cb37b942e8a5cfaff1085","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"cbb1c5ba5dbabe42c19ca31b83e48fec95895484fe1d1a8fb649b69ea224c5b8","impliedFormat":99},{"version":"748aaddcaf36dd6d2cd08d9b4a8fdf621da41cb61dc4536d17104a23a7c12f6d","impliedFormat":99},{"version":"69d4b61c408556b97b796782a1110f7e01a03ed80f31741f2c59b722185830ed","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"e6ca59368dce5a594dcde9bbb6ae640d668fa6c28c31639dd2a75b731bb036a2","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"7757c6ca7a8ad1992401c6aff33633d6a088515be5a39d7ee188b35bfc8e5f8e","impliedFormat":99},{"version":"74aa037dad474c179b196dac3d2fe6cd888c76a6f9bef61fe0cd1d1b29f5253b","signature":"2f40f5b066ae0e8b25ce0405683930c93e1e124727d34b596d337e65248258c3"},{"version":"27782810b38397b600edb57c3bdc051112e96cd6827a19db811dd0b2f50d9ffb","signature":"cb66ac77b7643fc7621e51502aa52e0fb41f9ad7cc1520c1e479bff39cede458"},"87ce0193181489d3b05863bce1fe67b6f97de9582c184884d8771bdb941f422c",{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"5e91172586d1be7d1508d1a40c8bf76161f6f4179d1c25158a20599f9fb26a66","impliedFormat":99},{"version":"09d215b379a93f8cbb6caf9e9f5d7b4d48042295ee697e7e4771288c7917a21e","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"ab80d2cb170a92c61ca8c822d0db0fc50eb15c7c6cf1a24cb01852a5a15a7db8","impliedFormat":99},{"version":"d689a82dec12ec02e1c558870a50f71000e06f173151fcdff0458c587dbf016f","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"210955af8573671abebb6e1391d134d82fbcff130aa68922ea1e839f8f48a0ad","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"c371ea3efec17691f019bca670c161bee2f4787b1f464bdbbb10c4117bf0a55d","impliedFormat":99},{"version":"3d6c12a64a91aafada7be14c9ce6ba42d81a416d030ff2224c6e6aaad1fd216c","signature":"1041ca778fc4c03f71ec8b0756cb19006841caa9a58e258d943491554e4e91a0"},{"version":"9de3597b361a403f88bdf2fb37b9efbb0980c7b1306cc162d40d9da23ac3199c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"765ac742802ad54467aaa9ac195c1a8c37423268c4510c49ca3dbb996a49cb65","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"e0f449551af1460ae3a14271a6c7f21fd65ee4e971c5efdb06899dad1d4cb358","054f3449b0ae601fbcede01aa08eec75adcd99fbfbcdcc521c315b005243486a","8f42701c075126cfd6acaaa1e24267347f137ef68394fb95f63e6765369453b9",{"version":"fd1ad4bc25754908cf632e000cd33b9d07bda1186138da356cb86080ff77907b","affectsGlobalScope":true,"impliedFormat":1},"afe95dbac9ec76ef6ccdc1e49e27a2cf2d6fb45be4157d15e2aa410b469228c1",{"version":"5774dc7b673738a81d276fdfdabf02ca00f3c69625c3fce28fe350bfbfd832c7","impliedFormat":1},{"version":"0a2ec3038c02e503becf32004fc530b0c8253029ae81e58b99c12ea357a741af","impliedFormat":1},{"version":"d12c384f77a0068f905553c1e0909bb695c7b886b36b835e4814c13006b068ed","impliedFormat":1},{"version":"22fdcdc3bc62ea2332d1718edc280ded20f0f6db0f5e373902f5b064255e56e7","impliedFormat":1},{"version":"fa4546e9b67dbdcc0fa8d8653c6b89d49b9e7b637b3340bea78107ca161595fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"4cf563dbe6e06bd3e25cdd9703f6b1a598dadd9521c2a9b920c3deb099791102","impliedFormat":1},{"version":"2eb4886cfdafc874eee62f035f539e96e4266585df2f9e1b53899d0aea5a400c","impliedFormat":1},{"version":"ff9d8cc4cb5cd25bdb10f736c3e2f020e4bdeff6a4f925dfb1b32bc7a8158b01","impliedFormat":1},{"version":"50c7627d6af095a4ce3a7dfbf09da66e73fbf290e8a733b185be286ed995db6f","impliedFormat":1},{"version":"1054a323c08990b18beb381e660a3e472bf2cf8a28f186cc0cbb11f6182145f4","impliedFormat":1},{"version":"b88ec8a7c61774277e986c734ff9645ab3f1020a3e007ad7c213b69efdb3f271","impliedFormat":1},{"version":"e497a81668e120e1a268de5f76b7b266a08c4d6f36c241807070030c14184518","impliedFormat":1},{"version":"6f13fdecf8125af9fc5b0bb0539b0badf73d186839c0409ac4f55bad0eaa1a30","impliedFormat":1},{"version":"d1fbdf791d574cdc3977f6ee10dcc0ea98e18045a90fae04e87308e9debacd2a","impliedFormat":1},{"version":"a84173e4a93081489ec5c9620cdcf5b726ec7e2d2d1908331d96f5640f7728b4","impliedFormat":1},{"version":"7d4677a7ac2bfe23efa58592c9425b213ba0b75e5054e12c1ddb19f4da82a013","impliedFormat":1},{"version":"6cb9eab75670069da10088e9012f1252b7b5b6528399b5912230462fa077da0a","signature":"d6a6ac8e49e89d97cfc150deb1cfcb3cf3fd391fa28ba525eab7d9d00a6bc045"},{"version":"80a5f9601b9d767b2a8e5d097366865a867a6b0af96e6323eca4b834bde07eb7","signature":"5f1fa41d6fa05390d3f43b693f2f3ba4d188fb78110e4bcb1f615be29c2e0eb9"},"7d57b8e4f9c4fe7e166120ce291a7688c0420faef71855e8871f5f9da7143ccf","94efb9f9732fda401108df4a681738738086a4b2fcbdc1dddb0a37b2df856de1",{"version":"b476269a25a46ff5dc107570debfff7a2e6e2dd2b7e5b9cbab140b301d3106a5","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"5a1d6a4c5fe8c4c3cc7fa9fd1b27a0379983b2b33f4d70db6e2c73f74dcd7a78","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"36096fabce4aa683638b964c7a897d2cddc7399ee6667b276514215dd3bb10c6","0269a531b0c72dc08838d9e685d1318a5b51acae9493f9b6f641364eb058de82","d7f2e7791ef6f004b15f941a825e94191e58b35a0e1687d73d64f011c94ddcdf",{"version":"e88d11b7857417c0603995c77eb188fade5ca64dd5550cd7bd08c9f61c29df5b","affectsGlobalScope":true,"impliedFormat":99}],"root":[[214,216],[267,272],274,[291,299]],"options":{"composite":true,"esModuleInterop":true,"module":99,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[214,1],[208,2],[206,3],[213,4],[211,5],[207,2],[209,6],[210,2],[246,7],[244,3],[279,3],[170,3],[113,8],[114,8],[115,9],[67,10],[116,11],[117,12],[118,13],[62,3],[65,14],[63,3],[64,3],[119,15],[120,16],[121,17],[122,18],[123,19],[124,20],[125,20],[126,21],[127,22],[128,23],[129,24],[68,3],[66,3],[130,25],[131,26],[132,27],[166,28],[133,29],[134,3],[135,30],[136,31],[137,32],[138,33],[139,34],[140,35],[141,36],[142,37],[143,38],[144,38],[145,39],[146,3],[147,40],[148,41],[150,42],[149,43],[151,44],[152,45],[153,46],[154,47],[155,48],[156,49],[157,50],[158,51],[159,52],[160,53],[161,54],[162,55],[163,56],[69,3],[70,3],[71,3],[109,57],[110,3],[111,3],[112,44],[164,58],[165,59],[212,60],[256,61],[233,62],[231,3],[232,3],[217,3],[228,63],[223,64],[226,65],[247,66],[238,3],[241,67],[240,68],[252,68],[239,69],[255,3],[225,70],[227,70],[219,71],[222,72],[234,71],[224,73],[218,3],[245,3],[205,4],[300,74],[273,75],[263,76],[265,77],[264,78],[262,79],[261,3],[198,3],[200,80],[199,3],[193,81],[191,82],[192,83],[180,84],[181,82],[188,85],[179,86],[184,87],[194,3],[185,88],[190,89],[196,90],[195,91],[178,92],[186,93],[187,94],[182,95],[189,81],[183,96],[172,97],[171,98],[177,3],[248,3],[220,3],[221,99],[60,3],[61,3],[12,3],[11,3],[2,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[19,3],[20,3],[3,3],[21,3],[22,3],[4,3],[23,3],[27,3],[24,3],[25,3],[26,3],[28,3],[29,3],[30,3],[5,3],[31,3],[32,3],[33,3],[34,3],[6,3],[38,3],[35,3],[36,3],[37,3],[39,3],[7,3],[40,3],[45,3],[46,3],[41,3],[42,3],[43,3],[44,3],[8,3],[50,3],[47,3],[48,3],[49,3],[51,3],[9,3],[52,3],[53,3],[54,3],[56,3],[55,3],[57,3],[58,3],[10,3],[59,3],[1,3],[87,100],[97,101],[86,100],[107,102],[78,103],[77,104],[106,105],[100,106],[105,107],[80,108],[94,109],[79,110],[103,111],[75,112],[74,105],[104,113],[76,114],[81,115],[82,3],[85,115],[72,3],[108,116],[98,117],[89,118],[90,119],[92,120],[88,121],[91,122],[101,105],[83,123],[84,124],[93,125],[73,126],[96,117],[95,115],[99,3],[102,127],[250,128],[236,129],[237,128],[235,3],[168,130],[204,131],[174,132],[175,3],[169,130],[167,3],[173,133],[202,3],[197,3],[201,134],[176,3],[203,135],[249,136],[242,137],[251,138],[230,139],[257,140],[259,141],[253,142],[260,143],[258,144],[243,145],[254,146],[266,147],[229,3],[276,3],[284,148],[285,149],[283,150],[290,151],[280,152],[278,3],[277,3],[286,3],[281,153],[282,154],[287,155],[289,155],[288,155],[275,3],[216,156],[268,157],[267,158],[269,159],[272,160],[271,161],[294,162],[295,163],[291,164],[296,165],[292,166],[274,167],[297,168],[293,169],[298,170],[299,171],[215,3],[270,156]],"affectedFilesPendingEmit":[[214,17],[216,17],[268,17],[267,17],[269,17],[272,17],[271,17],[294,17],[295,17],[291,17],[296,17],[292,17],[274,17],[297,17],[293,17],[298,17],[299,17],[215,17],[270,17]],"emitSignatures":[214,215,216,267,268,269,270,271,272,274,291,292,293,294,295,296,297,298,299],"version":"5.9.3"} \ No newline at end of file diff --git a/tsconfig.web.tsbuildinfo b/tsconfig.web.tsbuildinfo deleted file mode 100644 index 31883f3..0000000 --- a/tsconfig.web.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./src/shared/contract.ts","./src/renderer/components/statusbanner.tsx","./src/renderer/app.tsx","./node_modules/@types/react-dom/client.d.ts","./src/renderer/main.tsx","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","./node_modules/tinyrainbow/dist/node.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/runner/dist/tasks.d-cksck4of.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/types.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/vitest/dist/chunks/environment.d.cl3nlxbe.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@vitest/mocker/dist/registry.d-d765pazg.d.ts","./node_modules/@vitest/mocker/dist/types.d-d_arzrdy.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vite-node/dist/trace-mapping.d-dlvdeqop.d.ts","./node_modules/vite-node/dist/index.d-dgmxd2u7.d.ts","./node_modules/vite-node/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","./node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d.ts","./node_modules/vitest/dist/chunks/config.d.bkdhh7zx.d.ts","./node_modules/vitest/dist/chunks/worker.d.cugipz9v.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.bwvbvtda.d.ts","./node_modules/vite-node/dist/client.d.ts","./node_modules/vitest/dist/chunks/coverage.d.s9rmnxie.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.buron0i0.d.ts","./node_modules/vitest/dist/chunks/worker.d.uzwscv9x.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/dist/chunks/global.d.mamajcmj.d.ts","./node_modules/vitest/dist/chunks/vite.d.bnoppc46.d.ts","./node_modules/vitest/dist/chunks/mocker.d.be_2ls6u.d.ts","./node_modules/vitest/dist/chunks/suite.d.fvehnv49.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/shared/contract.test.ts","./src/shared/types.ts","./node_modules/electron/electron.d.ts","./src/preload/index.ts","./src/preload/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/keyv/src/index.d.ts","./node_modules/@types/http-cache-semantics/index.d.ts","./node_modules/@types/responselike/index.d.ts","./node_modules/@types/cacheable-request/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/emscripten/index.d.ts","./node_modules/@types/fs-extra/index.d.ts","./node_modules/@types/keyv/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[92,141,158,159,271],[92,141,158,159],[92,141,158,159,271,272,273,274,275],[92,141,158,159,271,273],[92,141,152,155,158,159,184,191,277,278,279],[92,141,158,159,243,244],[92,141,158,159,281],[92,141,153,158,159,191],[92,141,152,158,159,191],[92,138,139,141,158,159],[92,140,141,158,159],[141,158,159],[92,141,146,158,159,176],[92,141,142,147,152,158,159,161,173,184],[92,141,142,143,152,158,159,161],[87,88,89,92,141,158,159],[92,141,144,158,159,185],[92,141,145,146,153,158,159,162],[92,141,146,158,159,173,181],[92,141,147,149,152,158,159,161],[92,140,141,148,158,159],[92,141,149,150,158,159],[92,141,151,152,158,159],[92,140,141,152,158,159],[92,141,152,153,154,158,159,173,184],[92,141,152,153,154,158,159,168,173,176],[92,133,141,149,152,155,158,159,161,173,184],[92,141,152,153,155,156,158,159,161,173,181,184],[92,141,155,157,158,159,173,181,184],[90,91,92,93,94,95,96,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,152,158,159],[92,141,158,159,160,184],[92,141,149,152,158,159,161,173],[92,141,158,159,162],[92,141,158,159,163],[92,140,141,158,159,164],[92,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,158,159,166],[92,141,158,159,167],[92,141,152,158,159,168,169],[92,141,158,159,168,170,185,187],[92,141,153,158,159],[92,141,152,158,159,173,174,176],[92,141,158,159,175,176],[92,141,158,159,173,174],[92,141,158,159,176],[92,141,158,159,177],[92,138,141,158,159,173,178,184],[92,141,152,158,159,179,180],[92,141,158,159,179,180],[92,141,146,158,159,161,173,181],[92,141,158,159,182],[92,141,158,159,161,183],[92,141,155,158,159,167,184],[92,141,146,158,159,185],[92,141,158,159,173,186],[92,141,158,159,160,187],[92,141,158,159,188],[92,133,141,158,159],[92,133,141,152,154,158,159,164,173,176,184,186,187,189],[92,141,158,159,173,190],[66,92,141,158,159],[64,65,92,141,158,159],[92,141,155,158,159,173,191],[77,78,81,92,141,158,159,254],[92,141,158,159,230,231],[78,79,81,82,83,92,141,158,159],[78,92,141,158,159],[78,79,81,92,141,158,159],[78,79,92,141,158,159],[92,141,158,159,237],[73,92,141,158,159,237,238],[73,92,141,158,159,237],[73,80,92,141,158,159],[74,92,141,158,159],[73,74,75,77,92,141,158,159],[73,92,141,158,159],[92,141,152,153,158,159,191],[92,141,158,159,260,261],[92,141,158,159,260,261,262,263],[92,141,158,159,260,262],[92,141,158,159,260],[92,141,158,159,223,224],[92,141,158,159,217],[92,141,158,159,215,217],[92,141,158,159,206,214,215,216,218,220],[92,141,158,159,204],[92,141,158,159,207,212,217,220],[92,141,158,159,203,220],[92,141,158,159,207,208,211,212,213,220],[92,141,158,159,207,208,209,211,212,220],[92,141,158,159,204,205,206,207,208,212,213,214,216,217,218,220],[92,141,158,159,220],[92,141,158,159,202,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219],[92,141,158,159,202,220],[92,141,158,159,207,209,210,212,213,220],[92,141,158,159,211,220],[92,141,158,159,212,213,217,220],[92,141,158,159,205,215],[92,141,158,159,196,228,229],[92,141,158,159,195,196],[76,92,141,158,159],[92,105,109,141,158,159,184],[92,105,141,158,159,173,184],[92,100,141,158,159],[92,102,105,141,158,159,181,184],[92,141,158,159,161,181],[92,141,158,159,191],[92,100,141,158,159,191],[92,102,105,141,158,159,161,184],[92,97,98,101,104,141,152,158,159,173,184],[92,105,112,141,158,159],[92,97,103,141,158,159],[92,105,126,127,141,158,159],[92,101,105,141,158,159,176,184,191],[92,126,141,158,159,191],[92,99,100,141,158,159,191],[92,105,141,158,159],[92,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,132,141,158,159],[92,105,120,141,158,159],[92,105,112,113,141,158,159],[92,103,105,113,114,141,158,159],[92,104,141,158,159],[92,97,100,105,141,158,159],[92,105,109,113,114,141,158,159],[92,109,141,158,159],[92,103,105,108,141,158,159,184],[92,97,102,105,112,141,158,159],[92,141,158,159,173],[92,100,105,126,141,158,159,189,191],[92,141,158,159,234,235],[92,141,158,159,234],[92,141,158,159,192],[92,141,152,153,155,156,157,158,159,161,173,181,184,190,191,192,193,194,196,197,199,200,201,221,222,226,227,228,229],[92,141,158,159,192,193,194,198],[92,141,158,159,194],[92,141,158,159,225],[92,141,158,159,196,229],[84,92,141,158,159,246,247,256],[73,81,84,92,141,158,159,239,240,256],[92,141,158,159,249],[85,92,141,158,159],[73,84,86,92,141,158,159,239,248,255,256],[92,141,158,159,232],[73,78,81,84,86,92,141,144,153,158,159,173,229,232,233,236,239,241,242,245,248,250,251,256,257],[84,92,141,158,159,246,247,248,256],[92,141,158,159,229,252,257],[84,86,92,141,158,159,236,239,241,256],[92,141,158,159,189,242],[73,78,81,84,85,86,92,141,144,153,158,159,173,189,229,232,233,236,239,240,241,242,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264],[92,141,158,159,269],[67,68,92,141,158,159,267,268],[66,67,68,69,92,141,158,159],[67,68,92,141,158,159],[66,67,70,71,92,141,158,159],[67,68,92,141,158,159,265],[67,92,141,158,159]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"814d5c7384f3ca276e9dc4bcfde5545801a3ea0bfae09916b3336774e662fd1b","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"27782810b38397b600edb57c3bdc051112e96cd6827a19db811dd0b2f50d9ffb","signature":"cb66ac77b7643fc7621e51502aa52e0fb41f9ad7cc1520c1e479bff39cede458"},"e982f051cb8c670d5003b3ee275208c23e265ca033ebb46ed440fc6e51128d2d","bf60b52139b5759de18ca395da1e14328db64cf798a258a39dad7bfb68418f22",{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},"dcddb45c70a767d8fbd5562f2e35fc4e54556b4e116476b9560ebb19c9312ad8",{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"21944c138a48dc23382cb6558b1d4498908faad2104ba7ff390ba8b27c06f3c0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"3cc8a3d123b6b232d48d34b51b785f9da8d193f5b5817fa521fcd2f3b9315c55","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"354a7f8e1287d9d6b7561bc97fdd8cbc2f7c1dd79e4cb37b942e8a5cfaff1085","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"cbb1c5ba5dbabe42c19ca31b83e48fec95895484fe1d1a8fb649b69ea224c5b8","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"5e91172586d1be7d1508d1a40c8bf76161f6f4179d1c25158a20599f9fb26a66","impliedFormat":99},{"version":"09d215b379a93f8cbb6caf9e9f5d7b4d48042295ee697e7e4771288c7917a21e","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"ab80d2cb170a92c61ca8c822d0db0fc50eb15c7c6cf1a24cb01852a5a15a7db8","impliedFormat":99},{"version":"d689a82dec12ec02e1c558870a50f71000e06f173151fcdff0458c587dbf016f","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"210955af8573671abebb6e1391d134d82fbcff130aa68922ea1e839f8f48a0ad","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"c371ea3efec17691f019bca670c161bee2f4787b1f464bdbbb10c4117bf0a55d","impliedFormat":99},"d7f2e7791ef6f004b15f941a825e94191e58b35a0e1687d73d64f011c94ddcdf","e0f449551af1460ae3a14271a6c7f21fd65ee4e971c5efdb06899dad1d4cb358",{"version":"fd1ad4bc25754908cf632e000cd33b9d07bda1186138da356cb86080ff77907b","affectsGlobalScope":true,"impliedFormat":1},"0269a531b0c72dc08838d9e685d1318a5b51acae9493f9b6f641364eb058de82",{"version":"5606f19e18d64726492389381a66ac9d5c71b3ee1adc3acb9fca9a3153b0eb54","affectsGlobalScope":true},{"version":"69d4b61c408556b97b796782a1110f7e01a03ed80f31741f2c59b722185830ed","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"e6ca59368dce5a594dcde9bbb6ae640d668fa6c28c31639dd2a75b731bb036a2","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"42baf4ca38c38deaf411ea73f37bc39ff56c6e5c761a968b64ac1b25c92b5cd8","impliedFormat":1},{"version":"4f6ae308c5f2901f2988c817e1511520619e9025b9b12cc7cce2ab2e6ffed78a","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"89e326922cadcc2331d7e851011cf9f0456a681aaf3c95b48b81f8d80e8cdfba","impliedFormat":1},{"version":"fa4546e9b67dbdcc0fa8d8653c6b89d49b9e7b637b3340bea78107ca161595fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed19da84b7dbf00952ad0b98ce5c194f1903bcf7c94d8103e8e0d63b271543ae","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[68,70],72,266,267,270],"options":{"composite":true,"esModuleInterop":true,"jsx":4,"module":99,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[273,1],[271,2],[276,3],[272,1],[274,4],[275,1],[280,5],[245,6],[282,7],[243,2],[283,2],[195,2],[284,8],[278,2],[285,9],[281,2],[138,10],[139,10],[140,11],[92,12],[141,13],[142,14],[143,15],[87,2],[90,16],[88,2],[89,2],[144,17],[145,18],[146,19],[147,20],[148,21],[149,22],[150,22],[151,23],[152,24],[153,25],[154,26],[93,2],[91,2],[155,27],[156,28],[157,29],[191,30],[158,31],[159,2],[160,32],[161,33],[162,34],[163,35],[164,36],[165,37],[166,38],[167,39],[168,40],[169,40],[170,41],[171,2],[172,42],[173,43],[175,44],[174,45],[176,46],[177,47],[178,48],[179,49],[180,50],[181,51],[182,52],[183,53],[184,54],[185,55],[186,56],[187,57],[188,58],[94,2],[95,2],[96,2],[134,59],[135,2],[136,2],[137,46],[189,60],[190,61],[71,62],[286,62],[64,2],[66,63],[67,62],[279,64],[255,65],[232,66],[230,2],[231,2],[73,2],[84,67],[79,68],[82,69],[246,70],[237,2],[240,71],[239,72],[251,72],[238,73],[254,2],[81,74],[83,74],[75,75],[78,76],[233,75],[80,77],[74,2],[244,2],[65,2],[268,78],[262,79],[264,80],[263,81],[261,82],[260,2],[277,31],[223,2],[225,83],[224,2],[218,84],[216,85],[217,86],[205,87],[206,85],[213,88],[204,89],[209,90],[219,2],[210,91],[215,92],[221,93],[220,94],[203,95],[211,96],[212,97],[207,98],[214,84],[208,99],[197,100],[196,101],[202,2],[247,2],[76,2],[77,102],[62,2],[63,2],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[1,2],[112,103],[122,104],[111,103],[132,105],[103,106],[102,107],[131,108],[125,109],[130,110],[105,111],[119,112],[104,113],[128,114],[100,115],[99,108],[129,116],[101,117],[106,118],[107,2],[110,118],[97,2],[133,119],[123,120],[114,121],[115,122],[117,123],[113,124],[116,125],[126,108],[108,126],[109,127],[118,128],[98,129],[121,120],[120,118],[124,2],[127,130],[249,131],[235,132],[236,131],[234,2],[193,133],[229,134],[199,135],[200,2],[194,133],[192,2],[198,136],[227,2],[222,2],[226,137],[201,2],[228,138],[248,139],[241,140],[250,141],[86,142],[256,143],[258,144],[252,145],[259,146],[257,147],[242,148],[253,149],[265,150],[85,2],[270,151],[269,152],[70,153],[69,154],[72,155],[266,156],[68,157],[267,154]],"affectedFilesPendingEmit":[[269,17],[70,17],[69,17],[72,17],[266,17],[68,17],[267,17]],"emitSignatures":[68,69,70,72,266,267,269],"version":"5.9.3"} \ No newline at end of file