From 7daa0f572ed6a2fd37295b2b8fcd769b7a94518a Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 2 Jul 2026 18:53:58 +0530 Subject: [PATCH 001/109] feat(core,backend): emit console/stdout/stderr events into trace.zip and round-trip them in the reader --- packages/backend/src/trace-reader-types.ts | 17 +++ packages/backend/src/trace-reader-utils.ts | 58 +++++++- packages/backend/src/trace-reader.ts | 26 ++-- packages/backend/tests/trace-reader.test.ts | 38 +++++- packages/core/src/index.ts | 2 + packages/core/src/trace-console.ts | 93 +++++++++++++ packages/core/src/trace-exporter.ts | 141 +++++--------------- packages/core/src/trace-snapshots.ts | 102 ++++++++++++++ packages/core/tests/trace-console.test.ts | 111 +++++++++++++++ 9 files changed, 465 insertions(+), 123 deletions(-) create mode 100644 packages/core/src/trace-console.ts create mode 100644 packages/core/src/trace-snapshots.ts create mode 100644 packages/core/tests/trace-console.test.ts diff --git a/packages/backend/src/trace-reader-types.ts b/packages/backend/src/trace-reader-types.ts index 63bc3139..3a9d5e77 100644 --- a/packages/backend/src/trace-reader-types.ts +++ b/packages/backend/src/trace-reader-types.ts @@ -24,6 +24,22 @@ export interface ScreencastFrameEvent { timestamp: number } +export interface ConsoleEvent { + type: 'console' + time: number + messageType: string + text: string + args?: { preview: string; value: unknown }[] +} + +export interface StdioEvent { + type: 'stdout' | 'stderr' + timestamp: number + text?: string + /** Extension field restoring the test-vs-terminal origin; absent in foreign zips. */ + source?: 'test' | 'terminal' +} + export interface ContextOptionsEvent { type: 'context-options' wallTime: number @@ -54,4 +70,5 @@ export interface CategorizedEvents { befores: Map afters: Map frameEvents: ScreencastFrameEvent[] + consoleEvents: (ConsoleEvent | StdioEvent)[] } diff --git a/packages/backend/src/trace-reader-utils.ts b/packages/backend/src/trace-reader-utils.ts index 16a0972e..b7162c12 100644 --- a/packages/backend/src/trace-reader-utils.ts +++ b/packages/backend/src/trace-reader-utils.ts @@ -3,13 +3,20 @@ import { TraceType, + type ConsoleLog, + type LogLevel, type Metadata, type NetworkRequest, type TracePlayerFrame, type Viewport } from '@wdio/devtools-shared' -import type { ContextOptionsEvent, HarSnapshot } from './trace-reader-types.js' +import type { + ConsoleEvent, + ContextOptionsEvent, + HarSnapshot, + StdioEvent +} from './trace-reader-types.js' export function parseNdjson(text: string): Record[] { return text @@ -44,9 +51,9 @@ export function paramsToArgs( return indexKeys.map((key) => params[key]) } -// Playwright/vibium-style action label, built from class.method + the most -// meaningful param (value for fill/type, url for navigate, nothing for click) — -// matching what `playwright show-trace` renders for the same trace. +// Trace-viewer action label, built from class.method + the most meaningful +// param (value for fill/type, url for navigate, nothing for click) — +// matching what standard trace viewers render for the same trace. export function actionLabel( cls: string, method: string, @@ -109,7 +116,7 @@ export function harToNetworkRequest( ): NetworkRequest { const started = Date.parse(snapshot.startedDateTime) const startTime = Number.isFinite(started) ? started : 0 - // A foreign trace.zip (the reader accepts any Vibium/Playwright zip) can carry + // A foreign trace.zip (the reader accepts any standard-format zip) can carry // a pending or failed request with no response or content; default those. const response = snapshot.response const content = response?.content @@ -137,6 +144,47 @@ export function harToNetworkRequest( } } +const LOG_LEVELS: ReadonlySet = new Set([ + 'trace', + 'debug', + 'log', + 'info', + 'warn', + 'error' +]) + +// Reverse of the writer's level mapping ('warn' → 'warning'); a foreign +// trace zip can carry levels outside our union, which default to 'log'. +function fromTraceLevel(messageType: string): LogLevel { + if (messageType === 'warning') { + return 'warn' + } + return LOG_LEVELS.has(messageType) ? (messageType as LogLevel) : 'log' +} + +export function buildConsoleLogs( + consoleEvents: (ConsoleEvent | StdioEvent)[], + wallTime: number +): ConsoleLog[] { + return consoleEvents.map((event) => { + if (event.type === 'console') { + return { + type: fromTraceLevel(event.messageType), + args: event.args?.map((arg) => arg.value) ?? [event.text], + timestamp: wallTime + event.time, + source: 'browser' as const + } + } + return { + type: event.type === 'stderr' ? ('error' as const) : ('log' as const), + args: [event.text ?? ''], + timestamp: wallTime + event.timestamp, + // Our zips carry the origin; foreign stdio events default to terminal. + source: event.source ?? ('terminal' as const) + } + }) +} + export function nearestFrame( frames: TracePlayerFrame[], timestamp: number diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index d8643f39..6146998f 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -1,10 +1,11 @@ // Reads a trace.zip produced by core/trace-exporter.ts back into a player // payload. The writer is the inverse: this reconstructs commands from // before/after events, the frame filmstrip from screencast-frame events + -// resources/*.jpeg, and network requests from the HAR resource-snapshot -// entries. Fields the zip never carried (console logs, mutations, sources, -// suites) come back empty. Constants, event types, and pure helpers live in the -// sibling trace-reader-{constants,types,utils}.ts files. +// resources/*.jpeg, console logs from console/stdout/stderr events, and +// network requests from the HAR resource-snapshot entries. Fields the zip +// never carried (mutations, sources, suites) come back empty. Constants, +// event types, and pure helpers live in the sibling +// trace-reader-{constants,types,utils}.ts files. import fs from 'node:fs/promises' import { unzipSync, strFromU8 } from 'fflate' @@ -20,12 +21,15 @@ import type { AfterEvent, BeforeEvent, CategorizedEvents, + ConsoleEvent, ContextOptionsEvent, HarSnapshot, - ScreencastFrameEvent + ScreencastFrameEvent, + StdioEvent } from './trace-reader-types.js' import { actionLabel, + buildConsoleLogs, buildMetadata, harToNetworkRequest, nearestFrame, @@ -39,6 +43,7 @@ function categorizeEvents( const befores = new Map() const afters = new Map() const frameEvents: ScreencastFrameEvent[] = [] + const consoleEvents: (ConsoleEvent | StdioEvent)[] = [] let ctx: ContextOptionsEvent | undefined for (const event of events) { switch (event.type) { @@ -58,9 +63,14 @@ function categorizeEvents( case 'screencast-frame': frameEvents.push(event as unknown as ScreencastFrameEvent) break + case 'console': + case 'stdout': + case 'stderr': + consoleEvents.push(event as unknown as ConsoleEvent | StdioEvent) + break } } - return { ctx, befores, afters, frameEvents } + return { ctx, befores, afters, frameEvents, consoleEvents } } function buildFrames( @@ -100,7 +110,7 @@ function buildCommands( command: REVERSE_ACTION_MAP[`${before.class}.${before.method}`] ?? before.method, args: paramsToArgs(before.params), - // Show the Playwright/vibium label (`Element.fill("x")`); the command + // Show the trace-style label (`Element.fill("x")`); the command // name above still drives the UI's category colour and icon. title: actionLabel(before.class, before.method, before.params), startTime: wallTime + before.startTime, @@ -143,7 +153,7 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { const trace: TraceLog = { mutations: [], logs: [], - consoleLogs: [], + consoleLogs: buildConsoleLogs(categorized.consoleEvents, wallTime), networkRequests, metadata: buildMetadata(categorized.ctx), commands, diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index f2aa880e..8df8f9ff 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -73,7 +73,18 @@ function fixtureZip(): Uint8Array { width: 1024, height: 768, timestamp: 260 - } + }, + { + type: 'console', + time: 120, + pageId: 'page@abcd1234', + messageType: 'warning', + text: 'low disk', + args: [{ preview: 'low disk', value: 'low disk' }], + location: { url: '', lineNumber: 0, columnNumber: 0 } + }, + { type: 'stdout', timestamp: 130, text: 'spec started', source: 'test' }, + { type: 'stderr', timestamp: 140, text: 'worker warning' } ] const networkEntry = { type: 'resource-snapshot', @@ -159,9 +170,32 @@ describe('parseTraceZip', () => { (trace.metadata.capabilities as { browserName: string }).browserName ).toBe('chrome') expect(trace.metadata.sessionId).toBe('abcd1234') - expect(trace.consoleLogs).toEqual([]) expect(trace.mutations).toEqual([]) expect(trace.suites).toEqual([]) expect(trace.sources).toEqual({}) }) + + it('reconstructs console logs from console and stdio events', () => { + const { trace } = parseTraceZip(fixtureZip()) + expect(trace.consoleLogs).toEqual([ + { + type: 'warn', + args: ['low disk'], + timestamp: WALL_TIME + 120, + source: 'browser' + }, + { + type: 'log', + args: ['spec started'], + timestamp: WALL_TIME + 130, + source: 'test' + }, + { + type: 'error', + args: ['worker warning'], + timestamp: WALL_TIME + 140, + source: 'terminal' + } + ]) + }) }) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 21fcdf08..36b8bcd7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -8,8 +8,10 @@ export * from './assert-patcher.js' export * from './element-snapshot.js' export * from './element-scripts.js' export * from './element-types.js' +export * from './trace-console.js' export * from './trace-exporter.js' export * from './trace-har.js' +export * from './trace-snapshots.js' export * from './trace-zip-writer.js' export * from './bidi.js' export * from './console.js' diff --git a/packages/core/src/trace-console.ts b/packages/core/src/trace-console.ts new file mode 100644 index 00000000..f9db30fd --- /dev/null +++ b/packages/core/src/trace-console.ts @@ -0,0 +1,93 @@ +// Maps captured ConsoleLog entries into trace-event vocabulary: browser +// console entries become `console` events; test/terminal output becomes +// `stdout`/`stderr` events (which carry no location semantics — matching +// what we capture for Node-side lines). + +import type { ConsoleLog, LogSource } from '@wdio/devtools-shared' + +export interface ConsoleEvent { + type: 'console' + time: number + pageId?: string + messageType: string + text: string + args?: { preview: string; value: unknown }[] + location: { url: string; lineNumber: number; columnNumber: number } +} + +export interface StdioEvent { + type: 'stdout' | 'stderr' + timestamp: number + text?: string + /** Extension field: preserves the test-vs-terminal origin the standard + * stdio vocabulary can't express. Foreign viewers ignore it. */ + source?: Extract +} + +// Keeps a pathological run (console.log in a tight loop) from producing a +// trace.trace the viewer can't open. +const MAX_CONSOLE_EVENTS = 10_000 + +/** The trace format's console vocabulary uses 'warning'; 'trace' has no + * equivalent — 'debug' is the nearest severity. */ +function toTraceLevel(level: ConsoleLog['type']): string { + if (level === 'warn') { + return 'warning' + } + if (level === 'trace') { + return 'debug' + } + return level +} + +function previewArg(arg: unknown): string { + if (typeof arg === 'string') { + return arg + } + try { + return JSON.stringify(arg) ?? String(arg) + } catch { + return String(arg) + } +} + +export function buildConsoleEvents( + logs: ConsoleLog[], + pageId: string, + wallTime: number +): (ConsoleEvent | StdioEvent)[] { + const capped = logs.slice(0, MAX_CONSOLE_EVENTS) + const events: (ConsoleEvent | StdioEvent)[] = capped.map((log) => { + const time = Math.max(0, log.timestamp - wallTime) + const text = log.args.map(previewArg).join(' ') + // Untagged entries predate source tagging; they came from the page. + if (log.source === 'browser' || log.source === undefined) { + return { + type: 'console', + time, + pageId, + messageType: toTraceLevel(log.type), + text, + args: log.args.map((arg) => ({ preview: previewArg(arg), value: arg })), + // Location isn't captured at the console patch site; the event + // shape requires the field, so it ships zeroed. + location: { url: '', lineNumber: 0, columnNumber: 0 } + } satisfies ConsoleEvent + } + return { + type: log.type === 'error' || log.type === 'warn' ? 'stderr' : 'stdout', + timestamp: time, + text, + source: log.source + } satisfies StdioEvent + }) + if (logs.length > MAX_CONSOLE_EVENTS) { + const last = capped[capped.length - 1] + events.push({ + type: 'stderr', + timestamp: last ? Math.max(0, last.timestamp - wallTime) : 0, + text: `[devtools] console truncated: dropped ${logs.length - MAX_CONSOLE_EVENTS} entries` + }) + } + return events +} diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index 24488442..8fd7d575 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -20,6 +20,16 @@ import { FILL_METHODS, type TraceAction } from './action-mapping.js' +import { + buildConsoleEvents, + type ConsoleEvent, + type StdioEvent +} from './trace-console.js' +import { + buildFilmstripEvents, + buildSnapshotResources, + type ScreencastFrameEvent +} from './trace-snapshots.js' import { networkRequestToHar } from './trace-har.js' import { buildTraceZip, type TraceZipResource } from './trace-zip-writer.js' @@ -52,7 +62,7 @@ interface BeforeEvent { pageId: string params: Record title: string - /** Playwright-compatible API name (e.g. 'page.goBack', 'element.click'). */ + /** Trace-viewer API name (e.g. 'page.goBack', 'element.click'). */ apiName: string /** CallId of the Tracing.tracingGroup that wraps this action (if any). */ parentId?: string @@ -67,22 +77,13 @@ interface AfterEvent { parentId?: string } -interface ScreencastFrameEvent { - type: 'screencast-frame' - pageId: string - sha1: string - elements?: string - snapshot?: string - width: number - height: number - timestamp: number -} - type TraceEvent = | ContextOptionsEvent | BeforeEvent | AfterEvent | ScreencastFrameEvent + | ConsoleEvent + | StdioEvent function shortId(sessionId?: string): string { return (sessionId ?? Math.random().toString(36).slice(2, 10)).slice(0, 8) @@ -294,63 +295,6 @@ function buildNetworkNdjson( return Buffer.from(lines.join('\n'), 'utf8') } -function buildSnapshotResources( - snapshots: ActionSnapshot[], - pageId: string -): TraceZipResource[] { - const out: TraceZipResource[] = [] - for (const snap of snapshots) { - const base = `${pageId}-${snap.timestamp}` - if (snap.screenshot) { - out.push({ - resourceName: `${base}.jpeg`, - data: Buffer.from(snap.screenshot, 'base64') - }) - } - if (snap.elements && snap.elements.length) { - out.push({ - resourceName: `${base}-elements.json`, - data: Buffer.from(JSON.stringify(snap.elements), 'utf8') - }) - } - if (snap.snapshotText) { - out.push({ - resourceName: `${base}-snapshot.txt`, - data: Buffer.from(snap.snapshotText, 'utf8') - }) - } - } - return out -} - -function buildScreencastFrames( - snapshots: ActionSnapshot[], - pageId: string, - wallTime: number, - viewport: { width: number; height: number } -): ScreencastFrameEvent[] { - return snapshots - .filter((s) => s.screenshot) - .map((s) => { - const base = `${pageId}-${s.timestamp}` - const frame: ScreencastFrameEvent = { - type: 'screencast-frame', - pageId, - sha1: `${base}.jpeg`, - width: viewport.width, - height: viewport.height, - timestamp: Math.max(0, s.timestamp - wallTime) - } - if (s.elements && s.elements.length) { - frame.elements = `${base}-elements.json` - } - if (s.snapshotText) { - frame.snapshot = `${base}-snapshot.txt` - } - return frame - }) -} - /** * Build a trace.zip buffer from the captured TraceLog. * Filters commands through ACTION_MAP and renames to trace vocabulary; @@ -368,13 +312,19 @@ function eventTime(e: TraceEvent): number { return e.endTime case 'screencast-frame': return e.timestamp + case 'console': + return e.time + case 'stdout': + case 'stderr': + return e.timestamp } } /** At the same timestamp T: an action's `after` ends first, then the - * snapshot captured at the action boundary, then the next action's `before`. - * Matches the viewer's expectation that the screencast frame shows the - * state between the previous action's completion and the next one's start. */ + * snapshot captured at the action boundary, then console output observed + * at the boundary, then the next action's `before`. Matches the viewer's + * expectation that the screencast frame shows the state between the + * previous action's completion and the next one's start. */ function eventOrder(e: TraceEvent): number { switch (e.type) { case 'context-options': @@ -383,8 +333,12 @@ function eventOrder(e: TraceEvent): number { return 1 case 'screencast-frame': return 2 - case 'before': + case 'console': + case 'stdout': + case 'stderr': return 3 + case 'before': + return 4 } } @@ -464,41 +418,12 @@ function buildTraceBundle( const viewport = trace.metadata.viewport ?? { width: 1280, height: 720 } const snapshots = trace.actionSnapshots ?? [] const ctxOptions = buildContextOptions(trace, contextId, wallTime) - const events: TraceEvent[] = [ctxOptions] - - // Emit initial screencast-frame (timestamp=0) using the first snapshot's - // resources so trace viewers show the page state before any interaction. - const firstSnap = snapshots.find((s) => s.screenshot) - if (firstSnap) { - const base = `${pageId}-${firstSnap.timestamp}` - const initFrame: ScreencastFrameEvent = { - type: 'screencast-frame', - pageId, - sha1: `${base}.jpeg`, - width: viewport.width, - height: viewport.height, - timestamp: 0 - } - if (firstSnap.elements && firstSnap.elements.length) { - initFrame.elements = `${base}-elements.json` - } - if (firstSnap.snapshotText) { - initFrame.snapshot = `${base}-snapshot.txt` - } - events.push(initFrame) - } - - events.push( - // Skip the first snapshot in buildScreencastFrames — it was already emitted - // as the initial t=0 frame above. - ...buildScreencastFrames( - firstSnap ? snapshots.filter((s) => s !== firstSnap) : snapshots, - pageId, - wallTime, - viewport - ), - ...buildActionEvents(trace.commands, pageId, wallTime, opts.testMetadata) - ) + const events: TraceEvent[] = [ + ctxOptions, + ...buildFilmstripEvents(snapshots, pageId, wallTime, viewport), + ...buildActionEvents(trace.commands, pageId, wallTime, opts.testMetadata), + ...buildConsoleEvents(trace.consoleLogs, pageId, wallTime) + ] events.sort(compareEvents) const ctxBName = ctxOptions.title return { diff --git a/packages/core/src/trace-snapshots.ts b/packages/core/src/trace-snapshots.ts new file mode 100644 index 00000000..0f139bdb --- /dev/null +++ b/packages/core/src/trace-snapshots.ts @@ -0,0 +1,102 @@ +// Per-action snapshot resources and the screencast-frame filmstrip derived +// from them. Split from trace-exporter.ts; the exporter composes these into +// the trace event stream. + +import type { ActionSnapshot } from '@wdio/devtools-shared' +import type { TraceZipResource } from './trace-zip-writer.js' + +export interface ScreencastFrameEvent { + type: 'screencast-frame' + pageId: string + sha1: string + elements?: string + snapshot?: string + width: number + height: number + timestamp: number +} + +export function buildSnapshotResources( + snapshots: ActionSnapshot[], + pageId: string +): TraceZipResource[] { + const out: TraceZipResource[] = [] + for (const snap of snapshots) { + const base = `${pageId}-${snap.timestamp}` + if (snap.screenshot) { + out.push({ + resourceName: `${base}.jpeg`, + data: Buffer.from(snap.screenshot, 'base64') + }) + } + if (snap.elements && snap.elements.length) { + out.push({ + resourceName: `${base}-elements.json`, + data: Buffer.from(JSON.stringify(snap.elements), 'utf8') + }) + } + if (snap.snapshotText) { + out.push({ + resourceName: `${base}-snapshot.txt`, + data: Buffer.from(snap.snapshotText, 'utf8') + }) + } + } + return out +} + +function frameForSnapshot( + snap: ActionSnapshot, + pageId: string, + timestamp: number, + viewport: { width: number; height: number } +): ScreencastFrameEvent { + const base = `${pageId}-${snap.timestamp}` + const frame: ScreencastFrameEvent = { + type: 'screencast-frame', + pageId, + sha1: `${base}.jpeg`, + width: viewport.width, + height: viewport.height, + timestamp + } + if (snap.elements && snap.elements.length) { + frame.elements = `${base}-elements.json` + } + if (snap.snapshotText) { + frame.snapshot = `${base}-snapshot.txt` + } + return frame +} + +/** + * Full filmstrip for the trace: the first snapshot is re-anchored to t=0 so + * viewers show the page state before any interaction; the rest keep their + * wall-time offsets. + */ +export function buildFilmstripEvents( + snapshots: ActionSnapshot[], + pageId: string, + wallTime: number, + viewport: { width: number; height: number } +): ScreencastFrameEvent[] { + const firstSnap = snapshots.find((s) => s.screenshot) + const events: ScreencastFrameEvent[] = [] + if (firstSnap) { + events.push(frameForSnapshot(firstSnap, pageId, 0, viewport)) + } + for (const snap of snapshots) { + if (snap === firstSnap || !snap.screenshot) { + continue + } + events.push( + frameForSnapshot( + snap, + pageId, + Math.max(0, snap.timestamp - wallTime), + viewport + ) + ) + } + return events +} diff --git a/packages/core/tests/trace-console.test.ts b/packages/core/tests/trace-console.test.ts new file mode 100644 index 00000000..5bb6ee59 --- /dev/null +++ b/packages/core/tests/trace-console.test.ts @@ -0,0 +1,111 @@ +import { describe, it, expect } from 'vitest' +import { buildConsoleEvents } from '@wdio/devtools-core' +import type { ConsoleLog } from '@wdio/devtools-shared' + +const WALL_TIME = 1000 +const PAGE_ID = 'page@abc123' + +function log(overrides: Partial = {}): ConsoleLog { + return { + type: 'log', + args: ['hello'], + timestamp: WALL_TIME + 50, + source: 'browser', + ...overrides + } +} + +describe('buildConsoleEvents', () => { + it('returns empty array for no logs', () => { + expect(buildConsoleEvents([], PAGE_ID, WALL_TIME)).toEqual([]) + }) + + it('maps browser logs to console events with monotonic offsets', () => { + const events = buildConsoleEvents([log()], PAGE_ID, WALL_TIME) + expect(events).toEqual([ + { + type: 'console', + time: 50, + pageId: PAGE_ID, + messageType: 'log', + text: 'hello', + args: [{ preview: 'hello', value: 'hello' }], + location: { url: '', lineNumber: 0, columnNumber: 0 } + } + ]) + }) + + it('treats untagged logs as browser console', () => { + const events = buildConsoleEvents( + [log({ source: undefined })], + PAGE_ID, + WALL_TIME + ) + expect(events[0]!.type).toBe('console') + }) + + it("maps 'warn' to 'warning' and 'trace' to 'debug'", () => { + const events = buildConsoleEvents( + [log({ type: 'warn' }), log({ type: 'trace' })], + PAGE_ID, + WALL_TIME + ) + expect( + events.map((e) => (e.type === 'console' ? e.messageType : '')) + ).toEqual(['warning', 'debug']) + }) + + it('previews non-string args as JSON and joins into text', () => { + const events = buildConsoleEvents( + [log({ args: ['count', { a: 1 }, 2] })], + PAGE_ID, + WALL_TIME + ) + const event = events[0]! + expect(event.type).toBe('console') + if (event.type === 'console') { + expect(event.text).toBe('count {"a":1} 2') + expect(event.args?.[1]).toEqual({ preview: '{"a":1}', value: { a: 1 } }) + } + }) + + it('routes test/terminal logs to stdout/stderr by level with source kept', () => { + const events = buildConsoleEvents( + [ + log({ source: 'test', type: 'log', args: ['out'] }), + log({ source: 'test', type: 'error', args: ['bad'] }), + log({ source: 'terminal', type: 'warn', args: ['careful'] }) + ], + PAGE_ID, + WALL_TIME + ) + expect(events).toEqual([ + { type: 'stdout', timestamp: 50, text: 'out', source: 'test' }, + { type: 'stderr', timestamp: 50, text: 'bad', source: 'test' }, + { type: 'stderr', timestamp: 50, text: 'careful', source: 'terminal' } + ]) + }) + + it('floors offsets at zero for logs before wallTime', () => { + const events = buildConsoleEvents( + [log({ timestamp: WALL_TIME - 500 })], + PAGE_ID, + WALL_TIME + ) + const event = events[0]! + expect(event.type === 'console' ? event.time : -1).toBe(0) + }) + + it('caps output and appends a truncation marker', () => { + const logs = Array.from({ length: 10_001 }, (_, i) => + log({ timestamp: WALL_TIME + i }) + ) + const events = buildConsoleEvents(logs, PAGE_ID, WALL_TIME) + expect(events).toHaveLength(10_001) + const last = events[events.length - 1]! + expect(last.type).toBe('stderr') + if (last.type === 'stderr') { + expect(last.text).toContain('dropped 1 entries') + } + }) +}) From 36e391f0cd1ae4111ddd3dd335647002e5661039 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 2 Jul 2026 19:56:46 +0530 Subject: [PATCH 002/109] =?UTF-8?q?feat(app):=20trace-player=20layout=20pa?= =?UTF-8?q?rity=20=E2=80=94=20full=20workbench=20with=20top-docked=20timel?= =?UTF-8?q?ine=20strip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/app.ts | 7 +- .../browser/trace-player-controls.ts | 145 ++++++++ .../browser/trace-timeline-constants.ts | 26 +- .../browser/trace-timeline-styles.ts | 45 +-- .../src/components/browser/trace-timeline.ts | 313 +++++------------- packages/app/src/components/workbench.ts | 135 ++++++-- packages/app/src/controller/constants.ts | 9 + 7 files changed, 357 insertions(+), 323 deletions(-) create mode 100644 packages/app/src/components/browser/trace-player-controls.ts diff --git a/packages/app/src/app.ts b/packages/app/src/app.ts index d9a89e5d..d8076a4b 100644 --- a/packages/app/src/app.ts +++ b/packages/app/src/app.ts @@ -232,9 +232,10 @@ export class WebdriverIODevtoolsApplication extends Element { class="flex h-[calc(100%-40px)] w-full relative" > ${ - // Only render the test-suite sidebar (and its resize slider) when the - // trace came from a testrunner — the player (standalone) has no tree, - // so the slider would otherwise show a stray dragger on hover. + // Only render the test-suite sidebar (and its resize slider) for a + // live testrunner session. The player has no run/rerun affordances, + // so the tree is dead weight even for testrunner-captured zips. + !this.dataManager.playerMode && this.dataManager.traceType === TraceType.Testrunner ? html` { + this.playerState = (event as CustomEvent).detail + } + + #emit(name: string, detail?: unknown): void { + window.dispatchEvent(new CustomEvent(name, { detail })) + } + + #button( + title: string, + icon: TemplateResult, + onClick: () => void, + extra = '' + ): TemplateResult { + return html`` + } + + #renderSpeedSelect(speed: number): TemplateResult { + return html` + + ` + } + + render() { + const { currentMs, duration, playing, speed } = this.playerState + return html` +
+ ${formatTimecode(currentMs)} + / + ${formatTimecode(duration)} + + ${this.#button( + 'Restart', + html``, + () => this.#emit(PLAYER_RESTART_EVENT) + )} + ${this.#button( + 'Previous action', + html``, + () => this.#emit(KBD.step, { dir: -1 }) + )} + ${this.#button( + playing ? 'Pause' : 'Play', + playing + ? html`` + : html``, + () => this.#emit(KBD.togglePlay), + 'text-chartsBlue' + )} + ${this.#button( + 'Next action', + html``, + () => this.#emit(KBD.step, { dir: 1 }) + )} + ${this.#renderSpeedSelect(speed)} +
+ ` + } +} + +declare global { + interface HTMLElementTagNameMap { + [COMPONENT]: TracePlayerControls + } +} diff --git a/packages/app/src/components/browser/trace-timeline-constants.ts b/packages/app/src/components/browser/trace-timeline-constants.ts index d88f1c61..1e6a1dad 100644 --- a/packages/app/src/components/browser/trace-timeline-constants.ts +++ b/packages/app/src/components/browser/trace-timeline-constants.ts @@ -1,19 +1,15 @@ -import type { ActionCategory } from '../workbench/actionItems/category.js' - /** Playback speed multipliers offered in the timeline controls. */ export const SPEEDS = [0.5, 1, 2, 3, 5] -/** Width of the track-label gutter (px) — lanes start after it. */ -export const GUTTER = 80 - -/** Right breathing room (px) so end-of-timeline markers don't hug the edge. */ -export const INSET = 14 - -/** Tailwind background class per action category, for the timeline chips. */ -export const CATEGORY_BG: Record = { - navigation: 'bg-chartsBlue', - input: 'bg-chartsPurple', - assertion: 'bg-chartsGreen', - query: 'bg-chartsYellow', - other: 'bg-gray-500' +/** Window events linking the controls bar and the timeline strip — same + * decoupling pattern as the KBD events, so either side can be re-homed. */ +export const PLAYER_STATE_EVENT = 'trace-player:state' +export const PLAYER_RESTART_EVENT = 'trace-player:restart' +export const PLAYER_SPEED_EVENT = 'trace-player:speed' + +export interface PlayerState { + currentMs: number + duration: number + playing: boolean + speed: number } diff --git a/packages/app/src/components/browser/trace-timeline-styles.ts b/packages/app/src/components/browser/trace-timeline-styles.ts index f2e276ad..d65cbe24 100644 --- a/packages/app/src/components/browser/trace-timeline-styles.ts +++ b/packages/app/src/components/browser/trace-timeline-styles.ts @@ -1,7 +1,6 @@ import { css } from 'lit' -/** Styles for the trace-player timeline: host layout, hidden scrollbars, and - * the network-detail drawer. Detail-block styles come from networkStyles. */ +/** Styles for the trace-player timeline strip: host layout + hidden scrollbars. */ export const timelineStyles = css` :host { position: relative; @@ -19,46 +18,4 @@ export const timelineStyles = css` .no-scrollbar::-webkit-scrollbar { display: none; } - .net-drawer { - position: absolute; - left: 0; - right: 0; - bottom: 0; - max-height: 62%; - display: flex; - flex-direction: column; - background: var(--vscode-sideBar-background); - border-top: 1px solid var(--accent, #ff7a3c); - box-shadow: 0 -16px 40px -24px #000; - z-index: 30; - } - .net-drawer-head { - display: flex; - align-items: center; - gap: 8px; - padding: 6px 10px; - border-bottom: 1px solid var(--vscode-panel-border); - font-size: 12px; - } - .net-drawer-head .url { - font-family: monospace; - font-size: 11.5px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - opacity: 0.85; - } - .net-drawer-head .close { - margin-left: auto; - cursor: pointer; - padding: 2px 6px; - border-radius: 4px; - } - .net-drawer-head .close:hover { - background: var(--vscode-toolbar-hoverBackground); - } - .net-drawer-body { - overflow: auto; - padding: 4px 0; - } ` diff --git a/packages/app/src/components/browser/trace-timeline.ts b/packages/app/src/components/browser/trace-timeline.ts index c2a62d52..2abc3753 100644 --- a/packages/app/src/components/browser/trace-timeline.ts +++ b/packages/app/src/components/browser/trace-timeline.ts @@ -1,41 +1,30 @@ import { Element } from '@core/element' -import { html, nothing, type TemplateResult } from 'lit' +import { html, type TemplateResult } from 'lit' import { customElement, state, query } from 'lit/decorators.js' import { consume } from '@lit/context' import type { CommandLog, TracePlayerFrame } from '@wdio/devtools-shared' -import { - commandContext, - framesContext, - networkRequestContext -} from '../../controller/context.js' -import { commandCategory } from '../workbench/actionItems/category.js' +import { commandContext, framesContext } from '../../controller/context.js' import { activeTimestampAt } from '../workbench/active-entry.js' -import { networkStyles } from '../workbench/network/styles.js' -import { renderNetworkRequestDetail } from '../workbench/network/request-detail.js' import { KBD } from '../../controller/keyboard.js' import { - CATEGORY_BG, - GUTTER, - INSET, - SPEEDS + PLAYER_RESTART_EVENT, + PLAYER_SPEED_EVENT, + PLAYER_STATE_EVENT, + SPEEDS, + type PlayerState } from './trace-timeline-constants.js' import { formatTimecode, imageMime } from './trace-timeline-utils.js' import { timelineStyles } from './trace-timeline-styles.js' -import '~icons/mdi/play.js' -import '~icons/mdi/pause.js' -import '~icons/mdi/skip-previous.js' -import '~icons/mdi/skip-next.js' -import '~icons/mdi/restart.js' - const COMPONENT = 'wdio-devtools-trace-timeline' /** - * Trace-player timeline (replaces the workbench dock in `pnpm show-trace` - * mode). Owns the playback clock, the screenshot filmstrip, the per-track - * timeline (actions / network / console), and the playhead. Advancing the - * clock dispatches `show-command` so the reused browser pane swaps screenshots. + * Trace-player timeline strip, docked above the workbench in `pnpm show-trace` + * mode. Owns the playback clock, the screenshot filmstrip, and the playhead; + * the controls bar (trace-player-controls) and keyboard drive it via window + * events, and it broadcasts its state back the same way. Advancing the clock + * dispatches `show-command` so the reused browser pane and actions list follow. */ @customElement(COMPONENT) export class TraceTimeline extends Element { @@ -47,10 +36,6 @@ export class TraceTimeline extends Element { @state() frames: TracePlayerFrame[] = [] - @consume({ context: networkRequestContext, subscribe: true }) - @state() - networkRequests: NetworkRequest[] = [] - /** Playback position in ms relative to the recording start. */ @state() currentMs = 0 @state() playing = false @@ -61,14 +46,11 @@ export class TraceTimeline extends Element { #activeTimestamp?: number #started = false - @query('[data-lanes]') lanesEl?: HTMLElement + @query('[data-scrub]') scrubEl?: HTMLElement #dragging = false - /** Network request whose detail drawer is open, or undefined. */ - @state() selectedRequest?: NetworkRequest - - static styles = [...Element.styles, networkStyles, timelineStyles] + static styles = [...Element.styles, timelineStyles] connectedCallback(): void { super.connectedCallback() @@ -76,6 +58,8 @@ export class TraceTimeline extends Element { window.addEventListener(KBD.step, this.#onKbdStep) window.addEventListener(KBD.jump, this.#onKbdJump) window.addEventListener(KBD.speed, this.#onKbdSpeed) + window.addEventListener(PLAYER_RESTART_EVENT, this.#onRestartEvent) + window.addEventListener(PLAYER_SPEED_EVENT, this.#onSpeedEvent) } disconnectedCallback(): void { @@ -87,6 +71,13 @@ export class TraceTimeline extends Element { window.removeEventListener(KBD.step, this.#onKbdStep) window.removeEventListener(KBD.jump, this.#onKbdJump) window.removeEventListener(KBD.speed, this.#onKbdSpeed) + window.removeEventListener(PLAYER_RESTART_EVENT, this.#onRestartEvent) + window.removeEventListener(PLAYER_SPEED_EVENT, this.#onSpeedEvent) + } + + #onRestartEvent = (): void => this.#restart() + #onSpeedEvent = (event: Event): void => { + this.speed = (event as CustomEvent<{ value: number }>).detail.value } #onKbdTogglePlay = (): void => this.#togglePlay() @@ -152,6 +143,17 @@ export class TraceTimeline extends Element { if (!this.#started && this.commands.length) { this.#syncActiveCommand() } + // Mirror playback state to the controls bar on the tab-header line. + window.dispatchEvent( + new CustomEvent(PLAYER_STATE_EVENT, { + detail: { + currentMs: this.currentMs, + duration: this.#duration, + playing: this.playing, + speed: this.speed + } + }) + ) } #stopRaf(): void { @@ -243,23 +245,14 @@ export class TraceTimeline extends Element { } } - #onSpeedChange(event: Event): void { - this.speed = Number((event.target as HTMLSelectElement).value) - } - - // ─── scrubbing (free-flow playhead drag) ─────────────────────────────────── + // ─── scrubbing (drag anywhere on the strip) ─────────────────────────────── #fractionFromClientX(clientX: number): number { - const rect = this.lanesEl?.getBoundingClientRect() - if (!rect) { + const rect = this.scrubEl?.getBoundingClientRect() + if (!rect || rect.width <= 0) { return 0 } - const laneStart = rect.left + GUTTER - const laneWidth = rect.width - GUTTER - INSET - if (laneWidth <= 0) { - return 0 - } - return Math.min(1, Math.max(0, (clientX - laneStart) / laneWidth)) + return Math.min(1, Math.max(0, (clientX - rect.left) / rect.width)) } #onPointerDown = (event: PointerEvent): void => { @@ -290,72 +283,6 @@ export class TraceTimeline extends Element { // ─── render ─────────────────────────────────────────────────────────────── - #ctrlButton( - title: string, - icon: TemplateResult, - onClick: () => void, - extra = '' - ): TemplateResult { - return html`` - } - - #renderControls(): TemplateResult { - return html` -
- ${this.#ctrlButton( - 'Restart', - html``, - () => this.#restart() - )} - ${this.#ctrlButton( - 'Previous action', - html``, - () => this.#step(-1) - )} - ${this.#ctrlButton( - this.playing ? 'Pause' : 'Play', - this.playing - ? html`` - : html``, - () => this.#togglePlay(), - 'text-chartsBlue' - )} - ${this.#ctrlButton( - 'Next action', - html``, - () => this.#step(1) - )} - ${formatTimecode(this.currentMs)} - / - ${formatTimecode(this.#duration)} - -
- ` - } - /** Timestamp of the frame nearest the playhead — drives filmstrip highlight. */ get #activeFrameTimestamp(): number | undefined { const clock = this.#start + this.currentMs @@ -371,16 +298,10 @@ export class TraceTimeline extends Element { return best } - // CSS left for a marker inside a track body (which starts after the gutter), - // leaving INSET of right margin so end-of-timeline markers don't hug the edge. - #laneLeft(fraction: number): string { - return `calc(${fraction} * (100% - ${INSET}px))` - } - #renderFilmstrip(): TemplateResult { if (!this.frames.length) { return html`
No frames captured
` @@ -388,150 +309,64 @@ export class TraceTimeline extends Element { const activeFrame = this.#activeFrameTimestamp return html`
-
-
- ${this.frames.map( - (frame) => - html`` - )} -
-
- ` - } - - #renderTrack( - label: string, - body: TemplateResult | typeof nothing - ): TemplateResult { - return html` -
-
- ${label} -
-
${body}
+ ${this.frames.map( + (frame) => + html`` + )}
` } - #renderActionsTrack(): TemplateResult { - const body = html`${this.#sortedCommands.map((command) => { - const ts = command.timestamp ?? 0 - const fraction = this.#fraction(ts) - const active = ts === this.#activeTimestamp - const color = CATEGORY_BG[commandCategory(command.command)] - // Track chips stay compact with the short command name; the full - // Playwright label is the hover tooltip (and the left Actions list). - return html`` - })}` - return this.#renderTrack('Actions', body) - } - - #renderNetworkTrack(): TemplateResult { - if (!this.networkRequests.length) { - return this.#renderTrack('Network', nothing) - } - const body = html`${this.networkRequests.map((request) => { - const leftFr = this.#fraction(request.startTime) - const rawFr = Math.max(0.004, (request.time ?? 0) / this.#duration) - const widthFr = Math.min(rawFr, 1 - leftFr) - const selected = this.selectedRequest?.id === request.id - // stopPropagation so a click selects the request rather than scrubbing the - // playhead (the lanes container owns the pointerdown drag handler). - return html`
` - })}` - return this.#renderTrack('Network', body) - } - - #renderNetworkDrawer(): TemplateResult | typeof nothing { - const req = this.selectedRequest - if (!req) { - return nothing - } + // Slim full-width ruler under the controls: action ticks + drag-to-scrub. + #renderRuler(): TemplateResult { return html` -
-
- ${req.method} ${req.url} - -
-
${renderNetworkRequestDetail(req)}
+
+ ${this.#sortedCommands.map((command) => { + const ts = command.timestamp ?? 0 + return html`
` + })}
` } #renderPlayhead(): TemplateResult { const fraction = Math.min(1, Math.max(0, this.currentMs / this.#duration)) - // Anchored at the gutter and inset on the right so it tracks the same lane - // coordinates as the action/network markers. return html`
` } render() { return html` - ${this.#renderControls()} ${this.#renderFilmstrip()}
- ${this.#renderActionsTrack()} ${this.#renderNetworkTrack()} - ${this.#renderTrack('Console', nothing)} ${this.#renderPlayhead()} + ${this.#renderRuler()} ${this.#renderFilmstrip()} + ${this.#renderPlayhead()}
- ${this.#renderNetworkDrawer()} ` } } diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index 5b87cd9d..0d56d7d9 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -26,23 +26,36 @@ import './workbench/network.js' import './workbench/compare.js' import './browser/snapshot.js' import './browser/trace-timeline.js' +import './browser/trace-player-controls.js' import { + HEADER_HEIGHT, MIN_WORKBENCH_HEIGHT, MIN_METATAB_WIDTH, ACTIONS_DEFAULT_WIDTH, BROWSER_HEIGHT_RATIO, - RERENDER_TIMEOUT + PLAYER_CONTROLS_HEIGHT, + PLAYER_DOCK_DEFAULT_HEIGHT, + PLAYER_DOCK_MIN_HEIGHT, + RERENDER_TIMEOUT, + TRACE_TIMELINE_MIN_HEIGHT, + TRACE_TIMELINE_DEFAULT_HEIGHT } from '../controller/constants.js' const COMPONENT = 'wdio-devtools-workbench' + +/** Pixel value from a DragController position string (`flex-basis: 123px`). */ +function basisPx(position: string): number | undefined { + const value = parseFloat(position.split(':')[1] ?? '') + return Number.isFinite(value) ? value : undefined +} @customElement(COMPONENT) export class DevtoolsWorkbench extends Element { #toolbarCollapsed = localStorage.getItem('toolbar') === 'true' #workbenchSidebarCollapsed = localStorage.getItem('workbenchSidebar') === 'true' - // Trace-player mode (`pnpm show-trace`): hide the Metadata tab and swap the - // workbench tabs for the timeline player. + // Trace-player mode (`pnpm show-trace`): the full workbench renders as in + // live mode, plus the playback timeline docked above the browser pane. @property({ type: Boolean }) playerMode = false @@ -99,6 +112,33 @@ export class DevtoolsWorkbench extends Element { direction: Direction.horizontal }) + #dragTimeline = new DragController(this, { + localStorageKey: 'traceTimelineHeight', + minPosition: TRACE_TIMELINE_MIN_HEIGHT, + maxPosition: window.innerHeight * 0.4, + initialPosition: TRACE_TIMELINE_DEFAULT_HEIGHT, + getContainerEl: () => this.#getVerticalWindow(), + direction: Direction.vertical + }) + + // Player-mode browser-pane height. Separate controller + storage key so + // resizing the player never disturbs the live-mode split. + #dragVerticalPlayer = new DragController(this, { + localStorageKey: 'playerBrowserHeight', + minPosition: MIN_WORKBENCH_HEIGHT, + maxPosition: window.innerHeight * 0.8, + initialPosition: Math.max( + MIN_WORKBENCH_HEIGHT, + window.innerHeight - + HEADER_HEIGHT - + PLAYER_CONTROLS_HEIGHT - + TRACE_TIMELINE_DEFAULT_HEIGHT - + PLAYER_DOCK_DEFAULT_HEIGHT + ), + getContainerEl: () => this.#getVerticalWindow(), + direction: Direction.vertical + }) + async #getHorizontalWindow() { await this.updateComplete return this.horizontalResizerWindow as Element @@ -144,13 +184,43 @@ export class DevtoolsWorkbench extends Element { if (this.#toolbarCollapsed) { return '' } - const m = this.#dragVertical.getPosition().match(/(\d+(?:\.\d+)?)px/) - const raw = m ? parseFloat(m[1]) : window.innerHeight * BROWSER_HEIGHT_RATIO + if (this.playerMode) { + // Player proportions: the snapshot dominates — pane gets everything the + // timeline, controls bar, and a compact dock don't need, clamped in CSS + // so the dock never drops below its minimum inside the viewport. + const fallback = + window.innerHeight - + HEADER_HEIGHT - + PLAYER_CONTROLS_HEIGHT - + this.#timelinePaneHeight() - + PLAYER_DOCK_DEFAULT_HEIGHT + const raw = basisPx(this.#dragVerticalPlayer.getPosition()) ?? fallback + const paneHeight = Math.max(MIN_WORKBENCH_HEIGHT, raw) + const maxHeight = `calc(100vh - ${ + HEADER_HEIGHT + PLAYER_CONTROLS_HEIGHT + PLAYER_DOCK_MIN_HEIGHT + }px - ${this.#timelinePaneHeight()}px)` + return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:${maxHeight}; min-height:0;` + } + const raw = + basisPx(this.#dragVertical.getPosition()) ?? + window.innerHeight * BROWSER_HEIGHT_RATIO const capped = Math.min(raw, window.innerHeight * 0.7) const paneHeight = Math.max(MIN_WORKBENCH_HEIGHT, capped) return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:70vh; min-height:0;` } + #timelinePaneHeight(): number { + const raw = + basisPx(this.#dragTimeline.getPosition()) ?? TRACE_TIMELINE_DEFAULT_HEIGHT + const capped = Math.min(raw, window.innerHeight * 0.4) + return Math.max(TRACE_TIMELINE_MIN_HEIGHT, capped) + } + + #computeTimelinePaneStyle(): string { + const paneHeight = this.#timelinePaneHeight() + return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:40vh; min-height:0;` + } + #computeSidebarStyle(): string { if (this.#workbenchSidebarCollapsed) { return 'width:0; flex:0 0 0; overflow:hidden;' @@ -173,11 +243,9 @@ export class DevtoolsWorkbench extends Element { - ${this.playerMode - ? nothing - : html` - - `} + + +
diff --git a/packages/app/src/components/browser/trace-timeline-constants.ts b/packages/app/src/components/browser/trace-timeline-constants.ts index 1e6a1dad..9f057994 100644 --- a/packages/app/src/components/browser/trace-timeline-constants.ts +++ b/packages/app/src/components/browser/trace-timeline-constants.ts @@ -1,8 +1,16 @@ /** Playback speed multipliers offered in the timeline controls. */ export const SPEEDS = [0.5, 1, 2, 3, 5] -/** Window events linking the controls bar and the timeline strip — same - * decoupling pattern as the KBD events, so either side can be re-homed. */ +/** Candidate ruler intervals (ms); tickStep picks the smallest fitting one. */ +export const TICK_STEPS = [ + 100, 250, 500, 1_000, 2_000, 5_000, 10_000, 15_000, 30_000, 60_000, 120_000, + 300_000, 600_000 +] + +/** Ruler divisions to aim for — keeps labels readable at any duration. */ +export const TICK_TARGET_DIVISIONS = 14 + +/** Window events linking the controls bar and the timeline strip (KBD-style). */ export const PLAYER_STATE_EVENT = 'trace-player:state' export const PLAYER_RESTART_EVENT = 'trace-player:restart' export const PLAYER_SPEED_EVENT = 'trace-player:speed' diff --git a/packages/app/src/components/browser/trace-timeline-styles.ts b/packages/app/src/components/browser/trace-timeline-styles.ts index d65cbe24..f1482adc 100644 --- a/packages/app/src/components/browser/trace-timeline-styles.ts +++ b/packages/app/src/components/browser/trace-timeline-styles.ts @@ -1,6 +1,6 @@ import { css } from 'lit' -/** Styles for the trace-player timeline strip: host layout + hidden scrollbars. */ +/** Host layout for the trace-player timeline strip. */ export const timelineStyles = css` :host { position: relative; @@ -11,11 +11,4 @@ export const timelineStyles = css` background-color: var(--vscode-editor-background); color: var(--vscode-foreground); } - .no-scrollbar { - scrollbar-width: none; - -ms-overflow-style: none; - } - .no-scrollbar::-webkit-scrollbar { - display: none; - } ` diff --git a/packages/app/src/components/browser/trace-timeline-utils.ts b/packages/app/src/components/browser/trace-timeline-utils.ts index 1083ee65..ef99a363 100644 --- a/packages/app/src/components/browser/trace-timeline-utils.ts +++ b/packages/app/src/components/browser/trace-timeline-utils.ts @@ -1,9 +1,37 @@ +import { + TICK_STEPS, + TICK_TARGET_DIVISIONS +} from './trace-timeline-constants.js' + /** Detect image mime from a base64 string's magic bytes — trace screenshots * may be PNG (polling capture) or JPEG (CDP), and the zip names both `.jpeg`. */ export function imageMime(base64: string): string { return base64.startsWith('/9j/') ? 'image/jpeg' : 'image/png' } +export function tickStep( + durationMs: number, + targetTicks = TICK_TARGET_DIVISIONS +): number { + const raw = durationMs / targetTicks + return ( + TICK_STEPS.find((step) => step >= raw) ?? TICK_STEPS[TICK_STEPS.length - 1] + ) +} + +/** Ruler tick label: `500ms`, `3.5s`, `1:15`. */ +export function formatTickLabel(ms: number): string { + if (ms < 1_000) { + return `${ms}ms` + } + if (ms < 60_000) { + return `${(ms / 1_000).toFixed(1)}s` + } + const minutes = Math.floor(ms / 60_000) + const seconds = Math.round((ms % 60_000) / 1_000) + return `${minutes}:${String(seconds).padStart(2, '0')}` +} + /** `m:ss.cc` timecode (e.g. 32_270ms → `0:32.27`). */ export function formatTimecode(ms: number): string { const safe = Number.isFinite(ms) && ms > 0 ? ms : 0 diff --git a/packages/app/src/components/browser/trace-timeline.ts b/packages/app/src/components/browser/trace-timeline.ts index 2abc3753..21f7ffce 100644 --- a/packages/app/src/components/browser/trace-timeline.ts +++ b/packages/app/src/components/browser/trace-timeline.ts @@ -14,18 +14,17 @@ import { SPEEDS, type PlayerState } from './trace-timeline-constants.js' -import { formatTimecode, imageMime } from './trace-timeline-utils.js' +import { + formatTickLabel, + formatTimecode, + imageMime, + tickStep +} from './trace-timeline-utils.js' import { timelineStyles } from './trace-timeline-styles.js' const COMPONENT = 'wdio-devtools-trace-timeline' -/** - * Trace-player timeline strip, docked above the workbench in `pnpm show-trace` - * mode. Owns the playback clock, the screenshot filmstrip, and the playhead; - * the controls bar (trace-player-controls) and keyboard drive it via window - * events, and it broadcasts its state back the same way. Advancing the clock - * dispatches `show-command` so the reused browser pane and actions list follow. - */ +/** Player timeline strip: owns the playback clock, filmstrip, and playhead; wired to the controls bar and keyboard via window events, and drives the workbench via `show-command`. */ @customElement(COMPONENT) export class TraceTimeline extends Element { @consume({ context: commandContext, subscribe: true }) @@ -298,7 +297,45 @@ export class TraceTimeline extends Element { return best } - #renderFilmstrip(): TemplateResult { + get #ticks(): number[] { + const step = tickStep(this.#duration) + const out: number[] = [] + for (let t = step; t < this.#duration; t += step) { + out.push(t) + } + return out + } + + // Faint vertical gridlines at each ruler tick, spanning the whole strip. + #renderGridlines(): TemplateResult { + return html`${this.#ticks.map( + (tick) => + html`
` + )}` + } + + // Ruler labels stay inside the strip via the bounded translateX trick. + #renderRulerLabels(): TemplateResult { + return html` +
+ ${this.#ticks.map((tick) => { + const fraction = tick / this.#duration + return html`${formatTickLabel(tick)}` + })} +
+ ` + } + + // Thumbnails sit at their wall-clock position along the axis. + #renderThumbTrack(): TemplateResult { if (!this.frames.length) { return html`
- ${this.frames.map( - (frame) => - html`` - )} +
+ ${this.frames.map((frame) => { + const fraction = this.#fraction(frame.timestamp) + const active = frame.timestamp === activeFrame + return html`` + })}
` } - // Slim full-width ruler under the controls: action ticks + drag-to-scrub. - #renderRuler(): TemplateResult { + // Bottom scrub bar: full-width line, action tick marks, draggable knob. + #renderScrubBar(): TemplateResult { + const fraction = Math.min(1, Math.max(0, this.currentMs / this.#duration)) return html` -
+
+
${this.#sortedCommands.map((command) => { - const ts = command.timestamp ?? 0 + const tickFraction = this.#fraction(command.timestamp ?? 0) return html`
` })} +
` } - #renderPlayhead(): TemplateResult { - const fraction = Math.min(1, Math.max(0, this.currentMs / this.#duration)) - return html`
` - } - render() { return html`
- ${this.#renderRuler()} ${this.#renderFilmstrip()} - ${this.#renderPlayhead()} + ${this.#renderGridlines()} ${this.#renderRulerLabels()} + ${this.#renderThumbTrack()} ${this.#renderScrubBar()}
` } diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index 0d56d7d9..0bb9f243 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -6,10 +6,11 @@ import { consume } from '@lit/context' import { DragController, Direction } from '../utils/DragController.js' import { consoleLogContext, + metadataContext, networkRequestContext, baselineContext } from '../controller/context.js' -import type { PreservedAttempt } from '@wdio/devtools-shared' +import type { Metadata, PreservedAttempt } from '@wdio/devtools-shared' import '~icons/mdi/arrow-collapse-down.js' import '~icons/mdi/arrow-collapse-up.js' @@ -28,6 +29,7 @@ import './browser/snapshot.js' import './browser/trace-timeline.js' import './browser/trace-player-controls.js' import { + BROWSER_BACKDROP_GRADIENT, HEADER_HEIGHT, MIN_WORKBENCH_HEIGHT, MIN_METATAB_WIDTH, @@ -36,6 +38,7 @@ import { PLAYER_CONTROLS_HEIGHT, PLAYER_DOCK_DEFAULT_HEIGHT, PLAYER_DOCK_MIN_HEIGHT, + PLAYER_SNAPSHOT_WIDTH_RATIO, RERENDER_TIMEOUT, TRACE_TIMELINE_MIN_HEIGHT, TRACE_TIMELINE_DEFAULT_HEIGHT @@ -54,8 +57,7 @@ export class DevtoolsWorkbench extends Element { #workbenchSidebarCollapsed = localStorage.getItem('workbenchSidebar') === 'true' - // Trace-player mode (`pnpm show-trace`): the full workbench renders as in - // live mode, plus the playback timeline docked above the browser pane. + // Trace-player mode: full workbench plus the timeline strip and controls bar. @property({ type: Boolean }) playerMode = false @@ -71,6 +73,10 @@ export class DevtoolsWorkbench extends Element { @state() baselines: Map | undefined = undefined + @consume({ context: metadataContext, subscribe: true }) + @state() + metadata: Metadata | undefined = undefined + static styles = [ ...Element.styles, css` @@ -115,18 +121,18 @@ export class DevtoolsWorkbench extends Element { #dragTimeline = new DragController(this, { localStorageKey: 'traceTimelineHeight', minPosition: TRACE_TIMELINE_MIN_HEIGHT, - maxPosition: window.innerHeight * 0.4, + maxPosition: () => window.innerHeight * 0.4, initialPosition: TRACE_TIMELINE_DEFAULT_HEIGHT, getContainerEl: () => this.#getVerticalWindow(), direction: Direction.vertical }) - // Player-mode browser-pane height. Separate controller + storage key so - // resizing the player never disturbs the live-mode split. + // Player-mode pane height; own storage key so it never disturbs the live split. + // The live max bound keeps the handle (and pane) inside the current budget. #dragVerticalPlayer = new DragController(this, { - localStorageKey: 'playerBrowserHeight', + localStorageKey: 'playerPaneHeight', minPosition: MIN_WORKBENCH_HEIGHT, - maxPosition: window.innerHeight * 0.8, + maxPosition: () => this.#playerPaneBudget(), initialPosition: Math.max( MIN_WORKBENCH_HEIGHT, window.innerHeight - @@ -139,6 +145,27 @@ export class DevtoolsWorkbench extends Element { direction: Direction.vertical }) + // Player snapshot keeps the recorded viewport's shape, slightly narrowed. + #playerAspectRatio(): string { + const viewport = this.metadata?.viewport + const width = Math.round( + (viewport?.width || 1280) * PLAYER_SNAPSHOT_WIDTH_RATIO + ) + return `${width} / ${viewport?.height || 800}` + } + + // Space left for the snapshot pane once the fixed rows and dock minimum eat theirs. + #playerPaneBudget(): number { + return Math.max( + MIN_WORKBENCH_HEIGHT, + window.innerHeight - + HEADER_HEIGHT - + PLAYER_CONTROLS_HEIGHT - + PLAYER_DOCK_MIN_HEIGHT - + this.#timelinePaneHeight() + ) + } + async #getHorizontalWindow() { await this.updateComplete return this.horizontalResizerWindow as Element @@ -185,21 +212,12 @@ export class DevtoolsWorkbench extends Element { return '' } if (this.playerMode) { - // Player proportions: the snapshot dominates — pane gets everything the - // timeline, controls bar, and a compact dock don't need, clamped in CSS - // so the dock never drops below its minimum inside the viewport. - const fallback = - window.innerHeight - - HEADER_HEIGHT - - PLAYER_CONTROLS_HEIGHT - - this.#timelinePaneHeight() - - PLAYER_DOCK_DEFAULT_HEIGHT - const raw = basisPx(this.#dragVerticalPlayer.getPosition()) ?? fallback - const paneHeight = Math.max(MIN_WORKBENCH_HEIGHT, raw) + // Snapshot pane dominates; the CSS clamp keeps the dock minimum in view. + // Literal getPosition() basis lets adjustPosition sync slider ↔ clamped height. const maxHeight = `calc(100vh - ${ HEADER_HEIGHT + PLAYER_CONTROLS_HEIGHT + PLAYER_DOCK_MIN_HEIGHT }px - ${this.#timelinePaneHeight()}px)` - return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:${maxHeight}; min-height:0;` + return `flex-grow:0; flex-shrink:0; ${this.#dragVerticalPlayer.getPosition()}; max-height:${maxHeight}; min-height:${MIN_WORKBENCH_HEIGHT}px;` } const raw = basisPx(this.#dragVertical.getPosition()) ?? @@ -344,6 +362,31 @@ export class DevtoolsWorkbench extends Element { ` } + #renderBrowserPane() { + // Player: the boxed host goes transparent and the pane carries the shared + // backdrop, so the aspect box blends instead of showing a gradient seam. + const playerPaneExtra = this.playerMode + ? ` background:${BROWSER_BACKDROP_GRADIENT};` + : '' + return html` +
+ ${this.playerMode + ? html`
+ +
` + : html``} +
+ ` + } + // Full-width playback strip above the workbench row — player mode only. #renderTimelineStrip() { if (!this.playerMode) { @@ -388,12 +431,7 @@ export class DevtoolsWorkbench extends Element {
-
- -
+ ${this.#renderBrowserPane()} ${!this.#toolbarCollapsed ? (this.playerMode ? this.#dragVerticalPlayer diff --git a/packages/app/src/controller/constants.ts b/packages/app/src/controller/constants.ts index 105e74ad..6992ebf4 100644 --- a/packages/app/src/controller/constants.ts +++ b/packages/app/src/controller/constants.ts @@ -14,6 +14,11 @@ export const PLAYER_DOCK_MIN_HEIGHT = 140 export const PLAYER_DOCK_DEFAULT_HEIGHT = 220 /** Controls bar on the tab-header line in player mode (matches h-10 headers). */ export const PLAYER_CONTROLS_HEIGHT = 40 +/** Width factor on the player snapshot's aspect box — trims width, keeps height. */ +export const PLAYER_SNAPSHOT_WIDTH_RATIO = 0.9 +/** Backdrop behind the browser chrome — shared with the snapshot component styles. */ +export const BROWSER_BACKDROP_GRADIENT = + 'radial-gradient(120% 120% at 50% 0%, var(--vscode-editorWidget-background), var(--vscode-editor-background))' /** Fixed app-header height (see header.ts / app.ts `h-[calc(100%-40px)]`). */ export const HEADER_HEIGHT = 40 export const LOG_ICONS: Record = { diff --git a/packages/app/src/controller/keyboard.ts b/packages/app/src/controller/keyboard.ts index 87559253..f94ce52c 100644 --- a/packages/app/src/controller/keyboard.ts +++ b/packages/app/src/controller/keyboard.ts @@ -32,7 +32,7 @@ function isTyping(event: KeyboardEvent): boolean { ) } -function emit(name: string, detail?: unknown): void { +export function emit(name: string, detail?: unknown): void { window.dispatchEvent(new CustomEvent(name, { detail })) } diff --git a/packages/app/src/utils/DragController.ts b/packages/app/src/utils/DragController.ts index 593d452d..d675570f 100644 --- a/packages/app/src/utils/DragController.ts +++ b/packages/app/src/utils/DragController.ts @@ -14,15 +14,22 @@ export enum Direction { type DragControllerHost = HTMLElement & ReactiveControllerHost type AsyncGetElFn = () => Element | Promise +/** Bounds accept getters so panes with a layout-dependent budget clamp live. */ +type Bound = number | (() => number) + interface DragControllerOptions { initialPosition: number direction: Direction localStorageKey?: string - minPosition?: number - maxPosition?: number + minPosition?: Bound + maxPosition?: Bound getContainerEl: AsyncGetElFn } +function resolveBound(bound: Bound | undefined): number | undefined { + return typeof bound === 'function' ? bound() : bound +} + type State = 'dragging' | 'idle' const defaultOptions = { @@ -107,16 +114,18 @@ export class DragController implements ReactiveController { } #setPosition(x: number, y: number) { + const min = resolveBound(this.#options.minPosition) ?? 0 + const max = resolveBound(this.#options.maxPosition) if (this.#options.direction === Direction.horizontal) { - let nx = Math.max(x, this.#options.minPosition || 0) - if (this.#options.maxPosition !== undefined) { - nx = Math.min(nx, this.#options.maxPosition) + let nx = Math.max(x, min) + if (max !== undefined) { + nx = Math.min(nx, max) } this.#x = nx } else { - let ny = Math.max(y, this.#options.minPosition || 0) - if (this.#options.maxPosition !== undefined) { - ny = Math.min(ny, this.#options.maxPosition) + let ny = Math.max(y, min) + if (max !== undefined) { + ny = Math.min(ny, max) } this.#y = ny } diff --git a/packages/app/tests/trace-timeline-utils.test.ts b/packages/app/tests/trace-timeline-utils.test.ts new file mode 100644 index 00000000..e3197c7b --- /dev/null +++ b/packages/app/tests/trace-timeline-utils.test.ts @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest' +import { + formatTickLabel, + tickStep +} from '../src/components/browser/trace-timeline-utils.js' + +describe('tickStep', () => { + it('picks the smallest step yielding at most the target tick count', () => { + expect(tickStep(10_000)).toBe(1_000) + expect(tickStep(78_460)).toBe(10_000) + expect(tickStep(1_200)).toBe(100) + }) + + it('caps at the largest step for very long traces', () => { + expect(tickStep(3 * 60 * 60 * 1000)).toBe(600_000) + }) +}) + +describe('formatTickLabel', () => { + it('formats sub-second ticks as milliseconds', () => { + expect(formatTickLabel(500)).toBe('500ms') + }) + + it('formats seconds with one decimal', () => { + expect(formatTickLabel(1_000)).toBe('1.0s') + expect(formatTickLabel(3_500)).toBe('3.5s') + }) + + it('formats minutes as m:ss', () => { + expect(formatTickLabel(75_000)).toBe('1:15') + expect(formatTickLabel(60_000)).toBe('1:00') + }) +}) From ade42cddc3e56dc070950f09182855faeef210ba Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Fri, 3 Jul 2026 17:35:17 +0530 Subject: [PATCH 004/109] refactor(shared,backend,core): derive LogLevel from runtime LOG_LEVELS; tighten comments --- packages/backend/src/trace-reader-constants.ts | 5 ++++- packages/backend/src/trace-reader-utils.ts | 15 +++------------ packages/core/src/trace-console.ts | 12 ++++-------- packages/core/src/trace-snapshots.ts | 6 +----- packages/shared/src/types.ts | 10 +++++++++- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/packages/backend/src/trace-reader-constants.ts b/packages/backend/src/trace-reader-constants.ts index 6e738464..0572b51f 100644 --- a/packages/backend/src/trace-reader-constants.ts +++ b/packages/backend/src/trace-reader-constants.ts @@ -1,4 +1,7 @@ -import { ACTION_MAP } from '@wdio/devtools-shared' +import { ACTION_MAP, LOG_LEVELS } from '@wdio/devtools-shared' + +/** Runtime lookup for narrowing foreign trace levels to the shared union. */ +export const LOG_LEVEL_SET: ReadonlySet = new Set(LOG_LEVELS) // Inverse of ACTION_MAP, derived so it can never drift from the forward map. // The forward map is many-to-one (url/navigateTo/get all → Page.navigate); the diff --git a/packages/backend/src/trace-reader-utils.ts b/packages/backend/src/trace-reader-utils.ts index b7162c12..e1f8e3dd 100644 --- a/packages/backend/src/trace-reader-utils.ts +++ b/packages/backend/src/trace-reader-utils.ts @@ -11,6 +11,7 @@ import { type Viewport } from '@wdio/devtools-shared' +import { LOG_LEVEL_SET } from './trace-reader-constants.js' import type { ConsoleEvent, ContextOptionsEvent, @@ -144,22 +145,12 @@ export function harToNetworkRequest( } } -const LOG_LEVELS: ReadonlySet = new Set([ - 'trace', - 'debug', - 'log', - 'info', - 'warn', - 'error' -]) - -// Reverse of the writer's level mapping ('warn' → 'warning'); a foreign -// trace zip can carry levels outside our union, which default to 'log'. +// Reverse level mapping; foreign levels outside our union default to 'log'. function fromTraceLevel(messageType: string): LogLevel { if (messageType === 'warning') { return 'warn' } - return LOG_LEVELS.has(messageType) ? (messageType as LogLevel) : 'log' + return LOG_LEVEL_SET.has(messageType) ? (messageType as LogLevel) : 'log' } export function buildConsoleLogs( diff --git a/packages/core/src/trace-console.ts b/packages/core/src/trace-console.ts index f9db30fd..78deb7aa 100644 --- a/packages/core/src/trace-console.ts +++ b/packages/core/src/trace-console.ts @@ -19,17 +19,14 @@ export interface StdioEvent { type: 'stdout' | 'stderr' timestamp: number text?: string - /** Extension field: preserves the test-vs-terminal origin the standard - * stdio vocabulary can't express. Foreign viewers ignore it. */ + /** Extension field: test-vs-terminal origin; foreign viewers ignore it. */ source?: Extract } -// Keeps a pathological run (console.log in a tight loop) from producing a -// trace.trace the viewer can't open. +// Caps pathological runs (console.log in a loop) so the trace stays openable. const MAX_CONSOLE_EVENTS = 10_000 -/** The trace format's console vocabulary uses 'warning'; 'trace' has no - * equivalent — 'debug' is the nearest severity. */ +/** Trace vocabulary uses 'warning'; 'trace' maps to the nearest severity, 'debug'. */ function toTraceLevel(level: ConsoleLog['type']): string { if (level === 'warn') { return 'warning' @@ -69,8 +66,7 @@ export function buildConsoleEvents( messageType: toTraceLevel(log.type), text, args: log.args.map((arg) => ({ preview: previewArg(arg), value: arg })), - // Location isn't captured at the console patch site; the event - // shape requires the field, so it ships zeroed. + // Location isn't captured at the patch site; the required field ships zeroed. location: { url: '', lineNumber: 0, columnNumber: 0 } } satisfies ConsoleEvent } diff --git a/packages/core/src/trace-snapshots.ts b/packages/core/src/trace-snapshots.ts index 0f139bdb..9e98704d 100644 --- a/packages/core/src/trace-snapshots.ts +++ b/packages/core/src/trace-snapshots.ts @@ -69,11 +69,7 @@ function frameForSnapshot( return frame } -/** - * Full filmstrip for the trace: the first snapshot is re-anchored to t=0 so - * viewers show the page state before any interaction; the rest keep their - * wall-time offsets. - */ +/** Filmstrip events; the first snapshot is re-anchored to t=0 for pre-interaction state. */ export function buildFilmstripEvents( snapshots: ActionSnapshot[], pageId: string, diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 23ad3c7f..2f209aed 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -4,7 +4,15 @@ // these shapes. The backend stores and forwards them. The app consumes them. // See ARCHITECTURE.md §2 and CLAUDE.md §2.1. -export type LogLevel = 'trace' | 'debug' | 'log' | 'info' | 'warn' | 'error' +export const LOG_LEVELS = [ + 'trace', + 'debug', + 'log', + 'info', + 'warn', + 'error' +] as const +export type LogLevel = (typeof LOG_LEVELS)[number] /** Where a captured ConsoleLog entry originated. */ export type LogSource = 'browser' | 'test' | 'terminal' From 9120a04aad90ddf46a83ba84aa86954a12f302e3 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Fri, 3 Jul 2026 17:35:44 +0530 Subject: [PATCH 005/109] fix(backend): skip tracing-group markers when reconstructing player commands --- packages/backend/src/trace-reader.ts | 5 +++++ packages/backend/tests/trace-reader.test.ts | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 6146998f..3c6b84ea 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -103,6 +103,11 @@ function buildCommands( const commands: CommandLog[] = [] let maxOffset = 0 for (const [callId, before] of events.befores) { + // Group markers are structure, not actions — as command rows their end + // timestamp ties with the last action and steals the active highlight. + if (before.class === 'Tracing') { + continue + } const after = events.afters.get(callId) const endOffset = after?.endTime ?? before.startTime maxOffset = Math.max(maxOffset, endOffset) diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 8df8f9ff..7d1f059e 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -36,6 +36,14 @@ function fixtureZip(): Uint8Array { params: { selector: '#name', value: 'vishnu' } }, { type: 'after', callId: 'call@2', endTime: 160 }, + { + type: 'before', + callId: 'call@0', + startTime: 0, + class: 'Tracing', + method: 'tracingGroup', + params: { name: 'my test' } + }, { type: 'before', callId: 'call@3', @@ -50,6 +58,7 @@ function fixtureZip(): Uint8Array { endTime: 260, error: { message: 'boom' } }, + { type: 'after', callId: 'call@0', endTime: 260 }, { type: 'screencast-frame', pageId: 'page@abcd1234', @@ -175,6 +184,12 @@ describe('parseTraceZip', () => { expect(trace.sources).toEqual({}) }) + it('skips tracing group markers so the last command stays the last action', () => { + const { trace } = parseTraceZip(fixtureZip()) + expect(trace.commands.some((c) => c.command === 'tracingGroup')).toBe(false) + expect(trace.commands[trace.commands.length - 1].command).toBe('click') + }) + it('reconstructs console logs from console and stdio events', () => { const { trace } = parseTraceZip(fixtureZip()) expect(trace.consoleLogs).toEqual([ From e29070daaac4abca323a511191f0e743c630d028 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Fri, 3 Jul 2026 19:23:03 +0530 Subject: [PATCH 006/109] feat(shared,backend,app): nested action tree with failure rollup in the trace player --- examples/wdio/wdio.conf.ts | 2 +- .../src/components/workbench/action-tree.ts | 72 +++ .../workbench/actionItems/command.ts | 9 +- .../workbench/actionItems/duration.ts | 16 +- .../components/workbench/actionItems/group.ts | 69 +++ .../components/workbench/actionItems/item.ts | 17 + .../app/src/components/workbench/actions.ts | 106 ++++- .../src/components/workbench/call-source.ts | 45 ++ .../app/src/components/workbench/source.ts | 66 ++- .../src/components/workbench/source/styles.ts | 13 + packages/app/src/controller/DataManager.ts | 92 ++-- packages/app/src/controller/context.ts | 7 + packages/app/tests/action-tree.test.ts | 95 ++++ packages/app/tests/call-source.test.ts | 93 +++- packages/app/tests/duration.test.ts | 9 + .../backend/src/trace-reader-constants.ts | 12 + packages/backend/src/trace-reader-groups.ts | 165 +++++++ packages/backend/src/trace-reader-types.ts | 21 +- packages/backend/src/trace-reader-utils.ts | 99 +++- packages/backend/src/trace-reader.ts | 258 ++++++++--- packages/backend/tests/trace-reader.test.ts | 435 +++++++++++++++++- packages/core/src/index.ts | 4 + packages/core/src/sha1.ts | 6 + packages/core/src/trace-action-events.ts | 195 ++++++++ packages/core/src/trace-exporter.ts | 186 ++------ packages/core/src/trace-frame-snapshots.ts | 154 +++++++ packages/core/src/trace-sources.ts | 65 +++ packages/core/tests/trace-exporter.test.ts | 181 +++++++- .../core/tests/trace-frame-snapshots.test.ts | 180 ++++++++ packages/core/tests/trace-sources.test.ts | 71 +++ packages/shared/src/trace-player.ts | 22 + 31 files changed, 2458 insertions(+), 307 deletions(-) create mode 100644 packages/app/src/components/workbench/action-tree.ts create mode 100644 packages/app/src/components/workbench/actionItems/group.ts create mode 100644 packages/app/tests/action-tree.test.ts create mode 100644 packages/backend/src/trace-reader-groups.ts create mode 100644 packages/core/src/sha1.ts create mode 100644 packages/core/src/trace-action-events.ts create mode 100644 packages/core/src/trace-frame-snapshots.ts create mode 100644 packages/core/src/trace-sources.ts create mode 100644 packages/core/tests/trace-frame-snapshots.test.ts create mode 100644 packages/core/tests/trace-sources.test.ts diff --git a/examples/wdio/wdio.conf.ts b/examples/wdio/wdio.conf.ts index 0f7b3470..b6305819 100644 --- a/examples/wdio/wdio.conf.ts +++ b/examples/wdio/wdio.conf.ts @@ -131,7 +131,7 @@ export const config: Options.Testrunner = { [ 'devtools', { - mode: 'live' as const, + mode: 'trace' as const, screencast: { enabled: true, pollIntervalMs: 200 } } ] diff --git a/packages/app/src/components/workbench/action-tree.ts b/packages/app/src/components/workbench/action-tree.ts new file mode 100644 index 00000000..723f83af --- /dev/null +++ b/packages/app/src/components/workbench/action-tree.ts @@ -0,0 +1,72 @@ +// Pure helpers behind the player's collapsible action tree: flattening the +// group tree into render rows and deciding which groups start expanded. + +import type { + TraceActionChild, + TraceActionGroupNode +} from '@wdio/devtools-shared' + +export interface GroupRow { + kind: 'group' + group: TraceActionGroupNode + depth: number + expanded: boolean +} + +export interface CommandRow { + kind: 'command' + commandIndex: number + depth: number +} + +export type ActionTreeRow = GroupRow | CommandRow + +/** Command indices anywhere under a group, nested groups included. */ +export function collectCommandIndices(group: TraceActionGroupNode): number[] { + const indices: number[] = [] + for (const child of group.children) { + if ('group' in child) { + indices.push(...collectCommandIndices(child.group)) + } else { + indices.push(child.commandIndex) + } + } + return indices +} + +/** Groups open by default when failed or when holding the active command. */ +export function defaultExpanded( + group: TraceActionGroupNode, + activeCommandIndex?: number +): boolean { + if (group.failed) { + return true + } + return ( + activeCommandIndex !== undefined && + collectCommandIndices(group).includes(activeCommandIndex) + ) +} + +/** Flatten the tree into render rows, descending only into expanded groups. */ +export function flattenActionTree( + children: TraceActionChild[], + isExpanded: (group: TraceActionGroupNode) => boolean, + depth = 0 +): ActionTreeRow[] { + const rows: ActionTreeRow[] = [] + for (const child of children) { + if ('group' in child) { + const expanded = isExpanded(child.group) + rows.push({ kind: 'group', group: child.group, depth, expanded }) + if (expanded) { + rows.push( + ...flattenActionTree(child.group.children, isExpanded, depth + 1) + ) + } + } else { + rows.push({ kind: 'command', commandIndex: child.commandIndex, depth }) + } + } + return rows +} diff --git a/packages/app/src/components/workbench/actionItems/command.ts b/packages/app/src/components/workbench/actionItems/command.ts index a587369e..1a596f56 100644 --- a/packages/app/src/components/workbench/actionItems/command.ts +++ b/packages/app/src/components/workbench/actionItems/command.ts @@ -33,6 +33,10 @@ export class CommandItem extends ActionItem { @property({ type: Object, attribute: true }) entry?: CommandLog + willUpdate(): void { + this.failed = Boolean(this.entry?.error) + } + #highlightLine() { const event = new CustomEvent('show-command', { detail: { @@ -85,7 +89,10 @@ export class CommandItem extends ActionItem { @click="${() => this.#highlightLine()}" > ${this.iconChip(this.#renderIcon(entry.command))} - ${entry.title ?? entry.command} ${this.renderTime()} diff --git a/packages/app/src/components/workbench/actionItems/duration.ts b/packages/app/src/components/workbench/actionItems/duration.ts index db4b7fbc..5d2df61f 100644 --- a/packages/app/src/components/workbench/actionItems/duration.ts +++ b/packages/app/src/components/workbench/actionItems/duration.ts @@ -3,17 +3,19 @@ export type DurationHeat = 'fast' | 'mid' | 'slow' const ONE_SECOND = 1000 const ONE_MINUTE = ONE_SECOND * 60 -/** Human-readable duration: `ms` under a second, `s` under a minute, `m s` above. */ +/** Human-readable duration: `ms` under a second, `s` under a minute, `m s` + * above. Rounds first — reconstructed traces carry fractional-ms clocks. */ export function formatDuration(ms: number): string { - if (ms > ONE_MINUTE) { - const minutes = Math.floor(ms / ONE_MINUTE) - const seconds = Math.floor((ms - minutes * ONE_MINUTE) / ONE_SECOND) + const rounded = Math.round(ms) + if (rounded > ONE_MINUTE) { + const minutes = Math.floor(rounded / ONE_MINUTE) + const seconds = Math.floor((rounded - minutes * ONE_MINUTE) / ONE_SECOND) return `${minutes}m ${seconds}s` } - if (ms > ONE_SECOND) { - return `${(ms / ONE_SECOND).toFixed(2)}s` + if (rounded > ONE_SECOND) { + return `${(rounded / ONE_SECOND).toFixed(2)}s` } - return `${ms}ms` + return `${rounded}ms` } /** Bucket a step duration so slow steps stand out: fast < 500ms ≤ mid < 2s ≤ slow. */ diff --git a/packages/app/src/components/workbench/actionItems/group.ts b/packages/app/src/components/workbench/actionItems/group.ts new file mode 100644 index 00000000..10780076 --- /dev/null +++ b/packages/app/src/components/workbench/actionItems/group.ts @@ -0,0 +1,69 @@ +import { html } from 'lit' +import { customElement, property } from 'lit/decorators.js' + +import type { TraceActionGroupNode } from '@wdio/devtools-shared' + +import { ActionItem } from './item.js' +import '~icons/mdi/chevron-right.js' + +const SOURCE_COMPONENT = 'wdio-devtools-group-item' + +/** Collapsible step/group row of the trace player's action tree. */ +@customElement(SOURCE_COMPONENT) +export class GroupItem extends ActionItem { + @property({ type: Object }) + group?: TraceActionGroupNode + + /** Whether the group's children are currently rendered below it. */ + @property({ type: Boolean, reflect: true }) + expanded = false + + willUpdate(): void { + this.failed = Boolean(this.group?.failed) + this.duration = this.group + ? this.group.endTime - this.group.startTime + : undefined + } + + #toggle() { + this.dispatchEvent( + new CustomEvent('group-toggle', { + detail: { callId: this.group?.callId, expanded: this.expanded }, + bubbles: true, + composed: true + }) + ) + } + + render() { + if (!this.group) { + return + } + return html` + + ` + } +} + +declare global { + interface HTMLElementTagNameMap { + [SOURCE_COMPONENT]: GroupItem + } +} diff --git a/packages/app/src/components/workbench/actionItems/item.ts b/packages/app/src/components/workbench/actionItems/item.ts index 931a2299..945a79db 100644 --- a/packages/app/src/components/workbench/actionItems/item.ts +++ b/packages/app/src/components/workbench/actionItems/item.ts @@ -29,6 +29,10 @@ export class ActionItem extends Element { @property({ type: Boolean, reflect: true }) active = false + /** Whether this row's action errored — drives the red row treatment. */ + @property({ type: Boolean, reflect: true }) + failed = false + static styles = [ ...Element.styles, css` @@ -67,6 +71,19 @@ export class ActionItem extends Element { :host([active]) .ic { border-color: var(--accent); } + :host([failed]) button { + background: color-mix( + in srgb, + var(--vscode-charts-red) 8%, + transparent + ); + box-shadow: inset 2px 0 0 var(--vscode-charts-red); + } + :host([failed][active]) button { + box-shadow: + inset 2px 0 0 var(--vscode-charts-red), + inset 0 0 0 1px var(--vscode-panel-border); + } ` ] diff --git a/packages/app/src/components/workbench/actions.ts b/packages/app/src/components/workbench/actions.ts index 86f4e856..842f4f56 100644 --- a/packages/app/src/components/workbench/actions.ts +++ b/packages/app/src/components/workbench/actions.ts @@ -1,21 +1,38 @@ import { Element } from '@core/element' -import { html, css } from 'lit' +import { html, css, nothing } from 'lit' import { customElement, state } from 'lit/decorators.js' import { consume } from '@lit/context' -import type { CommandLog } from '@wdio/devtools-shared' -import { mutationContext, commandContext } from '../../controller/context.js' +import type { + CommandLog, + TraceActionChild, + TraceActionGroupNode +} from '@wdio/devtools-shared' +import { + mutationContext, + commandContext, + actionGroupsContext +} from '../../controller/context.js' import '../placeholder.js' import './actionItems/command.js' +import './actionItems/group.js' import './actionItems/mutation.js' import { stepDurations } from './actionItems/duration.js' import { activeTimestampAt } from './active-entry.js' +import { + defaultExpanded, + flattenActionTree, + type ActionTreeRow +} from './action-tree.js' type TimelineEntry = TraceMutation | CommandLog const SOURCE_COMPONENT = 'wdio-devtools-actions' +/** Horizontal shift per tree depth level in the player's action tree. */ +const TREE_INDENT_PX = 14 + @customElement(SOURCE_COMPONENT) export class DevtoolsActions extends Element { static styles = [ @@ -47,6 +64,11 @@ export class DevtoolsActions extends Element { background: var(--vscode-panel-border); pointer-events: none; } + + /* Tree mode indents rows, so the straight rail no longer lines up. */ + .timeline.tree::before { + display: none; + } ` ] @@ -56,12 +78,32 @@ export class DevtoolsActions extends Element { @consume({ context: commandContext, subscribe: true }) commands: CommandLog[] = [] + @consume({ context: actionGroupsContext, subscribe: true }) + groups?: TraceActionChild[] + // The selected timeline row, tracked by object reference — timestamps aren't // unique (commands logged in the same millisecond would all match), so // reference identity is what highlights exactly one row. @state() private activeEntry?: TimelineEntry + // User chevron toggles, by group callId; unset groups follow the default + // (failed or containing the active command → open). + @state() + private expandOverrides: ReadonlyMap = new Map() + + #onGroupToggle = (event: Event) => { + const { callId, expanded } = ( + event as CustomEvent<{ callId?: string; expanded: boolean }> + ).detail + if (!callId) { + return + } + const next = new Map(this.expandOverrides) + next.set(callId, !expanded) + this.expandOverrides = next + } + #onShowCommand = (event: Event) => { const command = (event as CustomEvent<{ command?: CommandLog }>).detail ?.command @@ -146,7 +188,65 @@ export class DevtoolsActions extends Element { } } + // Player tree mode: group rows expand/collapse; leaf rows are the same + // command items as the flat list, indented under their group. + #renderTree(rootChildren: TraceActionChild[]) { + const commands = this.commands || [] + const activeIndex = + this.activeEntry && 'command' in this.activeEntry + ? commands.indexOf(this.activeEntry) + : -1 + const isExpanded = (group: TraceActionGroupNode) => + this.expandOverrides.get(group.callId) ?? + defaultExpanded(group, activeIndex >= 0 ? activeIndex : undefined) + const rows = flattenActionTree(rootChildren, isExpanded) + const baseline = commands[0]?.timestamp ?? 0 + const gaps = stepDurations(commands.map((command) => command.timestamp)) + return html`
+ ${rows.map((row) => this.#renderTreeRow(row, commands, baseline, gaps))} +
` + } + + #renderTreeRow( + row: ActionTreeRow, + commands: CommandLog[], + baseline: number, + gaps: Array + ) { + const indent = `padding-left: ${row.depth * TREE_INDENT_PX}px` + if (row.kind === 'group') { + return html` + + ` + } + const entry = commands[row.commandIndex] + if (!entry) { + return nothing + } + // Reconstructed zips carry the real invocation span; gap is the fallback. + const duration = + entry.startTime !== undefined + ? entry.timestamp - entry.startTime + : gaps[row.commandIndex] + return html` + + ` + } + render() { + if (this.groups?.length) { + return this.#renderTree(this.groups) + } const entries = this.#sortedEntries() if (!entries.length) { diff --git a/packages/app/src/components/workbench/call-source.ts b/packages/app/src/components/workbench/call-source.ts index 9349b184..3fa2d5ca 100644 --- a/packages/app/src/components/workbench/call-source.ts +++ b/packages/app/src/components/workbench/call-source.ts @@ -23,6 +23,51 @@ export function parseCallSource( } } +/** Path with any trailing `:line` / `:line:column` suffix stripped — some + * recorded traces glue the line onto the file, so lookups compare clean paths. */ +export function normalizeSourcePath(path: string): string { + const match = path.match(/:\d+:\d+$/) || path.match(/:\d+$/) + return match && match.index ? path.slice(0, match.index) : path +} + +/** Key in `sources` holding `file`'s content — exact match first, then a + * normalized-path match so suffixed keys and clean queries still pair up. */ +export function resolveSourceFile( + sources: Record, + file: string +): string | undefined { + if (file in sources) { + return file + } + const target = normalizeSourcePath(file) + return Object.keys(sources).find((key) => normalizeSourcePath(key) === target) +} + +/** Normalized display list: every captured source file plus any file referenced + * by a command call source, deduplicated by clean path. */ +export function listSourceFiles( + sources: Record, + callSources: (string | undefined)[] +): string[] { + const files: string[] = [] + const seen = new Set() + const add = (path: string) => { + const normalized = normalizeSourcePath(path) + if (!seen.has(normalized)) { + seen.add(normalized) + files.push(normalized) + } + } + Object.keys(sources).forEach(add) + for (const callSource of callSources) { + const parsed = callSource ? parseCallSource(callSource) : null + if (parsed) { + add(parsed.file) + } + } + return files +} + /** Last path segment, handling both POSIX (`/`) and Windows (`\`) separators. */ export function fileBasename(path: string): string { const segments = path.split(/[/\\]/) diff --git a/packages/app/src/components/workbench/source.ts b/packages/app/src/components/workbench/source.ts index 81a12d0b..fcdb6fe5 100644 --- a/packages/app/src/components/workbench/source.ts +++ b/packages/app/src/components/workbench/source.ts @@ -13,7 +13,14 @@ import type { CommandLog } from '@wdio/devtools-shared' import { sourceContext, commandContext } from '../../controller/context.js' import { commandCategory, type ActionCategory } from './actionItems/category.js' -import { parseCallSource, fileBasename, pathSegments } from './call-source.js' +import { + parseCallSource, + fileBasename, + pathSegments, + normalizeSourcePath, + resolveSourceFile, + listSourceFiles +} from './call-source.js' import { sourceStyles } from './source/styles.js' import '../placeholder.js' @@ -95,12 +102,26 @@ export class DevtoolsSource extends Element { return document.body.classList.contains('dark') } + /** Captured files plus files referenced by command call sources (clean paths). */ + get #fileList(): string[] { + return listSourceFiles( + this.sources || {}, + (this.commands || []).map((c) => c.callSource) + ) + } + /** File to show: an explicit selection/call-site, else the first available. */ get #effectiveFile(): string | undefined { - if (this.activeFile && this.sources?.[this.activeFile]) { + const files = this.#fileList + if (this.activeFile && files.includes(this.activeFile)) { return this.activeFile } - return Object.keys(this.sources || {})[0] + return files[0] + } + + #contentFor(file: string): string | undefined { + const key = resolveSourceFile(this.sources || {}, file) + return key !== undefined ? this.sources[key] : undefined } connectedCallback(): void { @@ -145,8 +166,7 @@ export class DevtoolsSource extends Element { super.disconnectedCallback() window.removeEventListener('app-source-highlight', this.#onHighlight) window.removeEventListener('app-source-track', this.#onTrack) - this.#editorView?.destroy() - this.#editorView = undefined + this.#unmountEditor() this.#tabObserver?.disconnect() this.#tabObserver = undefined this.#themeObserver?.disconnect() @@ -158,6 +178,10 @@ export class DevtoolsSource extends Element { if (!target) { return } + if (this.#contentFor(target) === undefined) { + this.#unmountEditor() + return + } this.#mountEditor(target) this.#refreshCallSite() } @@ -167,10 +191,11 @@ export class DevtoolsSource extends Element { if (!parsed) { return } - this.activeFile = parsed.file - this.callSiteFile = parsed.file + const file = normalizeSourcePath(parsed.file) + this.activeFile = file + this.callSiteFile = file this.callSiteLine = parsed.line - const cmd = this.#commandAt(parsed.file, parsed.line) + const cmd = this.#commandAt(file, parsed.line) this.callSiteCommand = cmd?.command this.callSiteCategory = cmd ? commandCategory(cmd.command) : 'other' if (activateTab) { @@ -184,7 +209,11 @@ export class DevtoolsSource extends Element { return false } const parsed = parseCallSource(c.callSource) - return parsed?.file === file && parsed.line === line + return ( + !!parsed && + normalizeSourcePath(parsed.file) === file && + parsed.line === line + ) }) } @@ -192,9 +221,15 @@ export class DevtoolsSource extends Element { this.activeFile = file } + #unmountEditor() { + this.#editorView?.destroy() + this.#editorView = undefined + this.#mountedFile = undefined + } + #mountEditor(filePath: string) { - const source = this.sources?.[filePath] - if (!source) { + const source = this.#contentFor(filePath) + if (source === undefined) { return } const container = @@ -256,7 +291,7 @@ export class DevtoolsSource extends Element { } #renderFileTabs(active: string) { - return Object.keys(this.sources || {}).map( + return this.#fileList.map( (file) => html` ` } @@ -197,6 +214,9 @@ export class DevtoolsTab extends Element { @property({ type: Number }) badge?: number + @property({ type: String }) + badgeTone?: BadgeTone + static styles = [ ...Element.styles, css` diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index 0bb9f243..a97b20c9 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -8,9 +8,17 @@ import { consoleLogContext, metadataContext, networkRequestContext, - baselineContext + baselineContext, + commandContext, + suiteContext } from '../controller/context.js' -import type { Metadata, PreservedAttempt } from '@wdio/devtools-shared' +import type { + CommandLog, + Metadata, + PreservedAttempt +} from '@wdio/devtools-shared' +import type { SuiteStatsFragment } from '../controller/types.js' +import { collectErrors } from './workbench/errors/collect.js' import '~icons/mdi/arrow-collapse-down.js' import '~icons/mdi/arrow-collapse-up.js' @@ -24,6 +32,7 @@ import './workbench/logs.js' import './workbench/console.js' import './workbench/metadata.js' import './workbench/network.js' +import './workbench/errors.js' import './workbench/compare.js' import './browser/snapshot.js' import './browser/trace-timeline.js' @@ -73,6 +82,14 @@ export class DevtoolsWorkbench extends Element { @state() baselines: Map | undefined = undefined + @consume({ context: commandContext, subscribe: true }) + @state() + commands: CommandLog[] | undefined = undefined + + @consume({ context: suiteContext, subscribe: true }) + @state() + suites: Record[] | undefined = undefined + @consume({ context: metadataContext, subscribe: true }) @state() metadata: Metadata | undefined = undefined @@ -317,6 +334,44 @@ export class DevtoolsWorkbench extends Element { ` } + #errorCount(): number { + return collectErrors(this.commands, this.suites).length + } + + // Dock tab list — extracted so #renderWorkbenchTabs stays under the size cap. + #renderDockTabItems() { + return html` + + + + + + + + + + + + + + + + ${this.#renderCompareTabIfAvailable()} + ` + } + #renderWorkbenchTabs() { return html` - - - - - - - - - - - - - ${this.#renderCompareTabIfAvailable()} + ${this.#renderDockTabItems()}
+ ` + } + + render() { + const errors = collectErrors(this.commands, this.suites) + if (!errors.length) { + return html` +
+
+
No errors
+
+ ` + } + return html`${errors.map((error) => this.#renderEntry(error))}` + } +} + +declare global { + interface HTMLElementTagNameMap { + [COMPONENT]: DevtoolsErrors + } +} diff --git a/packages/app/src/components/workbench/errors/collect.ts b/packages/app/src/components/workbench/errors/collect.ts new file mode 100644 index 00000000..ca7429e1 --- /dev/null +++ b/packages/app/src/components/workbench/errors/collect.ts @@ -0,0 +1,232 @@ +/** + * Pure error-collection for the workbench Errors tab. Merges failed commands + * (from `commandContext`) with failed tests (from `suiteContext`) into a single + * ordered, de-duplicated list. Kept framework-free and side-effect-free so the + * tab component only has to render what this returns. + */ + +import type { CommandLog } from '@wdio/devtools-shared' +import type { + SuiteStatsFragment, + TestStatsFragment +} from '../../../controller/types.js' +import { stripAnsi } from '../console-filter.js' + +/** One row in the Errors tab. */ +export interface CollectedError { + /** Failing action/step or test title — the row heading. */ + title: string + /** Error message shown message-first, monospace. */ + message: string + /** Optional stack, rendered under the message when present. */ + stack?: string + /** `file:line:col` source anchor for the "open source" link. */ + callSource?: string + /** The failing command, when the error came from one — lets the tab dispatch + * `show-command` to select and scroll to that action. */ + command?: CommandLog + /** Command timestamp; drives ordering and the `show-command` elapsed time. */ + timestamp?: number + /** Assertion expected value, rendered as a labelled row when present. */ + expected?: string + /** Assertion received/actual value, rendered as a labelled row when present. */ + actual?: string +} + +const ASSERTION_COMMAND_RE = /^(expect|assert|verify)\./ + +/** Display string for an expected/actual value that may already be serialized. */ +function displayValue(value: unknown): string | undefined { + if (value === undefined || value === null) { + return undefined + } + if (typeof value === 'string') { + return value + } + try { + return JSON.stringify(value) + } catch { + return String(value) + } +} + +/** Assertion commands carry `[actual, expected]` in args (see the exporter's + * Assert params + synthesizeExpectFailure). */ +function assertionValues(command: CommandLog): { + actual?: string + expected?: string +} { + if (!ASSERTION_COMMAND_RE.test(command.command) || command.args.length < 2) { + return {} + } + return { + actual: displayValue(command.args[0]), + expected: displayValue(command.args[1]) + } +} + +interface ReadableError { + message?: string + name?: string + stack?: string + expected?: unknown + actual?: unknown +} + +/** Split trailing `at …` stack-frame lines off the message body. */ +function splitStack(clean: string): { body: string; stack?: string } { + const lines = clean.split('\n') + const idx = lines.findIndex((line) => /^\s*at\s/.test(line)) + if (idx === -1) { + return { body: clean.trimEnd() } + } + return { + body: lines.slice(0, idx).join('\n').trimEnd(), + stack: lines.slice(idx).join('\n').trim() + } +} + +/** Trim each line and drop blanks — assertion libraries indent continuation + * lines, which would otherwise show as ragged whitespace. */ +function dedent(text: string): string { + return text + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .join('\n') +} + +/** Pull `Expected:` / `Received:` values out of a matcher body and return the + * remaining headline. The labels may be indented (expect-webdriverio pads + * them), and `Received:` can span several lines up to the end of the body. */ +function extractDiff(body: string): { + headline: string + expected?: string + actual?: string +} { + const expected = body.match(/^[ \t]*Expected:[ \t]*(.*)$/m)?.[1]?.trim() + const receivedAt = body.search(/^[ \t]*Received:/m) + let actual: string | undefined + let headline = body + if (receivedAt !== -1) { + actual = dedent( + body.slice(receivedAt).replace(/^[ \t]*Received:[ \t]*/, '') + ) + headline = body.slice(0, receivedAt) + } + if (expected !== undefined) { + headline = headline.replace(/^[ \t]*Expected:[ \t]*.*$/m, '') + } + return { headline: dedent(headline), expected, actual } +} + +/** Clean, structured view of any error-ish value: ANSI stripped, stack split + * off the message, and assertion Expected/Received pulled into fields. */ +function readError(error: unknown): + | { + message: string + stack?: string + expected?: string + actual?: string + } + | undefined { + if (!error || typeof error !== 'object') { + return undefined + } + const e = error as ReadableError + const raw = e.message?.trim() || e.name?.trim() || '' + if (!raw && !e.stack) { + return undefined + } + const { body, stack } = splitStack(stripAnsi(raw)) + const diff = extractDiff(body) + return { + message: diff.headline || 'Error', + stack: e.stack ? stripAnsi(e.stack) : stack, + expected: diff.expected ?? displayValue(e.expected), + actual: diff.actual ?? displayValue(e.actual) + } +} + +/** Failed leaf tests across every suite map, deduped by uid (last wins, matching + * the sidebar's root-suite dedup so we read the freshest fragment). */ +function collectFailedTests( + suites: Record[] | undefined +): TestStatsFragment[] { + const byUid = new Map() + const visit = (suite: SuiteStatsFragment) => { + for (const test of suite.tests ?? []) { + if (test.state === 'failed') { + byUid.set(test.uid, test) + } + } + for (const child of suite.suites ?? []) { + visit(child) + } + } + for (const map of suites ?? []) { + for (const suite of Object.values(map)) { + visit(suite) + } + } + return [...byUid.values()] +} + +function commandErrors(commands: CommandLog[] | undefined): CollectedError[] { + return (commands ?? []) + .flatMap((command) => { + const read = readError(command.error) + if (!read) { + return [] + } + const values = assertionValues(command) + return [ + { + title: command.title ?? command.command, + message: read.message, + stack: read.stack, + callSource: command.callSource, + command, + timestamp: command.timestamp, + expected: values.expected ?? read.expected, + actual: values.actual ?? read.actual + } + ] + }) + .sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0)) +} + +/** + * Build the Errors-tab list from the live/player contexts. + * + * Command failures come first (time-ordered) because they carry the clickable + * action; a failed test that only echoes a command's message is dropped so the + * same failure isn't listed twice (e.g. a Cucumber `Then` fails as both the + * assertion command and the scenario). + */ +export function collectErrors( + commands: CommandLog[] | undefined, + suites: Record[] | undefined +): CollectedError[] { + const fromCommands = commandErrors(commands) + const seenMessages = new Set(fromCommands.map((e) => e.message)) + + const fromTests = collectFailedTests(suites).flatMap((test) => { + const read = readError(test.error ?? test.errors?.[0]) + if (!read || seenMessages.has(read.message)) { + return [] + } + return [ + { + title: test.fullTitle || test.title || test.uid, + message: read.message, + stack: read.stack, + callSource: test.callSource, + expected: read.expected, + actual: read.actual + } + ] + }) + + return [...fromCommands, ...fromTests] +} diff --git a/packages/app/src/components/workbench/source.ts b/packages/app/src/components/workbench/source.ts index fcdb6fe5..5b336bda 100644 --- a/packages/app/src/components/workbench/source.ts +++ b/packages/app/src/components/workbench/source.ts @@ -110,13 +110,11 @@ export class DevtoolsSource extends Element { ) } - /** File to show: an explicit selection/call-site, else the first available. */ + /** File to show: an explicit selection/call-site wins even when it wasn't + * captured as a source (the toolbar then shows a not-captured state instead + * of silently falling back to a different file), else the first available. */ get #effectiveFile(): string | undefined { - const files = this.#fileList - if (this.activeFile && files.includes(this.activeFile)) { - return this.activeFile - } - return files[0] + return this.activeFile ?? this.#fileList[0] } #contentFor(file: string): string | undefined { From 7df73018d07b7de3aefa65c104f78266ce6a962f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 10:57:11 +0530 Subject: [PATCH 015/109] fix(service,nightwatch): distinct rerun-stable uids for Cucumber steps and outline rows --- .../src/helpers/cucumberScenarioBuilder.ts | 12 +++- packages/service/src/reporter.ts | 45 ++++++++++-- packages/service/tests/reporter.test.ts | 72 +++++++++++++++++++ 3 files changed, 120 insertions(+), 9 deletions(-) diff --git a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts index 9ea426e9..54ab1da3 100644 --- a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts +++ b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts @@ -57,7 +57,9 @@ function buildScenarioStepTest( ? `${featureAbsPath}:${stepLines[i]}` : undefined return { - uid: deterministicUid(featureUri, `step:${scenarioName}:${step.text}`), + // Scope by the scenario uid (which carries the scenario line) so identical + // step text in sibling scenarios and outline example rows stays distinct. + uid: deterministicUid(featureUri, `step:${scenarioUid}:${step.text}`), cid: DEFAULTS.CID, title: stepLabel, fullTitle: `${scenarioName} ${stepLabel}`, @@ -87,8 +89,12 @@ export function buildCucumberScenarioSuite( parentFeatureSuiteUid } = input // deterministicUid (no counter) so the SAME scenario gets the SAME uid - // across retries — that's what makes retry-coalescing work upstream. - const scenarioUid = deterministicUid(featureUri, `scenario:${scenarioName}`) + // across retries — that's what makes retry-coalescing work upstream. The + // scenario line disambiguates outline example rows that share a name. + const scenarioUid = deterministicUid( + featureUri, + `scenario:${scenarioName}:${scenarioLine}` + ) const scenarioSuite: SuiteStats = { uid: scenarioUid, cid: DEFAULTS.CID, diff --git a/packages/service/src/reporter.ts b/packages/service/src/reporter.ts index ad792131..801a86ad 100644 --- a/packages/service/src/reporter.ts +++ b/packages/service/src/reporter.ts @@ -26,8 +26,13 @@ function isScenario(item: SuiteStats | TestStats): boolean { // Generate stable UID for a WDIO suite/test stats object. Handles WDIO's // Cucumber-specific shapes (scenarios with featureFile/featureLine, or with // numeric uid + example-row fallback), then delegates the Mocha/Jasmine path -// to core's generateStableUid. -function generateStableUid(item: SuiteStats | TestStats): string { +// to core's generateStableUid. `parentScope` (the owning scenario's stable +// uid) disambiguates Cucumber steps so identical step text in sibling +// scenarios yields distinct, rerun-stable uids. +function generateStableUid( + item: SuiteStats | TestStats, + parentScope?: string +): string { // For Cucumber scenarios, prefer the feature file URI:line as the stable // discriminator. The Cucumber pickle carries the actual line of the example // row, which is stable across reruns regardless of how many examples run. @@ -60,11 +65,25 @@ function generateStableUid(item: SuiteStats | TestStats): string { ) } + // Cucumber step: scope by the owning scenario's stable uid via + // deterministicUid (no run-order counter), so two scenarios sharing step + // text — and scenario-outline example rows — get distinct, rerun-stable uids. + const stepFile = 'file' in item ? (item.file ?? '') : '' + if (parentScope) { + return deterministicUid( + stepFile, + parentScope, + String(item.fullTitle || item.title) + ) + } + // For Mocha/Jasmine tests and suites, use only stable identifiers // that don't change between full and partial runs // DO NOT use cid or parent as they can vary based on run context - const file = 'file' in item ? (item.file ?? '') : '' - return generateStableUidByFileName(file, String(item.fullTitle || item.title)) + return generateStableUidByFileName( + stepFile, + String(item.fullTitle || item.title) + ) } /** @@ -154,6 +173,9 @@ export class TestReporter extends WebdriverIOReporter { #loadSource: (location: string) => void #currentSpecFile?: string #suitePath: string[] = [] + /** Stable uid of the Cucumber scenario currently open, used to scope its + * step uids. Undefined outside a scenario (Mocha/Jasmine). */ + #currentScenarioUid?: string constructor( options: Reporters.Options, @@ -205,6 +227,11 @@ export class TestReporter extends WebdriverIOReporter { // Generate stable UID for consistent identification across reruns suiteStats.uid = generateStableUid(suiteStats) + // Track the open Cucumber scenario so its steps scope their uids to it. + if (isScenario(suiteStats)) { + this.#currentScenarioUid = suiteStats.uid + } + this.#currentSpecFile = suiteStats.file setCurrentSpecFile(suiteStats.file) @@ -252,8 +279,10 @@ export class TestReporter extends WebdriverIOReporter { this.#loadSource(testStats.file) } - // Generate stable UID after enriching metadata for consistent test identification - testStats.uid = generateStableUid(testStats) + // Generate stable UID after enriching metadata for consistent test + // identification. Cucumber steps are scoped by their scenario's uid so + // identical step text across scenarios stays distinct. + testStats.uid = generateStableUid(testStats, this.#currentScenarioUid) this.#sendUpstream() } @@ -290,6 +319,10 @@ export class TestReporter extends WebdriverIOReporter { onSuiteEnd(suiteStats: SuiteStats): void { super.onSuiteEnd(suiteStats) + // Stop scoping steps once the owning scenario closes. + if (isScenario(suiteStats) && suiteStats.uid === this.#currentScenarioUid) { + this.#currentScenarioUid = undefined + } // Pop the suite we pushed on start if ( suiteStats.title && diff --git a/packages/service/tests/reporter.test.ts b/packages/service/tests/reporter.test.ts index 03461046..bdaccdca 100644 --- a/packages/service/tests/reporter.test.ts +++ b/packages/service/tests/reporter.test.ts @@ -324,4 +324,76 @@ describe('TestReporter - Rerun & Stable UID', () => { expect(() => reporter.report).not.toThrow() }) }) + + describe('Cucumber step uid scoping (no cross-scenario collision)', () => { + const FEATURE = '/proj/features/login.feature' + const STEP = + 'I should see a flash message saying You logged into a secure area!' + + const scenario = (title: string, line: number): SuiteStats => + ({ + uid: `raw-${title}`, + title, + fullTitle: `Login ${title}`, + file: FEATURE, + type: 'scenario', + argument: { uri: FEATURE, line } + }) as unknown as SuiteStats + + const step = (line: number): TestStats => + ({ + uid: 'raw-step', + title: STEP, + fullTitle: STEP, + file: FEATURE, + type: 'test', + argument: { uri: FEATURE, line } + }) as unknown as TestStats + + // Drive a scenario's step through the reporter and return the assigned uid. + const runStep = ( + r: TestReporter, + scen: SuiteStats, + stepStats: TestStats + ): string => { + r.onSuiteStart(scen) + r.onTestStart(stepStats) + r.onTestEnd(stepStats) + r.onSuiteEnd(scen) + return stepStats.uid + } + + it('gives identical step text in sibling scenarios distinct uids', () => { + const scenA = scenario('Scenario A', 5) + const scenB = scenario('Scenario B', 20) + const uidA = runStep(reporter, scenA, step(8)) + const uidB = runStep(reporter, scenB, step(23)) + expect(uidA).not.toBe(uidB) + }) + + it('keeps a step uid stable when its scenario is rerun alone', () => { + // Full run: scenario A then B. + const uidBFull = (() => { + runStep(reporter, scenario('Scenario A', 5), step(8)) + return runStep(reporter, scenario('Scenario B', 20), step(23)) + })() + + // Rerun scenario B on its own (fresh reporter resets the counter). A + // run-order-counter uid would shift to A's slot here; scoping by the + // scenario keeps it stable. + const reporter2 = new TestReporter( + { logFile: '/tmp/test.log' }, + sendUpstream as any + ) + const uidBAlone = runStep(reporter2, scenario('Scenario B', 20), step(23)) + + expect(uidBAlone).toBe(uidBFull) + }) + + it('distinguishes scenario-outline example rows (same title, different line)', () => { + const row1 = runStep(reporter, scenario('greet ', 10), step(11)) + const row2 = runStep(reporter, scenario('greet ', 14), step(15)) + expect(row1).not.toBe(row2) + }) + }) }) From 7ec3e0b1de4f497fdefa5632b1763f6d2ce7aadd Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 10:58:24 +0530 Subject: [PATCH 016/109] fix(core,service): collapse same-timestamp snapshots so blank frames don't clobber results --- packages/core/src/trace-snapshots.ts | 34 ++++- packages/service/src/snapshot-dedupe.ts | 20 +++ .../service/tests/dedupe-snapshots.test.ts | 124 +++++++++++++++++- 3 files changed, 174 insertions(+), 4 deletions(-) diff --git a/packages/core/src/trace-snapshots.ts b/packages/core/src/trace-snapshots.ts index 9e98704d..ab7ed3f5 100644 --- a/packages/core/src/trace-snapshots.ts +++ b/packages/core/src/trace-snapshots.ts @@ -16,10 +16,39 @@ export interface ScreencastFrameEvent { timestamp: number } +// Two snapshots at the same timestamp (a real post-action capture and a blank +// end-of-scenario one) map to the same `${pageId}-${ts}` resource name, so a +// last-wins write lets a blank frame clobber the real one — and the real +// screenshot and real elements can land on different captures. Collapse to one +// per timestamp: largest screenshot, richest metadata, merged across duplicates. +function collapseByTimestamp(snapshots: ActionSnapshot[]): ActionSnapshot[] { + const byTs = new Map() + const order: number[] = [] + for (const snap of snapshots) { + const existing = byTs.get(snap.timestamp) + if (!existing) { + byTs.set(snap.timestamp, { ...snap }) + order.push(snap.timestamp) + continue + } + if ((snap.screenshot?.length ?? 0) > (existing.screenshot?.length ?? 0)) { + existing.screenshot = snap.screenshot + } + if (!existing.elements?.length && snap.elements?.length) { + existing.elements = snap.elements + } + if (!existing.snapshotText && snap.snapshotText) { + existing.snapshotText = snap.snapshotText + } + } + return order.map((ts) => byTs.get(ts)!) +} + export function buildSnapshotResources( - snapshots: ActionSnapshot[], + rawSnapshots: ActionSnapshot[], pageId: string ): TraceZipResource[] { + const snapshots = collapseByTimestamp(rawSnapshots) const out: TraceZipResource[] = [] for (const snap of snapshots) { const base = `${pageId}-${snap.timestamp}` @@ -71,11 +100,12 @@ function frameForSnapshot( /** Filmstrip events; the first snapshot is re-anchored to t=0 for pre-interaction state. */ export function buildFilmstripEvents( - snapshots: ActionSnapshot[], + rawSnapshots: ActionSnapshot[], pageId: string, wallTime: number, viewport: { width: number; height: number } ): ScreencastFrameEvent[] { + const snapshots = collapseByTimestamp(rawSnapshots) const firstSnap = snapshots.find((s) => s.screenshot) const events: ScreencastFrameEvent[] = [] if (firstSnap) { diff --git a/packages/service/src/snapshot-dedupe.ts b/packages/service/src/snapshot-dedupe.ts index d7e14a00..5e51cccd 100644 --- a/packages/service/src/snapshot-dedupe.ts +++ b/packages/service/src/snapshot-dedupe.ts @@ -19,3 +19,23 @@ export function dedupeSnapshotsByTimestamp( } return [...best.values()].sort((a, b) => a.timestamp - b.timestamp) } + +/** Insert a snapshot, or — when one already shares its timestamp — keep only + * the richer screenshot, replacing in place to preserve any index ranges into + * the list. Applies the dedupe heuristic at capture time so a blank + * end-of-scenario frame can't clobber the last action's real result on export + * paths that don't run dedupeSnapshotsByTimestamp (e.g. per-spec traces). */ +export function upsertRichestSnapshot( + snapshots: ActionSnapshot[], + snap: ActionSnapshot +): void { + const idx = snapshots.findIndex((s) => s.timestamp === snap.timestamp) + if (idx === -1) { + snapshots.push(snap) + return + } + const existing = snapshots[idx]! + if ((snap.screenshot?.length ?? 0) > (existing.screenshot?.length ?? 0)) { + snapshots[idx] = snap + } +} diff --git a/packages/service/tests/dedupe-snapshots.test.ts b/packages/service/tests/dedupe-snapshots.test.ts index c33b9b38..d1ac50ee 100644 --- a/packages/service/tests/dedupe-snapshots.test.ts +++ b/packages/service/tests/dedupe-snapshots.test.ts @@ -1,6 +1,13 @@ +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' import { describe, it, expect } from 'vitest' -import type { ActionSnapshot } from '@wdio/devtools-shared' -import { dedupeSnapshotsByTimestamp } from '../src/snapshot-dedupe.js' +import { writeTraceZip, type TraceCapturer } from '@wdio/devtools-core' +import { TraceType, type ActionSnapshot } from '@wdio/devtools-shared' +import { + dedupeSnapshotsByTimestamp, + upsertRichestSnapshot +} from '../src/snapshot-dedupe.js' function snap(timestamp: number, screenshot: string): ActionSnapshot { return { timestamp, command: 'click', screenshot } @@ -34,3 +41,116 @@ describe('dedupeSnapshotsByTimestamp', () => { expect(dedupeSnapshotsByTimestamp([])).toEqual([]) }) }) + +describe('upsertRichestSnapshot', () => { + const blank = 'AA' + const content = 'A'.repeat(100) + + it("does not let a blank __final__ clobber the last action's real frame", () => { + // The last action's post-capture (real) and the end-of-scenario __final__ + // (blank) share the last action's timestamp; the real frame must survive. + const list: ActionSnapshot[] = [snap(50, content), snap(100, content)] + const final: ActionSnapshot = { + timestamp: 100, + command: '__final__', + screenshot: blank + } + upsertRichestSnapshot(list, final) + expect(list).toHaveLength(2) + expect(list[1].screenshot).toBe(content) + expect(list[1].command).toBe('click') + }) + + it('replaces in place when the final capture is richer', () => { + // Mirror the opposite case: the action was screenshotted mid-navigation + // (blank) and the settled __final__ is the real frame. + const list: ActionSnapshot[] = [snap(50, content), snap(100, blank)] + const final: ActionSnapshot = { + timestamp: 100, + command: '__final__', + screenshot: content + } + upsertRichestSnapshot(list, final) + expect(list).toHaveLength(2) + expect(list[1].screenshot).toBe(content) + expect(list[1].command).toBe('__final__') + }) + + it('preserves array length/indices on a timestamp collision', () => { + // Spec-range slicing indexes into this array, so a collision must never + // change its length — only replace in place or skip. + const list: ActionSnapshot[] = [snap(100, content)] + upsertRichestSnapshot(list, snap(100, blank)) + expect(list).toHaveLength(1) + }) + + it('appends when the timestamp is new', () => { + const list: ActionSnapshot[] = [snap(100, content)] + upsertRichestSnapshot(list, snap(200, blank)) + expect(list.map((s) => s.timestamp)).toEqual([100, 200]) + }) +}) + +describe('final-frame regression (capture → export)', () => { + it("exports the last action's real result, not the blank __final__ frame", async () => { + // Base64 payloads chosen so byte-length ranks blank < real < result and + // each round-trips cleanly through the resource writer's base64 decode. + const blank = 'AA' + const real = 'R'.repeat(200) + const result = 'B'.repeat(400) + + // The service builds pre/post captures per action; the last action's + // post-capture (result) collides on timestamp with the trailing __final__. + const snapshots: ActionSnapshot[] = [ + { timestamp: 1200, command: 'url', screenshot: real }, + { timestamp: 1200, command: 'click', screenshot: real }, + { timestamp: 1400, command: 'click', screenshot: result } + ] + upsertRichestSnapshot(snapshots, { + timestamp: 1400, + command: '__final__', + screenshot: blank + }) + const prepared = dedupeSnapshotsByTimestamp(snapshots) + + const capturer: TraceCapturer = { + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { command: 'url', args: [], timestamp: 1200, startTime: 1150 }, + { command: 'click', args: [], timestamp: 1400, startTime: 1350 } + ], + sources: new Map(), + metadata: { + type: TraceType.Testrunner, + viewport: { + width: 800, + height: 600, + offsetLeft: 0, + offsetTop: 0, + scale: 1 + } + }, + startWallTime: 1000 + } + + const outputDir = await fs.mkdtemp(path.join(os.tmpdir(), 'final-frame-')) + const dir = await writeTraceZip(capturer, { + outputDir, + sessionId: 'sess1234', + format: 'ndjson-directory', + actionSnapshots: prepared + }) + + const frame = await fs.readFile( + path.join(dir, 'resources', 'page@sess1234-1400.jpeg') + ) + // The last action's frame is the real result, never the blank capture. + expect(frame.toString('base64')).toBe(result) + expect(frame.length).not.toBe(Buffer.from(blank, 'base64').length) + + await fs.rm(outputDir, { recursive: true, force: true }) + }) +}) From 5c54ae4c69865a4ec23af508678f7b937a429211 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 11:00:47 +0530 Subject: [PATCH 017/109] chore: Added more actions to the action mapping to appear in the timeline --- packages/app/tests/errors-collect.test.ts | 337 ++++++++++++++++++++++ packages/shared/src/trace-actions.ts | 37 ++- 2 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 packages/app/tests/errors-collect.test.ts diff --git a/packages/app/tests/errors-collect.test.ts b/packages/app/tests/errors-collect.test.ts new file mode 100644 index 00000000..c92e3680 --- /dev/null +++ b/packages/app/tests/errors-collect.test.ts @@ -0,0 +1,337 @@ +import { describe, it, expect } from 'vitest' +import type { CommandLog } from '@wdio/devtools-shared' + +import { collectErrors } from '../src/components/workbench/errors/collect.js' +import type { + SuiteStatsFragment, + TestStatsFragment +} from '../src/controller/types.js' + +function command(overrides: Partial): CommandLog { + return { + command: 'click', + args: [], + timestamp: 0, + ...overrides + } +} + +function suiteMap( + ...suites: SuiteStatsFragment[] +): Record[] { + return [Object.fromEntries(suites.map((s) => [s.uid, s]))] +} + +function failedTest(overrides: Partial): TestStatsFragment { + return { + uid: 't1', + state: 'failed', + ...overrides + } +} + +describe('collectErrors', () => { + it('returns an empty list when nothing failed', () => { + expect(collectErrors([], [])).toEqual([]) + expect(collectErrors(undefined, undefined)).toEqual([]) + expect( + collectErrors( + [command({ command: 'click' })], + suiteMap({ + uid: 's1', + state: 'passed', + tests: [failedTest({ state: 'passed' })] + }) + ) + ).toEqual([]) + }) + + it('collects failed commands with title, message, stack and source', () => { + const errors = collectErrors( + [ + command({ + command: 'expect', + title: 'expect(el).toHaveText', + callSource: 'file:///spec.ts:12:3', + error: { + name: 'Error', + message: 'expected foo, got bar', + stack: 'at spec.ts:12' + }, + timestamp: 100 + }) + ], + [] + ) + expect(errors).toHaveLength(1) + expect(errors[0]).toMatchObject({ + title: 'expect(el).toHaveText', + message: 'expected foo, got bar', + stack: 'at spec.ts:12', + callSource: 'file:///spec.ts:12:3', + timestamp: 100 + }) + expect(errors[0].command?.command).toBe('expect') + }) + + it('falls back to the command name when there is no title', () => { + const [error] = collectErrors( + [ + command({ + command: 'navigateTo', + error: { name: 'Error', message: 'boom' } + }) + ], + [] + ) + expect(error.title).toBe('navigateTo') + }) + + it('orders command errors by timestamp', () => { + const errors = collectErrors( + [ + command({ + command: 'second', + error: { name: 'Error', message: 'b' }, + timestamp: 200 + }), + command({ + command: 'first', + error: { name: 'Error', message: 'a' }, + timestamp: 100 + }) + ], + [] + ) + expect(errors.map((e) => e.message)).toEqual(['a', 'b']) + }) + + it('collects failed tests from nested suites', () => { + const errors = collectErrors( + [], + suiteMap({ + uid: 'feature', + state: 'failed', + suites: [ + { + uid: 'scenario', + state: 'failed', + tests: [ + failedTest({ + uid: 'step-1', + title: 'Then it should pass', + fullTitle: 'Scenario > Then it should pass', + callSource: 'steps.ts:8:1', + error: { name: 'AssertionError', message: 'nope' } + }) + ] + } + ] + }) + ) + expect(errors).toHaveLength(1) + expect(errors[0]).toMatchObject({ + title: 'Scenario > Then it should pass', + message: 'nope', + callSource: 'steps.ts:8:1' + }) + expect(errors[0].command).toBeUndefined() + }) + + it('reads the first entry of errors[] when error is absent', () => { + const [error] = collectErrors( + [], + suiteMap({ + uid: 's', + state: 'failed', + tests: [ + failedTest({ + uid: 'a', + errors: [{ name: 'Error', message: 'from errors array' } as Error] + }) + ] + }) + ) + expect(error.message).toBe('from errors array') + }) + + it('ignores failed tests that carry no error payload', () => { + const errors = collectErrors( + [], + suiteMap({ + uid: 's', + state: 'failed', + tests: [failedTest({ uid: 'a' })] + }) + ) + expect(errors).toEqual([]) + }) + + it('dedupes a test failure that only echoes a command failure', () => { + const shared = 'expect(locator).toHaveText failed' + const errors = collectErrors( + [ + command({ + command: 'expect', + error: { name: 'Error', message: shared }, + timestamp: 5 + }) + ], + suiteMap({ + uid: 's', + state: 'failed', + tests: [ + failedTest({ + uid: 'a', + title: 'the scenario', + error: { name: 'Error', message: shared } + }) + ] + }) + ) + expect(errors).toHaveLength(1) + expect(errors[0].command?.command).toBe('expect') + }) + + it('keeps a distinct test failure alongside command failures', () => { + const errors = collectErrors( + [ + command({ + command: 'click', + error: { name: 'Error', message: 'click failed' }, + timestamp: 1 + }) + ], + suiteMap({ + uid: 's', + state: 'failed', + tests: [ + failedTest({ + uid: 'a', + title: 'setup', + error: { name: 'Error', message: 'hook failed' } + }) + ] + }) + ) + expect(errors.map((e) => e.message)).toEqual([ + 'click failed', + 'hook failed' + ]) + }) + + it('dedupes failed tests by uid across repeated suite maps', () => { + const test = failedTest({ + uid: 'dup', + title: 'flaky', + error: { name: 'Error', message: 'x' } + }) + const errors = collectErrors( + [], + [ + { s: { uid: 's', state: 'failed', tests: [test] } }, + { s: { uid: 's', state: 'failed', tests: [test] } } + ] + ) + expect(errors).toHaveLength(1) + }) + + it('strips ANSI, splits the stack, and pulls Expected/Received from a cucumber message', () => { + const raw = + 'Expect $(`#flash`) to have text\n\n' + + 'Expected: StringContaining "secure area"\n' + + 'Received: "invalid"\n' + + ' at World. (/specs/steps.ts:31:20)\n' + + ' at process.processTicksAndRejections (node:internal:104:5)' + const [error] = collectErrors( + [ + command({ + command: 'expect.assertion', + error: { name: 'Error', message: raw } + }) + ], + [] + ) + expect(error.message).toBe('Expect $(`#flash`) to have text') + expect(error.expected).toBe('StringContaining "secure area"') + expect(error.actual).toBe('"invalid"') + expect(error.stack).toContain('at World.') + expect(error.message).not.toContain('') + expect(error.message).not.toContain('at World') + }) + + it('extracts indented Expected/Received and dedents the value', () => { + const raw = + 'Expect $(`#flash`) to have text\n\n' + + ' Expected: StringContaining "secure area"\n' + + ' Received: "invalid!\n×"\n' + + ' at World. (/specs/steps.ts:31:20)' + const [error] = collectErrors( + [command({ command: 'getText', error: { name: 'Error', message: raw } })], + [] + ) + expect(error.message).toBe('Expect $(`#flash`) to have text') + expect(error.expected).toBe('StringContaining "secure area"') + expect(error.actual).toBe('"invalid!\n×"') + expect(error.stack).toContain('at World.') + }) + + it('extracts expected/received from an assertion command', () => { + const [error] = collectErrors( + [ + command({ + command: 'expect.toHaveText', + args: ['Your username is invalid!', 'You logged into a secure area!'], + error: { name: 'Error', message: 'text mismatch' } + }) + ], + [] + ) + expect(error.actual).toBe('Your username is invalid!') + expect(error.expected).toBe('You logged into a secure area!') + }) + + it('extracts expected/received from a failed-test matcher error', () => { + const [error] = collectErrors( + [], + suiteMap({ + uid: 's', + state: 'failed', + tests: [ + failedTest({ + uid: 'a', + title: 'the scenario', + error: { + name: 'Error', + message: 'mismatch', + expected: 42, + actual: 7 + } as unknown as Error + }) + ] + }) + ) + expect(error.expected).toBe('42') + expect(error.actual).toBe('7') + }) + + it('places command errors before test errors', () => { + const errors = collectErrors( + [ + command({ + command: 'click', + error: { name: 'Error', message: 'cmd' }, + timestamp: 999 + }) + ], + suiteMap({ + uid: 's', + state: 'failed', + tests: [ + failedTest({ uid: 'a', error: { name: 'Error', message: 'test' } }) + ] + }) + ) + expect(errors.map((e) => e.message)).toEqual(['cmd', 'test']) + }) +}) diff --git a/packages/shared/src/trace-actions.ts b/packages/shared/src/trace-actions.ts index bae73200..c3bd7462 100644 --- a/packages/shared/src/trace-actions.ts +++ b/packages/shared/src/trace-actions.ts @@ -33,6 +33,8 @@ export const TRACKED_ASSERT_METHODS = [ // assert. (node:assert), verify. (nightwatch soft variants), and // expect. (synthesized failing-matcher entries) all render as Assert. +// Only FAILING expect-webdriverio matchers reach the command log today (via the +// reporter); recording passing matchers needs a per-adapter capture change. const ASSERT_COMMAND_RE = /^(?:assert|verify|expect)\.(\w+)$/ export function mapAssertCommand(command: string): TraceAction | null { @@ -68,5 +70,38 @@ export const ACTION_MAP: Record = { execute: { class: 'Page', method: 'evaluate' }, executeAsync: { class: 'Page', method: 'evaluate' }, switchToFrame: { class: 'Frame', method: 'goto' }, - touchAction: { class: 'Element', method: 'tap' } + touchAction: { class: 'Element', method: 'tap' }, + // WDIO element reads — surfaced so query steps appear in the timeline the way + // locator queries do in standard trace viewers. Adapters already capture + // these; only the export allow-list kept them out. + getText: { class: 'Element', method: 'getText' }, + getValue: { class: 'Element', method: 'getValue' }, + getAttribute: { class: 'Element', method: 'getAttribute' }, + getProperty: { class: 'Element', method: 'getProperty' }, + getCSSProperty: { class: 'Element', method: 'getCSSProperty' }, + getTagName: { class: 'Element', method: 'getTagName' }, + getLocation: { class: 'Element', method: 'getLocation' }, + getSize: { class: 'Element', method: 'getSize' }, + isDisplayed: { class: 'Element', method: 'isDisplayed' }, + isExisting: { class: 'Element', method: 'isExisting' }, + isEnabled: { class: 'Element', method: 'isEnabled' }, + isSelected: { class: 'Element', method: 'isSelected' }, + isClickable: { class: 'Element', method: 'isClickable' }, + isFocused: { class: 'Element', method: 'isFocused' }, + // Explicit user-facing waits (not the internal polling loops behind them). + waitForDisplayed: { class: 'Element', method: 'waitForDisplayed' }, + waitForExist: { class: 'Element', method: 'waitForExist' }, + waitForEnabled: { class: 'Element', method: 'waitForEnabled' }, + waitForClickable: { class: 'Element', method: 'waitForClickable' }, + waitUntil: { class: 'Browser', method: 'waitForFunction' }, + // WDIO page/browser reads + getTitle: { class: 'Page', method: 'getTitle' }, + getUrl: { class: 'Page', method: 'getUrl' }, + getPageSource: { class: 'Page', method: 'getPageSource' }, + // Selenium read aliases — normalized onto the WDIO names above so both runners + // read identically. getText/getAttribute/getTagName/isDisplayed/isEnabled/ + // isSelected share the command name across runners and need no alias. + getCssValue: { class: 'Element', method: 'getCSSProperty' }, + getRect: { class: 'Element', method: 'getRect' }, + getCurrentUrl: { class: 'Page', method: 'getUrl' } } From 8f772f2414327cf08b564cfd633ee377d140a518 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 11:56:54 +0530 Subject: [PATCH 018/109] chore(examples): split wdio example into cucumber/ and mocha/ with shared page objects --- .../wdio/cucumber/features/login-fail.feature | 9 +++ .../{ => cucumber}/features/login.feature | 2 +- .../features/step-definitions/steps.ts | 4 +- examples/wdio/{ => cucumber}/wdio.conf.ts | 0 .../wdio/{ => cucumber}/wdio.mobile.conf.ts | 0 examples/wdio/cucumber/wdio.retention.conf.ts | 68 +++++++++++++++++++ .../wdio/{ => cucumber}/wdio.trace.conf.ts | 0 examples/wdio/mocha/specs/login-fail.e2e.ts | 17 +++++ examples/wdio/mocha/specs/login.e2e.ts | 26 +++++++ examples/wdio/mocha/wdio.conf.ts | 53 +++++++++++++++ examples/wdio/package.json | 9 ++- .../{features => }/pageobjects/login.page.ts | 0 .../wdio/{features => }/pageobjects/page.ts | 0 .../{features => }/pageobjects/secure.page.ts | 0 examples/wdio/tsconfig.json | 8 ++- 15 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 examples/wdio/cucumber/features/login-fail.feature rename examples/wdio/{ => cucumber}/features/login.feature (84%) rename examples/wdio/{ => cucumber}/features/step-definitions/steps.ts (89%) rename examples/wdio/{ => cucumber}/wdio.conf.ts (100%) rename examples/wdio/{ => cucumber}/wdio.mobile.conf.ts (100%) create mode 100644 examples/wdio/cucumber/wdio.retention.conf.ts rename examples/wdio/{ => cucumber}/wdio.trace.conf.ts (100%) create mode 100644 examples/wdio/mocha/specs/login-fail.e2e.ts create mode 100644 examples/wdio/mocha/specs/login.e2e.ts create mode 100644 examples/wdio/mocha/wdio.conf.ts rename examples/wdio/{features => }/pageobjects/login.page.ts (100%) rename examples/wdio/{features => }/pageobjects/page.ts (100%) rename examples/wdio/{features => }/pageobjects/secure.page.ts (100%) diff --git a/examples/wdio/cucumber/features/login-fail.feature b/examples/wdio/cucumber/features/login-fail.feature new file mode 100644 index 00000000..c8d325b8 --- /dev/null +++ b/examples/wdio/cucumber/features/login-fail.feature @@ -0,0 +1,9 @@ +Feature: Retention check — deliberately failing login + + # Logs in with bad credentials but asserts the SUCCESS message, so the Then + # step fails. Used to verify retain-on-failure keeps this spec's trace while + # dropping the passing login.feature. Reuses the existing step definitions. + Scenario: Failing assertion exercises retain-on-failure + Given I am on the login page + When I login with foobar and barfoo + Then I should see a flash message saying You logged into a secure area! diff --git a/examples/wdio/features/login.feature b/examples/wdio/cucumber/features/login.feature similarity index 84% rename from examples/wdio/features/login.feature rename to examples/wdio/cucumber/features/login.feature index e6dd0f87..8b9bcf9a 100644 --- a/examples/wdio/features/login.feature +++ b/examples/wdio/cucumber/features/login.feature @@ -8,5 +8,5 @@ Feature: The Internet Guinea Pig Website Examples: | username | password | message | - | tomsmith | SuperSecretPassword! | You logged into a secure area! | + | tomsmith | SuperSecretPassword1! | You logged into a secure area! | | foobar | barfoo | Your username is invalid! | diff --git a/examples/wdio/features/step-definitions/steps.ts b/examples/wdio/cucumber/features/step-definitions/steps.ts similarity index 89% rename from examples/wdio/features/step-definitions/steps.ts rename to examples/wdio/cucumber/features/step-definitions/steps.ts index 32522982..3367b631 100644 --- a/examples/wdio/features/step-definitions/steps.ts +++ b/examples/wdio/cucumber/features/step-definitions/steps.ts @@ -1,8 +1,8 @@ import { Given, When, Then, After } from '@wdio/cucumber-framework' import { browser, expect } from '@wdio/globals' -import LoginPage from '../pageobjects/login.page.js' -import SecurePage from '../pageobjects/secure.page.js' +import LoginPage from '../../../pageobjects/login.page.js' +import SecurePage from '../../../pageobjects/secure.page.js' const pages = { login: LoginPage diff --git a/examples/wdio/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts similarity index 100% rename from examples/wdio/wdio.conf.ts rename to examples/wdio/cucumber/wdio.conf.ts diff --git a/examples/wdio/wdio.mobile.conf.ts b/examples/wdio/cucumber/wdio.mobile.conf.ts similarity index 100% rename from examples/wdio/wdio.mobile.conf.ts rename to examples/wdio/cucumber/wdio.mobile.conf.ts diff --git a/examples/wdio/cucumber/wdio.retention.conf.ts b/examples/wdio/cucumber/wdio.retention.conf.ts new file mode 100644 index 00000000..a71b97bb --- /dev/null +++ b/examples/wdio/cucumber/wdio.retention.conf.ts @@ -0,0 +1,68 @@ +import path from 'node:path' + +// Disposable harness for verifying tracePolicy end-to-end. Runs one passing +// spec (login.feature) and one failing spec (login-fail.feature) at spec +// granularity so retain-on-failure can be seen dropping the passing spec's +// trace while keeping the failing one. Change `tracePolicy` below to try each. + +const __dirname = path.resolve(path.dirname(new URL(import.meta.url).pathname)) + +export const config: WebdriverIO.Config = { + runner: 'local', + tsConfigPath: './tsconfig.json', + + specs: ['./features/login.feature', './features/login-fail.feature'], + + maxInstances: 1, + + capabilities: [ + { + browserName: 'chrome', + browserVersion: '149.0.7827.201', // specify chromium browser version for testing + 'goog:chromeOptions': { + args: [ + '--headless', + '--disable-gpu', + '--remote-allow-origins=*', + '--window-size=1600,1200' + ] + } + } + ], + + logLevel: 'warn', + baseUrl: 'http://localhost', + waitforTimeout: 10000, + connectionRetryTimeout: 120000, + connectionRetryCount: 3, + + services: [ + [ + 'devtools', + { + mode: 'trace' as const, + traceGranularity: 'spec' as const + // tracePolicy: 'retain-on-failure' as const + } + ] + ], + + framework: 'cucumber', + reporters: ['spec'], + + cucumberOpts: { + require: [ + path.resolve(__dirname, 'features', 'step-definitions', 'steps.ts') + ], + backtrace: false, + requireModule: [], + dryRun: false, + failFast: false, + snippets: true, + source: true, + strict: false, + tagExpression: '', + timeout: 60000, + ignoreUndefinedDefinitions: false + } +} diff --git a/examples/wdio/wdio.trace.conf.ts b/examples/wdio/cucumber/wdio.trace.conf.ts similarity index 100% rename from examples/wdio/wdio.trace.conf.ts rename to examples/wdio/cucumber/wdio.trace.conf.ts diff --git a/examples/wdio/mocha/specs/login-fail.e2e.ts b/examples/wdio/mocha/specs/login-fail.e2e.ts new file mode 100644 index 00000000..b939a28b --- /dev/null +++ b/examples/wdio/mocha/specs/login-fail.e2e.ts @@ -0,0 +1,17 @@ +import { expect } from '@wdio/globals' + +import LoginPage from '../../pageobjects/login.page.js' +import SecurePage from '../../pageobjects/secure.page.js' + +// Deliberately failing — mirrors login-fail.feature, so the Errors tab and +// tracePolicy: 'retain-on-failure' have something to exercise. +describe('Login (failing)', () => { + it('asserts the wrong flash message so the run fails', async () => { + console.log('[TEST] submitting invalid credentials') + await LoginPage.open() + await LoginPage.login('foobar', 'barfoo') + await expect(SecurePage.flashAlert).toHaveText( + expect.stringContaining('You logged into a secure area!') + ) + }) +}) diff --git a/examples/wdio/mocha/specs/login.e2e.ts b/examples/wdio/mocha/specs/login.e2e.ts new file mode 100644 index 00000000..0282a744 --- /dev/null +++ b/examples/wdio/mocha/specs/login.e2e.ts @@ -0,0 +1,26 @@ +import { expect } from '@wdio/globals' + +import LoginPage from '../../pageobjects/login.page.js' +import SecurePage from '../../pageobjects/secure.page.js' + +describe('Login', () => { + it('logs into the secure area with valid credentials', async () => { + console.log('[TEST] logging in with valid credentials') + await LoginPage.open() + await LoginPage.login('tomsmith', 'SuperSecretPassword!') + await expect(SecurePage.flashAlert).toBeExisting() + await expect(SecurePage.flashAlert).toHaveText( + expect.stringContaining('You logged into a secure area!') + ) + console.log('[TEST] secure area reached') + }) + + it('shows an error message for an invalid username', async () => { + console.log('[TEST] logging in with an invalid username') + await LoginPage.open() + await LoginPage.login('foobar', 'barfoo') + await expect(SecurePage.flashAlert).toHaveText( + expect.stringContaining('Your username is invalid!') + ) + }) +}) diff --git a/examples/wdio/mocha/wdio.conf.ts b/examples/wdio/mocha/wdio.conf.ts new file mode 100644 index 00000000..474602e3 --- /dev/null +++ b/examples/wdio/mocha/wdio.conf.ts @@ -0,0 +1,53 @@ +import type { Options } from '@wdio/types' + +// Mocha counterpart to wdio.conf.ts (which runs the Cucumber example). Same +// capabilities and devtools service; only the framework + spec layout differ. +export const config: Options.Testrunner = { + runner: 'local', + autoCompileOpts: { + autoCompile: true, + tsNodeOpts: { + project: './tsconfig.json', + transpileOnly: true + } + }, + specs: ['./specs/**/*.e2e.ts'], + exclude: [], + maxInstances: 10, + capabilities: [ + { + browserName: 'chrome', + 'goog:chromeOptions': { + args: [ + '--headless', + '--disable-gpu', + '--remote-allow-origins=*', + '--window-size=1600,900' + ] + } + } + ], + logLevel: 'debug', + bail: 0, + baseUrl: 'http://localhost', + waitforTimeout: 10000, + connectionRetryTimeout: 120000, + connectionRetryCount: 3, + services: [ + [ + 'devtools', + { + mode: 'trace' as const, + traceGranularity: 'spec' as const + // tracePolicy: 'retain-on-failure' as const + // screencast: { enabled: true, pollIntervalMs: 200 } + } + ] + ], + framework: 'mocha', + reporters: ['spec'], + mochaOpts: { + ui: 'bdd', + timeout: 60000 + } +} diff --git a/examples/wdio/package.json b/examples/wdio/package.json index c783a577..4bbb0957 100644 --- a/examples/wdio/package.json +++ b/examples/wdio/package.json @@ -6,6 +6,7 @@ "devDependencies": { "@wdio/cli": "9.28.0", "@wdio/cucumber-framework": "9.28.0", + "@wdio/mocha-framework": "9.28.0", "@wdio/devtools-service": "workspace:*", "@wdio/globals": "9.28.0", "@wdio/local-runner": "9.28.0", @@ -18,8 +19,10 @@ "typescript": "^6.0.3" }, "scripts": { - "wdio": "wdio run ./wdio.conf.ts", - "mobile": "wdio run ./wdio.mobile.conf.ts", - "trace": "wdio run ./wdio.trace.conf.ts" + "cucumber": "wdio run ./cucumber/wdio.conf.ts", + "mocha": "wdio run ./mocha/wdio.conf.ts", + "mobile": "wdio run ./cucumber/wdio.mobile.conf.ts", + "trace": "wdio run ./cucumber/wdio.trace.conf.ts", + "retention": "wdio run ./cucumber/wdio.retention.conf.ts" } } diff --git a/examples/wdio/features/pageobjects/login.page.ts b/examples/wdio/pageobjects/login.page.ts similarity index 100% rename from examples/wdio/features/pageobjects/login.page.ts rename to examples/wdio/pageobjects/login.page.ts diff --git a/examples/wdio/features/pageobjects/page.ts b/examples/wdio/pageobjects/page.ts similarity index 100% rename from examples/wdio/features/pageobjects/page.ts rename to examples/wdio/pageobjects/page.ts diff --git a/examples/wdio/features/pageobjects/secure.page.ts b/examples/wdio/pageobjects/secure.page.ts similarity index 100% rename from examples/wdio/features/pageobjects/secure.page.ts rename to examples/wdio/pageobjects/secure.page.ts diff --git a/examples/wdio/tsconfig.json b/examples/wdio/tsconfig.json index 8acd81f7..8b8a6786 100644 --- a/examples/wdio/tsconfig.json +++ b/examples/wdio/tsconfig.json @@ -11,7 +11,8 @@ "node", "@wdio/globals/types", "expect-webdriverio", - "@wdio/cucumber-framework" + "@wdio/cucumber-framework", + "@wdio/mocha-framework" ], "skipLibCheck": true, "noEmit": true, @@ -24,7 +25,8 @@ "noFallthroughCasesInSwitch": true }, "include": [ - "test", - "wdio.conf.ts" + "cucumber", + "mocha", + "pageobjects" ] } From 28c3935af4474d926170e584dffc7faf5aa45f52 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 12:09:20 +0530 Subject: [PATCH 019/109] chore: Update path in readme and update pnpm-lock.yaml --- ARCHITECTURE.md | 2 +- README.md | 2 +- package.json | 3 +- pnpm-lock.yaml | 183 +++++++++++++++--------------------------------- 4 files changed, 60 insertions(+), 130 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6d4fecc0..1324f454 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -144,7 +144,7 @@ The execution environment is the browser, not Node, so this package cannot impor Per-framework demo projects used for manual verification. -- `examples/wdio/` — WebdriverIO with Mocha (default). Run via `pnpm demo:wdio`. +- `examples/wdio/` — WebdriverIO, split into `cucumber/` and `mocha/` (shared page objects in `pageobjects/`). Run via `pnpm demo:wdio` (Cucumber) or `pnpm demo:wdio:mocha`. - `examples/nightwatch/` — Nightwatch (both vanilla and Cucumber). Run via `pnpm demo:nightwatch`. - `examples/selenium/` — Selenium with subdirs for `mocha-test/`, `jest-test/`, `cucumber-test/`, `jasmine-test/`, `vitest-test/`. `pnpm demo:selenium` runs mocha; `pnpm --filter @wdio/selenium-devtools example:` runs the others. diff --git a/README.md b/README.md index 96e7adf8..fa87cc71 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ services: [[DevToolsHookService, { Adapters detect mobile sessions via `platformName: 'android' | 'ios'` (case-insensitive) and adjust the per-action snapshot to extract elements from the mobile XML tree instead of the DOM. The trace's `context-options` records `title: 'android' — ` / `'ios' — ` so the viewer labels frames correctly. -A reference WDIO config is at [examples/wdio/wdio.mobile.conf.ts](examples/wdio/wdio.mobile.conf.ts). Prereqs to run it end-to-end with a local emulator: +A reference WDIO config is at [examples/wdio/cucumber/wdio.mobile.conf.ts](examples/wdio/cucumber/wdio.mobile.conf.ts). Prereqs to run it end-to-end with a local emulator: 1. **Java JDK** — `brew install --cask temurin` 2. **Android SDK** — `brew install --cask android-commandlinetools` then `yes | sdkmanager --licenses && sdkmanager "platform-tools" "emulator" "system-images;android-34;google_apis_playstore;arm64-v8a"`. The brew cask installs sdkmanager under `/opt/homebrew/share/android-commandlinetools/`, and sdkmanager downloads other SDK pieces alongside it — set `ANDROID_HOME` to that path (not `~/Library/Android/sdk/`). diff --git a/package.json b/package.json index bc9b0dbe..46b8dd24 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "build": "pnpm -r build", - "demo:wdio": "wdio run ./examples/wdio/wdio.conf.ts", + "demo:wdio": "wdio run ./examples/wdio/cucumber/wdio.conf.ts", + "demo:wdio:mocha": "wdio run ./examples/wdio/mocha/wdio.conf.ts", "demo:nightwatch": "pnpm --filter @wdio/nightwatch-devtools example", "demo:selenium": "pnpm --filter @wdio/selenium-devtools example", "dev": "pnpm --parallel dev", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b338e0b8..a2354ac3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,6 +141,9 @@ importers: '@wdio/local-runner': specifier: 9.28.0 version: 9.28.0(@wdio/globals@9.28.0)(webdriverio@9.28.0(puppeteer-core@21.11.0)) + '@wdio/mocha-framework': + specifier: 9.28.0 + version: 9.28.0 '@wdio/spec-reporter': specifier: 9.28.0 version: 9.28.0 @@ -365,7 +368,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.0.16 - version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) packages/nightwatch-devtools: dependencies: @@ -1859,49 +1862,42 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.1.1': resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.1.1': resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.1.1': resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.1.1': resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.1.1': resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.1.1': resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@napi-rs/nice-openharmony-arm64@1.1.1': resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} @@ -2027,42 +2023,36 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.3': resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.3': resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.3': resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.3': resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.3': resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.3': resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} @@ -2133,79 +2123,66 @@ packages: resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.0': resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.0': resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.0': resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.0': resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.0': resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.0': resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.0': resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.0': resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.0': resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.0': resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.0': resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.0': resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.62.0': resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} @@ -2327,28 +2304,24 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.3.1': resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.3.1': resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.3.1': resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.3.1': resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==} @@ -2454,6 +2427,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + '@types/node@25.9.3': resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} @@ -2606,61 +2582,51 @@ packages: resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.12.2': resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} cpu: [loong64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-loong64-musl@1.12.2': resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} cpu: [loong64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.12.2': resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.12.2': resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] - libc: [musl] '@unrs/resolver-binding-openharmony-arm64@1.12.2': resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} @@ -2785,6 +2751,10 @@ packages: resolution: {integrity: sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==} engines: {node: '>=18.20.0'} + '@wdio/mocha-framework@9.28.0': + resolution: {integrity: sha512-UdkgigdyxJu0Rpx2ZRSNuB8u8B5nmLBeRjn5JHYTXBp8Ubi+wgFR1+EdLg8k2z+CtuYe3bNHBw7vPpBYuQMLZw==} + engines: {node: '>=18.20.0'} + '@wdio/protocols@8.40.3': resolution: {integrity: sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==} @@ -5262,28 +5232,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -7644,7 +7610,7 @@ snapshots: '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7803,7 +7769,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8484,7 +8450,7 @@ snapshots: '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -9168,7 +9134,7 @@ snapshots: '@puppeteer/browsers@2.13.2': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 @@ -9514,6 +9480,8 @@ snapshots: '@types/json5@0.0.29': {} + '@types/mocha@10.0.10': {} + '@types/node@25.9.3': dependencies: undici-types: 7.24.6 @@ -9584,7 +9552,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) eslint: 10.5.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: @@ -9594,7 +9562,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -9613,7 +9581,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/utils': 8.61.1(eslint@10.5.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) eslint: 10.5.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -9628,7 +9596,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.5 semver: 7.8.4 tinyglobby: 0.2.17 @@ -9767,14 +9735,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 @@ -9958,6 +9918,20 @@ snapshots: safe-regex2: 5.1.1 strip-ansi: 7.2.0 + '@wdio/mocha-framework@9.28.0': + dependencies: + '@types/mocha': 10.0.10 + '@types/node': 25.9.3 + '@wdio/logger': 9.18.0 + '@wdio/types': 9.28.0 + '@wdio/utils': 9.28.0 + mocha: 10.8.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + '@wdio/protocols@8.40.3': {} '@wdio/protocols@9.28.0': {} @@ -10084,7 +10058,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -11515,7 +11489,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -11632,7 +11606,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -11963,7 +11937,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -11971,7 +11945,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 8.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12167,35 +12141,35 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12492,7 +12466,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -13578,7 +13552,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -13590,7 +13564,7 @@ snapshots: pac-proxy-agent@9.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-uri: 8.0.0 http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 @@ -13880,7 +13854,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -13893,7 +13867,7 @@ snapshots: proxy-agent@8.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 lru-cache: 7.18.3 @@ -14413,7 +14387,7 @@ snapshots: socks-proxy-agent@10.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14421,7 +14395,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14630,7 +14604,7 @@ snapshots: cosmiconfig: 9.0.2(typescript@6.0.3) css-functions-list: 3.3.3 css-tree: 3.2.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 11.1.3 @@ -14893,7 +14867,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) esbuild: 0.27.7 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 @@ -15026,7 +15000,7 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@volar/typescript': 2.4.28 compare-versions: 6.1.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 1.2.1 magic-string: 0.30.21 @@ -15169,21 +15143,6 @@ snapshots: optionalDependencies: rollup: 4.62.0 - vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 - rolldown: 1.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 25.9.3 - esbuild: 0.27.7 - fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.22.4 - yaml: 2.9.0 - vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -15199,36 +15158,6 @@ snapshots: tsx: 4.22.4 yaml: 2.9.0 - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.9.3 - '@vitest/coverage-v8': 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) - happy-dom: 20.10.4 - jsdom: 24.1.3 - transitivePeerDependencies: - - msw - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 @@ -15271,7 +15200,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color From 18c97a33ed403eb8382df0b18a43b93a3e354667 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 12:09:49 +0530 Subject: [PATCH 020/109] fix(core): drop dependency-internal assertions from the trace --- packages/core/src/assert-patcher.ts | 5 ++ packages/core/tests/assert-patcher.test.ts | 62 +++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index ab30c1f7..8917a1ef 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -57,6 +57,11 @@ function makeAssertEmitters( onCommand: (cmd: CapturedAssert) => void ): { passed: () => void; failed: (err: unknown) => void } { const callInfo = getCallSourceFromStack() + // No user-code frame means the assert came from a dependency or framework + // internal, not the user's test — drop it so it never reaches the trace. + if (callInfo.filePath === undefined) { + return { passed: () => {}, failed: () => {} } + } const startedAt = Date.now() const sanitizedArgs = args.map(safeSerializeAssertArg) const emit = (result: 'passed' | undefined, error: Error | undefined) => diff --git a/packages/core/tests/assert-patcher.test.ts b/packages/core/tests/assert-patcher.test.ts index 641c2e59..86774967 100644 --- a/packages/core/tests/assert-patcher.test.ts +++ b/packages/core/tests/assert-patcher.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach } from 'vitest' +import { describe, it, expect, beforeEach, vi } from 'vitest' import assert from 'node:assert' import { ASSERT_PATCHED_SYMBOL, @@ -8,6 +8,19 @@ import { safeSerializeAssertArg, type CapturedAssert } from '../src/assert-patcher.js' +import { getCallSourceFromStack } from '../src/stack.js' + +// Stub the call-source resolver so tests choose whether an assert looks like +// it originated in user code (a frame) or a dependency/internal (no frame). +vi.mock('../src/stack.js', () => ({ + getCallSourceFromStack: vi.fn() +})) + +const USER_FRAME = { + filePath: '/specs/login.ts', + callSource: '/specs/login.ts:12:3' +} +const INTERNAL_FRAME = { filePath: undefined, callSource: 'unknown:0' } // Snapshot real methods once so each test starts from a fresh assert. const ASSERT_MUT = assert as unknown as Record @@ -21,6 +34,8 @@ beforeEach(() => { for (const m of TRACKED_ASSERT_METHODS) { ASSERT_MUT[m] = originals[m] } + // Default: every assert looks like it came from user code so captures fire. + vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) }) describe('safeSerializeAssertArg', () => { @@ -68,6 +83,51 @@ describe('patchNodeAssert', () => { expect(results).toEqual(['passed', undefined]) // first resolved, second rejected }) + // Only assertions that originate in user test code should reach the trace. + // Dependency/framework-internal asserts have no user-code frame on the + // stack (getCallSourceFromStack yields 'unknown:0') and must be dropped. + describe('user-origin filtering', () => { + it('drops a passing assert that has no user-code frame', () => { + vi.mocked(getCallSourceFromStack).mockReturnValue(INTERNAL_FRAME) + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + assert.equal(1, 1) + expect(captured).toHaveLength(0) + }) + + it('drops a failing internal assert but still re-throws', () => { + vi.mocked(getCallSourceFromStack).mockReturnValue(INTERNAL_FRAME) + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + expect(() => assert.equal(1, 2)).toThrow() + expect(captured).toHaveLength(0) + }) + + it('drops an internal async assert (rejects/doesNotReject)', async () => { + vi.mocked(getCallSourceFromStack).mockReturnValue(INTERNAL_FRAME) + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + await assert.doesNotReject(async () => 1) + await expect(assert.rejects(async () => 1)).rejects.toThrow() + expect(captured).toHaveLength(0) + }) + + it('keeps a user-origin assert and carries its callSource through', () => { + vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + assert.equal(1, 1) + expect(() => assert.equal(1, 2)).toThrow() + expect(captured).toHaveLength(2) + expect(captured[0]).toMatchObject({ + result: 'passed', + callSource: USER_FRAME.callSource + }) + expect(captured[1].result).toBeUndefined() + expect(captured[1].error).toBeInstanceOf(Error) + }) + }) + it('is idempotent — second patch is a no-op and sets the guard symbol', () => { const a: CapturedAssert[] = [] patchNodeAssert((c) => a.push(c)) From 625936a8b3604c044efeb52cfa584dbd296cf671 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 12:40:08 +0530 Subject: [PATCH 021/109] fix(service): give Cucumber scenario-outline rows distinct trace groups --- packages/service/src/action-snapshot.ts | 28 +++- packages/service/src/index.ts | 126 +++++++----------- packages/service/src/test-metadata.ts | 13 ++ packages/service/tests/trace-metadata.test.ts | 21 ++- 4 files changed, 108 insertions(+), 80 deletions(-) diff --git a/packages/service/src/action-snapshot.ts b/packages/service/src/action-snapshot.ts index 96cf60b4..12710114 100644 --- a/packages/service/src/action-snapshot.ts +++ b/packages/service/src/action-snapshot.ts @@ -8,9 +8,13 @@ // library. No external input reaches new Function() — the lint flag here is // a false positive given the closed input set. -import { captureActionSnapshot as coreCapture } from '@wdio/devtools-core' +import { + captureActionSnapshot as coreCapture, + mapCommandToAction +} from '@wdio/devtools-core' import type { ActionSnapshot } from '@wdio/devtools-shared' import { isNativeMobile, mobilePlatform } from './mobile.js' +import { INTERNAL_COMMANDS } from './constants.js' function reviveScript(src: string): () => unknown { // `src` from core/element-scripts is already a self-invoking IIFE @@ -55,6 +59,28 @@ export async function waitForActionResult( await browser.pause(250).catch(() => undefined) } +/** Post-action capture: settle the resulting page, screenshot it, and push the + * snapshot stamped at the latest logged action. No-op for internal/non-mapped + * commands. Skipped by the caller outside trace mode. */ +export async function captureActionResult( + browser: WebdriverIO.Browser, + command: string, + actionSnapshots: ActionSnapshot[], + stampTimestamp: () => number +): Promise { + if (!mapCommandToAction(command) || INTERNAL_COMMANDS.includes(command)) { + return + } + if (!isNativeMobile(browser)) { + await waitForActionResult(browser) + } + const snap = await captureActionSnapshot(browser, command) + if (snap) { + snap.timestamp = stampTimestamp() + actionSnapshots.push(snap) + } +} + export function captureActionSnapshot( browser: WebdriverIO.Browser, command: string diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index f3388600..c2af6580 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -1,7 +1,6 @@ /// import logger from '@wdio/logger' import { - deterministicUid, errorMessage, finalizeScreencast, finalizeTraceExport, @@ -14,11 +13,15 @@ import { type TraceExportContext } from '@wdio/devtools-core' import { captureExpectFailure, wireAssertCapture } from './assert-capture.js' -import { stampTestState, testMetadataUid } from './test-metadata.js' +import { + cucumberScenarioUid, + stampTestState, + testMetadataUid +} from './test-metadata.js' import { resolveCallSourceFromFrame } from './call-source.js' import { - captureActionSnapshot, - waitForActionResult + captureActionResult, + captureActionSnapshot } from './action-snapshot.js' import { dedupeSnapshotsByTimestamp, @@ -128,6 +131,21 @@ export default class DevToolsHookService implements Services.ServiceInstance { ) } + /** Record a spec boundary (spec granularity) and flush the previous spec. */ + #recordBoundary(specFile: string | undefined): void { + if (!specFile) { + return + } + const prevRange = recordSpecBoundary( + this.#boundaryContext, + specFile, + this.#options.traceGranularity + ) + if (prevRange) { + this.#fireAndForgetFlush(prevRange) + } + } + /** Assemble the framework-agnostic trace-export context from this service's * state. Output dir ignores the spec range — WDIO writes next to config. */ #traceContext(browser: WebdriverIO.Browser): TraceExportContext { @@ -286,33 +304,24 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** - * Hook for Cucumber framework. - * Detects feature-file boundaries for per-spec tracing and tags commands - * with a stable testUid so tracingGroup spans render in the trace output. - * WDIO passes the Cucumber World as the first argument. - */ - beforeScenario(world?: { pickle?: { uri?: string; name?: string } }) { + /** Cucumber hook: records feature-file boundaries and tags commands with a stable testUid. */ + beforeScenario(world?: { + pickle?: { uri?: string; name?: string; astNodeIds?: readonly string[] } + }) { this.resetStack() const featureFile = world?.pickle?.uri const scenarioName = world?.pickle?.name - // ── Per-spec boundary detection (Cucumber) ── - if (featureFile) { - const prevRange = recordSpecBoundary( - this.#boundaryContext, - featureFile, - this.#options.traceGranularity - ) - if (prevRange) { - this.#fireAndForgetFlush(prevRange) - } - } + this.#recordBoundary(featureFile) // ── Test identity for command tagging ── if (featureFile && scenarioName) { - const uid = deterministicUid(featureFile, scenarioName) + const uid = cucumberScenarioUid( + featureFile, + scenarioName, + world?.pickle?.astNodeIds + ) this.#currentTestUid = uid this.#testMetadata.set(uid, { title: scenarioName, @@ -321,28 +330,11 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** - * Hook for Mocha/Jasmine frameworks. - * It does the exact same thing as beforeScenario. - */ + /** Mocha/Jasmine hook: the beforeScenario equivalent for file-based specs. */ beforeTest(test?: { file?: string; title?: string; fullTitle?: string }) { this.resetStack() - const newSpec = test?.file - - // ── Per-spec boundary detection ── - // Only tracked when traceGranularity is 'spec'. Records array index - // ranges so #flushSpecTrace can slice the accumulated data per spec. - if (newSpec) { - const prevRange = recordSpecBoundary( - this.#boundaryContext, - newSpec, - this.#options.traceGranularity - ) - if (prevRange) { - this.#fireAndForgetFlush(prevRange) - } - } + this.#recordBoundary(test?.file) // Track test identity for command tagging. Generate a stable UID // from file + title so commands can be partitioned across reruns. @@ -381,12 +373,15 @@ export default class DevToolsHookService implements Services.ServiceInstance { } async afterScenario( - world?: { pickle?: { uri?: string; name?: string } }, + world?: { + pickle?: { uri?: string; name?: string; astNodeIds?: readonly string[] } + }, result?: { error?: unknown; passed?: boolean; skipped?: boolean } ) { - const { uri, name } = world?.pickle ?? {} + const { uri, name, astNodeIds } = world?.pickle ?? {} if (uri && name) { - stampTestState(this.#testMetadata, deterministicUid(uri, name), result) + const uid = cucumberScenarioUid(uri, name, astNodeIds) + stampTestState(this.#testMetadata, uid, result) } await this.#finalizePerScenario() } @@ -434,38 +429,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { return Date.now() } - // Post-action capture: the state RESULTING from the action just completed. - // The pre-action capture in beforeCommand only records the state before the - // NEXT mapped action — when intervening commands (assertions, reloadSession) - // change the page first, an action's result (e.g. the page a click navigated - // to) is never captured. - // - // readyState alone is unreliable: right after a click the OLD document still - // reports 'complete', so a naive wait snapshots a blank mid-navigation frame. - // Instead, beforeCommand tags the document; if the tag is gone the action - // navigated, so we wait for the NEW document to finish loading AND render - // content before screenshotting its destination. Stamped at this command's - // own end (the latest logged action). - async #captureActionResult(command: string): Promise { - if ( - this.#options.mode !== 'trace' || - !this.#browser || - !mapCommandToAction(command) || - INTERNAL_COMMANDS.includes(command) - ) { - return - } - const browser = this.#browser - if (!isNativeMobile(browser)) { - await waitForActionResult(browser) - } - const snap = await captureActionSnapshot(browser, command) - if (snap) { - snap.timestamp = this.#lastActionTimestamp() - this.#actionSnapshots.push(snap) - } - } - private resetStack() { this.#commandStack = [] this.#sessionCapturer.resetLastSelector() @@ -574,7 +537,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { frame.startTimestamp, this.#currentTestUid ) - await this.#captureActionResult(command) + if (this.#options.mode === 'trace') { + await captureActionResult( + this.#browser, + command, + this.#actionSnapshots, + () => this.#lastActionTimestamp() + ) + } return captured } } diff --git a/packages/service/src/test-metadata.ts b/packages/service/src/test-metadata.ts index bf802762..339e1dc1 100644 --- a/packages/service/src/test-metadata.ts +++ b/packages/service/src/test-metadata.ts @@ -13,6 +13,19 @@ export function testMetadataUid( return file ? deterministicUid(file, title) : title } +/** Scenario key that separates scenario-outline example rows: they share a + * name, so the pickle's astNodeIds (distinct per row, stable across reruns) + * are folded in. beforeScenario and afterScenario derive it identically. */ +export function cucumberScenarioUid( + uri: string, + name: string, + astNodeIds?: readonly string[] +): string { + return astNodeIds?.length + ? deterministicUid(uri, name, astNodeIds.join(':')) + : deterministicUid(uri, name) +} + /** Canonical test state from a WDIO afterTest/afterScenario result. */ export function resultToState(result: { passed?: boolean diff --git a/packages/service/tests/trace-metadata.test.ts b/packages/service/tests/trace-metadata.test.ts index 044067c2..fe88dc1a 100644 --- a/packages/service/tests/trace-metadata.test.ts +++ b/packages/service/tests/trace-metadata.test.ts @@ -1,7 +1,11 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as DevtoolsCore from '@wdio/devtools-core' import { deterministicUid } from '@wdio/devtools-core' -import { resultToState, testMetadataUid } from '../src/test-metadata.js' +import { + cucumberScenarioUid, + resultToState, + testMetadataUid +} from '../src/test-metadata.js' // Captures the ctx handed to finalizeTraceExport so the test can inspect the // state stamped onto testMetadata and the policy that flowed in. @@ -36,6 +40,7 @@ vi.mock('../src/session.js', () => ({ // Keep the after* hooks from touching a real browser/CDP. vi.mock('../src/action-snapshot.js', () => ({ captureActionSnapshot: vi.fn().mockResolvedValue(null), + captureActionResult: vi.fn().mockResolvedValue(undefined), waitForActionResult: vi.fn().mockResolvedValue(undefined) })) @@ -66,6 +71,20 @@ describe('test-metadata helpers', () => { ) expect(testMetadataUid(undefined, 'renders')).toBe('renders') }) + + it('cucumberScenarioUid separates outline rows sharing a name by astNodeIds', () => { + const uri = '/proj/features/login.feature' + const row1 = cucumberScenarioUid(uri, 'log in', ['node-1']) + const row2 = cucumberScenarioUid(uri, 'log in', ['node-2']) + // Distinct example rows → distinct uids (so they render as separate groups). + expect(row1).not.toBe(row2) + // A rerun of the same row → same uid (retry-coalescing stays intact). + expect(cucumberScenarioUid(uri, 'log in', ['node-1'])).toBe(row1) + // No astNodeIds → plain name-based uid. + expect(cucumberScenarioUid(uri, 'log in')).toBe( + deterministicUid(uri, 'log in') + ) + }) }) describe('DevtoolsService - afterTest state stamping', () => { From d553a22cdb6c45d178e89d218c92805418953bb3 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Wed, 8 Jul 2026 14:04:09 +0530 Subject: [PATCH 022/109] fix(service): show waits as actions and suppress their internal polling --- examples/wdio/cucumber/wdio.conf.ts | 6 +++-- examples/wdio/mocha/wdio.conf.ts | 6 +++-- packages/service/src/constants.ts | 2 -- packages/service/tests/index.test.ts | 33 ++++++++++++++++++---------- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/examples/wdio/cucumber/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts index b6305819..68f7ee8b 100644 --- a/examples/wdio/cucumber/wdio.conf.ts +++ b/examples/wdio/cucumber/wdio.conf.ts @@ -54,7 +54,9 @@ export const config: Options.Testrunner = { // and 30 processes will get spawned. The property handles how many capabilities // from the same test should run tests. // - maxInstances: 10, + // Live mode drives a single-session dashboard; >1 worker streams two feature + // files into it at once and neither renders cleanly. One instance = readable demo. + maxInstances: 1, // // If you have trouble getting all important capabilities together, check out the // Sauce Labs platform configurator - a great tool to configure your capabilities: @@ -131,7 +133,7 @@ export const config: Options.Testrunner = { [ 'devtools', { - mode: 'trace' as const, + mode: 'live' as const, screencast: { enabled: true, pollIntervalMs: 200 } } ] diff --git a/examples/wdio/mocha/wdio.conf.ts b/examples/wdio/mocha/wdio.conf.ts index 474602e3..7ccee43f 100644 --- a/examples/wdio/mocha/wdio.conf.ts +++ b/examples/wdio/mocha/wdio.conf.ts @@ -13,7 +13,9 @@ export const config: Options.Testrunner = { }, specs: ['./specs/**/*.e2e.ts'], exclude: [], - maxInstances: 10, + // Live mode drives a single-session dashboard; >1 worker streams two sessions + // into it at once and neither renders cleanly. One instance = readable demo. + maxInstances: 1, capabilities: [ { browserName: 'chrome', @@ -37,7 +39,7 @@ export const config: Options.Testrunner = { [ 'devtools', { - mode: 'trace' as const, + mode: 'live' as const, traceGranularity: 'spec' as const // tracePolicy: 'retain-on-failure' as const // screencast: { enabled: true, pollIntervalMs: 200 } diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index 46e38878..a30f6e3a 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -43,7 +43,6 @@ export const INTERNAL_COMMANDS = [ 'emit', 'browsingContextLocateNodes', 'browsingContextNavigate', - 'waitUntil', 'getTitle', 'getUrl', 'getWindowSize', @@ -51,7 +50,6 @@ export const INTERNAL_COMMANDS = [ 'deleteSession', 'findElementFromShadowRoot', 'findElementsFromShadowRoot', - 'waitForExist', 'browsingContextGetTree', 'scriptCallFunction', 'getElement', diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index 0ce30b79..5ce1e1f5 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -106,13 +106,7 @@ describe('DevtoolsService - Internal Command Filtering', () => { describe('beforeCommand', () => { it('should not add internal commands to command stack', () => { - const internalCommands = [ - 'getTitle', - 'waitUntil', - 'getUrl', - 'execute', - 'findElement' - ] + const internalCommands = ['getTitle', 'getUrl', 'execute', 'findElement'] internalCommands.forEach((cmd) => service.beforeCommand(cmd as any, [])) expect(true).toBe(true) }) @@ -138,19 +132,34 @@ describe('DevtoolsService - Internal Command Filtering', () => { executeCommand('url', ['https://example.com']) executeCommand('getTitle', [], 'Page Title') // internal executeCommand('click', ['.button']) - executeCommand('waitUntil', [expect.any(Function)], true) // internal + executeCommand('waitUntil', [expect.any(Function)], true) // a user wait executeCommand('getText', ['.result'], 'Success') - // Only user commands (url, click, getText) should be captured - expect(mockSessionCapturerInstance.afterCommand).toHaveBeenCalledTimes(3) + // getTitle is internal; the rest — including the wait — are user actions. + expect(mockSessionCapturerInstance.afterCommand).toHaveBeenCalledTimes(4) const capturedCommands = mockSessionCapturerInstance.afterCommand.mock.calls.map( (call) => call[1] ) - expect(capturedCommands).toEqual(['url', 'click', 'getText']) + expect(capturedCommands).toEqual(['url', 'click', 'waitUntil', 'getText']) expect(capturedCommands).not.toContain('getTitle') - expect(capturedCommands).not.toContain('waitUntil') + }) + + it('captures a wait once and suppresses the commands it polls', () => { + // waitUntil opens; its predicate polls isDisplayed while the wait is + // still on the stack, so those polls are top-level-suppressed. + service.beforeCommand('waitUntil' as any, [expect.any(Function)]) + service.beforeCommand('isDisplayed' as any, []) + service.afterCommand('isDisplayed' as any, [], false) + service.beforeCommand('isDisplayed' as any, []) + service.afterCommand('isDisplayed' as any, [], true) + service.afterCommand('waitUntil' as any, [expect.any(Function)], true) + + const captured = mockSessionCapturerInstance.afterCommand.mock.calls.map( + (call) => call[1] + ) + expect(captured).toEqual(['waitUntil']) }) // Service-fired commands (preload injection, Puppeteer handle for CDP, From 56402065c9612b3b925d295f52c524f352d5177e Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:47:46 +0530 Subject: [PATCH 023/109] feat(core,adapters): capture per-test retry attempts for retry-aware policies --- packages/core/src/attempt-tracker.ts | 39 +++++ packages/core/src/index.ts | 1 + packages/core/src/trace-finalizer.ts | 11 +- packages/core/tests/attempt-tracker.test.ts | 46 ++++++ .../src/cucumber-lifecycle.ts | 26 ++-- .../src/helpers/cucumberScenarioBuilder.ts | 13 +- packages/nightwatch-devtools/src/index.ts | 53 ++++--- .../src/plugin-internals.ts | 6 + packages/nightwatch-devtools/src/reporter.ts | 22 ++- .../nightwatch-devtools/src/session-init.ts | 14 +- .../nightwatch-devtools/src/test-lifecycle.ts | 3 + .../nightwatch-devtools/src/trace-context.ts | 60 ++++++++ .../tests/attemptTracking.test.ts | 134 ++++++++++++++++++ .../src/helpers/testManager.ts | 21 ++- packages/selenium-devtools/src/index.ts | 54 +++---- .../src/runnerHooks/mocha.ts | 3 +- .../src/session-lifecycle.ts | 5 +- .../selenium-devtools/src/test-management.ts | 59 ++++++-- packages/selenium-devtools/src/types.ts | 51 ++----- packages/service/src/index.ts | 53 +++++-- packages/service/src/reporter.ts | 4 + packages/service/src/test-metadata.ts | 32 ++++- packages/service/tests/trace-metadata.test.ts | 51 +++++++ 23 files changed, 606 insertions(+), 155 deletions(-) create mode 100644 packages/core/src/attempt-tracker.ts create mode 100644 packages/core/tests/attempt-tracker.test.ts create mode 100644 packages/nightwatch-devtools/src/trace-context.ts create mode 100644 packages/nightwatch-devtools/tests/attemptTracking.test.ts diff --git a/packages/core/src/attempt-tracker.ts b/packages/core/src/attempt-tracker.ts new file mode 100644 index 00000000..e4915584 --- /dev/null +++ b/packages/core/src/attempt-tracker.ts @@ -0,0 +1,39 @@ +/** + * Framework-agnostic per-test attempt counting. Every supported runner + * re-enters its per-test start hook when a test is retried, so recording the + * same uid again yields an incremented attempt number (0-based: the first run + * is attempt 0, the first retry is attempt 1). This is the primary, + * runner-independent retry signal feeding `TestOutcome.attempt` for the + * retry-aware trace policies (see trace-retention.ts). + */ +export class TestAttemptTracker { + #attempts = new Map() + #sawRetry = false + + /** Record a starting test; returns its attempt number (0 first, +1 per rerun). */ + recordStart(uid: string): number { + const prior = this.#attempts.get(uid) + const attempt = prior === undefined ? 0 : prior + 1 + this.#attempts.set(uid, attempt) + if (attempt > 0) { + this.#sawRetry = true + } + return attempt + } + + /** Latest attempt recorded for `uid`, or undefined if it never started. */ + attemptFor(uid: string): number | undefined { + return this.#attempts.get(uid) + } + + /** True once any test has started more than once (a retry occurred). */ + get sawRetry(): boolean { + return this.#sawRetry + } + + /** Clear all state — used at session boundaries and reuse-mode reconnects. */ + reset(): void { + this.#attempts.clear() + this.#sawRetry = false + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index db5b315d..3c3325e2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,7 @@ export * from './action-mapping.js' export * from './action-snapshot.js' +export * from './attempt-tracker.js' export * from './with-timeout.js' export * from './assert-patcher.js' export * from './element-snapshot.js' diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index f0de3023..1750d3a4 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -40,6 +40,9 @@ export interface TraceExportContext { mode?: DevToolsMode /** undefined → treated as `on` (always retain) by the retention evaluator. */ policy?: TraceRetentionPolicy + /** True when the adapter fed real per-test attempt numbers (B4); retry-aware + * policies degrade to retain-on-failure when this is false. */ + attemptInfoAvailable?: boolean granularity?: TraceGranularity format?: TraceFormat capturer: TraceCapturer @@ -75,9 +78,9 @@ function toOutcomes(metadata: TestMetadataMap): TestOutcome[] { } /** - * Evaluate the retention policy for one trace slice. B4 supplies real attempt - * info; today `attemptInfoAvailable` is false and the default `on` policy - * always retains — but the decision is wired now so B3 only flips the option. + * Evaluate the retention policy for one trace slice. Adapters that feed real + * per-test attempt numbers also set `attemptInfoAvailable`; when they don't, + * retry-aware policies degrade to retain-on-failure (see trace-retention.ts). */ function shouldRetain( ctx: TraceExportContext, @@ -85,7 +88,7 @@ function shouldRetain( ): boolean { return shouldRetainTrace(ctx.policy, { outcomes: toOutcomes(metadata), - attemptInfoAvailable: false + attemptInfoAvailable: ctx.attemptInfoAvailable ?? false }).retain } diff --git a/packages/core/tests/attempt-tracker.test.ts b/packages/core/tests/attempt-tracker.test.ts new file mode 100644 index 00000000..5d9a44b4 --- /dev/null +++ b/packages/core/tests/attempt-tracker.test.ts @@ -0,0 +1,46 @@ +import { describe, it, expect } from 'vitest' +import { TestAttemptTracker } from '../src/attempt-tracker.js' + +describe('TestAttemptTracker', () => { + it('numbers the first start 0 and each rerun +1', () => { + const t = new TestAttemptTracker() + expect(t.recordStart('a')).toBe(0) + expect(t.recordStart('a')).toBe(1) + expect(t.recordStart('a')).toBe(2) + }) + + it('tracks attempts per uid independently', () => { + const t = new TestAttemptTracker() + expect(t.recordStart('a')).toBe(0) + expect(t.recordStart('b')).toBe(0) + expect(t.recordStart('a')).toBe(1) + expect(t.attemptFor('a')).toBe(1) + expect(t.attemptFor('b')).toBe(0) + }) + + it('attemptFor is undefined for an unseen uid', () => { + const t = new TestAttemptTracker() + expect(t.attemptFor('missing')).toBeUndefined() + }) + + it('sawRetry flips only after a second start of some test', () => { + const t = new TestAttemptTracker() + expect(t.sawRetry).toBe(false) + t.recordStart('a') + t.recordStart('b') + expect(t.sawRetry).toBe(false) + t.recordStart('a') + expect(t.sawRetry).toBe(true) + }) + + it('reset clears attempts and the retry flag', () => { + const t = new TestAttemptTracker() + t.recordStart('a') + t.recordStart('a') + expect(t.sawRetry).toBe(true) + t.reset() + expect(t.sawRetry).toBe(false) + expect(t.attemptFor('a')).toBeUndefined() + expect(t.recordStart('a')).toBe(0) + }) +}) diff --git a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts index afb8a832..201e2ca0 100644 --- a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts +++ b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts @@ -13,7 +13,11 @@ import logger from '@wdio/logger' import { errorMessage } from '@wdio/devtools-core' -import { WS_SCOPE } from '@wdio/devtools-shared' +import { + WS_SCOPE, + type CucumberPickle, + type CucumberPickleStep +} from '@wdio/devtools-shared' import type { SessionCapturer } from './session.js' import type { TestReporter } from './reporter.js' @@ -32,20 +36,8 @@ import { parseCucumberScenario } from './helpers/utils.js' const log = logger('@wdio/nightwatch-devtools:cucumber') -/** Minimal shapes for the Cucumber objects we touch. Cucumber's own types - * vary across major versions; we pin only fields we read. */ -export interface CucumberPickleStep { - text?: string - astNodeIds?: string[] - location?: { line?: number } -} -export interface CucumberPickle { - uri?: string - name?: string - location?: { line?: number } - astNodeIds?: string[] - steps?: CucumberPickleStep[] -} +/** Cucumber's result shape varies across major versions; we pin only the + * status field we read. Pickle shapes come from shared. */ export interface CucumberResult { status?: string } @@ -66,6 +58,7 @@ export interface CucumberLifecycleCtx { setCurrentStep(s: unknown): void getCurrentStep(): unknown setCurrentTest(t: unknown): void + recordAttempt(uid: string): number } type MutStep = { @@ -178,7 +171,8 @@ export async function initCucumberScenario( stepLines, stepKeywords, scenarioLine, - parentFeatureSuiteUid: featureSuite.uid + parentFeatureSuiteUid: featureSuite.uid, + recordAttempt: (uid) => ctx.recordAttempt(uid) }) attachScenarioToFeature(ctx, featureSuite, scenarioSuite) ctx.setCurrentScenarioSuite(scenarioSuite) diff --git a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts index 54ab1da3..b60d5ad4 100644 --- a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts +++ b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts @@ -21,6 +21,9 @@ export interface CucumberScenarioBuildInput { scenarioLine: number /** Parent feature-suite uid — scenarios nest under this. */ parentFeatureSuiteUid: string + /** Records the scenario start under its (retry-stable) uid and returns the + * 0-based attempt number stamped on every step. Omitted → attempt 0. */ + recordAttempt?: (scenarioUid: string) => number } /** @@ -36,6 +39,7 @@ export interface CucumberScenarioBuildInput { function buildScenarioStepTest( input: CucumberScenarioBuildInput, scenarioUid: string, + attempt: number, i: number ): SuiteStats['tests'][number] { const { @@ -69,7 +73,9 @@ function buildScenarioStepTest( end: null, type: 'test' as const, file: featureUri, - retries: 0, + // Scenario-level attempt from the tracker (0 first run, +1 per retry); + // flows to TestOutcome.attempt via collectSuiteTestMetadata. + retries: attempt, _duration: 0, hooks: [], callSource @@ -95,6 +101,7 @@ export function buildCucumberScenarioSuite( featureUri, `scenario:${scenarioName}:${scenarioLine}` ) + const attempt = input.recordAttempt?.(scenarioUid) ?? 0 const scenarioSuite: SuiteStats = { uid: scenarioUid, cid: DEFAULTS.CID, @@ -116,7 +123,9 @@ export function buildCucumberScenarioSuite( : undefined } for (let i = 0; i < steps.length; i++) { - scenarioSuite.tests.push(buildScenarioStepTest(input, scenarioUid, i)) + scenarioSuite.tests.push( + buildScenarioStepTest(input, scenarioUid, attempt, i) + ) } return scenarioSuite } diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index 41a6c404..e94877bc 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -7,20 +7,25 @@ import { fileURLToPath } from 'node:url' import { - collectSuiteTestMetadata, errorMessage, finalizeTraceExport, flushRangeTrace, recordSpecBoundary, - resolveAdapterOutputDir, + TestAttemptTracker, tracePolicyModeWarning, type SpecRange, type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' +import { buildTraceContext } from './trace-context.js' import { wireAssertCapture } from './helpers/assertCapture.js' import { stop as stopBackend } from '@wdio/devtools-backend' -import { REUSE_ENV, SCREENCAST_DEFAULTS } from '@wdio/devtools-shared' +import { + REUSE_ENV, + SCREENCAST_DEFAULTS, + type CucumberPickle, + type CucumberPickleStep +} from '@wdio/devtools-shared' import logger from '@wdio/logger' import { handleReuseMode, @@ -53,8 +58,6 @@ import { cucumberAfter as cucumberLifecycleAfter, cucumberBeforeStep as cucumberLifecycleBeforeStep, cucumberAfterStep as cucumberLifecycleAfterStep, - type CucumberPickle, - type CucumberPickleStep, type CucumberResult } from './cucumber-lifecycle.js' import { @@ -116,6 +119,10 @@ class NightwatchDevToolsPlugin { #bidiEnabled = false #bidiAttachAttempted = false + // Nightwatch `--retries` and cross-worker reruns may reset this in-process + // tracker; only retries that re-enter this process's start hook are counted. + #attemptTracker = new TestAttemptTracker() + constructor(options: DevToolsOptions = {}) { const mode = options.mode ?? 'live' const ignore = mode === 'trace' && options.screencast?.enabled === true @@ -286,7 +293,10 @@ class NightwatchDevToolsPlugin { clearExecutionData: () => { self.testReporter.clearExecutionData() self.suiteManager.clearExecutionData() + self.#attemptTracker.reset() }, + recordAttempt: (uid) => self.#attemptTracker.recordStart(uid), + attemptFor: (uid) => self.#attemptTracker.attemptFor(uid), buildMetadataOptions: () => self.#buildMetadataOptions(), ensureSessionInitialized: (b) => self.#ensureSessionInitialized(b), wrapBrowserOnce: (b) => self.#wrapBrowserOnce(b), @@ -544,24 +554,21 @@ class NightwatchDevToolsPlugin { /** Assemble the framework-agnostic trace-export context from plugin state. * Output dir ignores the spec range — nightwatch writes next to config. */ #traceContext(sessionId: string): TraceExportContext { - return { - mode: this.options.mode, - policy: this.options.tracePolicy, - granularity: this.options.traceGranularity, - format: this.options.traceFormat, - capturer: this.sessionCapturer, - actionSnapshots: this.sessionCapturer.actionSnapshots, - sessionId, - testMetadata: collectSuiteTestMetadata( - this.suiteManager.getAllSuites().values() - ), - ranges: this.#specRanges, - flushed: this.#flushedSpecs, - resolveOutputDir: () => - resolveAdapterOutputDir({ configPath: this.#configPath }), - awaitPending: this.sessionCapturer.snapshotCaptures, - log: (level, msg) => log[level](msg) - } + return buildTraceContext( + { + mode: this.options.mode, + policy: this.options.tracePolicy, + granularity: this.options.traceGranularity, + format: this.options.traceFormat, + capturer: this.sessionCapturer, + suites: this.suiteManager.getAllSuites().values(), + ranges: this.#specRanges, + flushed: this.#flushedSpecs, + configPath: this.#configPath, + log: (level, msg) => log[level](msg) + }, + sessionId + ) } async #writeTraceIfNeeded(): Promise { diff --git a/packages/nightwatch-devtools/src/plugin-internals.ts b/packages/nightwatch-devtools/src/plugin-internals.ts index afce58b4..1d4d45a2 100644 --- a/packages/nightwatch-devtools/src/plugin-internals.ts +++ b/packages/nightwatch-devtools/src/plugin-internals.ts @@ -73,4 +73,10 @@ export interface PluginInternals { testIcon(state: TestStats['state']): string setCucumberRunner(v: boolean): void getRerunLabel(): string | undefined + + /** Records a test/scenario start under its retry-stable uid; returns the + * 0-based attempt number (0 first run, +1 per rerun). */ + recordAttempt(uid: string): number + /** Latest attempt recorded for `uid`, or undefined if it never started. */ + attemptFor(uid: string): number | undefined } diff --git a/packages/nightwatch-devtools/src/reporter.ts b/packages/nightwatch-devtools/src/reporter.ts index a6e8282e..63626d27 100644 --- a/packages/nightwatch-devtools/src/reporter.ts +++ b/packages/nightwatch-devtools/src/reporter.ts @@ -1,5 +1,5 @@ import logger from '@wdio/logger' -import { TestReporterBase } from '@wdio/devtools-core' +import { TestReporterBase, type ReporterUpstream } from '@wdio/devtools-core' import { REUSE_ENV } from '@wdio/devtools-shared' import { DEFAULTS } from './constants.js' import { extractTestMetadata, generateStableUid } from './helpers/utils.js' @@ -11,6 +11,15 @@ export class TestReporter extends TestReporterBase { #currentSpecFile?: string #testNamesCache = new Map() #currentSuite?: SuiteStats + #attemptFor: (uid: string) => number | undefined + + constructor( + report: ReporterUpstream, + attemptFor: (uid: string) => number | undefined + ) { + super(report) + this.#attemptFor = attemptFor + } onSuiteStart(suiteStats: SuiteStats) { this.#currentSpecFile = suiteStats.file @@ -92,11 +101,12 @@ export class TestReporter extends TestReporterBase { cachedNames.forEach((testName) => { if (!processedTestNames.has(testName)) { + const uid = generateStableUid({ + file: suiteStats.file, + fullTitle: `${suiteStats.title} ${testName}` + } as TestStats) const skippedTest: TestStats = { - uid: generateStableUid({ - file: suiteStats.file, - fullTitle: `${suiteStats.title} ${testName}` - } as TestStats), + uid, cid: DEFAULTS.CID, title: testName, fullTitle: `${suiteStats.title} ${testName}`, @@ -106,7 +116,7 @@ export class TestReporter extends TestReporterBase { end: new Date(), type: 'test', file: suiteStats.file, - retries: DEFAULTS.RETRIES, + retries: this.#attemptFor(uid) ?? DEFAULTS.RETRIES, _duration: DEFAULTS.DURATION, hooks: [] } diff --git a/packages/nightwatch-devtools/src/session-init.ts b/packages/nightwatch-devtools/src/session-init.ts index 71a1c21b..2bccfc82 100644 --- a/packages/nightwatch-devtools/src/session-init.ts +++ b/packages/nightwatch-devtools/src/session-init.ts @@ -57,6 +57,7 @@ export interface SessionInitCtx { getCurrentTest(): unknown getCurrentScenarioSuite(): SuiteStats | null buildMetadataOptions(): unknown + attemptFor(uid: string): number | undefined } async function handleSessionChange( @@ -84,11 +85,14 @@ function initReporterChain(ctx: SessionInitCtx): void { // These must NOT be recreated on session change — doing so generates a // new feature suite with a fresh start timestamp, which DataManager sees // as a new run and wipes all accumulated commands. - ctx.testReporter = new TestReporter((suitesData) => { - if (ctx.sessionCapturer) { - ctx.sessionCapturer.sendUpstream('suites', suitesData) - } - }) + ctx.testReporter = new TestReporter( + (suitesData) => { + if (ctx.sessionCapturer) { + ctx.sessionCapturer.sendUpstream('suites', suitesData) + } + }, + (uid) => ctx.attemptFor(uid) + ) ctx.testManager = new TestManager(ctx.testReporter) ctx.suiteManager = new SuiteManager(ctx.testReporter) ctx.browserProxy = new BrowserProxy( diff --git a/packages/nightwatch-devtools/src/test-lifecycle.ts b/packages/nightwatch-devtools/src/test-lifecycle.ts index 4bbd52e6..5caf0537 100644 --- a/packages/nightwatch-devtools/src/test-lifecycle.ts +++ b/packages/nightwatch-devtools/src/test-lifecycle.ts @@ -41,6 +41,7 @@ export interface TestLifecycleCtx { incrementCount(state: TestStats['state']): void testIcon(state: TestStats['state']): string setCurrentTest(t: unknown): void + recordAttempt(uid: string): number } interface SuiteMetadata { @@ -124,6 +125,8 @@ export async function startNextTest( } const test = ctx.testManager.findTestInSuite(currentSuite, currentTestName) if (test) { + // Nightwatch has no per-test retry index; the tracker is the retry signal. + test.retries = ctx.recordAttempt(test.uid) test.state = TEST_STATE.RUNNING as TestStats['state'] test.start = new Date() test.end = null diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts new file mode 100644 index 00000000..1e451ac7 --- /dev/null +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -0,0 +1,60 @@ +/** + * Assembles the framework-agnostic trace-export context from plugin state. + * + * Extracted from `NightwatchDevToolsPlugin.#traceContext` so the assembly is + * unit-testable and to keep `index.ts` under the file-size cap. Both the + * per-spec boundary flush and the final trace write share this one builder. + */ + +import { + collectSuiteTestMetadata, + resolveAdapterOutputDir, + type SpecRange, + type TraceExportContext +} from '@wdio/devtools-core' +import type { SessionCapturer } from './session.js' +import type { + DevToolsMode, + SuiteStats, + TraceFormat, + TraceGranularity, + TraceRetentionPolicy +} from './types.js' + +export interface TraceContextInput { + mode: DevToolsMode + policy: TraceRetentionPolicy + granularity: TraceGranularity + format: TraceFormat + capturer: SessionCapturer + suites: Iterable + ranges: SpecRange[] + flushed: Set + configPath: string | undefined + log: (level: 'info' | 'warn', msg: string) => void +} + +export function buildTraceContext( + input: TraceContextInput, + sessionId: string +): TraceExportContext { + return { + mode: input.mode, + policy: input.policy, + granularity: input.granularity, + format: input.format, + capturer: input.capturer, + actionSnapshots: input.capturer.actionSnapshots, + sessionId, + testMetadata: collectSuiteTestMetadata(input.suites), + ranges: input.ranges, + flushed: input.flushed, + resolveOutputDir: () => + resolveAdapterOutputDir({ configPath: input.configPath }), + awaitPending: input.capturer.snapshotCaptures, + // Nightwatch feeds real per-test attempt numbers via TestAttemptTracker + // (B4), so retry-aware policies use per-test attempts, not the fallback. + attemptInfoAvailable: true, + log: input.log + } +} diff --git a/packages/nightwatch-devtools/tests/attemptTracking.test.ts b/packages/nightwatch-devtools/tests/attemptTracking.test.ts new file mode 100644 index 00000000..c08313c4 --- /dev/null +++ b/packages/nightwatch-devtools/tests/attemptTracking.test.ts @@ -0,0 +1,134 @@ +import { describe, it, expect, vi } from 'vitest' +import { + TestAttemptTracker, + collectSuiteTestMetadata +} from '@wdio/devtools-core' +import { buildCucumberScenarioSuite } from '../src/helpers/cucumberScenarioBuilder.js' +import { buildTraceContext } from '../src/trace-context.js' +import { startNextTest, type TestLifecycleCtx } from '../src/test-lifecycle.js' +import { TEST_STATE } from '../src/constants.js' +import type { SessionCapturer } from '../src/session.js' +import type { SuiteStats, TestStats } from '../src/types.js' + +function scenarioInput(recordAttempt: (uid: string) => number) { + return { + featureUri: 'login.feature', + scenarioName: 'Valid login', + featureName: 'Login', + stepDefFiles: [], + steps: [{ text: 'I open the page' }, { text: 'I log in' }], + stepLines: [0, 0], + stepKeywords: ['Given', 'When'], + scenarioLine: 3, + parentFeatureSuiteUid: 'feature-uid', + recordAttempt + } +} + +function makeTest(uid: string, title: string): TestStats { + return { + uid, + cid: '0-0', + title, + fullTitle: title, + parent: 'suite-uid', + state: TEST_STATE.PENDING, + start: new Date(), + end: null, + type: 'test', + file: '/spec.ts', + retries: 0, + _duration: 0, + hooks: [] + } +} + +describe('cucumber scenario retry attempt', () => { + it('stamps the tracker attempt on every step and flows it to metadata.attempt', () => { + const tracker = new TestAttemptTracker() + const record = (uid: string) => tracker.recordStart(uid) + + const first = buildCucumberScenarioSuite(scenarioInput(record)) + expect((first.tests as TestStats[]).map((t) => t.retries)).toEqual([0, 0]) + + // Same scenario name + line → same (retry-stable) uid → attempt increments. + const retried = buildCucumberScenarioSuite(scenarioInput(record)) + expect((retried.tests as TestStats[]).map((t) => t.retries)).toEqual([1, 1]) + expect(tracker.sawRetry).toBe(true) + + const metadata = collectSuiteTestMetadata([retried]) + for (const step of retried.tests as TestStats[]) { + expect(metadata.get(step.uid)?.attempt).toBe(1) + } + }) + + it('defaults step attempt to 0 when no tracker is wired', () => { + const suite = buildCucumberScenarioSuite({ + ...scenarioInput(() => 0), + recordAttempt: undefined + }) + expect((suite.tests as TestStats[]).every((t) => t.retries === 0)).toBe( + true + ) + }) +}) + +describe('regular test retry attempt via startNextTest', () => { + it('records the attempt under the test uid and increments on rerun', async () => { + const tracker = new TestAttemptTracker() + const test = makeTest('test-uid', 'my test') + const suite = { + uid: 'suite-uid', + tests: [test] + } as unknown as SuiteStats + const ctx = { + suiteManager: { markSuiteAsRunning: vi.fn() }, + testManager: { findTestInSuite: () => test }, + testReporter: { onTestStart: vi.fn() }, + setCurrentTest: vi.fn(), + recordAttempt: (uid: string) => tracker.recordStart(uid) + } as unknown as TestLifecycleCtx + + await startNextTest(ctx, suite, 'my test', new Set()) + expect(test.retries).toBe(0) + + await startNextTest(ctx, suite, 'my test', new Set(['my test'])) + expect(test.retries).toBe(1) + }) +}) + +describe('buildTraceContext', () => { + it('sets attemptInfoAvailable and carries retries through to attempt', () => { + const capturer = { + actionSnapshots: [], + snapshotCaptures: [] + } as unknown as SessionCapturer + const test = makeTest('t1', 'retried test') + test.retries = 2 + const suite = { + uid: 'suite-uid', + tests: [test], + suites: [] + } as unknown as SuiteStats + + const ctx = buildTraceContext( + { + mode: 'trace', + policy: 'on', + granularity: 'session', + format: 'zip', + capturer, + suites: [suite], + ranges: [], + flushed: new Set(), + configPath: undefined, + log: () => {} + }, + 'session-1' + ) + + expect(ctx.attemptInfoAvailable).toBe(true) + expect(ctx.sessionId).toBe('session-1') + expect(ctx.testMetadata.get('t1')?.attempt).toBe(2) + }) +}) diff --git a/packages/selenium-devtools/src/helpers/testManager.ts b/packages/selenium-devtools/src/helpers/testManager.ts index fc3bfebf..70fcb14b 100644 --- a/packages/selenium-devtools/src/helpers/testManager.ts +++ b/packages/selenium-devtools/src/helpers/testManager.ts @@ -1,5 +1,9 @@ import logger from '@wdio/logger' -import { createTestStats, stampTestEnd } from '@wdio/devtools-core' +import { + createTestStats, + stampTestEnd, + TestAttemptTracker +} from '@wdio/devtools-core' import { DEFAULTS, TEST_STATE } from '../constants.js' import type { SuiteStats, TestStats } from '../types.js' import type { TestReporter } from '../reporter.js' @@ -19,6 +23,9 @@ export class TestManager { #currentTest: TestStats | null = null #lastMarkedTest: TestStats | null = null #mode: 'session' | 'marked' = 'session' + // Per-test attempt counter. Persists for the whole in-process session so + // same-process retries (Mocha/Jest/etc re-entering the start hook) accumulate. + #attemptTracker = new TestAttemptTracker() /** Set true the first time the user calls startMarkedTest. Once true we * never auto-create the synthetic session test — orphan commands attach * to the most-recently-marked test instead. */ @@ -90,7 +97,7 @@ export class TestManager { */ startMarkedTest( name: string, - opts: { file?: string; callSource?: string } = {} + opts: { file?: string; callSource?: string; attempt?: number } = {} ): TestStats { if (!this.#userTookOver) { this.#userTookOver = true @@ -115,14 +122,22 @@ export class TestManager { const file = opts.file || this.suite.file // Scope by parent so two suites with the same test/step name don't // collide on signatureCounter disambiguation across rerun processes. + const signature = `${this.suite.uid}::${name}` const test = createTestStats({ - uid: generateStableUid(file, `${this.suite.uid}::${name}`), + uid: generateStableUid(file, signature), cid: DEFAULTS.CID, title: name, file, parent: this.suite.uid, callSource: opts.callSource }) + // deterministicUid is retry-stable (no counter), so re-entering with the + // same logical test increments the heuristic. Mocha supplies an + // authoritative per-test retry index via opts.attempt; prefer it. + const heuristicAttempt = this.#attemptTracker.recordStart( + deterministicUid(file, signature) + ) + test.retries = opts.attempt ?? heuristicAttempt log.info( `Started marked test "${name}" (callSource: ${opts.callSource || 'n/a'})` ) diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 030e935f..2fcdb885 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -30,8 +30,10 @@ import { startScenario as tmStartScenario, endScenario as tmEndScenario, flushPendingTestActions as tmFlushPendingTestActions, + buildStartTestMeta, type StartTestMeta, - type StartScenarioMeta + type StartScenarioMeta, + type PendingTestAction } from './test-management.js' import type { PluginInternals } from './plugin-internals.js' import { @@ -104,16 +106,7 @@ class SeleniumDevToolsPlugin { #uiReadyPromise?: Promise // First it() body fires before onDriverCreated's async setup completes — // buffer startTest/endTest until testManager exists. - #pendingTestActions: Array< - | { - kind: 'start' - name: string - meta: { file?: string; callSource?: string } - suiteName?: string - suiteCallSource?: string - } - | { kind: 'end'; state: TestStats['state'] } - > = [] + #pendingTestActions: PendingTestAction[] = [] // Cucumber Before fires before the driver-build Before — stash and replay. #pendingScenario: { name: string @@ -596,27 +589,24 @@ patchNodeAssert((cmd) => { // Runner globals are published after `--require`, so retry briefly. function registerHooks() { return tryRegisterRunnerHooks({ - onTestStart: (name, file, callSource, suiteName, suiteCallSource) => { - const meta: { - file?: string - callSource?: string - suiteName?: string - suiteCallSource?: string - } = {} - if (file) { - meta.file = file - } - if (callSource) { - meta.callSource = callSource - } - if (suiteName) { - meta.suiteName = suiteName - } - if (suiteCallSource) { - meta.suiteCallSource = suiteCallSource - } - plugin.startTest(name, meta) - }, + onTestStart: ( + name, + file, + callSource, + suiteName, + suiteCallSource, + attempt + ) => + plugin.startTest( + name, + buildStartTestMeta( + file, + callSource, + suiteName, + suiteCallSource, + attempt + ) + ), onTestEnd: (state) => { plugin.endTest(state === 'pending' ? 'skipped' : state) }, diff --git a/packages/selenium-devtools/src/runnerHooks/mocha.ts b/packages/selenium-devtools/src/runnerHooks/mocha.ts index 5f2ad0f5..e7b8a616 100644 --- a/packages/selenium-devtools/src/runnerHooks/mocha.ts +++ b/packages/selenium-devtools/src/runnerHooks/mocha.ts @@ -87,7 +87,8 @@ function makeMochaBeforeEach( parentTitle, parentTitle ? resolveCallSource(test.file, parentTitle, 'suite') - : undefined + : undefined, + typeof test._currentRetry === 'number' ? test._currentRetry : undefined ) } } diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index 294d0921..b12699dd 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -290,7 +290,7 @@ export async function onSessionEnd(ctx: SessionLifecycleCtx): Promise { * file and the session trace next to the run's first test file. Test metadata * is recomputed from the suite tree so a boundary flush sees the current tree. */ -function buildTraceExportContext( +export function buildTraceExportContext( ctx: SessionLifecycleCtx, capturer: SessionCapturer, sessionId: string, @@ -306,6 +306,9 @@ function buildTraceExportContext( actionSnapshots: ctx.actionSnapshots, sessionId, testMetadata: collectSuiteTestMetadata(root ? [root] : []), + // TestStats.retries carries the per-test attempt (Mocha authoritative, + // other runners heuristic), so retry-aware policies can trust it. + attemptInfoAvailable: true, ranges: ctx.specRanges, flushed: ctx.flushedSpecs, resolveOutputDir: (range) => diff --git a/packages/selenium-devtools/src/test-management.ts b/packages/selenium-devtools/src/test-management.ts index 842c0654..e62d17de 100644 --- a/packages/selenium-devtools/src/test-management.ts +++ b/packages/selenium-devtools/src/test-management.ts @@ -24,7 +24,7 @@ export type PendingTestAction = | { kind: 'start' name: string - meta: { file?: string; callSource?: string } + meta: { file?: string; callSource?: string; attempt?: number } suiteName?: string suiteCallSource?: string } @@ -54,6 +54,8 @@ export interface StartTestMeta { callSource?: string suiteName?: string suiteCallSource?: string + /** Authoritative per-test retry index when the runner exposes one (Mocha). */ + attempt?: number } export interface StartScenarioMeta { @@ -63,6 +65,53 @@ export interface StartScenarioMeta { featureCallSource?: string } +/** Assemble a StartTestMeta from a runner hook's positional callback args. */ +export function buildStartTestMeta( + file?: string, + callSource?: string, + suiteName?: string, + suiteCallSource?: string, + attempt?: number +): StartTestMeta { + const meta: StartTestMeta = {} + if (file) { + meta.file = file + } + if (callSource) { + meta.callSource = callSource + } + if (suiteName) { + meta.suiteName = suiteName + } + if (suiteCallSource) { + meta.suiteCallSource = suiteCallSource + } + if (typeof attempt === 'number') { + meta.attempt = attempt + } + return meta +} + +type ResolvedTestMeta = { file?: string; callSource?: string; attempt?: number } + +function resolveStartMeta( + meta: StartTestMeta, + file: string | undefined, + callSource: string | undefined +): ResolvedTestMeta { + const resolved: ResolvedTestMeta = {} + if (file) { + resolved.file = file + } + if (callSource && callSource !== 'unknown:0') { + resolved.callSource = callSource + } + if (typeof meta.attempt === 'number') { + resolved.attempt = meta.attempt + } + return resolved +} + export function startTest( ctx: TestManagementCtx, name: string, @@ -74,13 +123,7 @@ export function startTest( const stackInfo = getCallSourceFromStack() const file = meta.file || stackInfo.filePath const callSource = meta.callSource || stackInfo.callSource - const resolvedMeta: { file?: string; callSource?: string } = {} - if (file) { - resolvedMeta.file = file - } - if (callSource && callSource !== 'unknown:0') { - resolvedMeta.callSource = callSource - } + const resolvedMeta = resolveStartMeta(meta, file, callSource) if (!ctx.suiteManager || !ctx.testReporter) { ctx.pendingTestActions.push({ kind: 'start', diff --git a/packages/selenium-devtools/src/types.ts b/packages/selenium-devtools/src/types.ts index e801799d..af764d69 100644 --- a/packages/selenium-devtools/src/types.ts +++ b/packages/selenium-devtools/src/types.ts @@ -20,31 +20,13 @@ export { type TraceRetentionPolicy } from '@wdio/devtools-shared' -export interface DevToolsOptions { - port?: number - hostname?: string +export interface DevToolsOptions extends BaseDevToolsOptions { /** Open a Chrome window pointing at the UI. Default true. */ openUi?: boolean - /** `live` (default) launches the DevTools UI; `trace` skips it. Overrides `openUi`. */ - mode?: DevToolsMode - /** Trace output layout — `zip` (default) writes a single archive, - * `ndjson-directory` unpacks into `trace-/`. Only applies in trace mode. */ - traceFormat?: TraceFormat - /** Trace output granularity — `session` (default) writes one trace per - * worker session; `spec` writes one trace per spec file. Only applies in - * trace mode. */ - traceGranularity?: TraceGranularity - /** Trace retention policy — gates which traces are kept (e.g. - * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ - tracePolicy?: TraceRetentionPolicy /** Capture screenshots after each command. Default true. */ captureScreenshots?: boolean - /** Capture node:assert assertions as first-class commands. Default true. */ - captureAssertions?: boolean /** Command template for per-test rerun. {{testName}} is substituted. */ rerunCommand?: string - /** Per-session screencast recording. Disabled by default. */ - screencast?: ScreencastOptions /** * Force the *test* browser into headless mode by injecting --headless=new * into Chrome capabilities. The dashboard window (auto-opened by openUi) @@ -55,13 +37,7 @@ export interface DevToolsOptions { // ScreencastFrame, ScreencastOptions hoisted to @wdio/devtools-shared; re-exported // here for backwards compatibility with existing selenium-internal imports. -import type { - DevToolsMode, - ScreencastOptions, - TraceFormat, - TraceGranularity, - TraceRetentionPolicy -} from '@wdio/devtools-shared' +import type { BaseDevToolsOptions, TestStatus } from '@wdio/devtools-shared' export type { ScreencastFrame, ScreencastOptions } from '@wdio/devtools-shared' /** @@ -133,24 +109,16 @@ export interface ElementOriginals { getTagName?: (element: unknown) => Promise } -// ─── bidi ─────────────────────────────────────────────────────────────────── - -import type { ConsoleLog, NetworkRequest } from '@wdio/devtools-shared' - -export interface BidiHandlerSinks { - pushConsoleLog: (entry: ConsoleLog) => void - pushNetworkRequest: (entry: NetworkRequest) => void - replaceNetworkRequest: (id: string, entry: NetworkRequest) => void -} - // ─── runnerHooks ──────────────────────────────────────────────────────────── export interface MochaTestCtx { title?: string file?: string - state?: 'passed' | 'failed' | 'pending' | 'running' | 'skipped' + state?: TestStatus duration?: number parent?: { title?: string } + /** Mocha's authoritative retry index — 0 on the first run, +1 per retry. */ + _currentRetry?: number } export interface RunnerHookCallbacks { @@ -159,9 +127,12 @@ export interface RunnerHookCallbacks { file?: string, callSource?: string, suiteName?: string, - suiteCallSource?: string + suiteCallSource?: string, + // Authoritative per-test retry index when the runner exposes one (Mocha's + // `_currentRetry`); undefined leaves the heuristic tracker to decide. + attempt?: number ) => void - onTestEnd: (state: 'passed' | 'failed' | 'skipped' | 'pending') => void + onTestEnd: (state: Exclude) => void // Cucumber-only: scenario boundary creates a sub-suite under the feature // rootSuite; subsequent onTestStart/onTestEnd attach as Gherkin steps inside. onScenarioStart?: ( @@ -171,7 +142,7 @@ export interface RunnerHookCallbacks { featureName?: string, featureCallSource?: string ) => void - onScenarioEnd?: (state: 'passed' | 'failed' | 'skipped' | 'pending') => void + onScenarioEnd?: (state: Exclude) => void // Fires from the runner's after-all hook so the dashboard suite header // updates without waiting for process exit. onTestRunComplete?: (summary: { diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index c2af6580..cbe6c196 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -8,15 +8,23 @@ import { mapCommandToAction, recordSpecBoundary, resolveAdapterOutputDir, + TestAttemptTracker, tracePolicyModeWarning, type SpecRange, type TraceExportContext } from '@wdio/devtools-core' -import { captureExpectFailure, wireAssertCapture } from './assert-capture.js' +import { + captureExpectFailure, + expectAssertionToCommandLog, + wireAssertCapture, + type ExpectAssertion +} from './assert-capture.js' import { cucumberScenarioUid, + resolveTestAttempt, stampTestState, - testMetadataUid + testMetadataUid, + type TestOutcomeResult } from './test-metadata.js' import { resolveCallSourceFromFrame } from './call-source.js' import { @@ -100,6 +108,11 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Map of testUid → metadata for trace group events and per-spec partitioning. */ #testMetadata: TestMetadataMap = new Map() + /** Per-test attempt counter. specFileRetries spawns a fresh worker (hence a + * fresh instance) per retry, so this only reflects same-process retries + * (Mocha this.retries(n)); cross-worker attempts rely on the WDIO result. */ + #attemptTracker = new TestAttemptTracker() + /** Index ranges into the session capturer's flat arrays, one per spec file. */ #specRanges: SpecRange[] = [] @@ -159,6 +172,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { sessionId: browser.sessionId, capabilities: browser.capabilities, testMetadata: this.#testMetadata, + attemptInfoAvailable: true, ranges: this.#specRanges, flushed: this.#flushedSpecs, resolveOutputDir: () => this.#outputDir, @@ -323,6 +337,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { world?.pickle?.astNodeIds ) this.#currentTestUid = uid + this.#attemptTracker.recordStart(uid) this.#testMetadata.set(uid, { title: scenarioName, specFile: featureFile @@ -344,6 +359,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (testTitle) { const uid = testMetadataUid(test?.file, testTitle) this.#currentTestUid = uid + this.#attemptTracker.recordStart(uid) this.#testMetadata.set(uid, { title: testTitle, specFile: test?.file ?? '' @@ -372,16 +388,23 @@ export default class DevToolsHookService implements Services.ServiceInstance { ) } + /** Stamp final state + the resolved 0-based attempt onto the test's metadata + * entry, taking the max of the tracker count and WDIO's retry field. */ + #stampOutcome(uid: string, result?: TestOutcomeResult): void { + const fallback = this.#attemptTracker.attemptFor(uid) ?? 0 + const attempt = resolveTestAttempt(result, fallback) + stampTestState(this.#testMetadata, uid, result, attempt) + } + async afterScenario( world?: { pickle?: { uri?: string; name?: string; astNodeIds?: readonly string[] } }, - result?: { error?: unknown; passed?: boolean; skipped?: boolean } + result?: TestOutcomeResult ) { const { uri, name, astNodeIds } = world?.pickle ?? {} if (uri && name) { - const uid = cucumberScenarioUid(uri, name, astNodeIds) - stampTestState(this.#testMetadata, uid, result) + this.#stampOutcome(cucumberScenarioUid(uri, name, astNodeIds), result) } await this.#finalizePerScenario() } @@ -389,20 +412,28 @@ export default class DevToolsHookService implements Services.ServiceInstance { async afterTest( test?: { file?: string; title?: string; fullTitle?: string }, _context?: unknown, - result?: { error?: unknown; passed?: boolean; skipped?: boolean } + result?: TestOutcomeResult ) { this.#captureExpectFailure(result?.error) const testTitle = test?.fullTitle || test?.title if (testTitle) { - stampTestState( - this.#testMetadata, - testMetadataUid(test?.file, testTitle), - result - ) + this.#stampOutcome(testMetadataUid(test?.file, testTitle), result) } await this.#finalizePerScenario() } + /** expect-webdriverio fires this per matcher (pass or fail) via WDIO's + * assertion hook — capture it as an `expect.` action so passing + * assertions show in the trace, not just failures. */ + afterAssertion(params: ExpectAssertion): void { + if (this.#options.captureAssertions === false) { + return + } + this.#sessionCapturer.captureAssertCommand( + expectAssertionToCommandLog(params, this.#currentTestUid) + ) + } + async #finalizePerScenario() { if (this.#options.mode !== 'trace' || !this.#browser) { return diff --git a/packages/service/src/reporter.ts b/packages/service/src/reporter.ts index 801a86ad..ee22f23b 100644 --- a/packages/service/src/reporter.ts +++ b/packages/service/src/reporter.ts @@ -314,6 +314,10 @@ export class TestReporter extends WebdriverIOReporter { matcherResult: rawErr.matcherResult } as Error } + // WDIO stamps the 0-based attempt on each test:start, so the final attempt's + // stat already carries the retry count; the field is optional upstream, so + // pin it to a number for the shared TestStats.retries contract. + testStats.retries = testStats.retries ?? 0 this.#sendUpstream() } diff --git a/packages/service/src/test-metadata.ts b/packages/service/src/test-metadata.ts index 339e1dc1..dc2babad 100644 --- a/packages/service/src/test-metadata.ts +++ b/packages/service/src/test-metadata.ts @@ -4,6 +4,15 @@ import { deterministicUid } from '@wdio/devtools-core' import type { TestMetadataMap, TestStatus } from '@wdio/devtools-shared' +/** The subset of a WDIO afterTest/afterScenario hook result this adapter reads: + * pass/skip state, the error, and WDIO's authoritative 0-based retry count. */ +export interface TestOutcomeResult { + error?: unknown + passed?: boolean + skipped?: boolean + retries?: { attempts?: number } +} + /** Stable per-test key. beforeTest and afterTest derive it identically so keys * match. File-less runners (some non-WDIO frameworks) key on the title alone. */ export function testMetadataUid( @@ -37,15 +46,32 @@ export function resultToState(result: { return result.passed ? 'passed' : 'failed' } -/** Stamp the final state onto the metadata entry beforeTest/beforeScenario - * created, so retention can gate its trace. No-op when there's no entry. */ +/** Stamp the final state (and, when known, the 0-based attempt) onto the + * metadata entry beforeTest/beforeScenario created, so retention can gate its + * trace per attempt. No-op when there's no entry. */ export function stampTestState( metadata: TestMetadataMap, uid: string, - result?: { passed?: boolean; skipped?: boolean } + result?: Pick, + attempt?: number ): void { const entry = result && metadata.get(uid) if (entry) { entry.state = resultToState(result) + if (attempt !== undefined) { + entry.attempt = attempt + } } } + +/** Resolve the 0-based attempt for a test. WDIO's mocha framework reports + * `retries.attempts` as 0 even on a retry, so it can't override the in-process + * tracker — take the max so a present-but-zero runner field never clobbers a + * real retry count, while a genuine runner value still wins when it's higher. */ +export function resolveTestAttempt( + result: Pick | undefined, + fallback: number +): number { + const attempts = result?.retries?.attempts + return Math.max(typeof attempts === 'number' ? attempts : 0, fallback) +} diff --git a/packages/service/tests/trace-metadata.test.ts b/packages/service/tests/trace-metadata.test.ts index fe88dc1a..9b2ee653 100644 --- a/packages/service/tests/trace-metadata.test.ts +++ b/packages/service/tests/trace-metadata.test.ts @@ -161,6 +161,57 @@ describe('DevtoolsService - afterTest state stamping', () => { ).toBe('failed') }) + it('flags attemptInfoAvailable so retry-aware policies use per-test attempt', async () => { + const ctx = (await runTest('trace opts', { passed: true })) as { + attemptInfoAvailable?: boolean + } + expect(ctx.attemptInfoAvailable).toBe(true) + }) + + it('uses the tracker attempt even when WDIO reports retries.attempts:0', async () => { + const service = new DevToolsHookService({ + mode: 'trace', + tracePolicy: 'retain-on-failure-and-retries' + }) + await service.before({} as never, [], mockBrowser) + const title = 'flaky login' + // Two starts before a single end simulate a same-process (Mocha) retry. + // WDIO's mocha framework reports retries.attempts:0 even on the retry, so + // the runner field must NOT clobber the tracker's real count of 1. + service.beforeTest({ file, fullTitle: title }) + service.beforeTest({ file, fullTitle: title }) + await service.afterTest( + { file, fullTitle: title }, + {}, + { passed: true, retries: { attempts: 0 } } + ) + await service.after() + const ctx = finalizeTraceExport.mock.calls.at(-1)?.[0] as { + testMetadata: Map + } + expect(ctx.testMetadata.get(deterministicUid(file, title))?.attempt).toBe(1) + }) + + it('uses the runner attempts count when it exceeds the tracker', async () => { + const service = new DevToolsHookService({ + mode: 'trace', + tracePolicy: 'retain-on-failure-and-retries' + }) + await service.before({} as never, [], mockBrowser) + const title = 'checkout retries' + service.beforeTest({ file, fullTitle: title }) + await service.afterTest( + { file, fullTitle: title }, + {}, + { passed: true, retries: { attempts: 3 } } + ) + await service.after() + const ctx = finalizeTraceExport.mock.calls.at(-1)?.[0] as { + testMetadata: Map + } + expect(ctx.testMetadata.get(deterministicUid(file, title))?.attempt).toBe(3) + }) + it('stamps a Cucumber scenario state in afterScenario', async () => { const service = new DevToolsHookService({ mode: 'trace', From 77fd464c59794e5a55bc3157e12a56eebcef863a Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:48:48 +0530 Subject: [PATCH 024/109] feat(service,core): render expect-webdriverio matchers as trace actions --- packages/core/src/assert-patcher.ts | 40 ++++++++ packages/core/tests/assert-patcher.test.ts | 40 ++++++++ .../tests/attempt-capture.test.ts | 95 +++++++++++++++++++ packages/service/src/assert-capture.ts | 54 ++++++++++- 4 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 packages/selenium-devtools/tests/attempt-capture.test.ts diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index 8917a1ef..71ebd9fe 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -2,6 +2,7 @@ import { createRequire } from 'node:module' import { TRACKED_ASSERT_METHODS, type CommandLog } from '@wdio/devtools-shared' import { getCallSourceFromStack } from './stack.js' import { toError } from './error.js' +import { stripAnsi } from './console.js' export { TRACKED_ASSERT_METHODS } @@ -152,6 +153,45 @@ export function capturedAssertToCommandLog( return entry } +/** + * Params any adapter's matcher tap produces. `prefix` selects the command + * namespace (`expect` / `assert` / `verify`), all of which map to an `Assert` + * action via the shared action map. Adapters do the thin framework-specific + * extraction (matcher name, args, pass flag, message); this conversion is the + * single shared path — the generic counterpart to `capturedAssertToCommandLog` + * for libraries that aren't node:assert (expect-webdriverio, chai, Nightwatch). + */ +export interface MatcherAssertion { + prefix?: string + method: string + args?: unknown[] + passed: boolean + message?: string | (() => string) + callSource?: string +} + +export function matcherAssertionToCommandLog( + input: MatcherAssertion, + testUid?: string +): CommandLog { + const command = `${input.prefix ?? 'expect'}.${input.method}` + const message = + typeof input.message === 'function' ? input.message() : input.message + return capturedAssertToCommandLog( + { + command, + args: (input.args ?? []).map(safeSerializeAssertArg), + result: input.passed ? 'passed' : undefined, + error: input.passed + ? undefined + : new Error(stripAnsi(message ?? `${command} failed`)), + callSource: input.callSource, + timestamp: Date.now() + }, + testUid + ) +} + /** * Patch `node:assert` so each tracked method emits a `CapturedAssert` to the * supplied hook. Idempotent across calls (guarded by `ASSERT_PATCHED_SYMBOL`). diff --git a/packages/core/tests/assert-patcher.test.ts b/packages/core/tests/assert-patcher.test.ts index 86774967..38bea721 100644 --- a/packages/core/tests/assert-patcher.test.ts +++ b/packages/core/tests/assert-patcher.test.ts @@ -4,6 +4,7 @@ import { ASSERT_PATCHED_SYMBOL, TRACKED_ASSERT_METHODS, capturedAssertToCommandLog, + matcherAssertionToCommandLog, patchNodeAssert, safeSerializeAssertArg, type CapturedAssert @@ -245,3 +246,42 @@ describe('capturedAssertToCommandLog', () => { expect(entry.testUid).toBeUndefined() }) }) + +describe('matcherAssertionToCommandLog', () => { + it('builds a passing expect. command (default prefix)', () => { + const entry = matcherAssertionToCommandLog( + { method: 'toHaveTitle', args: ['The Internet'], passed: true }, + 'uid-1' + ) + expect(entry).toMatchObject({ + command: 'expect.toHaveTitle', + args: ['The Internet'], + result: 'passed', + testUid: 'uid-1' + }) + expect(entry.error).toBeUndefined() + }) + + it('carries the ANSI-stripped message as the error when failed', () => { + const entry = matcherAssertionToCommandLog({ + method: 'toHaveText', + args: ['foo'], + passed: false, + message: () => 'expected foo' + }) + expect(entry.result).toBeUndefined() + expect(entry.error).toMatchObject({ message: 'expected foo' }) + }) + + it('honors a non-default prefix and sanitizes args', () => { + const entry = matcherAssertionToCommandLog({ + prefix: 'verify', + method: 'equal', + args: [/re/, () => 1], + passed: true + }) + expect(entry.command).toBe('verify.equal') + // RegExp → string, function → '[Function]' (via safeSerializeAssertArg). + expect(entry.args).toEqual(['/re/', '[Function]']) + }) +}) diff --git a/packages/selenium-devtools/tests/attempt-capture.test.ts b/packages/selenium-devtools/tests/attempt-capture.test.ts new file mode 100644 index 00000000..255280f6 --- /dev/null +++ b/packages/selenium-devtools/tests/attempt-capture.test.ts @@ -0,0 +1,95 @@ +import { describe, it, expect, vi } from 'vitest' +import { collectSuiteTestMetadata } from '@wdio/devtools-core' + +import { resetSignatureCounters } from '../src/helpers/utils.js' +import { TestManager } from '../src/helpers/testManager.js' +import { SuiteManager } from '../src/helpers/suiteManager.js' +import { TestReporter } from '../src/reporter.js' +import { SessionCapturer } from '../src/session.js' +import { + buildTraceExportContext, + type SessionLifecycleCtx +} from '../src/session-lifecycle.js' + +function makeManager() { + resetSignatureCounters() + const reporter = new TestReporter(vi.fn()) + const suiteManager = new SuiteManager(reporter) + const rootSuite = suiteManager.getOrCreateRootSuite('/spec.ts', 'Suite') + const mgr = new TestManager(rootSuite, reporter, suiteManager) + return { mgr, suiteManager, rootSuite } +} + +describe('retry/attempt capture', () => { + it('re-entering the start hook for the same test increments retries (heuristic)', () => { + const { mgr } = makeManager() + + const first = mgr.startMarkedTest('flaky') + expect(first.retries).toBe(0) + + mgr.endCurrent('failed') + const retry = mgr.startMarkedTest('flaky') + expect(retry.retries).toBe(1) + + mgr.endCurrent('failed') + const retry2 = mgr.startMarkedTest('flaky') + expect(retry2.retries).toBe(2) + }) + + it('prefers the authoritative Mocha attempt over the heuristic', () => { + const { mgr } = makeManager() + + // First start: heuristic would be 0, authoritative says 2 → 2 wins. + const t = mgr.startMarkedTest('login', { attempt: 2 }) + expect(t.retries).toBe(2) + + mgr.endCurrent('failed') + // Re-entry: heuristic would be 1, authoritative says 5 → 5 wins. + const retry = mgr.startMarkedTest('login', { attempt: 5 }) + expect(retry.retries).toBe(5) + }) + + it('flows retries into metadata attempt and the trace ctx flags attempt info', () => { + const { mgr, suiteManager, rootSuite } = makeManager() + + mgr.startMarkedTest('flaky') + mgr.endCurrent('failed') + const retry = mgr.startMarkedTest('flaky') + mgr.endCurrent('passed') + expect(retry.retries).toBe(1) + + const metadata = collectSuiteTestMetadata([rootSuite]) + expect(metadata.get(retry.uid)?.attempt).toBe(1) + + const capturer = new SessionCapturer() + try { + // Minimal structural ctx: buildTraceExportContext only reads options, + // suiteManager and the trace accumulators, so we cast a partial to the + // full lifecycle interface rather than standing up the whole plugin. + const ctx = { + options: { + mode: 'trace', + tracePolicy: 'retain-on-failure-and-retries', + traceGranularity: 'session', + traceFormat: 'zip' + }, + suiteManager, + actionSnapshots: [], + specRanges: [], + flushedSpecs: new Set(), + snapshotCaptures: [] + } as unknown as SessionLifecycleCtx + + const traceCtx = buildTraceExportContext( + ctx, + capturer, + 'sess-1', + '/spec.ts' + ) + expect(traceCtx.attemptInfoAvailable).toBe(true) + expect(traceCtx.testMetadata.get(retry.uid)?.attempt).toBe(1) + } finally { + capturer.cleanup() + } + }) +}) diff --git a/packages/service/src/assert-capture.ts b/packages/service/src/assert-capture.ts index 43c75131..2c277cf8 100644 --- a/packages/service/src/assert-capture.ts +++ b/packages/service/src/assert-capture.ts @@ -4,10 +4,11 @@ import logger from '@wdio/logger' import { capturedAssertToCommandLog, + matcherAssertionToCommandLog, patchNodeAssert, stripAnsi } from '@wdio/devtools-core' -import type { SerializedError } from '@wdio/devtools-shared' +import type { CommandLog, SerializedError } from '@wdio/devtools-shared' import type { SessionCapturer } from './session.js' const log = logger('@wdio/devtools-service:assert-capture') @@ -34,8 +35,10 @@ export function wireAssertCapture( * Normalize a framework failure into a SerializedError. Cucumber hands a plain * message string (@wdio/cucumber-framework getResultObject → world.result.message); * Mocha/Jasmine hand an Error object. Returns undefined when there's nothing to - * show, or for a node:assert AssertionError (the patcher already made that its - * own command). ANSI is stripped so every consumer gets a clean message. + * show, or when the failure was already captured as its own command: a + * node:assert AssertionError (via the patcher) or an expect-webdriverio matcher + * error (via afterAssertion — it carries `matcherResult`). Skipping those keeps + * `failLastAction` from double-marking a passing command. ANSI is stripped. */ export function toCommandError(error: unknown): SerializedError | undefined { if (!error) { @@ -48,8 +51,13 @@ export function toCommandError(error: unknown): SerializedError | undefined { if (typeof error !== 'object') { return undefined } - const err = error as { name?: string; message?: string; stack?: string } - if (err.name === 'AssertionError') { + const err = error as { + name?: string + message?: string + stack?: string + matcherResult?: unknown + } + if (err.name === 'AssertionError' || err.matcherResult !== undefined) { return undefined } return { @@ -79,3 +87,39 @@ export function captureExpectFailure( capturer.failLastAction(testUid, commandError) } } + +/** The subset of expect-webdriverio's afterAssertion hook params we read to + * turn a matcher call into a trace command. The matcher passes `{ pass }` at + * runtime, but @wdio/types declares `{ result }`, so we accept and read both. */ +export interface ExpectAssertion { + matcherName: string + expectedValue?: unknown + result: { pass?: boolean; result?: boolean; message?: () => string } +} + +/** + * Adapt expect-webdriverio's afterAssertion params to the shared matcher + * converter. Framework-specific extraction only (matcher name, expectedValue → + * args, the runtime `pass` vs typed `result` flag); the actual CommandLog + * shaping lives once in core's `matcherAssertionToCommandLog`. + */ +export function expectAssertionToCommandLog( + params: ExpectAssertion, + testUid: string | undefined +): CommandLog { + const { matcherName, expectedValue, result } = params + return matcherAssertionToCommandLog( + { + method: matcherName, + args: + expectedValue === undefined + ? [] + : Array.isArray(expectedValue) + ? expectedValue + : [expectedValue], + passed: result.pass ?? result.result ?? false, + message: result.message + }, + testUid + ) +} From ea03ba1745bdeb261da4fb5505fa8ebe9ebace62 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:49:14 +0530 Subject: [PATCH 025/109] test(backend): remove skip-forever foreign-zip tests --- .../backend/tests/trace-reader-bodies.test.ts | 27 +----------- packages/backend/tests/trace-reader.test.ts | 43 +------------------ 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/packages/backend/tests/trace-reader-bodies.test.ts b/packages/backend/tests/trace-reader-bodies.test.ts index 947daf38..62f2cec3 100644 --- a/packages/backend/tests/trace-reader-bodies.test.ts +++ b/packages/backend/tests/trace-reader-bodies.test.ts @@ -1,8 +1,7 @@ import { createHash } from 'node:crypto' -import { existsSync } from 'node:fs' import { describe, it, expect } from 'vitest' import { zipSync, strToU8 } from 'fflate' -import { parseTraceZip, readTraceZip } from '../src/trace-reader.js' +import { parseTraceZip } from '../src/trace-reader.js' const sha1 = (data: string): string => createHash('sha1').update(data).digest('hex') @@ -142,27 +141,3 @@ describe('trace-reader response bodies', () => { expect(bodyByUrl('https://example.com/missing')).toBeUndefined() }) }) - -// Machine-local foreign zip; exercises the extension-suffixed _sha1 convention -// against a real archive when present. -const REAL_FOREIGN_ZIP = - '/Users/vishnu.p@browserstack.com/Documents/Test projects/Test-playwright/test-results/trace-features-trace-feature-showcase-chromium-retry2/trace.zip' - -describe('foreign zip response bodies', () => { - it.skipIf(!existsSync(REAL_FOREIGN_ZIP))( - 'restores bodies referenced via extension-suffixed _sha1 entries', - async () => { - const data = await readTraceZip(REAL_FOREIGN_ZIP) - const requests = data.trace.networkRequests - const apiRequest = requests.find((r) => - r.url.startsWith('https://api.github.com/') - ) - expect(apiRequest?.responseBody).toContain('"full_name"') - const css = requests.find((r) => r.url.endsWith('base.css')) - expect(css?.responseBody?.length).toBeGreaterThan(0) - // Entries without a _sha1 ref stay body-less. - const script = requests.find((r) => r.url.endsWith('.js')) - expect(script?.responseBody).toBeUndefined() - } - ) -}) diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index be736c90..25f9a2f9 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -1,12 +1,11 @@ import { createHash } from 'node:crypto' -import { existsSync } from 'node:fs' import { describe, it, expect } from 'vitest' import { zipSync, strToU8 } from 'fflate' import type { TraceActionChild, TraceActionGroupNode } from '@wdio/devtools-shared' -import { parseTraceZip, readTraceZip } from '../src/trace-reader.js' +import { parseTraceZip } from '../src/trace-reader.js' import { buildSources, stackToCallSource } from '../src/trace-reader-utils.js' import type { BeforeEvent } from '../src/trace-reader-types.js' @@ -598,43 +597,3 @@ describe('glued callSource recovery from older zips', () => { expect(sources).toEqual({ [clean]: 'glued source' }) }) }) - -// Manual verification against a real foreign zip; skipped where absent. -const FOREIGN_ZIP_PATH = - process.env.FOREIGN_TRACE_ZIP ?? - '/Users/vishnu.p@browserstack.com/Documents/Test projects/Test-playwright/test-results/trace-features-trace-feature-showcase-chromium/trace.zip' - -describe('readTraceZip against a real foreign zip', () => { - it.skipIf(!existsSync(FOREIGN_ZIP_PATH))( - 'renders actions, filmstrip, network and a sane duration', - async () => { - const { trace, frames, startTime, duration, groups } = - await readTraceZip(FOREIGN_ZIP_PATH) - expect(trace.commands.length).toBeGreaterThan(10) - expect(frames.length).toBeGreaterThan(10) - expect(frames.every((f) => f.screenshot.length > 0)).toBe(true) - expect(startTime).toBeGreaterThan(1_700_000_000_000) - expect(duration).toBeGreaterThan(5_000) - expect(duration).toBeLessThan(60_000) - for (const frame of frames) { - expect(frame.timestamp).toBeGreaterThanOrEqual(startTime) - expect(frame.timestamp).toBeLessThanOrEqual(startTime + duration) - } - expect(trace.networkRequests.length).toBeGreaterThan(0) - expect(trace.consoleLogs.length).toBeGreaterThanOrEqual(3) - expect(Object.keys(trace.sources).length).toBeGreaterThan(0) - expect(trace.commands.some((c) => c.error)).toBe(true) - // The action tree covers every command exactly once and flags failures. - const tree = allGroups(groups ?? []) - expect(tree.length).toBeGreaterThan(5) - expect([...commandIndices(groups ?? [])].sort((a, b) => a - b)).toEqual( - trace.commands.map((_, index) => index) - ) - const failed = tree.filter((group) => group.failed) - expect(failed.length).toBeGreaterThan(0) - expect(failed.some((g) => g.title.startsWith('Soft assertion'))).toBe( - true - ) - } - ) -}) From 9087288b0822a6063a49593bb13501abd344a32d Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:50:27 +0530 Subject: [PATCH 026/109] chore(examples): add WDIO retry harness for retry-aware trace policies --- examples/wdio/mocha/retry/flaky.e2e.ts | 19 +++++++++ examples/wdio/mocha/wdio.retry.conf.ts | 58 ++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 78 insertions(+) create mode 100644 examples/wdio/mocha/retry/flaky.e2e.ts create mode 100644 examples/wdio/mocha/wdio.retry.conf.ts diff --git a/examples/wdio/mocha/retry/flaky.e2e.ts b/examples/wdio/mocha/retry/flaky.e2e.ts new file mode 100644 index 00000000..0b87bc83 --- /dev/null +++ b/examples/wdio/mocha/retry/flaky.e2e.ts @@ -0,0 +1,19 @@ +import { browser, expect } from '@wdio/globals' + +// Deterministically flaky: throws on the first attempt and passes on the retry. +// The module-level counter survives mocha's in-process retry, so attempt 0 fails +// and attempt 1 succeeds. The test ends PASSED — so retain-on-failure would drop +// its trace, but on-first-retry keeps it, which is exactly what B4 verifies: +// the retry attempt is captured and is distinct from a failure. +let attempts = 0 + +describe('Flaky (passes on retry)', () => { + it('fails the first attempt, then passes', async () => { + await browser.url('https://the-internet.herokuapp.com/login') + attempts += 1 + if (attempts === 1) { + throw new Error('intentional first-attempt failure — should retry') + } + await expect(browser).toHaveTitle('The Internet') + }) +}) diff --git a/examples/wdio/mocha/wdio.retry.conf.ts b/examples/wdio/mocha/wdio.retry.conf.ts new file mode 100644 index 00000000..90b87858 --- /dev/null +++ b/examples/wdio/mocha/wdio.retry.conf.ts @@ -0,0 +1,58 @@ +import type { Options } from '@wdio/types' + +// Disposable harness for verifying B4 (retry-aware trace policies). Runs the +// deterministically-flaky spec (fails once, passes on retry) alongside a clean +// passing spec at spec granularity. With tracePolicy 'on-first-retry' only the +// flaky spec's trace is retained — proving the retry attempt is captured and is +// distinct from failure (the flaky test ends PASSED, so retain-on-failure would +// drop it). Flip tracePolicy below to exercise the other retry-aware policies. +export const config: Options.Testrunner = { + runner: 'local', + autoCompileOpts: { + autoCompile: true, + tsNodeOpts: { + project: './tsconfig.json', + transpileOnly: true + } + }, + specs: ['./retry/flaky.e2e.ts', './specs/login.e2e.ts'], + exclude: [], + maxInstances: 1, + capabilities: [ + { + browserName: 'chrome', + 'goog:chromeOptions': { + args: [ + '--headless', + '--disable-gpu', + '--remote-allow-origins=*', + '--window-size=1600,900' + ] + } + } + ], + logLevel: 'warn', + bail: 0, + baseUrl: 'http://localhost', + waitforTimeout: 10000, + connectionRetryTimeout: 120000, + connectionRetryCount: 3, + services: [ + [ + 'devtools', + { + mode: 'trace' as const, + traceGranularity: 'spec' as const, + tracePolicy: 'on-first-retry' as const + } + ] + ], + framework: 'mocha', + reporters: ['spec'], + mochaOpts: { + ui: 'bdd', + timeout: 60000, + // 1 retry = 2 total attempts; the flaky spec fails attempt 0, passes attempt 1. + retries: 1 + } +} diff --git a/package.json b/package.json index 46b8dd24..e8901c1b 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "build": "pnpm -r build", "demo:wdio": "wdio run ./examples/wdio/cucumber/wdio.conf.ts", "demo:wdio:mocha": "wdio run ./examples/wdio/mocha/wdio.conf.ts", + "demo:wdio:retry": "wdio run ./examples/wdio/mocha/wdio.retry.conf.ts", "demo:nightwatch": "pnpm --filter @wdio/nightwatch-devtools example", "demo:selenium": "pnpm --filter @wdio/selenium-devtools example", "dev": "pnpm --parallel dev", From eaa409405c3f84702b84bf5d01942a2bf659cf5f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:51:49 +0530 Subject: [PATCH 027/109] docs: correct node:assert note; record retain-on-first-failure limitation --- .gitignore | 2 ++ CLAUDE.md | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e95e0003..47c58732 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,5 @@ coverage/ # pnpm state, cache, logs, and debug files /packages/**/*.mjs + +.claude diff --git a/CLAUDE.md b/CLAUDE.md index 0416c6ae..f06ea24d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -233,8 +233,9 @@ Documented divergences from the conventions above. They exist today as debt to b ### Architecture - `replaceCommand` has two semantics — Selenium mutates in place (preserves `_id`/`id` for chained calls); Nightwatch splices and reissues. Both call the same `core/suite-helpers` factories; the storage strategy stays adapter-specific because runner integrations differ. Could be unified by parameterizing the policy if the divergence ever causes a real problem. -- `patchNodeAssert` is wired only in `selenium-devtools`. The shared helper lives in `core/assert-patcher`; Service and Nightwatch can opt in via a one-line call when ready. Not auto-enabled — both communities lean on chai/expect. +- `patchNodeAssert` (via `core/assert-patcher`) is now wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`). Framework matcher libraries differ: Service additionally taps expect-webdriverio's `afterAssertion` hook so passing+failing matchers render as `expect.*` actions; Selenium (chai/jest) and Nightwatch (`browser.assert`/`verify`) don't yet surface passing framework-matcher assertions as trace actions. - BiDi is auto-attached in Service and Selenium; Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities. +- Retry-aware trace policies aren't uniform across adapters. Selenium emits one metadata entry per attempt (counter-based `generateStableUid` uid + retry-stable tracker key), so all six policies — including `retain-on-first-failure` (needs the first attempt's outcome) — evaluate correctly. Service and Nightwatch key metadata on the retry-stable uid and overwrite/mutate per attempt, collapsing to the *final* attempt's outcome; the retry-count policies (`retain-on-failure`, `on-first-retry`, `on-all-retries`, `retain-on-failure-and-retries`) are still correct, but `retain-on-first-failure` can't see a failed-then-passed first attempt and under-retains. Proper fix rides with B5 (per-test granularity preserves per-attempt slices); until then all three set `attemptInfoAvailable: true`. ### File-size (raw line counts; soft cap is 500 logic lines) From a1c74bc6799e09c14cf9708b034a401f38cc98ee Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 13:59:41 +0530 Subject: [PATCH 028/109] refactor(shared,adapters): consolidate adapter types into shared --- packages/nightwatch-devtools/src/types.ts | 41 ++-------------- .../src/runnerHooks/cucumber.ts | 18 +++---- packages/service/src/types.ts | 41 ++-------------- packages/shared/src/types.ts | 47 +++++++++++++++++++ 4 files changed, 59 insertions(+), 88 deletions(-) diff --git a/packages/nightwatch-devtools/src/types.ts b/packages/nightwatch-devtools/src/types.ts index e8ef90f6..ab776db5 100644 --- a/packages/nightwatch-devtools/src/types.ts +++ b/packages/nightwatch-devtools/src/types.ts @@ -23,13 +23,7 @@ export { type TraceLog } from '@wdio/devtools-shared' -import type { - DevToolsMode, - ScreencastOptions, - TraceFormat, - TraceGranularity, - TraceRetentionPolicy -} from '@wdio/devtools-shared' +import type { BaseDevToolsOptions } from '@wdio/devtools-shared' export interface CommandStackFrame { command: string @@ -87,16 +81,7 @@ export interface StepLocation { line: number } -export interface DevToolsOptions { - port?: number - hostname?: string - /** - * Screencast recording options. When enabled, a continuous video of the - * browser session is recorded and saved as a .webm file at the end of the - * test run. Polling mode only on Nightwatch (no CDP push); works on every - * browser Nightwatch supports. - */ - screencast?: ScreencastOptions +export interface DevToolsOptions extends BaseDevToolsOptions { /** * Enable WebDriver BiDi capture (browser console + JS exceptions + network * via `selenium-webdriver/bidi`). Requires `webSocketUrl: true` in your @@ -105,21 +90,6 @@ export interface DevToolsOptions { * entries. Defaults to `false` — opt-in. */ bidi?: boolean - /** Capture node:assert assertions as first-class commands (Nightwatch's - * built-in asserts already flow as commands). Default true. */ - captureAssertions?: boolean - /** `live` (default) launches the DevTools UI; `trace` skips it. */ - mode?: DevToolsMode - /** Trace output layout — `zip` (default) writes a single archive, - * `ndjson-directory` unpacks into `trace-/`. Only applies in trace mode. */ - traceFormat?: TraceFormat - /** Trace output granularity — `session` (default) writes one trace per - * worker session; `spec` writes one trace per spec file. Only applies in - * trace mode. */ - traceGranularity?: TraceGranularity - /** Trace retention policy — gates which traces are kept (e.g. - * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ - tracePolicy?: TraceRetentionPolicy } export interface NightwatchBrowser { @@ -144,12 +114,7 @@ export interface NightwatchBrowser { webdriver?: { host?: string } [key: string]: unknown } - currentTest?: { - name?: string - module?: string - group?: string - [key: string]: unknown - } + currentTest?: NightwatchCurrentTest results?: unknown queue?: unknown } diff --git a/packages/selenium-devtools/src/runnerHooks/cucumber.ts b/packages/selenium-devtools/src/runnerHooks/cucumber.ts index cffc6c76..86f8d3c2 100644 --- a/packages/selenium-devtools/src/runnerHooks/cucumber.ts +++ b/packages/selenium-devtools/src/runnerHooks/cucumber.ts @@ -1,6 +1,11 @@ import { createRequire } from 'node:module' import logger from '@wdio/logger' import { errorMessage } from '@wdio/devtools-core' +import type { + CucumberPickle, + CucumberPickleStep, + TestStatus +} from '@wdio/devtools-shared' import type { RunnerHookCallbacks } from '../types.js' const log = logger('@wdio/selenium-devtools:runnerHooks:cucumber') @@ -178,17 +183,6 @@ interface GherkinFeature { location?: { line?: number } children?: GherkinFeatureChild[] } -interface CucumberPickleStep { - text?: string - astNodeIds?: string[] - location?: { line?: number } -} -interface CucumberPickle { - name?: string - uri?: string - location?: { line?: number } - astNodeIds?: string[] -} interface CucumberTestCase { gherkinDocument?: { feature?: GherkinFeature } pickle?: CucumberPickle @@ -227,7 +221,7 @@ function populateGherkinIndex( } } -type ScenarioState = 'passed' | 'failed' | 'pending' +type ScenarioState = Extract function mapCucumberStatus(status: string): ScenarioState | 'skipped' { const s = status.toUpperCase() diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index 6aa1a33e..d21dcff3 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -23,15 +23,10 @@ export { type Viewport } from '@wdio/devtools-shared' +import type { BaseDevToolsOptions } from '@wdio/devtools-shared' + // ScreencastFrame, ScreencastOptions hoisted to @wdio/devtools-shared; re-exported // here for backwards compatibility with existing service-internal imports. -import type { - DevToolsMode, - ScreencastOptions, - TraceFormat, - TraceGranularity, - TraceRetentionPolicy -} from '@wdio/devtools-shared' export type { DevToolsMode, ScreencastFrame, @@ -45,16 +40,7 @@ export interface ExtendedCapabilities extends WebdriverIO.Capabilities { 'wdio:devtoolsOptions'?: ServiceOptions } -export interface ServiceOptions { - /** - * port to launch the application on (default: random) - */ - port?: number - /** - * hostname to launch the application on - * @default localhost - */ - hostname?: string +export interface ServiceOptions extends BaseDevToolsOptions { /** * capabilities used to launch the devtools application * @default @@ -67,27 +53,6 @@ export interface ServiceOptions { * } */ devtoolsCapabilities?: WebdriverIO.Capabilities - /** - * Screencast recording options. When enabled, a continuous video of the - * browser session is recorded and saved as a .webm file. Chrome/Chromium - * uses CDP push mode; all other browsers fall back to screenshot polling. - */ - screencast?: ScreencastOptions - /** Capture node:assert assertions (and failing `expect` matchers) as - * first-class commands. Default true. */ - captureAssertions?: boolean - /** `live` (default) launches the DevTools UI; `trace` skips it. */ - mode?: DevToolsMode - /** Trace output layout — `zip` (default) writes a single archive, - * `ndjson-directory` unpacks into `trace-/`. Only applies in trace mode. */ - traceFormat?: TraceFormat - /** Trace output granularity — `session` (default) writes one trace per - * worker session; `spec` writes one trace per spec file. Only applies in - * trace mode. */ - traceGranularity?: TraceGranularity - /** Trace retention policy — gates which traces are kept (e.g. - * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ - tracePolicy?: TraceRetentionPolicy } declare namespace WebdriverIO { diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index c2902e19..f90db146 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -283,6 +283,53 @@ export const SCREENCAST_DEFAULTS: Required = { pollIntervalMs: 200 } +/** + * Options every framework adapter accepts. Each adapter's own options interface + * extends this and adds only its framework-specific fields (e.g. WDIO's + * devtoolsCapabilities, Selenium's openUi, Nightwatch's bidi). + */ +export interface BaseDevToolsOptions { + /** Port to launch the application on (default: random). */ + port?: number + /** Hostname to launch the application on. @default localhost */ + hostname?: string + /** Screencast recording options. When enabled, a continuous video of the + * browser session is recorded and saved as a .webm file. */ + screencast?: ScreencastOptions + /** Capture node:assert assertions (and framework `expect` matchers where + * supported) as first-class commands. Default true. */ + captureAssertions?: boolean + /** `live` (default) launches the DevTools UI; `trace` skips it. */ + mode?: DevToolsMode + /** Trace output layout — `zip` (default) writes a single archive, + * `ndjson-directory` unpacks into `trace-/`. Only applies in trace mode. */ + traceFormat?: TraceFormat + /** Trace output granularity — `session` (default) writes one trace per + * worker session; `spec` writes one per spec file. Only applies in trace mode. */ + traceGranularity?: TraceGranularity + /** Trace retention policy — gates which traces are kept (e.g. + * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ + tracePolicy?: TraceRetentionPolicy +} + +/** Minimal Cucumber pickle-step shape — only the fields the adapters read. + * Cucumber's own types vary across versions, so we pin just these. */ +export interface CucumberPickleStep { + text?: string + astNodeIds?: string[] + location?: { line?: number } +} + +/** Minimal Cucumber pickle shape — only the fields the adapters read. `steps` + * is present only where the adapter walks step boundaries (Nightwatch). */ +export interface CucumberPickle { + name?: string + uri?: string + location?: { line?: number } + astNodeIds?: string[] + steps?: CucumberPickleStep[] +} + export interface Metadata { type: TraceType url?: string From 95d5e7122f87fc424328991f2f97f751ff253598 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 14:00:03 +0530 Subject: [PATCH 029/109] test(service): cover expect-webdriverio matcher capture --- packages/service/tests/assert-capture.test.ts | 88 +++++++++++++++++-- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git a/packages/service/tests/assert-capture.test.ts b/packages/service/tests/assert-capture.test.ts index 55ed1ee8..d1486257 100644 --- a/packages/service/tests/assert-capture.test.ts +++ b/packages/service/tests/assert-capture.test.ts @@ -6,19 +6,20 @@ import { } from '@wdio/devtools-core' import { captureExpectFailure, + expectAssertionToCommandLog, toCommandError, wireAssertCapture } from '../src/assert-capture.js' import type { SessionCapturer } from '../src/session.js' describe('toCommandError', () => { - it('normalizes a matcher Error object (ANSI stripped)', () => { - const error = Object.assign(new Error('expected 1 to be 2'), { - matcherResult: { matcherName: 'toBe', actual: 1, expected: 2 } - }) + it('normalizes a plain Error object (ANSI stripped)', () => { + // Matcher errors are skipped now (afterAssertion owns them); a plain + // thrown Error still routes through failLastAction, so test that path. + const error = new Error('something broke') expect(toCommandError(error)).toMatchObject({ name: 'Error', - message: 'expected 1 to be 2' + message: 'something broke' }) }) @@ -30,11 +31,17 @@ describe('toCommandError', () => { }) }) - it('returns undefined for node:assert AssertionError, empties and non-errors', () => { + it('returns undefined for self-captured errors (AssertionError / matcher), empties and non-errors', () => { const assertionError = Object.assign(new Error('a !== b'), { name: 'AssertionError' }) expect(toCommandError(assertionError)).toBeUndefined() + // expect-webdriverio matcher errors carry matcherResult and are already + // captured by afterAssertion — must not double-mark via failLastAction. + const matcherError = Object.assign(new Error('expected a to be b'), { + matcherResult: { pass: false } + }) + expect(toCommandError(matcherError)).toBeUndefined() expect(toCommandError(' ')).toBeUndefined() expect(toCommandError(undefined)).toBeUndefined() expect(toCommandError(42)).toBeUndefined() @@ -65,6 +72,17 @@ describe('captureExpectFailure', () => { captureExpectFailure(capturer, 'test-1', undefined, true) expect(capturer.failLastAction).not.toHaveBeenCalled() }) + + it('does not mark an action for a self-captured matcher error', () => { + const capturer = fakeCapturer() + // A failing expect-webdriverio matcher (carries matcherResult) is already + // its own command via afterAssertion — failLastAction must stay off it. + const matcherError = Object.assign(new Error('expected'), { + matcherResult: { pass: false } + }) + captureExpectFailure(capturer, 'test-1', matcherError, true) + expect(capturer.failLastAction).not.toHaveBeenCalled() + }) }) describe('wireAssertCapture', () => { @@ -121,3 +139,61 @@ describe('wireAssertCapture', () => { expect(spy).not.toHaveBeenCalled() }) }) + +describe('expectAssertionToCommandLog', () => { + it('captures a passing matcher as an expect. command', () => { + const entry = expectAssertionToCommandLog( + { + matcherName: 'toHaveTitle', + expectedValue: 'The Internet', + result: { pass: true, message: () => 'ok' } + }, + 'uid-1' + ) + expect(entry).toMatchObject({ + command: 'expect.toHaveTitle', + args: ['The Internet'], + result: 'passed', + testUid: 'uid-1' + }) + expect(entry.error).toBeUndefined() + }) + + it('captures a failing matcher with its ANSI-stripped message as the error', () => { + const entry = expectAssertionToCommandLog( + { + matcherName: 'toHaveText', + expectedValue: 'foo', + result: { pass: false, message: () => 'expected foo' } + }, + undefined + ) + expect(entry.result).toBeUndefined() + expect(entry.error).toMatchObject({ message: 'expected foo' }) + }) + + it('spreads an array expectedValue and reads the typed `result` flag', () => { + // @wdio/types declares the pass flag on `result`, not `pass` — read both. + const entry = expectAssertionToCommandLog( + { + matcherName: 'toHaveAttribute', + expectedValue: ['href', '/x'], + result: { result: true } + }, + undefined + ) + expect(entry).toMatchObject({ + command: 'expect.toHaveAttribute', + args: ['href', '/x'], + result: 'passed' + }) + }) + + it('treats a matcher with no expectedValue as a no-arg assertion', () => { + const entry = expectAssertionToCommandLog( + { matcherName: 'toBeClickable', result: { pass: true } }, + undefined + ) + expect(entry).toMatchObject({ command: 'expect.toBeClickable', args: [] }) + }) +}) From 1d26e0cf3623e03a650c13d6936fbac42371bde5 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Thu, 9 Jul 2026 16:32:07 +0530 Subject: [PATCH 030/109] feat(core): per-test trace granularity foundation --- packages/core/src/spec-trace-helpers.ts | 188 ++++++++++++++---- packages/core/src/trace-finalizer.ts | 62 ++++-- .../core/tests/spec-trace-helpers.test.ts | 129 ++++++++++++ packages/core/tests/trace-finalizer.test.ts | 104 ++++++++++ 4 files changed, 424 insertions(+), 59 deletions(-) diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index e49f2bd6..dd091efb 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -18,9 +18,15 @@ import { deterministicUid } from './uid.js' // ─── SpecRange ──────────────────────────────────────────────────────────────── -/** Index ranges into a SessionCapturer's flat arrays for a single spec file. */ +/** Index ranges into a SessionCapturer's flat arrays for one trace slice + * (a spec file, or a single test under `test` granularity). */ export interface SpecRange { specFile: string + /** Dedupe/identity key: spec path for spec slices; testUid for test slices, + * or `${testUid}-retry${n}` so each retried attempt is its own slice. */ + key: string + /** Present only for test-granularity slices; the base (non-retry) testUid. */ + testUid?: string commandStartIdx: number consoleStartIdx: number networkStartIdx: number @@ -63,6 +69,25 @@ export function buildSpecSessionId( return `${base}-${hash}-${sessionId.slice(0, 8)}` } +// ─── Test slice session ID ────────────────────────────────────────────────── + +/** + * Build a collision-safe test-level session ID from the slice's spec file, its + * identity `key` (testUid, or `${testUid}-retry${n}` for retries), and the + * parent session ID. Hashing the key keeps retries and sibling tests in the + * same spec from colliding on filename, while the spec basename keeps the name + * human-readable. + */ +export function buildTestSliceSessionId( + specFile: string, + key: string, + sessionId: string +): string { + const base = sanitizeSpecName(specFile) + const hash = deterministicUid(key).split('-').pop()!.slice(0, 8) + return `${base}-${hash}-${sessionId.slice(0, 8)}` +} + // ─── TraceCapturer slice ───────────────────────────────────────────────────── /** @@ -127,11 +152,29 @@ export function filterTestMetadataBySpec( return filtered } +/** + * Filter a full `testUid → metadata` map down to a single test's entry. The + * per-test analog of {@link filterTestMetadataBySpec}: a test slice's metadata + * is just that one test's entry, attached as its tracingGroup name. + */ +export function filterTestMetadataByUid( + allMetadata: TestMetadataMap, + testUid: string +): TestMetadataMap { + const filtered: TestMetadataMap = new Map() + const entry = allMetadata.get(testUid) + if (entry) { + filtered.set(testUid, entry) + } + return filtered +} + // ─── Spec boundary recording ────────────────────────────────────────────────── /** - * Minimal context needed by `recordSpecBoundary` to detect spec-file - * transitions and capture array index ranges. + * Minimal context needed by `recordSliceBoundary` to detect spec-file / test + * transitions and capture array index ranges. `flushedSpecs` holds already- + * flushed slice keys (spec paths or test keys), shared with the finalizer. */ export interface SpecBoundaryContext { specRanges: SpecRange[] @@ -146,32 +189,28 @@ export interface SpecBoundaryContext { actionSnapshots: ArrayLike } -/** - * Record a spec-file boundary. When `traceGranularity` is `'spec'` and the - * spec file has changed, this pushes a new `SpecRange` and returns the - * previous range so the caller can flush its trace artifact. - * - * Returns `null` when no flush is needed (same spec, or granularity isn't - * `'spec'`, or no capturer). - */ -export function recordSpecBoundary( +/** Push a new slice range and return the previous (unflushed) range to flush. + * `suppressSameKey` skips recording when the incoming key matches the last + * range's — used for spec granularity so consecutive tests in one file share + * a slice; test granularity records every attempt (retries included). */ +function pushSliceRange( ctx: SpecBoundaryContext, specFile: string, - traceGranularity: TraceGranularity | undefined + key: string, + testUid: string | undefined, + suppressSameKey: boolean ): SpecRange | null { - if (traceGranularity !== 'spec') { - return null - } const lastRange = ctx.specRanges[ctx.specRanges.length - 1] - if (lastRange && lastRange.specFile === specFile) { + if (suppressSameKey && lastRange && lastRange.key === key) { return null } - const prevRange = - lastRange && !ctx.flushedSpecs.has(lastRange.specFile) ? lastRange : null + lastRange && !ctx.flushedSpecs.has(lastRange.key) ? lastRange : null ctx.specRanges.push({ specFile, + key, + testUid, commandStartIdx: ctx.capturer.commandsLog.length, consoleStartIdx: ctx.capturer.consoleLogs.length, networkStartIdx: ctx.capturer.networkRequests.length, @@ -183,6 +222,48 @@ export function recordSpecBoundary( return prevRange } +/** + * Record a trace-slice boundary. For `spec` granularity, a new slice starts + * when the spec file changes (existing behavior). For `test` granularity, a + * new slice starts on every recorded test — including retries: a repeated + * `testUid` is keyed `${testUid}-retry${n}` so each attempt is its own slice. + * Returns the previous, not-yet-flushed range so the caller can flush it, or + * `null` when nothing needs flushing (same spec, missing testUid, or a + * non-sliced granularity). + */ +export function recordSliceBoundary( + ctx: SpecBoundaryContext, + granularity: TraceGranularity | undefined, + specFile: string, + testUid?: string +): SpecRange | null { + if (granularity === 'spec') { + return pushSliceRange(ctx, specFile, specFile, undefined, true) + } + if (granularity === 'test' && testUid !== undefined) { + const priorAttempts = ctx.specRanges.filter( + (r) => r.testUid === testUid + ).length + const key = + priorAttempts === 0 ? testUid : `${testUid}-retry${priorAttempts}` + return pushSliceRange(ctx, specFile, key, testUid, false) + } + return null +} + +/** + * Record a spec-file boundary. Thin back-compat wrapper over + * {@link recordSliceBoundary}; behavior is unchanged for `spec` granularity + * and returns `null` for every other granularity. + */ +export function recordSpecBoundary( + ctx: SpecBoundaryContext, + specFile: string, + traceGranularity: TraceGranularity | undefined +): SpecRange | null { + return recordSliceBoundary(ctx, traceGranularity, specFile) +} + // ─── Spec trace I/O ──────────────────────────────────────────────────────────── /** @@ -205,41 +286,66 @@ export interface WriteSpecTraceInput { capabilities?: unknown } -/** - * Write a standalone trace artifact (zip or ndjson-directory) for a single - * spec file. This is the shared I/O path — all three adapters delegate to it - * from their own `flushSpecTrace` wrappers. - */ -export async function writeSpecTrace( - input: WriteSpecTraceInput +/** Slice the parent capturer/snapshots for one range and write the artifact + * under `sliceSessionId` with the pre-filtered `testMetadata`. Shared by the + * spec and test write paths so both slice identically. */ +async function writeSliceTrace( + input: WriteSpecTraceInput, + sliceSessionId: string, + testMetadata: TestMetadataMap ): Promise { - const specCapturer = buildSpecCapturer( + const sliceCapturer = buildSpecCapturer( input.capturer, input.range, input.nextRange ) - const specSnapshots = input.actionSnapshots.slice( + const sliceSnapshots = input.actionSnapshots.slice( input.range.snapshotCount, input.nextRange?.snapshotCount ?? input.actionSnapshots.length ) - const specSessionId = buildSpecSessionId( - input.range.specFile, - input.sessionId - ) - - const testMetadata = filterTestMetadataBySpec( - input.testMetadata, - input.range.specFile - ) - - return writeTraceZip(specCapturer, { + return writeTraceZip(sliceCapturer, { outputDir: input.outputDir, - sessionId: specSessionId, + sessionId: sliceSessionId, capabilities: input.capabilities, - actionSnapshots: specSnapshots.length > 0 ? specSnapshots : undefined, + actionSnapshots: sliceSnapshots.length > 0 ? sliceSnapshots : undefined, format: input.format, testMetadata }) } + +/** + * Write a standalone trace artifact (zip or ndjson-directory) for a single + * spec file. This is the shared I/O path — all three adapters delegate to it + * from their own `flushSpecTrace` wrappers. + */ +export async function writeSpecTrace( + input: WriteSpecTraceInput +): Promise { + return writeSliceTrace( + input, + buildSpecSessionId(input.range.specFile, input.sessionId), + filterTestMetadataBySpec(input.testMetadata, input.range.specFile) + ) +} + +/** + * Write a standalone trace artifact for a single test slice. Reuses + * {@link WriteSpecTraceInput}; the slice identity comes from `range.key` + * (retry-aware) and its metadata from the base `range.testUid`. + */ +export async function writeTestSliceTrace( + input: WriteSpecTraceInput +): Promise { + const testUid = input.range.testUid ?? input.range.key + return writeSliceTrace( + input, + buildTestSliceSessionId( + input.range.specFile, + input.range.key, + input.sessionId + ), + filterTestMetadataByUid(input.testMetadata, testUid) + ) +} diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index 1750d3a4..840d9a51 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -17,7 +17,9 @@ import type { import { errorMessage } from './error.js' import { filterTestMetadataBySpec, + filterTestMetadataByUid, writeSpecTrace, + writeTestSliceTrace, type SpecRange } from './spec-trace-helpers.js' import { shouldRetainTrace, type TestOutcome } from './trace-retention.js' @@ -69,6 +71,22 @@ const SPEC_WITHOUT_BOUNDARIES_WARNING = '(the runner may not expose per-test hooks). Falling back to ' + 'session-level trace.' +const TEST_WITHOUT_BOUNDARIES_WARNING = + 'traceGranularity is "test" but no test boundaries were detected ' + + '(the runner may not expose per-test hooks). Falling back to ' + + 'session-level trace.' + +/** Above this many slices, warn to pair granularity with a retention policy. */ +const SLICE_COUNT_WARN_THRESHOLD = 200 + +function sliceCountWarning(count: number): string { + return ( + `traceGranularity produced ${count} trace slices. Consider pairing it ` + + 'with a retention policy (e.g. tracePolicy: "retain-on-failure") to ' + + 'avoid writing hundreds of trace archives.' + ) +} + /** Project a metadata slice onto the retention evaluator's outcome shape. */ function toOutcomes(metadata: TestMetadataMap): TestOutcome[] { return Array.from(metadata.values(), (m) => ({ @@ -93,30 +111,31 @@ function shouldRetain( } /** - * Policy-aware single-range flush: dedupes via `ctx.flushed`, applies the - * retention decision, and delegates the byte-level slicing/naming to - * `writeSpecTrace`. Returns the artifact, or undefined when the range was - * already flushed. + * Policy-aware single-range flush: dedupes via `ctx.flushed` on the slice + * `key`, applies the retention decision, and delegates the byte-level + * slicing/naming to `writeSpecTrace` (spec slices) or `writeTestSliceTrace` + * (test slices, distinguished by `range.testUid`). Returns the artifact, or + * undefined when the range was already flushed. */ export async function flushRangeTrace( ctx: TraceExportContext, range: SpecRange, nextRange?: SpecRange ): Promise { - if (ctx.flushed.has(range.specFile)) { + if (ctx.flushed.has(range.key)) { return undefined } - ctx.flushed.add(range.specFile) + ctx.flushed.add(range.key) - const sliceMetadata = filterTestMetadataBySpec( - ctx.testMetadata, - range.specFile - ) + const isTestSlice = range.testUid !== undefined + const sliceMetadata = isTestSlice + ? filterTestMetadataByUid(ctx.testMetadata, range.testUid!) + : filterTestMetadataBySpec(ctx.testMetadata, range.specFile) const artifact: TraceArtifact = { kind: 'trace', path: '', - scope: 'spec', - key: range.specFile, + scope: isTestSlice ? 'test' : 'spec', + key: range.key, testUids: Array.from(sliceMetadata.keys()), retained: shouldRetain(ctx, sliceMetadata) } @@ -125,7 +144,8 @@ export async function flushRangeTrace( return artifact } - artifact.path = await writeSpecTrace({ + const writeSlice = isTestSlice ? writeTestSliceTrace : writeSpecTrace + artifact.path = await writeSlice({ range, nextRange, capturer: ctx.capturer, @@ -138,7 +158,7 @@ export async function flushRangeTrace( }) ctx.log?.( 'info', - `Trace for spec "${range.specFile}" saved to ${artifact.path}` + `Trace for ${isTestSlice ? 'test' : 'spec'} "${range.key}" saved to ${artifact.path}` ) ctx.onArtifact?.(artifact) return artifact @@ -202,9 +222,9 @@ async function flushAllRanges( /** * Entry point for the after/end-of-run hook. No-op outside trace mode. Awaits - * any pending snapshot captures, then fans out to per-spec or session writes. - * `spec` granularity with no recorded boundaries warns and falls back to a - * single session-level trace. + * any pending snapshot captures, then fans out to per-spec, per-test, or + * session writes. `spec`/`test` granularity with no recorded boundaries warns + * and falls back to a single session-level trace. */ export async function finalizeTraceExport( ctx: TraceExportContext @@ -215,11 +235,17 @@ export async function finalizeTraceExport( if (ctx.awaitPending?.length) { await Promise.allSettled(ctx.awaitPending) } - if (ctx.granularity === 'spec' && ctx.ranges.length > 0) { + const sliced = ctx.granularity === 'spec' || ctx.granularity === 'test' + if (sliced && ctx.ranges.length > 0) { + if (ctx.ranges.length > SLICE_COUNT_WARN_THRESHOLD) { + ctx.log?.('warn', sliceCountWarning(ctx.ranges.length)) + } return flushAllRanges(ctx) } if (ctx.granularity === 'spec') { ctx.log?.('warn', SPEC_WITHOUT_BOUNDARIES_WARNING) + } else if (ctx.granularity === 'test') { + ctx.log?.('warn', TEST_WITHOUT_BOUNDARIES_WARNING) } const artifact = await safely(ctx, () => writeSessionTrace(ctx)) return artifact ? [artifact] : [] diff --git a/packages/core/tests/spec-trace-helpers.test.ts b/packages/core/tests/spec-trace-helpers.test.ts index f41efc5c..4be8ad6e 100644 --- a/packages/core/tests/spec-trace-helpers.test.ts +++ b/packages/core/tests/spec-trace-helpers.test.ts @@ -2,8 +2,13 @@ import { describe, it, expect } from 'vitest' import { buildSpecCapturer, buildSpecSessionId, + buildTestSliceSessionId, filterTestMetadataBySpec, + filterTestMetadataByUid, + recordSliceBoundary, + recordSpecBoundary, sanitizeSpecName, + type SpecBoundaryContext, type SpecRange, type TraceCapturer } from '@wdio/devtools-core' @@ -30,6 +35,7 @@ function capturer(): TraceCapturer { const range = (over: Partial = {}): SpecRange => ({ specFile: '/a.js', + key: over.key ?? over.specFile ?? '/a.js', commandStartIdx: 0, consoleStartIdx: 0, networkStartIdx: 0, @@ -39,6 +45,24 @@ const range = (over: Partial = {}): SpecRange => ({ ...over }) +function boundaryCtx( + over: Partial = {} +): SpecBoundaryContext { + return { + specRanges: [], + flushedSpecs: new Set(), + capturer: { + commandsLog: [], + consoleLogs: [], + networkRequests: [], + mutations: [], + traceLogs: [] + }, + actionSnapshots: [], + ...over + } +} + describe('buildSpecCapturer', () => { it('slices from the range start to the end when no nextRange is given', () => { const sliced = buildSpecCapturer(capturer(), range({ commandStartIdx: 2 })) @@ -91,3 +115,108 @@ describe('spec name / session id', () => { expect(a.startsWith('login-')).toBe(true) }) }) + +describe('filterTestMetadataByUid', () => { + it('keeps only the entry for the given uid', () => { + const all: TestMetadataMap = new Map([ + ['u1', { title: 'A', specFile: '/a.js' }], + ['u2', { title: 'B', specFile: '/b.js' }] + ]) + expect([...filterTestMetadataByUid(all, 'u1').keys()]).toEqual(['u1']) + expect(filterTestMetadataByUid(all, 'missing').size).toBe(0) + }) +}) + +describe('buildTestSliceSessionId', () => { + it('derives distinct, stable ids per key and stays readable', () => { + const a = buildTestSliceSessionId('/dir/login.js', 'u1', 'session-xyz') + const b = buildTestSliceSessionId('/dir/login.js', 'u2', 'session-xyz') + const retry = buildTestSliceSessionId( + '/dir/login.js', + 'u1-retry1', + 'session-xyz' + ) + expect(a).not.toBe(b) + expect(a).not.toBe(retry) + expect(a).toBe( + buildTestSliceSessionId('/dir/login.js', 'u1', 'session-xyz') + ) + expect(a.startsWith('login-')).toBe(true) + }) +}) + +describe('recordSliceBoundary (test granularity)', () => { + it('opens a new slice per test uid and returns the previous range', () => { + const ctx = boundaryCtx({ + capturer: { + commandsLog: [1, 2], + consoleLogs: [1], + networkRequests: [], + mutations: [1, 2, 3], + traceLogs: [] + }, + actionSnapshots: [1, 1] + }) + expect(recordSliceBoundary(ctx, 'test', '/a.js', 'u1')).toBeNull() + expect(ctx.specRanges).toHaveLength(1) + expect(ctx.specRanges[0]!.key).toBe('u1') + expect(ctx.specRanges[0]!.testUid).toBe('u1') + expect(ctx.specRanges[0]!.commandStartIdx).toBe(2) + expect(ctx.specRanges[0]!.snapshotCount).toBe(2) + + const prev = recordSliceBoundary(ctx, 'test', '/a.js', 'u2') + expect(prev?.key).toBe('u1') + expect(ctx.specRanges).toHaveLength(2) + expect(ctx.specRanges[1]!.key).toBe('u2') + }) + + it('keys each retry of the same uid as its own slice', () => { + const ctx = boundaryCtx() + recordSliceBoundary(ctx, 'test', '/a.js', 'u1') + recordSliceBoundary(ctx, 'test', '/a.js', 'u1') + recordSliceBoundary(ctx, 'test', '/a.js', 'u1') + expect(ctx.specRanges.map((r) => r.key)).toEqual([ + 'u1', + 'u1-retry1', + 'u1-retry2' + ]) + expect(ctx.specRanges.every((r) => r.testUid === 'u1')).toBe(true) + }) + + it('returns null when no testUid is provided', () => { + const ctx = boundaryCtx() + expect(recordSliceBoundary(ctx, 'test', '/a.js')).toBeNull() + expect(ctx.specRanges).toHaveLength(0) + }) + + it('does not return a previous range already in the flushed set', () => { + const ctx = boundaryCtx() + recordSliceBoundary(ctx, 'test', '/a.js', 'u1') + ctx.flushedSpecs.add('u1') + expect(recordSliceBoundary(ctx, 'test', '/a.js', 'u2')).toBeNull() + }) +}) + +describe('recordSliceBoundary / recordSpecBoundary (spec granularity)', () => { + it('keeps the spec-file behavior: one slice per spec, key equals specFile', () => { + const ctx = boundaryCtx() + expect(recordSliceBoundary(ctx, 'spec', '/a.js')).toBeNull() + expect(recordSliceBoundary(ctx, 'spec', '/a.js')).toBeNull() + expect(ctx.specRanges).toHaveLength(1) + expect(ctx.specRanges[0]!.key).toBe('/a.js') + expect(ctx.specRanges[0]!.testUid).toBeUndefined() + + const prev = recordSliceBoundary(ctx, 'spec', '/b.js') + expect(prev?.specFile).toBe('/a.js') + expect(ctx.specRanges).toHaveLength(2) + }) + + it('recordSpecBoundary returns null for session and test granularities', () => { + expect(recordSpecBoundary(boundaryCtx(), '/a.js', 'session')).toBeNull() + expect(recordSpecBoundary(boundaryCtx(), '/a.js', 'test')).toBeNull() + const ctx = boundaryCtx() + recordSpecBoundary(ctx, '/a.js', 'spec') + expect(ctx.specRanges).toHaveLength(1) + expect(ctx.specRanges[0]!.key).toBe('/a.js') + }) +}) diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index 73a9ae36..04362b01 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -4,6 +4,7 @@ import path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { buildSpecSessionId, + buildTestSliceSessionId, finalizeTraceExport, flushRangeTrace, type SpecRange, @@ -51,6 +52,7 @@ function meta(entries: Array<[string, TestMetadataEntry]>): TestMetadataMap { function range(specFile: string, startIdx: number): SpecRange { return { specFile, + key: specFile, commandStartIdx: startIdx, consoleStartIdx: 0, networkStartIdx: 0, @@ -60,6 +62,15 @@ function range(specFile: string, startIdx: number): SpecRange { } } +function testRange( + specFile: string, + testUid: string, + startIdx: number, + key = testUid +): SpecRange { + return { ...range(specFile, startIdx), key, testUid } +} + describe('finalizeTraceExport', () => { let outputDir: string let artifacts: TraceArtifact[] @@ -158,6 +169,99 @@ describe('finalizeTraceExport', () => { ).toBe(true) }) + it('fans out one trace per recorded test range', async () => { + const result = await finalizeTraceExport( + baseCtx({ + granularity: 'test', + ranges: [testRange('/a.js', 'a1', 0), testRange('/a.js', 'a2', 2)], + testMetadata: meta([ + ['a1', { title: 'A1', specFile: '/a.js' }], + ['a2', { title: 'A2', specFile: '/a.js' }] + ]) + }) + ) + expect(result).toHaveLength(2) + expect(result.map((a) => a.scope)).toEqual(['test', 'test']) + expect(result.map((a) => a.key)).toEqual(['a1', 'a2']) + // Each test slice carries only its own test's metadata. + expect(result[0]!.testUids).toEqual(['a1']) + expect(result[1]!.testUids).toEqual(['a2']) + const nameA1 = buildTestSliceSessionId('/a.js', 'a1', 'abcd1234') + const nameA2 = buildTestSliceSessionId('/a.js', 'a2', 'abcd1234') + expect(nameA1).not.toBe(nameA2) + expect(await exists(path.join(outputDir, `trace-${nameA1}.zip`))).toBe(true) + expect(await exists(path.join(outputDir, `trace-${nameA2}.zip`))).toBe(true) + }) + + it('treats a retry-keyed range as its own test slice', async () => { + const result = await finalizeTraceExport( + baseCtx({ + granularity: 'test', + ranges: [ + testRange('/a.js', 'a1', 0), + testRange('/a.js', 'a1', 2, 'a1-retry1') + ], + testMetadata: meta([['a1', { title: 'A1', specFile: '/a.js' }]]) + }) + ) + expect(result).toHaveLength(2) + expect(result.map((a) => a.key)).toEqual(['a1', 'a1-retry1']) + const first = buildTestSliceSessionId('/a.js', 'a1', 'abcd1234') + const retry = buildTestSliceSessionId('/a.js', 'a1-retry1', 'abcd1234') + expect(first).not.toBe(retry) + expect(await exists(path.join(outputDir, `trace-${first}.zip`))).toBe(true) + expect(await exists(path.join(outputDir, `trace-${retry}.zip`))).toBe(true) + }) + + it('warns and falls back to a session trace when test has no boundaries', async () => { + const result = await finalizeTraceExport( + baseCtx({ granularity: 'test', ranges: [] }) + ) + expect(result).toHaveLength(1) + expect(result[0]!.scope).toBe('session') + expect(await exists(path.join(outputDir, 'trace-abcd1234.zip'))).toBe(true) + expect( + logs.some( + ([level, msg]) => + level === 'warn' && msg.includes('no test boundaries were detected') + ) + ).toBe(true) + }) + + it('warns to pair with a retention policy above the slice-count threshold', async () => { + const ranges = Array.from({ length: 201 }, (_, i) => + testRange('/a.js', `u${i}`, i) + ) + const result = await finalizeTraceExport( + baseCtx({ + granularity: 'test', + // retain-on-failure + all-passing declines every write, so the guard + // is exercised without emitting 201 archives. + policy: 'retain-on-failure', + ranges, + testMetadata: meta( + ranges.map((r) => [ + r.testUid!, + { + title: r.testUid!, + specFile: '/a.js', + state: 'passed', + attempt: 0 + } + ]) + ) + }) + ) + expect(result).toHaveLength(201) + expect(result.every((a) => !a.retained)).toBe(true) + expect(await fs.readdir(outputDir)).toEqual([]) + expect( + logs.some( + ([level, msg]) => level === 'warn' && msg.includes('retention policy') + ) + ).toBe(true) + }) + it('does not rewrite a range already in the flushed set', async () => { const flushed = new Set(['/a.js']) const result = await finalizeTraceExport( From 2770d57b223bafdec4ac67a8f85796be9e2bccfa Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan Date: Fri, 10 Jul 2026 23:23:01 +0530 Subject: [PATCH 031/109] feat(trace): per-test granularity, output folders, and test-results/ parent --- .gitignore | 3 + packages/core/src/finalize-screencast.ts | 3 + packages/core/src/output-dir.ts | 13 +- packages/core/src/spec-trace-helpers.ts | 70 ++++- packages/core/src/trace-exporter.ts | 8 +- packages/core/src/trace-finalizer.ts | 41 ++- packages/core/tests/output-dir.test.ts | 25 +- .../core/tests/spec-trace-helpers.test.ts | 119 ++++++++- packages/core/tests/trace-finalizer.test.ts | 24 +- .../src/cucumber-lifecycle.ts | 27 +- .../src/plugin-internals.ts | 13 +- .../nightwatch-devtools/src/test-lifecycle.ts | 11 +- .../nightwatch-devtools/src/trace-slices.ts | 102 ++++++++ .../tests/traceSlices.test.ts | 155 +++++++++++ packages/selenium-devtools/src/index.ts | 23 +- .../selenium-devtools/src/plugin-internals.ts | 2 + .../src/session-lifecycle.ts | 116 +++++++-- .../tests/attempt-capture.test.ts | 1 + .../tests/trace-granularity.test.ts | 191 ++++++++++++++ packages/service/src/trace-slices.ts | 49 ++++ .../service/tests/trace-granularity.test.ts | 240 ++++++++++++++++++ 21 files changed, 1167 insertions(+), 69 deletions(-) create mode 100644 packages/nightwatch-devtools/src/trace-slices.ts create mode 100644 packages/nightwatch-devtools/tests/traceSlices.test.ts create mode 100644 packages/selenium-devtools/tests/trace-granularity.test.ts create mode 100644 packages/service/src/trace-slices.ts create mode 100644 packages/service/tests/trace-granularity.test.ts diff --git a/.gitignore b/.gitignore index 47c58732..e8a7a934 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,9 @@ packages/nightwatch-devtools/nightwatch-video-*.webm trace-*.zip examples/**/trace-*/ +# test results +examples/**/test-results/ + # vitest --coverage output coverage/ diff --git a/packages/core/src/finalize-screencast.ts b/packages/core/src/finalize-screencast.ts index e8c6b00c..4e1b0b9c 100644 --- a/packages/core/src/finalize-screencast.ts +++ b/packages/core/src/finalize-screencast.ts @@ -62,6 +62,9 @@ export async function finalizeScreencast({ const candidate = outputDir || process.cwd() let videoPath = path.join(candidate, fileName) try { + // Create the (test-results) dir if absent, then confirm it's writable; + // fall back to tmpdir on any failure so a bad path never aborts the run. + fs.mkdirSync(candidate, { recursive: true }) fs.accessSync(candidate, fs.constants.W_OK) } catch { videoPath = path.join(os.tmpdir(), fileName) diff --git a/packages/core/src/output-dir.ts b/packages/core/src/output-dir.ts index fa659ace..463c5960 100644 --- a/packages/core/src/output-dir.ts +++ b/packages/core/src/output-dir.ts @@ -25,6 +25,9 @@ export interface ResolveAdapterOutputDirInput { const NODE_MODULES_SEGMENT = `${path.sep}node_modules${path.sep}` +/** All run output is grouped under this subfolder. */ +const OUTPUT_SUBDIR = 'test-results' + function isWritable(dir: string): boolean { try { fs.accessSync(dir, fs.constants.W_OK) @@ -36,9 +39,11 @@ function isWritable(dir: string): boolean { /** * Resolve the directory where an adapter should write output files - * (screencast .webm, trace JSON, etc.). + * (screencast .webm, trace JSON, etc.). Every artifact is grouped under a + * single `test-results/` subfolder so a run's output is + * self-contained regardless of where the base directory resolves to. * - * Priority: + * The base directory is resolved by priority: * 1. `userConfiguredDir` — explicit opt-in, honored as-is. * 2. `dirname(testFilePath)` — same folder as the spec that just ran. * 3. `dirname(configPath)` — fallback to the framework config dir. @@ -56,6 +61,10 @@ function isWritable(dir: string): boolean { export function resolveAdapterOutputDir( input: ResolveAdapterOutputDirInput = {} ): string { + return path.join(resolveBaseDir(input), OUTPUT_SUBDIR) +} + +function resolveBaseDir(input: ResolveAdapterOutputDirInput): string { const fallback = input.fallbackDir ?? process.cwd() // userConfiguredDir bypasses the node_modules and writability filters // because the user opted into it explicitly — surprising overrides are diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index dd091efb..2eb69298 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -6,6 +6,7 @@ * is the single source of truth — adapters import from here. */ +import path from 'node:path' import type { ActionSnapshot, TestMetadataMap, @@ -88,6 +89,44 @@ export function buildTestSliceSessionId( return `${base}-${hash}-${sessionId.slice(0, 8)}` } +// ─── Test slice output folder ──────────────────────────────────────────────── + +/** Max slug length so a title doesn't blow past filesystem path limits. */ +const MAX_SLUG_LENGTH = 60 + +/** Lowercase, collapse runs of non-alphanumerics to `-`, trim edge dashes, + * and cap length (trimming a dash the cut may leave behind). */ +function slugify(text: string): string { + return text + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, MAX_SLUG_LENGTH) + .replace(/-+$/g, '') +} + +/** + * Build the per-test output folder name: `--<browser>[-retryN]`. + * The spec basename is sanitized via {@link sanitizeSpecName}; title and browser + * are slugified. An empty title falls back to a short hash of `key`, and a + * `${uid}-retry${n}` key appends a `-retry<N>` suffix so retries don't collide. + */ +export function buildTestSliceFolder( + specFile: string, + testTitle: string | undefined, + browser: string | undefined, + key: string +): string { + const specBase = sanitizeSpecName(path.basename(specFile)) + const titleSlug = + slugify(testTitle ?? '') || + deterministicUid(key).split('-').pop()!.slice(0, 8) + const browserSlug = slugify(browser ?? '') || 'browser' + const retryMatch = key.match(/-retry(\d+)$/) + const retrySuffix = retryMatch ? `-retry${retryMatch[1]}` : '' + return `${specBase}-${titleSlug}-${browserSlug}${retrySuffix}` +} + // ─── TraceCapturer slice ───────────────────────────────────────────────────── /** @@ -288,11 +327,13 @@ export interface WriteSpecTraceInput { /** Slice the parent capturer/snapshots for one range and write the artifact * under `sliceSessionId` with the pre-filtered `testMetadata`. Shared by the - * spec and test write paths so both slice identically. */ + * spec and test write paths so both slice identically. `overrides` lets the + * test path redirect into a named folder with a fixed `trace` file stem. */ async function writeSliceTrace( input: WriteSpecTraceInput, sliceSessionId: string, - testMetadata: TestMetadataMap + testMetadata: TestMetadataMap, + overrides: { outputDir?: string; fileStem?: string } = {} ): Promise<string> { const sliceCapturer = buildSpecCapturer( input.capturer, @@ -306,8 +347,9 @@ async function writeSliceTrace( ) return writeTraceZip(sliceCapturer, { - outputDir: input.outputDir, + outputDir: overrides.outputDir ?? input.outputDir, sessionId: sliceSessionId, + fileStem: overrides.fileStem, capabilities: input.capabilities, actionSnapshots: sliceSnapshots.length > 0 ? sliceSnapshots : undefined, format: input.format, @@ -331,14 +373,27 @@ export async function writeSpecTrace( } /** - * Write a standalone trace artifact for a single test slice. Reuses - * {@link WriteSpecTraceInput}; the slice identity comes from `range.key` - * (retry-aware) and its metadata from the base `range.testUid`. + * Write a standalone trace artifact for a single test slice into its own + * folder: `<outputDir>/<specBasename>-<titleSlug>-<browserSlug>[-retryN]/trace.zip`. + * Reuses {@link WriteSpecTraceInput}; the folder is the slice's external + * identity (title/browser/retry), while {@link buildTestSliceSessionId} names + * the sessionId embedded inside the archive. */ export async function writeTestSliceTrace( input: WriteSpecTraceInput ): Promise<string> { const testUid = input.range.testUid ?? input.range.key + const title = input.testMetadata.get(testUid)?.title + // capabilities is framework-typed unknown; read only browserName here. + const browserName = ( + input.capabilities as { browserName?: string } | undefined + )?.browserName + const folder = buildTestSliceFolder( + input.range.specFile, + title, + browserName, + input.range.key + ) return writeSliceTrace( input, buildTestSliceSessionId( @@ -346,6 +401,7 @@ export async function writeTestSliceTrace( input.range.key, input.sessionId ), - filterTestMetadataByUid(input.testMetadata, testUid) + filterTestMetadataByUid(input.testMetadata, testUid), + { outputDir: path.join(input.outputDir, folder), fileStem: 'trace' } ) } diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index bc223e14..40079b9a 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -466,6 +466,9 @@ export interface WriteTraceZipOptions { format?: TraceFormat /** Test metadata keyed by testUid for Tracing.tracingGroup events. */ testMetadata?: TestMetadataMap + /** Base name for the artifact (zip file stem / directory name). Defaults to + * `trace-<sessionId>`; per-test slices pass `'trace'` inside a named folder. */ + fileStem?: string } /** @@ -501,14 +504,15 @@ export async function writeTraceZip( wallTimeOverride: capturer.startWallTime, testMetadata: opts.testMetadata } + const stem = opts.fileStem ?? `trace-${opts.sessionId}` if (opts.format === 'ndjson-directory') { - const dir = path.join(opts.outputDir, `trace-${opts.sessionId}`) + const dir = path.join(opts.outputDir, stem) await fs.mkdir(dir, { recursive: true }) await exportTraceDirectory(traceLog, dir, exportOpts) return dir } const zip = await exportTraceZip(traceLog, exportOpts) - const zipPath = path.join(opts.outputDir, `trace-${opts.sessionId}.zip`) + const zipPath = path.join(opts.outputDir, `${stem}.zip`) await fs.writeFile(zipPath, zip) return zipPath } diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index 840d9a51..415b6289 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -164,6 +164,36 @@ export async function flushRangeTrace( return artifact } +/** + * Flush one slice via {@link flushRangeTrace}, logging the shared spec/test + * error string on failure so a failed boundary flush can't abort the next test. + * All three adapters wrapped this identically; the label + identity are derived + * from `range.testUid` (test slice → `test "<key>"`, else `spec "<specFile>"`), + * so each call site keeps its exact message. Errors are logged and swallowed + * (resolves `undefined`), so callers `await` it when the write must land before + * a retry overwrites metadata, or fire-and-forget (`void`, or tracked in an + * in-flight list) otherwise. Callers keep their own find-current-range strategy + * and pass the resolved range in. + */ +export async function flushRangeLogged( + ctx: TraceExportContext, + range: SpecRange +): Promise<TraceArtifact | undefined> { + try { + return await flushRangeTrace(ctx, range) + } catch (err) { + const label = + range.testUid !== undefined + ? `test "${range.key}"` + : `spec "${range.specFile}"` + ctx.log?.( + 'warn', + `Failed to flush trace for ${label}: ${errorMessage(err)}` + ) + return undefined + } +} + async function writeSessionTrace( ctx: TraceExportContext ): Promise<TraceArtifact | undefined> { @@ -211,8 +241,15 @@ async function flushAllRanges( ctx: TraceExportContext ): Promise<TraceArtifact[]> { const artifacts: TraceArtifact[] = [] - for (const range of ctx.ranges) { - const artifact = await safely(ctx, () => flushRangeTrace(ctx, range)) + // Bound each slice by the next range's start indices; the final range (no + // nextRange) runs to the end of the arrays. Without this, every slice would + // run to the end and each test slice would swallow all later tests. + for (let i = 0; i < ctx.ranges.length; i++) { + const range = ctx.ranges[i]! + const nextRange = ctx.ranges[i + 1] + const artifact = await safely(ctx, () => + flushRangeTrace(ctx, range, nextRange) + ) if (artifact) { artifacts.push(artifact) } diff --git a/packages/core/tests/output-dir.test.ts b/packages/core/tests/output-dir.test.ts index 12d80315..f44ba3ef 100644 --- a/packages/core/tests/output-dir.test.ts +++ b/packages/core/tests/output-dir.test.ts @@ -4,6 +4,9 @@ import path from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { resolveAdapterOutputDir } from '../src/output-dir.js' +/** Every resolved dir is grouped under this subfolder (Playwright-style). */ +const grouped = (base: string) => path.join(base, 'test-results') + describe('resolveAdapterOutputDir', () => { let tmpDir: string @@ -15,10 +18,16 @@ describe('resolveAdapterOutputDir', () => { fs.rmSync(tmpDir, { recursive: true, force: true }) }) + it('groups the resolved dir under a test-results/ subfolder', () => { + expect(resolveAdapterOutputDir({ fallbackDir: tmpDir })).toBe( + path.join(tmpDir, 'test-results') + ) + }) + it('returns userConfiguredDir verbatim when set, even if non-existent', () => { expect( resolveAdapterOutputDir({ userConfiguredDir: '/whatever/path' }) - ).toBe('/whatever/path') + ).toBe(grouped('/whatever/path')) }) it('prefers testFilePath dir over configPath dir over fallback', () => { @@ -35,14 +44,14 @@ describe('resolveAdapterOutputDir', () => { configPath, fallbackDir: tmpDir }) - ).toBe(path.dirname(testFile)) + ).toBe(grouped(path.dirname(testFile))) }) it('falls back to configPath dir when testFilePath is missing', () => { const configPath = path.join(tmpDir, 'wdio.conf.ts') fs.writeFileSync(configPath, '') expect(resolveAdapterOutputDir({ configPath, fallbackDir: tmpDir })).toBe( - tmpDir + grouped(tmpDir) ) }) @@ -59,11 +68,11 @@ describe('resolveAdapterOutputDir', () => { testFilePath: testFile, configPath }) - ).toBe(tmpDir) + ).toBe(grouped(tmpDir)) }) it('falls back to process.cwd() when no inputs are given', () => { - expect(resolveAdapterOutputDir()).toBe(process.cwd()) + expect(resolveAdapterOutputDir()).toBe(grouped(process.cwd())) }) it('falls back to fallbackDir when given and none of the candidates are writable', () => { @@ -72,12 +81,12 @@ describe('resolveAdapterOutputDir', () => { testFilePath: '/definitely/missing/a.test.ts', fallbackDir: tmpDir }) - ).toBe(tmpDir) + ).toBe(grouped(tmpDir)) }) it('userConfiguredDir bypasses node_modules skip (explicit opt-in)', () => { const nm = '/some/node_modules/pkg/dir' - expect(resolveAdapterOutputDir({ userConfiguredDir: nm })).toBe(nm) + expect(resolveAdapterOutputDir({ userConfiguredDir: nm })).toBe(grouped(nm)) }) it('returns fallback (cwd) when all candidate dirs are missing', () => { @@ -86,6 +95,6 @@ describe('resolveAdapterOutputDir', () => { testFilePath: '/missing/x.test.ts', configPath: '/missing/wdio.conf.ts' }) - ).toBe(process.cwd()) + ).toBe(grouped(process.cwd())) }) }) diff --git a/packages/core/tests/spec-trace-helpers.test.ts b/packages/core/tests/spec-trace-helpers.test.ts index 4be8ad6e..95257afe 100644 --- a/packages/core/tests/spec-trace-helpers.test.ts +++ b/packages/core/tests/spec-trace-helpers.test.ts @@ -1,16 +1,23 @@ -import { describe, it, expect } from 'vitest' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, expect } from 'vitest' import { buildSpecCapturer, buildSpecSessionId, + buildTestSliceFolder, buildTestSliceSessionId, filterTestMetadataBySpec, filterTestMetadataByUid, recordSliceBoundary, recordSpecBoundary, sanitizeSpecName, + writeSpecTrace, + writeTestSliceTrace, type SpecBoundaryContext, type SpecRange, - type TraceCapturer + type TraceCapturer, + type WriteSpecTraceInput } from '@wdio/devtools-core' import { TraceType, type TestMetadataMap } from '@wdio/devtools-shared' @@ -197,6 +204,114 @@ describe('recordSliceBoundary (test granularity)', () => { }) }) +describe('buildTestSliceFolder', () => { + it('combines sanitized spec, title slug, and browser slug', () => { + expect( + buildTestSliceFolder( + '/tests/login.e2e.js', + 'shows an error message for an invalid username', + 'chrome', + 'u1' + ) + ).toBe('login_e2e-shows-an-error-message-for-an-invalid-username-chrome') + }) + + it('appends a -retry<N> suffix when the key is a retry key', () => { + expect( + buildTestSliceFolder('/a.js', 'My Test', 'chrome', 'u1-retry2') + ).toBe('a-my-test-chrome-retry2') + }) + + it('defaults the browser slug to "browser" when the browser is absent', () => { + expect(buildTestSliceFolder('/a.js', 'My Test', undefined, 'u1')).toBe( + 'a-my-test-browser' + ) + }) + + it('falls back to a stable short hash of the key when the title is empty', () => { + const folder = buildTestSliceFolder('/a.js', '', 'chrome', 'u1') + expect(folder).toMatch(/^a-[a-z0-9]+-chrome$/) + expect(buildTestSliceFolder('/a.js', undefined, 'chrome', 'u1')).toBe( + folder + ) + }) + + it('lowercases, collapses non-alphanumerics, and caps the slug length', () => { + const folder = buildTestSliceFolder( + '/a.js', + `${'A'.repeat(80)} !!! End`, + 'Chrome', + 'u1' + ) + const titleSlug = folder.slice('a-'.length, folder.lastIndexOf('-chrome')) + expect(titleSlug.length).toBeLessThanOrEqual(60) + expect(titleSlug).toMatch(/^[a-z0-9-]+$/) + expect(titleSlug.endsWith('-')).toBe(false) + }) +}) + +describe('writeTestSliceTrace / writeSpecTrace output layout', () => { + let outputDir: string + beforeEach(async () => { + outputDir = await fs.mkdtemp(path.join(os.tmpdir(), 'slice-layout-')) + }) + afterEach(async () => { + await fs.rm(outputDir, { recursive: true, force: true }) + }) + + const writableCapturer = (): TraceCapturer => ({ + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { command: 'url', args: ['https://example.test'], timestamp: 1000 } + ], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + }) + + const input = ( + over: Partial<WriteSpecTraceInput> = {} + ): WriteSpecTraceInput => ({ + range: range({ specFile: '/tests/login.js', key: 'u1', testUid: 'u1' }), + capturer: writableCapturer(), + actionSnapshots: [], + sessionId: 'sess1234', + outputDir, + testMetadata: new Map([ + ['u1', { title: 'My Test', specFile: '/tests/login.js' }] + ]), + capabilities: { browserName: 'firefox' }, + ...over + }) + + it('writes a test slice into <folder>/trace.zip', async () => { + const written = await writeTestSliceTrace(input()) + const folder = buildTestSliceFolder( + '/tests/login.js', + 'My Test', + 'firefox', + 'u1' + ) + expect(folder).toBe('login-my-test-firefox') + expect(written).toBe(path.join(outputDir, folder, 'trace.zip')) + await expect(fs.access(written)).resolves.toBeUndefined() + }) + + it('keeps the spec write flat as trace-<id>.zip (unchanged layout)', async () => { + const written = await writeSpecTrace( + input({ + range: range({ specFile: '/tests/login.js', key: '/tests/login.js' }) + }) + ) + const name = buildSpecSessionId('/tests/login.js', 'sess1234') + expect(written).toBe(path.join(outputDir, `trace-${name}.zip`)) + await expect(fs.access(written)).resolves.toBeUndefined() + }) +}) + describe('recordSliceBoundary / recordSpecBoundary (spec granularity)', () => { it('keeps the spec-file behavior: one slice per spec, key equals specFile', () => { const ctx = boundaryCtx() diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index 04362b01..6d2b5013 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { buildSpecSessionId, - buildTestSliceSessionId, + buildTestSliceFolder, finalizeTraceExport, flushRangeTrace, type SpecRange, @@ -186,11 +186,13 @@ describe('finalizeTraceExport', () => { // Each test slice carries only its own test's metadata. expect(result[0]!.testUids).toEqual(['a1']) expect(result[1]!.testUids).toEqual(['a2']) - const nameA1 = buildTestSliceSessionId('/a.js', 'a1', 'abcd1234') - const nameA2 = buildTestSliceSessionId('/a.js', 'a2', 'abcd1234') - expect(nameA1).not.toBe(nameA2) - expect(await exists(path.join(outputDir, `trace-${nameA1}.zip`))).toBe(true) - expect(await exists(path.join(outputDir, `trace-${nameA2}.zip`))).toBe(true) + // Each slice lands in its own <spec>--<title>-<browser>/trace.zip folder. + const folderA1 = buildTestSliceFolder('/a.js', 'A1', undefined, 'a1') + const folderA2 = buildTestSliceFolder('/a.js', 'A2', undefined, 'a2') + expect(folderA1).not.toBe(folderA2) + expect(result[0]!.path).toBe(path.join(outputDir, folderA1, 'trace.zip')) + expect(await exists(path.join(outputDir, folderA1, 'trace.zip'))).toBe(true) + expect(await exists(path.join(outputDir, folderA2, 'trace.zip'))).toBe(true) }) it('treats a retry-keyed range as its own test slice', async () => { @@ -206,11 +208,13 @@ describe('finalizeTraceExport', () => { ) expect(result).toHaveLength(2) expect(result.map((a) => a.key)).toEqual(['a1', 'a1-retry1']) - const first = buildTestSliceSessionId('/a.js', 'a1', 'abcd1234') - const retry = buildTestSliceSessionId('/a.js', 'a1-retry1', 'abcd1234') + // The retry attempt gets a distinct folder via the -retry<N> suffix. + const first = buildTestSliceFolder('/a.js', 'A1', undefined, 'a1') + const retry = buildTestSliceFolder('/a.js', 'A1', undefined, 'a1-retry1') expect(first).not.toBe(retry) - expect(await exists(path.join(outputDir, `trace-${first}.zip`))).toBe(true) - expect(await exists(path.join(outputDir, `trace-${retry}.zip`))).toBe(true) + expect(retry.endsWith('-retry1')).toBe(true) + expect(await exists(path.join(outputDir, first, 'trace.zip'))).toBe(true) + expect(await exists(path.join(outputDir, retry, 'trace.zip'))).toBe(true) }) it('warns and falls back to a session trace when test has no boundaries', async () => { diff --git a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts index 201e2ca0..44197c0e 100644 --- a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts +++ b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts @@ -19,7 +19,6 @@ import { type CucumberPickleStep } from '@wdio/devtools-shared' -import type { SessionCapturer } from './session.js' import type { TestReporter } from './reporter.js' import type { TestManager } from './helpers/testManager.js' import type { SuiteManager } from './helpers/suiteManager.js' @@ -33,6 +32,11 @@ import { import { buildCucumberScenarioSuite } from './helpers/cucumberScenarioBuilder.js' import { scanFeatureFile } from './helpers/featureFileScan.js' import { parseCucumberScenario } from './helpers/utils.js' +import { + recordTestSliceBoundary, + flushTestSlice, + type TestSliceCtx +} from './trace-slices.js' const log = logger('@wdio/nightwatch-devtools:cucumber') @@ -42,8 +46,7 @@ export interface CucumberResult { status?: string } -export interface CucumberLifecycleCtx { - readonly sessionCapturer: SessionCapturer +export interface CucumberLifecycleCtx extends TestSliceCtx { readonly testReporter: TestReporter readonly testManager: TestManager readonly suiteManager: SuiteManager @@ -132,6 +135,15 @@ function normalizeSteps( return (pickleSteps ?? []).map((s) => ({ text: s.text ?? '' })) } +function captureFeatureSources( + ctx: CucumberLifecycleCtx, + paths: string[] +): void { + for (const p of paths) { + ctx.sessionCapturer.captureSource(p).catch(() => {}) + } +} + export async function initCucumberScenario( ctx: CucumberLifecycleCtx, browser: NightwatchBrowser, @@ -148,9 +160,7 @@ export async function initCucumberScenario( stepDefFiles, capturedPaths } = scanFeatureFile(featureUri) - for (const p of capturedPaths) { - ctx.sessionCapturer.captureSource(p).catch(() => {}) - } + captureFeatureSources(ctx, capturedPaths) const { featureSuite, scenarioLine, stepLines, stepKeywords } = createFeatureSuite( ctx, @@ -175,6 +185,8 @@ export async function initCucumberScenario( recordAttempt: (uid) => ctx.recordAttempt(uid) }) attachScenarioToFeature(ctx, featureSuite, scenarioSuite) + // The scenario is the `test` unit; its steps are the leaf metadata entries. + recordTestSliceBoundary(ctx, featureUri, scenarioSuite.uid) ctx.setCurrentScenarioSuite(scenarioSuite) ctx.setCurrentStep(null) ctx.setCurrentTest(null) @@ -222,6 +234,9 @@ export async function finalizeCucumberScenario( ctx.setCurrentTest(null) } await ctx.sessionCapturer.captureTrace(browser) + // Flush before the next attempt's attachScenarioToFeature overwrites this + // scenario's suite (and thus its outcome) in the tree. + flushTestSlice(ctx) } catch (err) { log.error(`Failed to finalize Cucumber scenario: ${errorMessage(err)}`) } diff --git a/packages/nightwatch-devtools/src/plugin-internals.ts b/packages/nightwatch-devtools/src/plugin-internals.ts index 1d4d45a2..1753d09c 100644 --- a/packages/nightwatch-devtools/src/plugin-internals.ts +++ b/packages/nightwatch-devtools/src/plugin-internals.ts @@ -7,6 +7,7 @@ * four) while still letting each lifecycle module narrow its dependencies. */ +import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' import type { SessionCapturer } from './session.js' import type { TestReporter } from './reporter.js' import type { ScreencastRecorder } from './screencast.js' @@ -18,7 +19,8 @@ import type { NightwatchBrowser, ScreencastOptions, SuiteStats, - TestStats + TestStats, + TraceGranularity } from './types.js' export interface PluginInternals { @@ -29,6 +31,7 @@ export interface PluginInternals { readonly mode: DevToolsMode readonly screencastOptions: ScreencastOptions readonly bidiEnabled: boolean + readonly captureAssertions: boolean // Runtime instances (mutable — bringup/session-change replaces them) sessionCapturer: SessionCapturer @@ -79,4 +82,12 @@ export interface PluginInternals { recordAttempt(uid: string): number /** Latest attempt recorded for `uid`, or undefined if it never started. */ attemptFor(uid: string): number | undefined + + // Per-test trace slicing (`test` granularity). Boundary state is shared with + // the finalizer; flushTraceRange writes one slice via the plugin's context. + readonly traceMode: boolean + readonly traceGranularity: TraceGranularity + readonly specRanges: SpecRange[] + readonly flushedSpecs: Set<string> + flushTraceRange(range: SpecRange): Promise<TraceArtifact | undefined> } diff --git a/packages/nightwatch-devtools/src/test-lifecycle.ts b/packages/nightwatch-devtools/src/test-lifecycle.ts index 5caf0537..7192c12a 100644 --- a/packages/nightwatch-devtools/src/test-lifecycle.ts +++ b/packages/nightwatch-devtools/src/test-lifecycle.ts @@ -9,7 +9,6 @@ */ import logger from '@wdio/logger' -import type { SessionCapturer } from './session.js' import type { TestReporter } from './reporter.js' import type { TestManager } from './helpers/testManager.js' import type { SuiteManager } from './helpers/suiteManager.js' @@ -26,11 +25,11 @@ import { DEFAULTS, TIMING, TEST_STATE } from './constants.js' import { resolveSpecFilePath } from './helpers/specFileResolver.js' import { closePreviousTest } from './helpers/closePreviousTest.js' import { extractTestMetadata, determineTestState } from './helpers/utils.js' +import { recordTestSliceBoundary, type TestSliceCtx } from './trace-slices.js' const log = logger('@wdio/nightwatch-devtools:test-lifecycle') -export interface TestLifecycleCtx { - readonly sessionCapturer: SessionCapturer +export interface TestLifecycleCtx extends TestSliceCtx { readonly testReporter: TestReporter readonly testManager: TestManager readonly suiteManager: SuiteManager @@ -118,7 +117,8 @@ export async function startNextTest( ctx: TestLifecycleCtx, currentSuite: SuiteStats, currentTestName: string, - processedTests: Set<string> + processedTests: Set<string>, + specFile: string | null ): Promise<void> { if (processedTests.size === 0) { ctx.suiteManager.markSuiteAsRunning(currentSuite) @@ -127,6 +127,9 @@ export async function startNextTest( if (test) { // Nightwatch has no per-test retry index; the tracker is the retry signal. test.retries = ctx.recordAttempt(test.uid) + if (specFile) { + recordTestSliceBoundary(ctx, specFile, test.uid) + } test.state = TEST_STATE.RUNNING as TestStats['state'] test.start = new Date() test.end = null diff --git a/packages/nightwatch-devtools/src/trace-slices.ts b/packages/nightwatch-devtools/src/trace-slices.ts new file mode 100644 index 00000000..bdd0cf0d --- /dev/null +++ b/packages/nightwatch-devtools/src/trace-slices.ts @@ -0,0 +1,102 @@ +/** + * Trace-slice boundary recording for `spec` and `test` granularity. + * + * `spec` slices are recorded/flushed at each spec-file transition (unchanged + * from the original inline `beforeEach` logic). For `test`, Nightwatch builds + * test outcomes into the suite tree in place — a retry overwrites the previous + * attempt's state (regular tests reuse the same test object; cucumber replaces + * the scenario suite). So each attempt's slice is flushed at its own + * test/scenario END, before the next attempt can overwrite the outcome the + * flush reads. Regular tests drive this from test-lifecycle, cucumber scenarios + * from cucumber-lifecycle; both share this module. + */ + +import { + recordSliceBoundary, + recordSpecBoundary, + type SpecBoundaryContext, + type SpecRange, + type TraceArtifact +} from '@wdio/devtools-core' +import type { SessionCapturer } from './session.js' +import type { TraceGranularity } from './types.js' + +export interface TestSliceCtx { + readonly sessionCapturer: SessionCapturer + readonly traceMode: boolean + readonly traceGranularity: TraceGranularity + readonly specRanges: SpecRange[] + readonly flushedSpecs: Set<string> + flushTraceRange(range: SpecRange): Promise<TraceArtifact | undefined> +} + +function sliceActive(ctx: TestSliceCtx): boolean { + return ctx.traceMode && ctx.traceGranularity === 'test' +} + +function boundaryContext(ctx: TestSliceCtx): SpecBoundaryContext { + return { + specRanges: ctx.specRanges, + flushedSpecs: ctx.flushedSpecs, + capturer: ctx.sessionCapturer, + actionSnapshots: ctx.sessionCapturer.actionSnapshots + } +} + +function flushPrevious(ctx: TestSliceCtx, prevRange: SpecRange | null): void { + if (!prevRange) { + return + } + // flushTraceRange (→ core flushRangeLogged) logs+swallows on failure. + void ctx.flushTraceRange(prevRange) +} + +/** + * Record a spec-file boundary at test/scenario start and eagerly flush the + * previous spec's slice. No-op for `session`/`test` granularity (core returns + * null). Preserves the original `beforeEach` behavior verbatim. + */ +export function recordSpecSliceBoundary( + ctx: TestSliceCtx, + specFile: string +): void { + const prevRange = recordSpecBoundary( + boundaryContext(ctx), + specFile, + ctx.traceGranularity + ) + flushPrevious(ctx, prevRange) +} + +/** + * Record a per-test slice boundary at test/scenario start. No-op outside trace + * mode + `test` granularity. Retries push a distinct range (core keys a repeat + * `${testUid}-retry${n}`), so each attempt becomes its own artifact. + */ +export function recordTestSliceBoundary( + ctx: TestSliceCtx, + specFile: string, + testUid: string +): void { + if (!sliceActive(ctx)) { + return + } + recordSliceBoundary(boundaryContext(ctx), 'test', specFile, testUid) +} + +/** + * Flush the current test's slice at test/scenario end — before a retry can + * overwrite its outcome in the suite tree. Fire-and-forget; the finalize pass + * is the safety net for any range this misses. No-op outside trace + `test`. + */ +export function flushTestSlice(ctx: TestSliceCtx): void { + if (!sliceActive(ctx)) { + return + } + const range = ctx.specRanges[ctx.specRanges.length - 1] + if (!range) { + return + } + // flushTraceRange (→ core flushRangeLogged) logs+swallows on failure. + void ctx.flushTraceRange(range) +} diff --git a/packages/nightwatch-devtools/tests/traceSlices.test.ts b/packages/nightwatch-devtools/tests/traceSlices.test.ts new file mode 100644 index 00000000..b42e92d5 --- /dev/null +++ b/packages/nightwatch-devtools/tests/traceSlices.test.ts @@ -0,0 +1,155 @@ +import { describe, it, expect, vi } from 'vitest' +import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' +import { + recordTestSliceBoundary, + recordSpecSliceBoundary, + flushTestSlice, + type TestSliceCtx +} from '../src/trace-slices.js' +import type { SessionCapturer } from '../src/session.js' +import type { TraceGranularity } from '../src/types.js' + +function makeCtx(traceMode: boolean, granularity: TraceGranularity) { + const capturer = { + commandsLog: [], + consoleLogs: [], + networkRequests: [], + mutations: [], + traceLogs: [], + actionSnapshots: [] + } as unknown as SessionCapturer + const artifacts: TraceArtifact[] = [] + const flushTraceRange = vi.fn( + async (range: SpecRange): Promise<TraceArtifact> => { + const artifact: TraceArtifact = { + kind: 'trace', + path: `/out/${range.key}.zip`, + scope: range.testUid ? 'test' : 'spec', + key: range.key, + testUids: range.testUid ? [range.testUid] : [], + retained: true + } + artifacts.push(artifact) + return artifact + } + ) + const ctx: TestSliceCtx = { + sessionCapturer: capturer, + traceMode, + traceGranularity: granularity, + specRanges: [], + flushedSpecs: new Set<string>(), + flushTraceRange + } + return { ctx, artifacts, flushTraceRange } +} + +describe('test granularity — recordTestSliceBoundary', () => { + it('records a per-test slice keyed on the test uid', () => { + const { ctx } = makeCtx(true, 'test') + recordTestSliceBoundary(ctx, '/login.spec.js', 'uid-1') + expect(ctx.specRanges).toHaveLength(1) + expect(ctx.specRanges[0]).toMatchObject({ + key: 'uid-1', + testUid: 'uid-1', + specFile: '/login.spec.js' + }) + }) + + it('keys a retry of the same test as a distinct slice', () => { + const { ctx } = makeCtx(true, 'test') + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') // retry + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-2') // sibling test + expect(ctx.specRanges.map((r) => r.key)).toEqual([ + 'uid-1', + 'uid-1-retry1', + 'uid-2' + ]) + // Every slice stays a test slice (base uid preserved for metadata filter). + expect(ctx.specRanges.map((r) => r.testUid)).toEqual([ + 'uid-1', + 'uid-1', + 'uid-2' + ]) + }) +}) + +describe('test granularity — flushTestSlice', () => { + it('emits one artifact per test slice, flushing the current test at its end', () => { + const { ctx, artifacts, flushTraceRange } = makeCtx(true, 'test') + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + flushTestSlice(ctx) + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-2') + flushTestSlice(ctx) + + expect(flushTraceRange).toHaveBeenCalledTimes(2) + expect(artifacts.map((a) => a.key)).toEqual(['uid-1', 'uid-2']) + expect(artifacts.every((a) => a.scope === 'test')).toBe(true) + }) + + it('flushes each attempt separately so retries become distinct artifacts', () => { + const { ctx, artifacts } = makeCtx(true, 'test') + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + flushTestSlice(ctx) // attempt 0 flushed before the retry can overwrite it + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + flushTestSlice(ctx) // attempt 1 + + expect(artifacts.map((a) => a.key)).toEqual(['uid-1', 'uid-1-retry1']) + }) + + it('does nothing when there is no recorded slice', () => { + const { ctx, flushTraceRange } = makeCtx(true, 'test') + flushTestSlice(ctx) + expect(flushTraceRange).not.toHaveBeenCalled() + }) +}) + +describe('test-slice helpers are inert outside trace + test granularity', () => { + it('no-ops for spec and session granularity', () => { + for (const granularity of ['spec', 'session'] as TraceGranularity[]) { + const { ctx, flushTraceRange } = makeCtx(true, granularity) + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + flushTestSlice(ctx) + expect(ctx.specRanges).toHaveLength(0) + expect(flushTraceRange).not.toHaveBeenCalled() + } + }) + + it('no-ops in live mode even at test granularity', () => { + const { ctx, flushTraceRange } = makeCtx(false, 'test') + recordTestSliceBoundary(ctx, '/a.spec.js', 'uid-1') + flushTestSlice(ctx) + expect(ctx.specRanges).toHaveLength(0) + expect(flushTraceRange).not.toHaveBeenCalled() + }) +}) + +describe('spec granularity is unchanged by the test-slice work', () => { + it('records one slice per spec file and flushes the previous on transition', () => { + const { ctx, artifacts, flushTraceRange } = makeCtx(true, 'spec') + recordSpecSliceBoundary(ctx, '/a.spec.js') + expect(ctx.specRanges.map((r) => r.key)).toEqual(['/a.spec.js']) + expect(flushTraceRange).not.toHaveBeenCalled() // no previous spec yet + + recordSpecSliceBoundary(ctx, '/a.spec.js') // same spec → shared slice + expect(ctx.specRanges).toHaveLength(1) + + recordSpecSliceBoundary(ctx, '/b.spec.js') // new spec → flush previous + expect(ctx.specRanges.map((r) => r.key)).toEqual([ + '/a.spec.js', + '/b.spec.js' + ]) + expect(artifacts.map((a) => a.key)).toEqual(['/a.spec.js']) + expect(artifacts[0].scope).toBe('spec') + }) + + it('records nothing for session or test granularity', () => { + for (const granularity of ['session', 'test'] as TraceGranularity[]) { + const { ctx, flushTraceRange } = makeCtx(true, granularity) + recordSpecSliceBoundary(ctx, '/a.spec.js') + expect(ctx.specRanges).toHaveLength(0) + expect(flushTraceRange).not.toHaveBeenCalled() + } + }) +}) diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 2fcdb885..7289cd81 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -21,7 +21,8 @@ import { onDriverEnd as sessionOnDriverEnd, onSessionEnd as sessionOnSessionEnd, setPluginRef, - recordSpecBoundary + recordTraceBoundary, + flushCurrentTestTrace } from './session-lifecycle.js' import type { SpecRange } from '@wdio/devtools-core' import { @@ -122,6 +123,9 @@ class SeleniumDevToolsPlugin { /** Set of spec files already flushed to disk. */ #flushedSpecs = new Set<string>() + /** In-flight per-test eager flushes (test granularity), awaited at finalize. */ + #traceFlushes: Promise<unknown>[] = [] + constructor(options: DevToolsOptions = {}) { this.#options = { port: options.port ?? 3000, @@ -427,6 +431,9 @@ class SeleniumDevToolsPlugin { get flushedSpecs() { return self.#flushedSpecs }, + get traceFlushes() { + return self.#traceFlushes + }, setFinalized: (v) => { self.#finalized = v }, @@ -451,20 +458,17 @@ class SeleniumDevToolsPlugin { /** Public API: start a marked test. */ startTest(name: string, meta: StartTestMeta = {}) { tmStartTest(this.#getInternals(), name, meta) - if (meta.file) { - recordSpecBoundary(this.#getInternals(), meta.file) - } + recordTraceBoundary(this.#getInternals(), meta.file) } endTest(state: TestStats['state'] = 'passed') { tmEndTest(this.#getInternals(), state) + flushCurrentTestTrace(this.#getInternals()) } startScenario(name: string, meta: StartScenarioMeta = {}) { tmStartScenario(this.#getInternals(), name, meta) - if (meta.file) { - recordSpecBoundary(this.#getInternals(), meta.file) - } + recordTraceBoundary(this.#getInternals(), meta.file) } endScenario(state: TestStats['state'] = 'passed') { @@ -473,6 +477,11 @@ class SeleniumDevToolsPlugin { #flushPendingTestActions() { tmFlushPendingTestActions(this.#getInternals()) + // The first test's startTest fires before the driver/capturer exists, so + // its per-test boundary is recorded here once capture is live. + if (this.#options.traceGranularity === 'test') { + recordTraceBoundary(this.#getInternals(), this.#testFilePath) + } } async onDriverCreated(driver: SeleniumDriverLike) { diff --git a/packages/selenium-devtools/src/plugin-internals.ts b/packages/selenium-devtools/src/plugin-internals.ts index c769c4ad..a9672e50 100644 --- a/packages/selenium-devtools/src/plugin-internals.ts +++ b/packages/selenium-devtools/src/plugin-internals.ts @@ -67,6 +67,8 @@ export interface PluginInternals { // Per-spec trace tracking (populated at spec file boundaries). readonly specRanges: SpecRange[] readonly flushedSpecs: Set<string> + // In-flight per-test eager flushes (test granularity), awaited at finalize. + readonly traceFlushes: Promise<unknown>[] // Plugin-side delegates setFinalized(v: boolean): void diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index b12699dd..856d05ee 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -14,9 +14,11 @@ import { errorMessage, finalizeScreencast, finalizeTraceExport, - flushRangeTrace, + flushRangeLogged, + recordSliceBoundary as coreRecordSliceBoundary, recordSpecBoundary as coreRecordSpecBoundary, resolveAdapterOutputDir, + type SpecBoundaryContext, type SpecRange, type TraceExportContext } from '@wdio/devtools-core' @@ -79,6 +81,9 @@ export interface SessionLifecycleCtx { // Per-spec trace tracking (populated at spec file boundaries). readonly specRanges: SpecRange[] readonly flushedSpecs: Set<string> + // In-flight per-test eager flushes (test granularity); awaited at finalize + // so the last test's write completes before the process exits. + readonly traceFlushes: Promise<unknown>[] setFinalized(v: boolean): void ensureBackendStarted(): Promise<void> @@ -315,30 +320,55 @@ export function buildTraceExportContext( resolveAdapterOutputDir({ testFilePath: range ? range.specFile : testFilePath }), - awaitPending: ctx.snapshotCaptures, + awaitPending: [...ctx.snapshotCaptures, ...ctx.traceFlushes], log: (level, msg) => log[level](msg) } } +/** Narrow view of the lifecycle ctx that the core boundary recorder needs. */ +function boundaryContext( + ctx: SessionLifecycleCtx, + capturer: SessionCapturer +): SpecBoundaryContext { + return { + specRanges: ctx.specRanges, + flushedSpecs: ctx.flushedSpecs, + capturer, + actionSnapshots: ctx.actionSnapshots + } +} + /** - * Record a spec-file boundary in the session lifecycle context. Called from - * the plugin's startTest / startScenario when `traceGranularity` is `'spec'`. - * Flushes the previous spec's trace if it hasn't been written yet. + * Record a trace-slice boundary for the active granularity, called from the + * plugin's startTest / startScenario. `spec` keys by spec file (flushing the + * previous spec lazily at the next boundary); `test` keys by the just-started + * marked test's uid so each test — and each retry, which selenium gives a + * distinct uid — becomes its own slice. No-op for `session`. */ -export function recordSpecBoundary( +export function recordTraceBoundary( ctx: SessionLifecycleCtx, - specFile: string + specFile: string | undefined ): void { + if (ctx.options.traceGranularity === 'test') { + recordTestBoundary(ctx, specFile) + return + } + if (specFile) { + recordSpecBoundary(ctx, specFile) + } +} + +/** + * Record a spec-file boundary and lazily flush the previous spec's trace if it + * hasn't been written yet. `coreRecordSpecBoundary` no-ops for non-spec + * granularities, so this only records under `spec`. + */ +function recordSpecBoundary(ctx: SessionLifecycleCtx, specFile: string): void { if (!ctx.sessionCapturer) { return } const prevRange = coreRecordSpecBoundary( - { - specRanges: ctx.specRanges, - flushedSpecs: ctx.flushedSpecs, - capturer: ctx.sessionCapturer, - actionSnapshots: ctx.actionSnapshots - }, + boundaryContext(ctx, ctx.sessionCapturer), specFile, ctx.options.traceGranularity ) @@ -346,7 +376,7 @@ export function recordSpecBoundary( if (!prevRange || !sessionId) { return } - void flushRangeTrace( + void flushRangeLogged( buildTraceExportContext( ctx, ctx.sessionCapturer, @@ -354,13 +384,63 @@ export function recordSpecBoundary( ctx.testFilePath ), prevRange - ).catch((err) => - log.warn( - `Failed to flush trace for spec "${prevRange.specFile}": ${errorMessage(err)}` - ) ) } +/** + * Record a per-test boundary keyed by the currently-active marked test's uid. + * The first test's startTest fires before the driver exists (no capturer yet), + * so flushPendingTestActions re-invokes this once capture is live; the + * same-uid guard keeps that replay from minting a spurious retry slice. + */ +function recordTestBoundary( + ctx: SessionLifecycleCtx, + specFile: string | undefined +): void { + const testUid = ctx.testManager?.getCurrentTest()?.uid + const file = specFile ?? ctx.testFilePath + if (!ctx.sessionCapturer || !testUid || !file) { + return + } + const lastRange = ctx.specRanges[ctx.specRanges.length - 1] + if (lastRange?.testUid === testUid) { + return + } + coreRecordSliceBoundary( + boundaryContext(ctx, ctx.sessionCapturer), + 'test', + file, + testUid + ) +} + +/** + * Eager-flush the just-ended test's trace slice (test granularity), after + * endTest has finalized its state so collectSuiteTestMetadata sees the final + * outcome. flushRangeTrace dedupes by key, so finalizeTraceExport won't + * re-write it; the promise is tracked so finalize awaits the last write. + */ +export function flushCurrentTestTrace(ctx: SessionLifecycleCtx): void { + if (ctx.options.traceGranularity !== 'test' || !ctx.sessionCapturer) { + return + } + const sessionId = ctx.sessionCapturer.metadata?.sessionId + const currentRange = ctx.specRanges[ctx.specRanges.length - 1] + if (!sessionId || currentRange?.testUid === undefined) { + return + } + const flush = flushRangeLogged( + buildTraceExportContext( + ctx, + ctx.sessionCapturer, + sessionId, + ctx.testFilePath + ), + currentRange + ) + ctx.traceFlushes.push(flush) +} + async function writeTraceIfNeeded( ctx: SessionLifecycleCtx, capturer: SessionCapturer | undefined, diff --git a/packages/selenium-devtools/tests/attempt-capture.test.ts b/packages/selenium-devtools/tests/attempt-capture.test.ts index 255280f6..2f2840ff 100644 --- a/packages/selenium-devtools/tests/attempt-capture.test.ts +++ b/packages/selenium-devtools/tests/attempt-capture.test.ts @@ -77,6 +77,7 @@ describe('retry/attempt capture', () => { actionSnapshots: [], specRanges: [], flushedSpecs: new Set<string>(), + traceFlushes: [], snapshotCaptures: [] } as unknown as SessionLifecycleCtx diff --git a/packages/selenium-devtools/tests/trace-granularity.test.ts b/packages/selenium-devtools/tests/trace-granularity.test.ts new file mode 100644 index 00000000..8f133a24 --- /dev/null +++ b/packages/selenium-devtools/tests/trace-granularity.test.ts @@ -0,0 +1,191 @@ +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { resetSignatureCounters } from '../src/helpers/utils.js' +import { TestManager } from '../src/helpers/testManager.js' +import { SuiteManager } from '../src/helpers/suiteManager.js' +import { TestReporter } from '../src/reporter.js' +import { SessionCapturer } from '../src/session.js' +import { + flushCurrentTestTrace, + recordTraceBoundary, + type SessionLifecycleCtx +} from '../src/session-lifecycle.js' +import type { TraceGranularity } from '../src/types.js' + +const SESSION_ID = 'sess-abcd1234ef' + +const capturers: SessionCapturer[] = [] +const tmpDirs: string[] = [] + +afterEach(() => { + while (capturers.length) { + capturers.pop()!.cleanup() + } + while (tmpDirs.length) { + fs.rmSync(tmpDirs.pop()!, { recursive: true, force: true }) + } +}) + +function makeTmpSpec(): string { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'sel-trace-gran-')) + tmpDirs.push(dir) + return path.join(dir, 'login.spec.ts') +} + +function makeCtx( + granularity: TraceGranularity, + specFile: string, + withSessionId = false +) { + resetSignatureCounters() + const reporter = new TestReporter(vi.fn()) + const suiteManager = new SuiteManager(reporter) + const rootSuite = suiteManager.getOrCreateRootSuite(specFile, 'Suite') + const testManager = new TestManager(rootSuite, reporter, suiteManager) + const capturer = new SessionCapturer() + capturers.push(capturer) + if (withSessionId) { + // Only sessionId matters to the flush path; the rest of Metadata is + // filled with writeTraceZip's defaults, so a partial cast is safe here. + capturer.metadata = { sessionId: SESSION_ID } as SessionCapturer['metadata'] + } + + // Minimal structural ctx: the boundary/flush helpers read only the trace + // accumulators, options, capturer, test/suite managers and testFilePath, so + // we cast a partial to the full lifecycle interface. + const ctx = { + options: { + mode: 'trace', + tracePolicy: 'on', + traceGranularity: granularity, + traceFormat: 'zip' + }, + sessionCapturer: capturer, + testManager, + suiteManager, + testFilePath: specFile, + actionSnapshots: [], + snapshotCaptures: [], + specRanges: [], + flushedSpecs: new Set<string>(), + traceFlushes: [] + } as unknown as SessionLifecycleCtx + + return { ctx, capturer, testManager } +} + +describe('trace granularity: test', () => { + it('records one per-test slice keyed by the started test uid', () => { + const spec = makeTmpSpec() + const { ctx, testManager } = makeCtx('test', spec) + + const test = testManager.startMarkedTest('logs in') + recordTraceBoundary(ctx, spec) + + expect(ctx.specRanges).toHaveLength(1) + expect(ctx.specRanges[0].testUid).toBe(test.uid) + expect(ctx.specRanges[0].key).toBe(test.uid) + expect(ctx.specRanges[0].specFile).toBe(spec) + }) + + it('re-recording the same active test is idempotent (no spurious slice)', () => { + const spec = makeTmpSpec() + const { ctx, testManager } = makeCtx('test', spec) + + testManager.startMarkedTest('logs in') + recordTraceBoundary(ctx, spec) + // Mirrors the buffered-first-test replay: startTest recorded nothing (no + // capturer yet), flushPendingTestActions re-invokes for the same test. + recordTraceBoundary(ctx, spec) + + expect(ctx.specRanges).toHaveLength(1) + }) + + it('a retry gets its own distinct slice (selenium gives each attempt a uid)', () => { + const spec = makeTmpSpec() + const { ctx, testManager } = makeCtx('test', spec) + + const first = testManager.startMarkedTest('flaky') + recordTraceBoundary(ctx, spec) + testManager.endCurrent('failed') + + const retry = testManager.startMarkedTest('flaky') + recordTraceBoundary(ctx, spec) + testManager.endCurrent('passed') + + expect(first.uid).not.toBe(retry.uid) + expect(ctx.specRanges).toHaveLength(2) + expect(ctx.specRanges.map((r) => r.key)).toEqual([first.uid, retry.uid]) + }) + + it('eager-flushes each test to its own artifact at test end', async () => { + const spec = makeTmpSpec() + const outDir = path.dirname(spec) + const { ctx, testManager } = makeCtx('test', spec, true) + + testManager.startMarkedTest('logs in') + recordTraceBoundary(ctx, spec) + testManager.endCurrent('passed') + flushCurrentTestTrace(ctx) + + testManager.startMarkedTest('logs out') + recordTraceBoundary(ctx, spec) + testManager.endCurrent('passed') + flushCurrentTestTrace(ctx) + + expect(ctx.traceFlushes).toHaveLength(2) + // Both slice keys are recorded as flushed synchronously, so end-of-run + // finalizeTraceExport dedupes and won't re-write them. + expect(ctx.flushedSpecs.size).toBe(2) + await Promise.all(ctx.traceFlushes) + + // Per-test slices land under test-results/<spec--title-browser>/trace.zip, + // so recurse to find them rather than scanning the flat dir. + const zips = fs + .readdirSync(outDir, { recursive: true }) + .map(String) + .filter((f) => f.endsWith('.zip')) + expect(zips).toHaveLength(2) + expect(zips.every((f) => path.basename(f) === 'trace.zip')).toBe(true) + expect(zips.every((f) => f.includes('test-results'))).toBe(true) + }) + + it('flushCurrentTestTrace is a no-op with no recorded range', () => { + const spec = makeTmpSpec() + const { ctx } = makeCtx('test', spec, true) + flushCurrentTestTrace(ctx) + expect(ctx.traceFlushes).toHaveLength(0) + expect(ctx.flushedSpecs.size).toBe(0) + }) +}) + +describe('trace granularity: spec/session unchanged', () => { + it('spec granularity still records one slice per spec file, keyed by file', () => { + const specA = makeTmpSpec() + const specB = makeTmpSpec() + const { ctx } = makeCtx('spec', specA) + + recordTraceBoundary(ctx, specA) + recordTraceBoundary(ctx, specA) // same file → shares the slice + recordTraceBoundary(ctx, specB) + + expect(ctx.specRanges.map((r) => r.key)).toEqual([specA, specB]) + expect(ctx.specRanges.every((r) => r.testUid === undefined)).toBe(true) + }) + + it('session granularity records no slices and never eager-flushes', () => { + const spec = makeTmpSpec() + const { ctx, testManager } = makeCtx('session', spec, true) + + testManager.startMarkedTest('logs in') + recordTraceBoundary(ctx, spec) + testManager.endCurrent('passed') + flushCurrentTestTrace(ctx) + + expect(ctx.specRanges).toHaveLength(0) + expect(ctx.traceFlushes).toHaveLength(0) + }) +}) diff --git a/packages/service/src/trace-slices.ts b/packages/service/src/trace-slices.ts new file mode 100644 index 00000000..fcc36962 --- /dev/null +++ b/packages/service/src/trace-slices.ts @@ -0,0 +1,49 @@ +// Trace-slice flushing for the WDIO adapter: previous-slice flush at boundary +// changes plus the eager per-test flush. Kept out of index.ts so the slice +// selection and flush I/O are unit-testable and the god-file stays lean. + +import { + flushRangeLogged, + type SpecRange, + type TraceExportContext +} from '@wdio/devtools-core' + +/** The range for the test that just ended is the most recent slice recorded + * under this base testUid — retries push a new range under the same testUid, + * so reverse-scanning finds the attempt whose afterTest is now firing. */ +export function findCurrentTestRange( + ranges: readonly SpecRange[], + testUid: string +): SpecRange | undefined { + for (let i = ranges.length - 1; i >= 0; i--) { + if (ranges[i]!.testUid === testUid) { + return ranges[i] + } + } + return undefined +} + +/** Fire-and-forget flush of the previous unflushed slice at a boundary change + * (spec granularity, or a test slice whose eager flush was missed). Errors are + * logged, never thrown, so a failed flush can't abort the next test. */ +export function flushPrevSlice( + ctx: TraceExportContext, + range: SpecRange +): void { + void flushRangeLogged(ctx, range) +} + +/** Awaited flush of the just-ended test's slice (test granularity), so this + * attempt's just-stamped metadata is written before a retry's beforeTest + * overwrites the entry. No-op when the test recorded no range. */ +export async function flushTestSlice( + ctx: TraceExportContext, + ranges: readonly SpecRange[], + testUid: string +): Promise<void> { + const range = findCurrentTestRange(ranges, testUid) + if (!range) { + return + } + await flushRangeLogged(ctx, range) +} diff --git a/packages/service/tests/trace-granularity.test.ts b/packages/service/tests/trace-granularity.test.ts new file mode 100644 index 00000000..c43b6b66 --- /dev/null +++ b/packages/service/tests/trace-granularity.test.ts @@ -0,0 +1,240 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import type * as DevtoolsCore from '@wdio/devtools-core' +import { deterministicUid, type SpecRange } from '@wdio/devtools-core' +import { findCurrentTestRange } from '../src/trace-slices.js' + +// Records the key/state observed at each per-slice flush and replays the real +// dedupe (flushed.add) so recordSliceBoundary's prev-slice logic behaves as in +// production — otherwise a boundary change would re-flush an already-flushed +// slice. Capturing state at call time is what proves the eager flush sees this +// attempt's outcome before a retry's beforeTest overwrites the entry. +const flushedSlices: Array<{ key: string; testUid?: string; state?: string }> = + [] + +type FlushCtx = { + flushed: Set<string> + testMetadata: Map<string, { state?: string }> +} + +const flushRangeTrace = vi.fn( + (ctx: FlushCtx, range: { key: string; testUid?: string }) => { + ctx.flushed.add(range.key) + flushedSlices.push({ + key: range.key, + testUid: range.testUid, + state: range.testUid + ? ctx.testMetadata.get(range.testUid)?.state + : undefined + }) + return Promise.resolve(undefined) + } +) + +const finalizeTraceExport = vi.fn().mockResolvedValue([]) + +vi.mock('stack-trace', () => ({ parse: () => [] })) + +const mockSessionCapturerInstance = { + afterCommand: vi.fn(), + sendUpstream: vi.fn(), + injectScript: vi.fn().mockResolvedValue(undefined), + captureAssertCommand: vi.fn(), + failLastAction: vi.fn(), + resetLastSelector: vi.fn(), + resetRetryTracker: vi.fn(), + cleanup: vi.fn(), + commandsLog: [] as unknown[], + sources: new Map(), + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + metadata: { url: 'http://test.com', viewport: {} } +} + +vi.mock('../src/session.js', () => ({ + SessionCapturer: vi.fn(function (this: unknown) { + return mockSessionCapturerInstance + }) +})) + +vi.mock('../src/action-snapshot.js', () => ({ + captureActionSnapshot: vi.fn().mockResolvedValue(null), + captureActionResult: vi.fn().mockResolvedValue(undefined), + waitForActionResult: vi.fn().mockResolvedValue(undefined) +})) + +vi.mock('@wdio/devtools-core', async (importOriginal) => { + const actual = await importOriginal<typeof DevtoolsCore>() + return { + ...actual, + finalizeTraceExport: (ctx: unknown) => finalizeTraceExport(ctx), + // The adapter now flushes via core's flushRangeLogged wrapper; route it to + // the same spy so call-count/argument assertions still observe each flush. + flushRangeLogged: (ctx: unknown, range: unknown) => + flushRangeTrace( + ctx as FlushCtx, + range as { key: string; testUid?: string } + ), + flushRangeTrace: (ctx: unknown, range: unknown) => + flushRangeTrace( + ctx as FlushCtx, + range as { key: string; testUid?: string } + ) + } +}) + +// Imported after the mocks are declared so the mocked core module is used. +const { default: DevToolsHookService } = await import('../src/index.js') + +describe('findCurrentTestRange', () => { + const mk = (key: string, testUid?: string): SpecRange => ({ + specFile: 'f', + key, + testUid, + commandStartIdx: 0, + consoleStartIdx: 0, + networkStartIdx: 0, + mutationStartIdx: 0, + traceLogStartIdx: 0, + snapshotCount: 0 + }) + + it('returns the most recent range recorded under the base testUid', () => { + const ranges = [mk('a', 'a'), mk('b', 'b'), mk('b-retry1', 'b')] + // A retry pushes a new range under the same testUid; the latest one wins. + expect(findCurrentTestRange(ranges, 'b')?.key).toBe('b-retry1') + expect(findCurrentTestRange(ranges, 'a')?.key).toBe('a') + }) + + it('returns undefined when no range matches (spec/session slices)', () => { + expect( + findCurrentTestRange([mk('spec.ts', undefined)], 'x') + ).toBeUndefined() + expect(findCurrentTestRange([], 'x')).toBeUndefined() + }) +}) + +describe('DevtoolsService - trace granularity slicing', () => { + const file = '/proj/specs/login.spec.ts' + const mockBrowser = { + isBidi: true, + sessionId: 'sess-1', + scriptAddPreloadScript: vi.fn().mockResolvedValue(undefined), + takeScreenshot: vi.fn().mockResolvedValue('shot'), + execute: vi + .fn() + .mockResolvedValue({ width: 1, height: 1, offsetLeft: 0, offsetTop: 0 }), + on: vi.fn(), + emit: vi.fn(), + options: { rootDir: '/proj' }, + capabilities: { browserName: 'chrome' } + } as never + + beforeEach(() => { + vi.clearAllMocks() + finalizeTraceExport.mockResolvedValue([]) + flushedSlices.length = 0 + }) + + async function newService(granularity: 'session' | 'spec' | 'test') { + const service = new DevToolsHookService({ + mode: 'trace', + tracePolicy: 'retain-on-failure', + traceGranularity: granularity + }) + await service.before({} as never, [], mockBrowser) + return service + } + + it('test granularity: records a per-test slice at beforeTest and eager-flushes it at afterTest', async () => { + const service = await newService('test') + const title = 'login works' + const uid = deterministicUid(file, title) + + service.beforeTest({ file, fullTitle: title }) + expect(flushRangeTrace).not.toHaveBeenCalled() + + await service.afterTest({ file, fullTitle: title }, {}, { passed: true }) + + expect(flushRangeTrace).toHaveBeenCalledTimes(1) + // The flushed range is the one recorded at beforeTest (found via testUid), + // proving both the start-boundary and the eager end-flush. + expect(flushRangeTrace.mock.calls[0]![1]).toMatchObject({ + key: uid, + testUid: uid + }) + expect(flushedSlices).toEqual([{ key: uid, testUid: uid, state: 'passed' }]) + }) + + it('test granularity: a retried test produces a distinct retry slice, each with its own attempt outcome', async () => { + const service = await newService('test') + const title = 'flaky login' + const uid = deterministicUid(file, title) + + // Attempt 1 fails, then a same-process retry (Mocha) passes. + service.beforeTest({ file, fullTitle: title }) + await service.afterTest( + { file, fullTitle: title }, + {}, + { passed: false, error: new Error('boom') } + ) + service.beforeTest({ file, fullTitle: title }) + await service.afterTest({ file, fullTitle: title }, {}, { passed: true }) + + expect(flushRangeTrace).toHaveBeenCalledTimes(2) + // Each attempt is its own slice, and each slice was written with that + // attempt's just-stamped state — the failed first attempt survives the + // retry's beforeTest overwrite (the retain-on-first-failure fix). + expect(flushedSlices).toEqual([ + { key: uid, testUid: uid, state: 'failed' }, + { key: `${uid}-retry1`, testUid: uid, state: 'passed' } + ]) + }) + + it('test granularity: Cucumber scenario eager-flushes its slice at afterScenario', async () => { + const service = await newService('test') + const uri = '/proj/features/login.feature' + const name = 'log in' + const uid = deterministicUid(uri, name) + + service.beforeScenario({ pickle: { uri, name } }) + await service.afterScenario({ pickle: { uri, name } }, { passed: true }) + + expect(flushRangeTrace).toHaveBeenCalledTimes(1) + expect(flushRangeTrace.mock.calls[0]![1]).toMatchObject({ + key: uid, + testUid: uid + }) + }) + + it('spec granularity: no eager flush at afterTest; flushes only when the spec file changes', async () => { + const service = await newService('spec') + const other = '/proj/specs/cart.spec.ts' + + service.beforeTest({ file, fullTitle: 't1' }) + await service.afterTest({ file, fullTitle: 't1' }, {}, { passed: true }) + // Two tests in the same spec: neither the end-flush nor a boundary fires. + service.beforeTest({ file, fullTitle: 't2' }) + await service.afterTest({ file, fullTitle: 't2' }, {}, { passed: true }) + expect(flushRangeTrace).not.toHaveBeenCalled() + + // A new spec file flushes the previous spec's slice (fire-and-forget). + service.beforeTest({ file: other, fullTitle: 't3' }) + expect(flushRangeTrace).toHaveBeenCalledTimes(1) + const range = flushRangeTrace.mock.calls[0]![1] as SpecRange + expect(range.key).toBe(file) + expect(range.testUid).toBeUndefined() + }) + + it('session granularity: records no slices and never flushes per test', async () => { + const service = await newService('session') + + service.beforeTest({ file, fullTitle: 't1' }) + await service.afterTest({ file, fullTitle: 't1' }, {}, { passed: true }) + service.beforeTest({ file, fullTitle: 't2' }) + await service.afterTest({ file, fullTitle: 't2' }, {}, { passed: false }) + + expect(flushRangeTrace).not.toHaveBeenCalled() + }) +}) From 3c79feeb46db9460ce5f194851ddb585c7719355 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:23:26 +0530 Subject: [PATCH 032/109] feat(service): capture expect-webdriverio matchers as assertion actions --- packages/core/src/assert-patcher.ts | 10 +- packages/service/src/action-snapshot.ts | 18 ++ packages/service/src/assert-capture.ts | 45 +++- packages/service/src/call-source.ts | 12 +- packages/service/src/index.ts | 218 ++++++++++++++---- .../service/tests/action-snapshot.test.ts | 29 +++ packages/service/tests/assert-capture.test.ts | 56 +++++ packages/service/tests/assertion-rows.test.ts | 157 +++++++++++++ packages/service/tests/index.test.ts | 64 +++++ 9 files changed, 557 insertions(+), 52 deletions(-) create mode 100644 packages/service/tests/action-snapshot.test.ts create mode 100644 packages/service/tests/assertion-rows.test.ts diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index 71ebd9fe..c6b91bf2 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -168,6 +168,10 @@ export interface MatcherAssertion { passed: boolean message?: string | (() => string) callSource?: string + /** Explicit display label for the action row. Falls back to `command` when + * absent — set it when the framework carries a richer human message than + * `prefix.method` (e.g. Nightwatch's "Testing if the page title contains …"). */ + title?: string } export function matcherAssertionToCommandLog( @@ -177,7 +181,7 @@ export function matcherAssertionToCommandLog( const command = `${input.prefix ?? 'expect'}.${input.method}` const message = typeof input.message === 'function' ? input.message() : input.message - return capturedAssertToCommandLog( + const entry = capturedAssertToCommandLog( { command, args: (input.args ?? []).map(safeSerializeAssertArg), @@ -190,6 +194,10 @@ export function matcherAssertionToCommandLog( }, testUid ) + if (input.title) { + entry.title = input.title + } + return entry } /** diff --git a/packages/service/src/action-snapshot.ts b/packages/service/src/action-snapshot.ts index 12710114..f8dc7fe9 100644 --- a/packages/service/src/action-snapshot.ts +++ b/packages/service/src/action-snapshot.ts @@ -81,6 +81,24 @@ export async function captureActionResult( } } +/** Capture a DOM snapshot for a synthesized action row (e.g. an `expect.*` + * assertion) and push it stamped at the row's OWN timestamp — the trace + * player's Snapshot tab claims it by timestamp the same way it claims a + * regular command's post-action snapshot (see FrameSnapshotIndex.claimAfter). + * Mirrors the tail of `captureActionResult` for a command with no page-settle. */ +export async function pushActionSnapshotAt( + browser: WebdriverIO.Browser, + command: string, + timestamp: number, + actionSnapshots: ActionSnapshot[] +): Promise<void> { + const snap = await captureActionSnapshot(browser, command) + if (snap) { + snap.timestamp = timestamp + actionSnapshots.push(snap) + } +} + export function captureActionSnapshot( browser: WebdriverIO.Browser, command: string diff --git a/packages/service/src/assert-capture.ts b/packages/service/src/assert-capture.ts index 2c277cf8..49725ec8 100644 --- a/packages/service/src/assert-capture.ts +++ b/packages/service/src/assert-capture.ts @@ -9,10 +9,44 @@ import { stripAnsi } from '@wdio/devtools-core' import type { CommandLog, SerializedError } from '@wdio/devtools-shared' +import { parse } from 'stack-trace' +import { + resolveCallSourceFromFrame, + resolveFilePathFromFrame +} from './call-source.js' +import { isUserSpecFile } from './utils.js' import type { SessionCapturer } from './session.js' const log = logger('@wdio/devtools-service:assert-capture') +/** + * Capture the user's `expect()` call site from the SYNCHRONOUS stack at matcher + * entry (call from `beforeAssertion`). The matcher then runs async, so this is + * the only point a user frame is still on the stack — reading it in + * `afterAssertion` resolves to the service bundle instead. Mirrors + * `beforeCommand`'s resolver (`parse(new Error()).reverse()` → first user-spec + * frame → `resolveCallSourceFromFrame`) so assertion rows share regular + * commands' Source-tab behaviour. Also loads that file's source via + * `captureSource` so the tab renders. Returns `undefined` when no user frame is + * present (row falls back to no callSource, exactly as before this fix). + */ +export function resolveAssertionCallSource( + captureSource: (filePath: string) => void +): string | undefined { + Error.stackTraceLimit = 20 + const frame = parse(new Error('')) + .reverse() + .find((f) => isUserSpecFile(f.getFileName())) + if (!frame) { + return undefined + } + const filePath = resolveFilePathFromFrame(frame) + if (filePath) { + captureSource(filePath) + } + return resolveCallSourceFromFrame(frame) +} + /** * Patch node:assert so every tracked assertion lands in the session capturer * as a command. Getters are read at capture time — the capturer instance is @@ -101,11 +135,15 @@ export interface ExpectAssertion { * Adapt expect-webdriverio's afterAssertion params to the shared matcher * converter. Framework-specific extraction only (matcher name, expectedValue → * args, the runtime `pass` vs typed `result` flag); the actual CommandLog - * shaping lives once in core's `matcherAssertionToCommandLog`. + * shaping lives once in core's `matcherAssertionToCommandLog`. `callSource` is + * the user's `expect()` call site captured in `beforeAssertion` (the matcher + * runs async, so afterAssertion's own stack no longer holds a user frame) — it + * makes the row's Source tab point at the spec, not the service bundle. */ export function expectAssertionToCommandLog( params: ExpectAssertion, - testUid: string | undefined + testUid: string | undefined, + callSource?: string ): CommandLog { const { matcherName, expectedValue, result } = params return matcherAssertionToCommandLog( @@ -118,7 +156,8 @@ export function expectAssertionToCommandLog( ? expectedValue : [expectedValue], passed: result.pass ?? result.result ?? false, - message: result.message + message: result.message, + callSource }, testUid ) diff --git a/packages/service/src/call-source.ts b/packages/service/src/call-source.ts index 59325905..53a6fc80 100644 --- a/packages/service/src/call-source.ts +++ b/packages/service/src/call-source.ts @@ -2,8 +2,8 @@ import type { parse } from 'stack-trace' type StackFrame = ReturnType<typeof parse>[number] -/** `<file>:<line>:<column>` from a parsed stack frame; strips file:// and query. */ -export function resolveCallSourceFromFrame( +/** Absolute file path from a parsed stack frame; strips file:// and query. */ +export function resolveFilePathFromFrame( frame: StackFrame ): string | undefined { const rawFile = frame.getFileName() ?? undefined @@ -18,6 +18,14 @@ export function resolveCallSourceFromFrame( if (absPath?.includes('?')) { absPath = absPath.split('?')[0] } + return absPath +} + +/** `<file>:<line>:<column>` from a parsed stack frame; strips file:// and query. */ +export function resolveCallSourceFromFrame( + frame: StackFrame +): string | undefined { + const absPath = resolveFilePathFromFrame(frame) if (absPath === undefined) { return undefined } diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index cbe6c196..5a266694 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -4,9 +4,8 @@ import { errorMessage, finalizeScreencast, finalizeTraceExport, - flushRangeTrace, mapCommandToAction, - recordSpecBoundary, + recordSliceBoundary, resolveAdapterOutputDir, TestAttemptTracker, tracePolicyModeWarning, @@ -16,6 +15,7 @@ import { import { captureExpectFailure, expectAssertionToCommandLog, + resolveAssertionCallSource, wireAssertCapture, type ExpectAssertion } from './assert-capture.js' @@ -27,9 +27,11 @@ import { type TestOutcomeResult } from './test-metadata.js' import { resolveCallSourceFromFrame } from './call-source.js' +import { flushPrevSlice, flushTestSlice } from './trace-slices.js' import { captureActionResult, - captureActionSnapshot + captureActionSnapshot, + pushActionSnapshotAt } from './action-snapshot.js' import { dedupeSnapshotsByTimestamp, @@ -102,6 +104,24 @@ export default class DevToolsHookService implements Services.ServiceInstance { */ #commandStack: CommandFrame[] = [] + /** Depth of the current expect-webdriverio matcher evaluation. While > 0, the + * matcher's internal WebDriver commands (getText/isExisting polling) are + * suppressed so only the `expect.<matcher>` assertion row is captured — + * matching Playwright and the Nightwatch native-assert behaviour. */ + #assertionDepth = 0 + + /** Matcher start timestamps (stack, paired with #assertionDepth) so a captured + * assertion spans [matcher start → end] — its poll duration — instead of + * collapsing to a zero-width point at completion, which left the screencast + * tracking the preceding command during the poll. */ + #assertionStartTimes: number[] = [] + + /** User `expect()` call sites (stack, paired with #assertionStartTimes), + * captured in beforeAssertion while a user frame is still synchronous. The + * matcher runs async, so afterAssertion's own stack resolves to the service + * bundle — this parallel stack lets each row keep its spec-file callSource. */ + #assertionCallSources: (string | undefined)[] = [] + /** Current test UID, set in beforeTest(), used by afterCommand() to tag commands. */ #currentTestUid?: string @@ -119,7 +139,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Set of spec files already flushed to disk. */ #flushedSpecs = new Set<string>() - /** Build the boundary context for recordSpecBoundary — the same shape is + /** Build the boundary context for recordSliceBoundary — the same shape is * needed in both beforeTest and beforeScenario. */ get #boundaryContext() { return { @@ -130,33 +150,41 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** Fire-and-forget flush of a previous spec's trace. The error log is - * inline so the spec-file reference stays precise. */ - #fireAndForgetFlush(prevRange: SpecRange): void { - if (!this.#browser) { + /** Record a trace-slice boundary. `spec` slices per file; `test` per test + * (retries keyed per attempt by core); `session` records nothing. The + * previous-slice flush fires for `spec`; `test` slices eager-flush at their + * own test end (see #eagerFlushTestSlice) so this is only a missed-slice net. */ + #recordBoundary(specFile: string | undefined, testUid?: string): void { + if (!specFile) { return } - void flushRangeTrace(this.#traceContext(this.#browser), prevRange).catch( - (err) => - log.warn( - `Failed to flush trace for spec "${prevRange.specFile}": ${errorMessage(err)}` - ) + const prevRange = recordSliceBoundary( + this.#boundaryContext, + this.#options.traceGranularity, + specFile, + testUid ) + if (prevRange && this.#browser) { + flushPrevSlice(this.#traceContext(this.#browser), prevRange) + } } - /** Record a spec boundary (spec granularity) and flush the previous spec. */ - #recordBoundary(specFile: string | undefined): void { - if (!specFile) { + /** Eager per-test flush at test end (test granularity only), run after the + * outcome is stamped so this attempt's metadata is written before a retry + * overwrites it; the end-of-run finalizer then dedupes it via the key set. */ + async #eagerFlushTestSlice(testUid: string): Promise<void> { + if ( + this.#options.traceGranularity !== 'test' || + this.#options.mode !== 'trace' || + !this.#browser + ) { return } - const prevRange = recordSpecBoundary( - this.#boundaryContext, - specFile, - this.#options.traceGranularity + await flushTestSlice( + this.#traceContext(this.#browser), + this.#specRanges, + testUid ) - if (prevRange) { - this.#fireAndForgetFlush(prevRange) - } } /** Assemble the framework-agnostic trace-export context from this service's @@ -326,16 +354,21 @@ export default class DevToolsHookService implements Services.ServiceInstance { const featureFile = world?.pickle?.uri const scenarioName = world?.pickle?.name + // Derived before recording the boundary so `test` granularity keys the + // slice on the same uid the metadata map uses. + const uid = + featureFile && scenarioName + ? cucumberScenarioUid( + featureFile, + scenarioName, + world?.pickle?.astNodeIds + ) + : undefined - this.#recordBoundary(featureFile) + this.#recordBoundary(featureFile, uid) // ── Test identity for command tagging ── - if (featureFile && scenarioName) { - const uid = cucumberScenarioUid( - featureFile, - scenarioName, - world?.pickle?.astNodeIds - ) + if (uid && scenarioName && featureFile) { this.#currentTestUid = uid this.#attemptTracker.recordStart(uid) this.#testMetadata.set(uid, { @@ -349,15 +382,17 @@ export default class DevToolsHookService implements Services.ServiceInstance { beforeTest(test?: { file?: string; title?: string; fullTitle?: string }) { this.resetStack() - this.#recordBoundary(test?.file) - // Track test identity for command tagging. Generate a stable UID // from file + title so commands can be partitioned across reruns. // WDIO's Test type always provides `fullTitle`; `title` is a - // fallback for non-WDIO frameworks. + // fallback for non-WDIO frameworks. Derived before the boundary so + // `test` granularity keys the slice on the metadata-map uid. const testTitle = test?.fullTitle || test?.title - if (testTitle) { - const uid = testMetadataUid(test?.file, testTitle) + const uid = testTitle ? testMetadataUid(test?.file, testTitle) : undefined + + this.#recordBoundary(test?.file, uid) + + if (uid && testTitle) { this.#currentTestUid = uid this.#attemptTracker.recordStart(uid) this.#testMetadata.set(uid, { @@ -403,10 +438,16 @@ export default class DevToolsHookService implements Services.ServiceInstance { result?: TestOutcomeResult ) { const { uri, name, astNodeIds } = world?.pickle ?? {} - if (uri && name) { - this.#stampOutcome(cucumberScenarioUid(uri, name, astNodeIds), result) + const uid = + uri && name ? cucumberScenarioUid(uri, name, astNodeIds) : undefined + if (uid) { + this.#stampOutcome(uid, result) } await this.#finalizePerScenario() + // Flush now so this slice includes the final snapshot and stamped outcome. + if (uid) { + await this.#eagerFlushTestSlice(uid) + } } async afterTest( @@ -416,22 +457,81 @@ export default class DevToolsHookService implements Services.ServiceInstance { ) { this.#captureExpectFailure(result?.error) const testTitle = test?.fullTitle || test?.title - if (testTitle) { - this.#stampOutcome(testMetadataUid(test?.file, testTitle), result) + const uid = testTitle ? testMetadataUid(test?.file, testTitle) : undefined + if (uid) { + this.#stampOutcome(uid, result) } await this.#finalizePerScenario() + // Flush now so this slice includes the final snapshot and stamped outcome. + if (uid) { + await this.#eagerFlushTestSlice(uid) + } } - /** expect-webdriverio fires this per matcher (pass or fail) via WDIO's - * assertion hook — capture it as an `expect.<matcher>` action so passing - * assertions show in the trace, not just failures. */ - afterAssertion(params: ExpectAssertion): void { + /** expect-webdriverio fires this before each matcher evaluates. The matcher's + * internal polling commands run inside the before→after window and must not + * surface as their own rows — only the `expect.<matcher>` assertion should. */ + beforeAssertion(): void { + // Matchers don't nest, so any residual depth here is a prior matcher whose + // afterAssertion was skipped by a hard throw. Reset before pushing so the + // suppression window can't stay stuck open across assertions. + if (this.#assertionDepth > 0) { + this.#assertionDepth = 0 + this.#assertionStartTimes = [] + this.#assertionCallSources = [] + } + this.#assertionDepth++ + this.#assertionStartTimes.push(Date.now()) + // Capture the user's expect() call site now — see #assertionCallSources. + this.#assertionCallSources.push( + resolveAssertionCallSource( + (file) => void this.#sessionCapturer.captureSource(file) + ) + ) + } + + async afterAssertion(params: ExpectAssertion): Promise<void> { + // Decrement first (even when capture is off) so the window stays balanced. + const startTime = this.#assertionStartTimes.pop() + const callSource = this.#assertionCallSources.pop() + if (this.#assertionDepth > 0) { + this.#assertionDepth-- + } if (this.#options.captureAssertions === false) { return } - this.#sessionCapturer.captureAssertCommand( - expectAssertionToCommandLog(params, this.#currentTestUid) + const entry = expectAssertionToCommandLog( + params, + this.#currentTestUid, + callSource ) + // Span the matcher's poll window so the row's duration is real and the + // screencast tracks the assertion (not the preceding command) during it. + if (startTime !== undefined) { + entry.startTime = startTime + } + // The suppressed matcher-internal command carried the DOM screenshot; + // capture one here so the assertion row's Snapshot panel isn't blank. + if (this.#browser && !isNativeMobile(this.#browser)) { + try { + entry.screenshot = await this.#browser.takeScreenshot() + } catch (err) { + // best-effort: a missing screenshot must not fail the assertion hook + log.debug(`assertion screenshot skipped: ${errorMessage(err)}`) + } + } + // Trace mode: push a DOM action-snapshot stamped at this row's timestamp so + // the trace player's Snapshot tab renders it, exactly like a regular + // command's post-action snapshot (captureActionResult). + if (this.#options.mode === 'trace' && this.#browser) { + await pushActionSnapshotAt( + this.#browser, + entry.command, + entry.timestamp, + this.#actionSnapshots + ) + } + this.#sessionCapturer.captureAssertCommand(entry) } async #finalizePerScenario() { @@ -462,6 +562,9 @@ export default class DevToolsHookService implements Services.ServiceInstance { private resetStack() { this.#commandStack = [] + this.#assertionDepth = 0 + this.#assertionStartTimes = [] + this.#assertionCallSources = [] this.#sessionCapturer.resetLastSelector() this.#sessionCapturer.resetRetryTracker() } @@ -503,7 +606,30 @@ export default class DevToolsHookService implements Services.ServiceInstance { Error.stackTraceLimit = 20 const stack = parse(new Error('')).reverse() const source = stack.find((frame) => isUserSpecFile(frame.getFileName())) - if (source && this.#commandStack.length === 0) { + // #assertionDepth > 0 → we believe we're inside an expect matcher; its + // internal commands trace back to the user's expect() line but must not + // become their own rows (only the expect.<matcher> assertion should). + // expect-webdriverio doesn't wrap afterAssertion in try/finally, though, so + // a matcher whose internal command hard-throws skips it and leaves the depth + // stuck ≥1 — which would then suppress every later user command. When a + // top-level user command arrives with the depth stuck but no live + // expect-webdriverio frame on the stack, the matcher already ended: self-heal + // the leftover depth + parallel stacks so this command captures normally. + if (source && this.#commandStack.length === 0 && this.#assertionDepth > 0) { + const inMatcher = stack.some((frame) => + frame.getFileName()?.includes('expect-webdriverio') + ) + if (!inMatcher) { + this.#assertionDepth = 0 + this.#assertionStartTimes = [] + this.#assertionCallSources = [] + } + } + if ( + source && + this.#commandStack.length === 0 && + this.#assertionDepth === 0 + ) { this.#pushTopLevelCommandFrame( command, resolveCallSourceFromFrame(source) diff --git a/packages/service/tests/action-snapshot.test.ts b/packages/service/tests/action-snapshot.test.ts new file mode 100644 index 00000000..f81be33c --- /dev/null +++ b/packages/service/tests/action-snapshot.test.ts @@ -0,0 +1,29 @@ +import { describe, it, expect, vi } from 'vitest' +import type { ActionSnapshot } from '@wdio/devtools-shared' +import { pushActionSnapshotAt } from '../src/action-snapshot.js' + +const mockBrowser = () => + ({ + execute: vi.fn().mockResolvedValue([]), + takeScreenshot: vi.fn().mockResolvedValue('SHOT'), + getUrl: vi.fn().mockResolvedValue('http://example.com/'), + getTitle: vi.fn().mockResolvedValue('Example') + }) as unknown as WebdriverIO.Browser + +describe('pushActionSnapshotAt', () => { + it('captures a DOM snapshot and stamps it at the row timestamp', async () => { + const snapshots: ActionSnapshot[] = [] + await pushActionSnapshotAt( + mockBrowser(), + 'expect.toExist', + 12345, + snapshots + ) + expect(snapshots).toHaveLength(1) + // Stamped at the row's own timestamp — not the capture time — so the trace + // player's FrameSnapshotIndex.claimAfter(cmd.timestamp) matches it. + expect(snapshots[0]!.timestamp).toBe(12345) + expect(snapshots[0]!.command).toBe('expect.toExist') + expect(snapshots[0]!.screenshot).toBe('SHOT') + }) +}) diff --git a/packages/service/tests/assert-capture.test.ts b/packages/service/tests/assert-capture.test.ts index d1486257..534945e3 100644 --- a/packages/service/tests/assert-capture.test.ts +++ b/packages/service/tests/assert-capture.test.ts @@ -7,11 +7,30 @@ import { import { captureExpectFailure, expectAssertionToCommandLog, + resolveAssertionCallSource, toCommandError, wireAssertCapture } from '../src/assert-capture.js' import type { SessionCapturer } from '../src/session.js' +const stackFrames = vi.hoisted(() => ({ + value: [] as Array<{ + getFileName: () => string | null + getLineNumber: () => number | null + getColumnNumber: () => number | null + }> +})) + +// Only resolveAssertionCallSource reads 'stack-trace'; node:assert capture uses +// core's stacktrace-parser path, so mocking here doesn't affect those tests. +vi.mock('stack-trace', () => ({ parse: () => stackFrames.value })) + +const frame = (file: string | null, line = 1, column = 1) => ({ + getFileName: () => file, + getLineNumber: () => line, + getColumnNumber: () => column +}) + describe('toCommandError', () => { it('normalizes a plain Error object (ANSI stripped)', () => { // Matcher errors are skipped now (afterAssertion owns them); a plain @@ -196,4 +215,41 @@ describe('expectAssertionToCommandLog', () => { ) expect(entry).toMatchObject({ command: 'expect.toBeClickable', args: [] }) }) + + it('forwards the captured callSource onto the assertion row', () => { + const entry = expectAssertionToCommandLog( + { matcherName: 'toExist', result: { pass: true } }, + 'uid-1', + '/proj/specs/login.e2e.ts:30:7' + ) + expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') + }) +}) + +describe('resolveAssertionCallSource', () => { + it('returns the outermost user-spec frame and loads its source', () => { + // innermost → outermost: service bundle, expect-webdriverio matcher, the + // user spec, then node internals. The user spec must win, not the bundle. + stackFrames.value = [ + frame('/repo/packages/service/dist/index.js', 4045, 12), + frame('/repo/node_modules/expect-webdriverio/lib/matchers.js', 9, 3), + frame('/proj/specs/login.e2e.ts', 30, 7), + frame('node:internal/process/task_queues', 95, 5) + ] + const captured: string[] = [] + const callSource = resolveAssertionCallSource((f) => captured.push(f)) + expect(callSource).toBe('/proj/specs/login.e2e.ts:30:7') + expect(callSource).not.toContain('/dist/') + expect(captured).toEqual(['/proj/specs/login.e2e.ts']) + }) + + it('returns undefined and loads nothing when only dependency frames exist', () => { + stackFrames.value = [ + frame('/repo/node_modules/expect-webdriverio/lib/matchers.js', 9, 3), + frame('node:internal/process/task_queues', 95, 5) + ] + const captured: string[] = [] + expect(resolveAssertionCallSource((f) => captured.push(f))).toBeUndefined() + expect(captured).toEqual([]) + }) }) diff --git a/packages/service/tests/assertion-rows.test.ts b/packages/service/tests/assertion-rows.test.ts new file mode 100644 index 00000000..5a5b09ac --- /dev/null +++ b/packages/service/tests/assertion-rows.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect, vi, beforeEach, afterAll } from 'vitest' +import assert from 'node:assert' +import { + ASSERT_PATCHED_SYMBOL, + TRACKED_ASSERT_METHODS +} from '@wdio/devtools-core' + +// Controlled synchronous stack for the beforeAssertion call-source walk. +const stackFrames = vi.hoisted(() => ({ + value: [] as Array<{ + getFileName: () => string | null + getLineNumber: () => number | null + getColumnNumber: () => number | null + }> +})) +vi.mock('stack-trace', () => ({ parse: () => stackFrames.value })) + +const capturer = vi.hoisted(() => ({ + captureAssertCommand: vi.fn(), + captureSource: vi.fn().mockResolvedValue(undefined), + injectScript: vi.fn().mockResolvedValue(undefined), + sendUpstream: vi.fn(), + cleanup: vi.fn(), + resetLastSelector: vi.fn(), + resetRetryTracker: vi.fn(), + commandsLog: [] as unknown[], + sources: new Map<string, string>() +})) +vi.mock('../src/session.js', () => ({ + SessionCapturer: vi.fn(function (this: unknown) { + return capturer + }) +})) + +const pushActionSnapshotAt = vi.hoisted(() => + vi.fn().mockResolvedValue(undefined) +) +vi.mock('../src/action-snapshot.js', () => ({ + pushActionSnapshotAt, + captureActionSnapshot: vi.fn().mockResolvedValue(null), + captureActionResult: vi.fn().mockResolvedValue(undefined) +})) + +import DevToolsHookService from '../src/index.js' +import type { ExpectAssertion } from '../src/assert-capture.js' + +const userFrame = { + getFileName: () => '/proj/specs/login.e2e.ts', + getLineNumber: () => 30, + getColumnNumber: () => 7 +} + +const mockBrowser = { + isBidi: true, + sessionId: 's1', + options: {}, + capabilities: {}, + takeScreenshot: vi.fn().mockResolvedValue('SHOT'), + execute: vi + .fn() + .mockResolvedValue({ width: 1, height: 1, offsetLeft: 0, offsetTop: 0 }), + on: vi.fn(), + emit: vi.fn() +} as unknown as WebdriverIO.Browser + +// before() wires node:assert capture; restore the real methods afterwards. +const ASSERT_MUT = assert as unknown as Record<string | symbol, unknown> +const originals: Record<string, unknown> = {} +for (const method of TRACKED_ASSERT_METHODS) { + originals[method] = ASSERT_MUT[method] +} +afterAll(() => { + delete ASSERT_MUT[ASSERT_PATCHED_SYMBOL] + for (const method of TRACKED_ASSERT_METHODS) { + ASSERT_MUT[method] = originals[method] + } +}) + +const capturedEntry = () => capturer.captureAssertCommand.mock.calls[0]![0] + +describe('DevtoolsService — expect.* assertion rows', () => { + beforeEach(() => { + vi.clearAllMocks() + stackFrames.value = [userFrame] + }) + + it('trace mode: user-spec callSource, spec source loaded, DOM snapshot pushed', async () => { + const service = new DevToolsHookService({ mode: 'trace' }) + await service.before({} as never, [], mockBrowser) + + service.beforeAssertion() + const params: ExpectAssertion = { + matcherName: 'toExist', + result: { pass: true, message: () => 'ok' } + } + await service.afterAssertion(params) + + const entry = capturedEntry() + expect(entry.command).toBe('expect.toExist') + // The regression: callSource must point at the user's spec, not the + // service bundle (…/service/dist/index.js). + expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') + expect(entry.callSource).not.toContain('/dist/') + // Source of that file is loaded so the Source tab can render it. + expect(capturer.captureSource).toHaveBeenCalledWith( + '/proj/specs/login.e2e.ts' + ) + // Live-mode screenshot kept for the CommandLog. + expect(entry.screenshot).toBe('SHOT') + // Trace-player Snapshot tab: a DOM snapshot stamped at the row timestamp. + expect(pushActionSnapshotAt).toHaveBeenCalledWith( + mockBrowser, + 'expect.toExist', + entry.timestamp, + expect.any(Array) + ) + // WDIO reconciles rows by timestamp (like every regular WDIO command), + // so assertion rows carry no public id — parity with regular commands. + expect(entry.id).toBeUndefined() + }) + + it('live mode: keeps the screenshot but pushes no DOM snapshot', async () => { + const service = new DevToolsHookService({ mode: 'live' }) + await service.before({} as never, [], mockBrowser) + + service.beforeAssertion() + await service.afterAssertion({ + matcherName: 'toHaveText', + expectedValue: 'Hi', + result: { pass: false, message: () => 'nope' } + }) + + const entry = capturedEntry() + expect(entry.command).toBe('expect.toHaveText') + expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') + expect(entry.error).toMatchObject({ message: 'nope' }) + expect(entry.screenshot).toBe('SHOT') + expect(pushActionSnapshotAt).not.toHaveBeenCalled() + }) + + it('captureAssertions: false suppresses the row but keeps the window balanced', async () => { + const service = new DevToolsHookService({ + mode: 'trace', + captureAssertions: false + }) + await service.before({} as never, [], mockBrowser) + + service.beforeAssertion() + await service.afterAssertion({ + matcherName: 'toExist', + result: { pass: true } + }) + + expect(capturer.captureAssertCommand).not.toHaveBeenCalled() + expect(pushActionSnapshotAt).not.toHaveBeenCalled() + }) +}) diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index 5ce1e1f5..1809fa6c 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -15,6 +15,8 @@ const mockSessionCapturerInstance = { afterCommand: vi.fn(), sendUpstream: vi.fn(), injectScript: vi.fn().mockResolvedValue(undefined), + captureSource: vi.fn(), + captureAssertCommand: vi.fn(), cleanup: vi.fn(), commandsLog: [], sources: new Map(), @@ -280,3 +282,65 @@ describe('DevtoolsService - Screencast Integration', () => { expect(mockScreencastRecorder.start).toHaveBeenCalledWith(mockBrowser) }) }) + +describe('DevtoolsService - assertion suppression self-heal', () => { + let service: DevToolsHookService + const mockBrowser = { + isBidi: true, + sessionId: 'heal-session', + scriptAddPreloadScript: vi.fn().mockResolvedValue(undefined), + takeScreenshot: vi.fn().mockResolvedValue('screenshot'), + execute: vi.fn().mockResolvedValue({ + width: 1200, + height: 800, + offsetLeft: 0, + offsetTop: 0 + }), + on: vi.fn(), + emit: vi.fn() + } as any + + const capturedCommands = () => + mockSessionCapturerInstance.afterCommand.mock.calls.map((call) => call[1]) + + beforeEach(async () => { + vi.clearAllMocks() + service = new DevToolsHookService() + await service.before({} as any, [], mockBrowser) + vi.clearAllMocks() + }) + + // expect-webdriverio doesn't wrap afterAssertion in try/finally, so a matcher + // whose internal command hard-throws runs beforeAssertion but skips + // afterAssertion, leaving #assertionDepth stuck ≥ 1. Without the self-heal + // that stuck depth suppresses every later user command in the test. + it('captures a top-level command after a matcher throw left the assertion depth stuck', async () => { + service.beforeAssertion() + service.beforeAssertion() // depth now 2, no matching afterAssertion + + // The mocked stack is a user-spec frame with no expect-webdriverio frame, + // so the command is recognised as top-level and the leftover depth resets. + service.beforeCommand('click' as any, ['.button']) + await service.afterCommand('click' as any, ['.button'], undefined) + + expect(capturedCommands()).toEqual(['click']) + }) + + it('a fresh beforeAssertion resets a stuck depth so the window stays balanced', async () => { + service.beforeAssertion() + service.beforeAssertion() // leftover depth from a prior throw + + // A new matcher starts (resetting the stuck depth) and completes normally. + service.beforeAssertion() + await service.afterAssertion({ + matcherName: 'toBeDisplayed', + result: { pass: true } + } as any) + + // Depth is balanced again, so the next top-level command is captured. + service.beforeCommand('setValue' as any, ['.input', 'hi']) + await service.afterCommand('setValue' as any, ['.input', 'hi'], undefined) + + expect(capturedCommands()).toEqual(['setValue']) + }) +}) From f131895c974916796f433157e682a1264bcbccbb Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:23:51 +0530 Subject: [PATCH 033/109] feat(nightwatch): capture native browser.assert/verify as assertion actions --- .../src/helpers/browserProxy.ts | 99 ++++- .../src/helpers/nativeAssertions.ts | 299 +++++++++++++++ packages/nightwatch-devtools/src/index.ts | 80 +++-- .../nightwatch-devtools/src/session-init.ts | 4 +- packages/nightwatch-devtools/src/session.ts | 35 ++ packages/nightwatch-devtools/src/types.ts | 16 +- .../tests/attemptTracking.test.ts | 4 +- .../tests/browserProxy.test.ts | 168 +++++++++ .../tests/nativeAssertions.test.ts | 340 ++++++++++++++++++ 9 files changed, 1011 insertions(+), 34 deletions(-) create mode 100644 packages/nightwatch-devtools/src/helpers/nativeAssertions.ts create mode 100644 packages/nightwatch-devtools/tests/browserProxy.test.ts create mode 100644 packages/nightwatch-devtools/tests/nativeAssertions.test.ts diff --git a/packages/nightwatch-devtools/src/helpers/browserProxy.ts b/packages/nightwatch-devtools/src/helpers/browserProxy.ts index 019ebfb2..dff01a1f 100644 --- a/packages/nightwatch-devtools/src/helpers/browserProxy.ts +++ b/packages/nightwatch-devtools/src/helpers/browserProxy.ts @@ -10,11 +10,16 @@ import { } from '../constants.js' import { getCallSourceFromStack } from './utils.js' import { serializeCommandResult } from './serializeCommandResult.js' +import { + latestResolvedScreenshot, + pendingAssertionCommand +} from './nativeAssertions.js' import { RetryTracker, toError } from '@wdio/devtools-core' import type { SessionCapturer } from '../session.js' import type { TestManager } from './testManager.js' import type { CommandLog, + NativeAssertCall, NightwatchBrowser, NightwatchCurrentTest, CommandStackFrame @@ -42,10 +47,20 @@ export class BrowserProxy { */ private retryTracker = new RetryTracker() + /** + * Per-test buffer of explicit `browser.assert.*` / `browser.verify.*` calls, + * recorded synchronously at call time by {@link wrapAssertionNamespaces}. + * Nightwatch exposes no per-assertion hook and its test-end results carry no + * source location for passing assertions, so call-time capture is the only + * way to get real args + callSource. Drained (and cleared) each `afterEach`. + */ + private nativeAssertCalls: NativeAssertCall[] = [] + constructor( private sessionCapturer: SessionCapturer, private testManager: TestManager, - private getCurrentTest: () => { uid?: string } | null + private getCurrentTest: () => { uid?: string } | null, + private captureAssertions = true ) {} /** @@ -60,6 +75,78 @@ export class BrowserProxy { this.commandStack = [] this.lastCommandSig = null this.retryTracker.reset() + this.nativeAssertCalls = [] + } + + /** Hand off this test's recorded native-assertion calls and clear the + * buffer so the next test starts fresh. */ + drainNativeAssertCalls(): NativeAssertCall[] { + const calls = this.nativeAssertCalls + this.nativeAssertCalls = [] + return calls + } + + /** + * Replace `browser.assert` / `browser.verify` (both are Nightwatch Proxies + * whose `get` returns a fresh function per access) with a recording Proxy: + * on each method call it captures `{prefix, method, args, callSource}` from a + * user-code frame, streams a neutral pending row immediately (live), then + * delegates to the ORIGINAL namespace method so Nightwatch's queue, chaining, + * and abortOnFailure semantics (assert aborts, verify does not) are + * byte-for-byte unchanged. Called once per browser. + */ + private wrapAssertionNamespaces(browser: NightwatchBrowser): void { + // captureAssertions:false → leave assert/verify original so no neutral + // pending rows stream (the afterEach finalize path is gated to match). + if (!this.captureAssertions) { + return + } + // Cast once: the assert/verify namespaces aren't on the public type; each + // is a dynamic method bag reached by property name. + const b = browser as unknown as Record<string, unknown> + ;(['assert', 'verify'] as const).forEach((prefix) => { + const original = b[prefix] + if (!original || typeof original !== 'object') { + return + } + b[prefix] = new Proxy(original as object, { + get: (target, name, receiver) => { + const orig = Reflect.get(target, name, receiver) + // `not` (negation Proxy) and non-method props pass through untouched. + if (typeof orig !== 'function' || typeof name !== 'string') { + return orig + } + return (...args: unknown[]) => { + const callInfo = getCallSourceFromStack() + if (callInfo.filePath !== undefined) { + this.emitPendingAssertion({ + prefix, + method: name, + args, + callSource: callInfo.callSource, + timestamp: Date.now() + }) + } + return (orig as (...a: unknown[]) => unknown)(...args) + } + } + }) + }) + } + + /** Stream a neutral pending row for an explicit assert/verify call the moment + * it's invoked, and buffer the call (with its emitted row) for `afterEach` + * to finalize pass/fail in place. */ + private emitPendingAssertion(call: NativeAssertCall): void { + const testUid = this.getCurrentTest()?.uid + const entry = pendingAssertionCommand( + call, + testUid, + latestResolvedScreenshot(this.sessionCapturer) + ) + this.sessionCapturer.captureAssertCommand(entry) + call.entry = entry + this.nativeAssertCalls.push(call) } getCurrentTestFullPath(): string | null { @@ -189,6 +276,7 @@ export class BrowserProxy { wrappedMethods.push(methodName) }) + this.wrapAssertionNamespaces(browser) this.proxiedBrowsers.add(browser as object) log.info(`✓ Wrapped ${wrappedMethods.length} browser methods`) } @@ -307,6 +395,7 @@ export class BrowserProxy { logArgs: unknown[], cmdSig: string, callSource: string | undefined, + hasUserSource: boolean, commandTimestamp: number, testUid: string | undefined, userCallback: Function | null @@ -318,7 +407,12 @@ export class BrowserProxy { methodName ) const effectiveUid = this.getCurrentTest()?.uid ?? testUid - if (effectiveUid) { + // Only surface commands that originate from a user-code frame. Commands + // Nightwatch issues from inside its own queue (e.g. the getTitle a + // `browser.assert.titleContains` runs) execute in a detached tick with no + // user frame on the stack, so they'd otherwise leak as top-level actions + // with an "unknown" source. Mirrors the service's user-spec-source guard. + if (effectiveUid && hasUserSource) { if (this.retryTracker.isRetry(cmdSig)) { this.handleRetryReplacement( browser, @@ -402,6 +496,7 @@ export class BrowserProxy { logArgs, cmdSig, callSource, + callInfo.filePath !== undefined, commandTimestamp, this.getCurrentTest()?.uid, userCallback diff --git a/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts new file mode 100644 index 00000000..16dd3bd2 --- /dev/null +++ b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts @@ -0,0 +1,299 @@ +// Native-assertion capture: turns explicit `browser.assert.*` / +// `browser.verify.*` calls into concise trace/UI action rows with real args, +// a clickable source location, and pass/fail colour — streamed LIVE. +// +// Nightwatch exposes no per-assertion hook, and its test-end +// `currentTest.results` carries no source location for PASSING assertions +// (results.assertions[i].stackTrace is '' on pass) and only stringified args. +// So each explicit call is intercepted at CALL TIME +// (BrowserProxy.wrapAssertionNamespaces): a neutral "pending" row is emitted +// immediately (concise title, real args, callSource) so rows stream in one by +// one like normal commands. At TEST END the pass/fail truth + verbose failure +// message are read from results.assertions and the already-emitted row is +// UPDATED IN PLACE (same stable id) — never re-created, so no duplicates. +// Iterating the recorded calls (not results.assertions) also excludes +// Nightwatch's implicit command-generated assertions (e.g. +// waitForElementVisible's "element was visible" entry). + +import logger from '@wdio/logger' +import { + matcherAssertionToCommandLog, + safeSerializeAssertArg, + stripAnsi +} from '@wdio/devtools-core' +import type { SessionCapturer } from '../session.js' +import type { + CommandLog, + NativeAssertCall, + NightwatchBrowser, + NightwatchCurrentTest +} from '../types.js' + +const log = logger('@wdio/nightwatch-devtools:nativeAssertions') + +/** + * One entry Nightwatch pushes to `results.assertions` (from + * `NightwatchAssertion.getAssertResult`, lib/assertion/assertion.js). Carries + * only a human message — no method/args. `failure === false` is the reliable + * pass signal; any truthy `failure` (message string, or `true`) means failed. + */ +interface NwAssertionEntry { + message?: string + fullMsg?: string + failure?: string | boolean +} + +/** One entry Nightwatch pushes to `results.commands` (lib/reporter/index.js + * logCommandResult). For an assert/verify `name` is the namespaced method and + * `startTime`/`endTime` are the real queue-execution window in ms + * (treenode.js). Read only to position the finalized row on the timeline. */ +interface NwCommandEntry { + name?: string + startTime?: number + endTime?: number +} + +const ASSERT_CMD_RE = /^(assert|verify)\.\w+$/ + +/** Real per-assertion execution windows, in call order, aligned to `count` + * recorded calls. Nightwatch enqueues assertions synchronously (all at once) + * but runs them later one at a time, so the enqueue timestamp clusters the + * rows; this recovers each row's true execution time so the trace timeline + * spreads them out. Returns `null` per slot when the executed-command count + * doesn't line up (e.g. retries) — the enqueue timestamp is kept then. */ +function assertCommandTimings( + commands: NwCommandEntry[], + count: number +): Array<{ startTime: number; endTime: number } | null> { + const executed = commands.filter( + (c) => typeof c?.name === 'string' && ASSERT_CMD_RE.test(c.name) + ) + if (executed.length !== count) { + return new Array(count).fill(null) + } + return executed.map((c) => + typeof c.startTime === 'number' && typeof c.endTime === 'number' + ? { startTime: c.startTime, endTime: c.endTime } + : null + ) +} + +/** Nightwatch embeds the assertion arguments in the message text + * (AssertionInstance.initialize → Logger.formatMessage), so a passing entry + * for `titleContains('Example')` reads "Testing if the page title contains + * 'Example'". Match a call to its result entry when every string/number arg + * appears in the message. */ +function messageMatchesArgs(entry: NwAssertionEntry, args: unknown[]): boolean { + const text = String(entry.fullMsg ?? entry.message ?? '') + const literals = args.filter( + (a): a is string | number => typeof a === 'string' || typeof a === 'number' + ) + return literals.length > 0 && literals.every((a) => text.includes(String(a))) +} + +interface Outcome { + passed: boolean + message: string +} + +/** + * Pair each recorded call with its `results.assertions` entry for pass/fail + + * verbose message. Both lists are in call/execution order and each explicit + * call produces exactly one assertion entry, so: match by args-in-message + * first (most specific, skips interleaved implicit entries), then fall back to + * the next unconsumed entry positionally. A call with no matching entry left + * (never happens for a real assertion) is dropped (`null`). + */ +function correlate( + calls: NativeAssertCall[], + assertions: NwAssertionEntry[] +): Array<Outcome | null> { + const consumed = new Array(assertions.length).fill(false) + const toOutcome = (idx: number): Outcome => { + consumed[idx] = true + const entry = assertions[idx] + return { + passed: !entry.failure, + message: stripAnsi(String(entry.fullMsg ?? entry.message ?? '')).trim() + } + } + const matched = calls.map((call) => { + const idx = assertions.findIndex( + (entry, i) => !consumed[i] && messageMatchesArgs(entry, call.args) + ) + return idx === -1 ? null : toOutcome(idx) + }) + return matched.map((outcome) => { + if (outcome) { + return outcome + } + const idx = consumed.findIndex((used) => !used) + return idx === -1 ? null : toOutcome(idx) + }) +} + +/** Last already-resolved screenshot in the command log — the DOM the assertion + * evaluated against (title/most asserts don't mutate it). Synchronous, so it's + * usable from the call-time wrapper. */ +export function latestResolvedScreenshot( + capturer: SessionCapturer +): string | null { + for (let i = capturer.commandsLog.length - 1; i >= 0; i--) { + const shot = capturer.commandsLog[i]?.screenshot + if (shot) { + return shot + } + } + return null +} + +/** Reuse the nearest preceding command's screenshot; if the fire-and-forget + * capture hasn't resolved yet (race), fall back to a fresh end-of-test one. */ +async function resolveAssertionScreenshot( + capturer: SessionCapturer, + browser: NightwatchBrowser +): Promise<string | null> { + return ( + latestResolvedScreenshot(capturer) ?? + (await capturer.takeScreenshotViaHttp(browser)) + ) +} + +/** `assert.titleContains('SOFT_FAIL_ME')` — the concise row label. Strings are + * quoted, objects elided; never the verbose failure message. */ +function conciseTitle(call: NativeAssertCall): string { + const preview = call.args + .map((a) => + typeof a === 'string' + ? `'${a}'` + : a !== null && typeof a === 'object' + ? '…' + : String(a) + ) + .join(', ') + return `${call.prefix}.${call.method}(${preview})` +} + +/** + * Build the neutral "pending" row emitted the moment an assert/verify is + * called — everything known at call time (concise title, real args, callSource, + * screenshot) but NO result/error yet, so it renders neutral (not red/green) + * and streams in like a normal in-flight command. `startTime`/`timestamp` are + * the call time; the row is finalized in place later by + * {@link captureNativeAssertions}. + */ +export function pendingAssertionCommand( + call: NativeAssertCall, + testUid: string | undefined, + screenshot: string | null +): CommandLog { + const entry: CommandLog = { + command: `${call.prefix}.${call.method}`, + args: call.args.map(safeSerializeAssertArg), + title: conciseTitle(call), + timestamp: call.timestamp, + startTime: call.timestamp + } + if (call.callSource) { + entry.callSource = call.callSource + } + if (testUid) { + entry.testUid = testUid + } + if (screenshot) { + entry.screenshot = screenshot + } + return entry +} + +/** Update one streamed pending row in place: apply pass/fail + verbose error, + * a screenshot, and its real execution window, then re-broadcast by stable id. */ +function finalizeAssertionRow( + capturer: SessionCapturer, + call: NativeAssertCall, + outcome: Outcome, + timing: { startTime: number; endTime: number } | null, + screenshot: string | null, + testUid: string | undefined +): void { + const entry = call.entry! + const finalized = matcherAssertionToCommandLog( + { + prefix: call.prefix, + method: call.method, + args: call.args, + passed: outcome.passed, + message: outcome.message || `${call.prefix}.${call.method} failed`, + callSource: call.callSource, + title: entry.title + }, + testUid + ) + entry.result = finalized.result + entry.error = finalized.error + if (!entry.screenshot && screenshot) { + entry.screenshot = screenshot + } + // Reposition the row on its REAL execution window (Nightwatch enqueues all + // asserts at once, so the emit/enqueue timestamp clustered them). The row is + // matched for replacement by its stable id, so the old enqueue timestamp is + // what the UI still keys on until this swap lands. + const oldTimestamp = entry.timestamp + if (timing) { + entry.startTime = timing.startTime + entry.timestamp = + timing.endTime > timing.startTime ? timing.endTime : timing.startTime + } + capturer.sendReplaceCommand(oldTimestamp, entry) + log.info(`[assert] ${entry.title} → ${outcome.passed ? 'pass' : 'fail'}`) +} + +/** + * Finalize the streamed pending rows at test-end: correlate the recorded calls + * with `results.assertions`, then UPDATE each row's `entry` in place with + * pass/fail (`result`) + the verbose failure message (`error`, failures only) + * + a screenshot + its real execution window, and re-broadcast via + * `sendReplaceCommand` keyed on the row's stable id. No new rows are created + * (no duplicates); a call with no matching result is left pending (defensive). + */ +export async function captureNativeAssertions( + capturer: SessionCapturer, + browser: NightwatchBrowser, + currentTest: NightwatchCurrentTest | undefined, + testUid: string | undefined, + calls: NativeAssertCall[] +): Promise<void> { + if (calls.length === 0) { + return + } + // Boundary cast: `results` is Nightwatch's loosely-typed per-test bag; we read + // only the assertions + commands arrays whose shapes are documented above. + const results = currentTest?.results as + | { assertions?: NwAssertionEntry[]; commands?: NwCommandEntry[] } + | undefined + const assertions = Array.isArray(results?.assertions) + ? results.assertions + : [] + const outcomes = correlate(calls, assertions) + const timings = assertCommandTimings( + Array.isArray(results?.commands) ? results.commands : [], + calls.length + ) + // One shared screenshot for all rows — same DOM, ran consecutively. + const screenshot = await resolveAssertionScreenshot(capturer, browser) + + calls.forEach((call, index) => { + const outcome = outcomes[index] + // Leave an unmatched (or never-emitted) row in its last state. + if (call.entry && outcome) { + finalizeAssertionRow( + capturer, + call, + outcome, + timings[index], + screenshot, + testUid + ) + } + }) +} diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index e94877bc..db5cefc0 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -9,8 +9,7 @@ import { fileURLToPath } from 'node:url' import { errorMessage, finalizeTraceExport, - flushRangeTrace, - recordSpecBoundary, + flushRangeLogged, TestAttemptTracker, tracePolicyModeWarning, type SpecRange, @@ -72,6 +71,8 @@ import { ensureSessionInitialized, finalizeCurrentScreencast } from './session-init.js' +import { captureNativeAssertions } from './helpers/nativeAssertions.js' +import { flushTestSlice, recordSpecSliceBoundary } from './trace-slices.js' import { getTestIcon, incrementCounters, @@ -179,6 +180,9 @@ class NightwatchDevToolsPlugin { get bidiEnabled() { return self.#bidiEnabled }, + get captureAssertions() { + return self.options.captureAssertions + }, get sessionCapturer() { return self.sessionCapturer }, @@ -305,11 +309,29 @@ class NightwatchDevToolsPlugin { setCucumberRunner: (v) => { self.#isCucumberRunner = v }, - getRerunLabel: () => self.#getRerunLabel() + getRerunLabel: () => self.#getRerunLabel(), + get traceMode() { + return self.options.mode === 'trace' + }, + get traceGranularity() { + return self.options.traceGranularity + }, + get specRanges() { + return self.#specRanges + }, + get flushedSpecs() { + return self.#flushedSpecs + }, + flushTraceRange: (range) => self.#flushSpecTrace(range) } return this.#internals } + /** Boundary cast: currentTest is Nightwatch's loose bag; only uid is read. */ + #currentTestUid(): string | undefined { + return (this.#currentTest as { uid?: string } | null)?.uid + } + #handleReuseMode(): void { handleReuseMode(this.#getInternals()) } @@ -330,8 +352,7 @@ class NightwatchDevToolsPlugin { if (this.options.captureAssertions) { wireAssertCapture( () => this.sessionCapturer, - // Boundary cast: currentTest is Nightwatch's loose bag; only uid is read. - () => (this.#currentTest as { uid?: string } | null)?.uid + () => this.#currentTestUid() ) } } @@ -401,13 +422,15 @@ class NightwatchDevToolsPlugin { async #startNextTest( currentSuite: SuiteStats, currentTestName: string, - processedTests: Set<string> + processedTests: Set<string>, + specFile: string | null ): Promise<void> { await startNextTest( this.#getInternals(), currentSuite, currentTestName, - processedTests + processedTests, + specFile ) } @@ -453,25 +476,8 @@ class NightwatchDevToolsPlugin { this.sessionCapturer.captureSource(fullPath).catch(() => {}) } - // ── Per-spec boundary detection ── if (fullPath) { - const prevRange = recordSpecBoundary( - { - specRanges: this.#specRanges, - flushedSpecs: this.#flushedSpecs, - capturer: this.sessionCapturer, - actionSnapshots: this.sessionCapturer.actionSnapshots - }, - fullPath, - this.options.traceGranularity - ) - if (prevRange) { - void this.#flushSpecTrace(prevRange).catch((err) => - log.warn( - `Failed to flush trace for spec "${prevRange.specFile}": ${errorMessage(err)}` - ) - ) - } + recordSpecSliceBoundary(this.#getInternals(), fullPath) } await this.#closePreviousRunningTest(currentSuite, testFile, currentTest) @@ -483,7 +489,12 @@ class NightwatchDevToolsPlugin { processedTests ) if (currentTestName) { - await this.#startNextTest(currentSuite, currentTestName, processedTests) + await this.#startNextTest( + currentSuite, + currentTestName, + processedTests, + fullPath + ) } this.#wrapBrowserOnce(browser) } @@ -497,7 +508,18 @@ class NightwatchDevToolsPlugin { if (browser && this.sessionCapturer) { try { await this.#closeOutTestcases(browser) + if (this.options.captureAssertions) { + await captureNativeAssertions( + this.sessionCapturer, + browser, + browser.currentTest as NightwatchCurrentTest | undefined, + this.#currentTestUid(), + this.browserProxy.drainNativeAssertCalls() + ) + } await this.sessionCapturer.captureTrace(browser) + // Flush this test's slice before the next test overwrites its outcome. + flushTestSlice(this.#getInternals()) } catch (err) { log.error(`Failed to capture trace: ${errorMessage(err)}`) } @@ -542,13 +564,15 @@ class NightwatchDevToolsPlugin { logRunSummary(this.#getInternals()) } - /** Thin wrapper so boundary flushes and the final flush share one path. */ + /** Thin wrapper so boundary flushes and the final flush share one path. + * flushRangeLogged logs+swallows a failed flush (shared spec/test string) so + * the fire-and-forget boundary callers don't each re-implement the guard. */ #flushSpecTrace(range: SpecRange): Promise<TraceArtifact | undefined> { const sessionId = this.sessionCapturer.metadata?.sessionId if (!sessionId) { return Promise.resolve(undefined) } - return flushRangeTrace(this.#traceContext(sessionId), range) + return flushRangeLogged(this.#traceContext(sessionId), range) } /** Assemble the framework-agnostic trace-export context from plugin state. diff --git a/packages/nightwatch-devtools/src/session-init.ts b/packages/nightwatch-devtools/src/session-init.ts index 2bccfc82..e9d1004a 100644 --- a/packages/nightwatch-devtools/src/session-init.ts +++ b/packages/nightwatch-devtools/src/session-init.ts @@ -39,6 +39,7 @@ export interface SessionInitCtx { readonly screencastOptions: ScreencastOptions readonly bidiEnabled: boolean readonly mode: DevToolsMode + readonly captureAssertions: boolean sessionCapturer: SessionCapturer testReporter: TestReporter @@ -98,7 +99,8 @@ function initReporterChain(ctx: SessionInitCtx): void { ctx.browserProxy = new BrowserProxy( ctx.sessionCapturer, ctx.testManager, - () => ctx.getCurrentTest() ?? ctx.getCurrentScenarioSuite() + () => ctx.getCurrentTest() ?? ctx.getCurrentScenarioSuite(), + ctx.captureAssertions ) } diff --git a/packages/nightwatch-devtools/src/session.ts b/packages/nightwatch-devtools/src/session.ts index ae830af7..ed9c5457 100644 --- a/packages/nightwatch-devtools/src/session.ts +++ b/packages/nightwatch-devtools/src/session.ts @@ -213,6 +213,41 @@ export class SessionCapturer extends SessionCapturerBase { ) } + /** + * Ingest a pre-built assertion entry (native `browser.assert`/`verify` + * synthesized from Nightwatch's results, or a node:assert capture) into the + * same command stream driver commands use. Unlike {@link captureCommand} this + * preserves the entry's `title` (the human assertion message) and never + * dedups — each call is a distinct action row. Assigns a fresh `_id` and a + * matching stable public `id` (so a later `sendReplaceCommand` can update + * this exact row in place — native asserts stream a pending row at call time, + * then finalize their pass/fail), pushes, and broadcasts. + */ + captureAssertCommand(entry: CommandLog): void { + const withId = entry as CommandLog & { _id?: number } + withId._id = this.commandCounter++ + withId.id = withId._id + this.commandsLog.push(withId) + if ( + this.traceMode === 'trace' && + !entry.error && + this.#browser && + mapCommandToAction(entry.command) + ) { + const browser = this.#browser + this.snapshotCaptures.push( + captureActionSnapshot(browser, entry.command, () => + this.takeScreenshotViaHttp(browser) + ).then((snap) => { + if (snap) { + this.actionSnapshots.push(snap) + } + }) + ) + } + this.sendCommand(withId) + } + /** * Replace an already-captured command entry (used for retried commands so * only the final execution result is shown in the UI). diff --git a/packages/nightwatch-devtools/src/types.ts b/packages/nightwatch-devtools/src/types.ts index ab776db5..203dbbdb 100644 --- a/packages/nightwatch-devtools/src/types.ts +++ b/packages/nightwatch-devtools/src/types.ts @@ -23,7 +23,7 @@ export { type TraceLog } from '@wdio/devtools-shared' -import type { BaseDevToolsOptions } from '@wdio/devtools-shared' +import type { BaseDevToolsOptions, CommandLog } from '@wdio/devtools-shared' export interface CommandStackFrame { command: string @@ -31,6 +31,20 @@ export interface CommandStackFrame { signature: string } +/** One explicit `browser.assert.*` / `browser.verify.*` call, recorded at call + * time by BrowserProxy. A neutral "pending" row (`entry`) is streamed live at + * call time; `captureNativeAssertions` finalizes its pass/fail at test-end. */ +export interface NativeAssertCall { + prefix: 'assert' | 'verify' + method: string + args: unknown[] + callSource?: string + /** Wall-clock at call time; also the streamed row's timestamp/startTime. */ + timestamp: number + /** The pending row emitted at call time, updated in place when finalized. */ + entry?: CommandLog +} + export interface NightwatchTestCase { passed: number failed: number diff --git a/packages/nightwatch-devtools/tests/attemptTracking.test.ts b/packages/nightwatch-devtools/tests/attemptTracking.test.ts index c08313c4..30df38e2 100644 --- a/packages/nightwatch-devtools/tests/attemptTracking.test.ts +++ b/packages/nightwatch-devtools/tests/attemptTracking.test.ts @@ -89,10 +89,10 @@ describe('regular test retry attempt via startNextTest', () => { recordAttempt: (uid: string) => tracker.recordStart(uid) } as unknown as TestLifecycleCtx - await startNextTest(ctx, suite, 'my test', new Set()) + await startNextTest(ctx, suite, 'my test', new Set(), null) expect(test.retries).toBe(0) - await startNextTest(ctx, suite, 'my test', new Set(['my test'])) + await startNextTest(ctx, suite, 'my test', new Set(['my test']), null) expect(test.retries).toBe(1) }) }) diff --git a/packages/nightwatch-devtools/tests/browserProxy.test.ts b/packages/nightwatch-devtools/tests/browserProxy.test.ts new file mode 100644 index 00000000..d69ffcf3 --- /dev/null +++ b/packages/nightwatch-devtools/tests/browserProxy.test.ts @@ -0,0 +1,168 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import type { CommandLog, NightwatchBrowser } from '../src/types.js' + +// browserProxy resolves the caller's source via this helper; stub it so each +// test can decide whether the command looks user-issued or framework-internal. +// vi.hoisted so the stub exists when the hoisted vi.mock factory runs. +const { getCallSourceFromStack } = vi.hoisted(() => ({ + getCallSourceFromStack: vi.fn() +})) +vi.mock('../src/helpers/utils.js', () => ({ getCallSourceFromStack })) + +import { BrowserProxy } from '../src/helpers/browserProxy.js' +import type { SessionCapturer } from '../src/session.js' +import type { TestManager } from '../src/helpers/testManager.js' + +function makeCapturer() { + const commandsLog: (CommandLog & { _id?: number })[] = [] + let counter = 0 + const captureCommand = vi.fn( + async ( + command: string, + args: unknown[], + result: unknown, + error: Error | undefined, + testUid?: string, + callSource?: string, + timestamp?: number + ) => { + commandsLog.push({ + _id: counter++, + command, + args, + result, + error, + testUid, + callSource, + timestamp + }) + return true + } + ) + const capturer = { + commandsLog, + captureCommand, + replaceCommand: vi.fn(), + sendCommand: vi.fn(), + sendReplaceCommand: vi.fn(), + takeScreenshotViaHttp: vi.fn(async () => null), + captureTrace: vi.fn(async () => {}) + } as unknown as SessionCapturer + return { capturer, commandsLog, captureCommand } +} + +function makeTestManager() { + return { + detectTestBoundary: vi.fn(() => ''), + startTestIfPending: vi.fn() + } as unknown as TestManager +} + +/** A browser whose single command echoes its result into the capture callback + * Nightwatch appends as the last argument. */ +function makeBrowser() { + return { + titleContains: (_arg: unknown, cb: (result: unknown) => void) => { + cb('Example Domain') + return undefined + } + } as unknown as NightwatchBrowser +} + +describe('BrowserProxy internal-command suppression', () => { + beforeEach(() => { + getCallSourceFromStack.mockReset() + }) + + it('captures a command issued from a user-code frame', () => { + const { capturer, commandsLog, captureCommand } = makeCapturer() + getCallSourceFromStack.mockReturnValue({ + filePath: '/tests/spec.js', + callSource: '/tests/spec.js:5' + }) + const proxy = new BrowserProxy(capturer, makeTestManager(), () => ({ + uid: 'test-1' + })) + const browser = makeBrowser() + proxy.wrapBrowserCommands(browser) + ;( + browser as unknown as Record<string, (a: unknown) => unknown> + ).titleContains('Example') + + expect(captureCommand).toHaveBeenCalledTimes(1) + expect(commandsLog).toHaveLength(1) + expect(commandsLog[0].command).toBe('titleContains') + expect(commandsLog[0].callSource).toBe('/tests/spec.js:5') + }) + + it('suppresses a framework-internal command with no user-code frame', () => { + const { capturer, commandsLog, captureCommand } = makeCapturer() + // Mirrors the getTitle a `browser.assert.titleContains` issues from inside + // Nightwatch's queue: no user frame, so getCallSourceFromStack returns none. + getCallSourceFromStack.mockReturnValue({ + filePath: undefined, + callSource: 'unknown:0' + }) + const proxy = new BrowserProxy(capturer, makeTestManager(), () => ({ + uid: 'test-1' + })) + const browser = makeBrowser() + proxy.wrapBrowserCommands(browser) + ;( + browser as unknown as Record<string, (a: unknown) => unknown> + ).titleContains('Example') + + expect(captureCommand).not.toHaveBeenCalled() + expect(commandsLog).toHaveLength(0) + }) +}) + +describe('BrowserProxy captureAssertions gating', () => { + beforeEach(() => { + getCallSourceFromStack.mockReset() + }) + + /** A browser exposing `assert`/`verify` namespace objects (as Nightwatch + * does), so the test can check whether wrapAssertionNamespaces replaced them + * with a recording Proxy. */ + function makeAssertBrowser() { + return { + assert: { titleContains: vi.fn() }, + verify: { titleContains: vi.fn() } + } as unknown as NightwatchBrowser & { + assert: object + verify: object + } + } + + it('leaves assert/verify namespaces original when captureAssertions is false', () => { + const { capturer } = makeCapturer() + const browser = makeAssertBrowser() + const originalAssert = browser.assert + const originalVerify = browser.verify + const proxy = new BrowserProxy( + capturer, + makeTestManager(), + () => ({ uid: 't1' }), + false + ) + proxy.wrapBrowserCommands(browser) + // No wrapping → the namespaces are untouched, so no pending rows can stream. + expect(browser.assert).toBe(originalAssert) + expect(browser.verify).toBe(originalVerify) + }) + + it('wraps assert/verify namespaces by default (captureAssertions true)', () => { + const { capturer } = makeCapturer() + const browser = makeAssertBrowser() + const originalAssert = browser.assert + const originalVerify = browser.verify + const proxy = new BrowserProxy(capturer, makeTestManager(), () => ({ + uid: 't1' + })) + proxy.wrapBrowserCommands(browser) + // Replaced with a recording Proxy → no longer the original object. + expect(browser.assert).not.toBe(originalAssert) + expect(browser.verify).not.toBe(originalVerify) + }) +}) diff --git a/packages/nightwatch-devtools/tests/nativeAssertions.test.ts b/packages/nightwatch-devtools/tests/nativeAssertions.test.ts new file mode 100644 index 00000000..d904dbde --- /dev/null +++ b/packages/nightwatch-devtools/tests/nativeAssertions.test.ts @@ -0,0 +1,340 @@ +import { describe, it, expect, vi } from 'vitest' +import { + captureNativeAssertions, + latestResolvedScreenshot, + pendingAssertionCommand +} from '../src/helpers/nativeAssertions.js' +import type { SessionCapturer } from '../src/session.js' +import type { + CommandLog, + NativeAssertCall, + NightwatchBrowser, + NightwatchCurrentTest +} from '../src/types.js' + +/** Fake capturer mimicking the live stream: `captureAssertCommand` assigns a + * stable public `id` and appends to `commandsLog` (like the real one); + * `sendReplaceCommand` records in-place updates; `takeScreenshotViaHttp` is + * the fresh-fallback. */ +function makeFakeCapturer( + commandsLog: CommandLog[] = [], + freshScreenshot: string | null = 'FRESH_SHOT' +) { + const sent: CommandLog[] = [] + const replaced: Array<{ oldTimestamp: number; command: CommandLog }> = [] + let counter = 100 + const captureAssertCommand = vi.fn( + (entry: CommandLog & { _id?: number; id?: number }) => { + entry._id = counter++ + entry.id = entry._id + commandsLog.push(entry) + sent.push(entry) + } + ) + const sendReplaceCommand = vi.fn( + (oldTimestamp: number, command: CommandLog) => { + replaced.push({ oldTimestamp, command }) + } + ) + const takeScreenshotViaHttp = vi.fn(() => Promise.resolve(freshScreenshot)) + const capturer = { + commandsLog, + captureAssertCommand, + sendReplaceCommand, + takeScreenshotViaHttp + } as unknown as SessionCapturer + return { + capturer, + commandsLog, + sent, + replaced, + captureAssertCommand, + sendReplaceCommand, + takeScreenshotViaHttp + } +} + +const browser = {} as unknown as NightwatchBrowser + +/** Mimic BrowserProxy.emitPendingAssertion: stream a neutral pending row at + * call time and attach it to the call for later finalization. */ +function emitPending( + capturer: SessionCapturer, + calls: NativeAssertCall[], + testUid: string | undefined +) { + for (const call of calls) { + const entry = pendingAssertionCommand( + call, + testUid, + latestResolvedScreenshot(capturer) + ) + capturer.captureAssertCommand(entry) + call.entry = entry + } +} + +/** Nightwatch's `getAssertResult` entries: pass → `failure: false`; fail → + * `failure` is a message string. The message embeds the assertion args. */ +function passing(message: string) { + return { message, fullMsg: message, failure: false as const } +} +function failing(message: string) { + return { message, fullMsg: message, failure: `${message} — failed` } +} + +function currentTestWith( + assertions: unknown[], + commands: unknown[] = [] +): NightwatchCurrentTest { + return { + name: 'renders asserts', + module: 'assert-check', + results: { assertions, commands } + } as unknown as NightwatchCurrentTest +} + +let clock = 1000 +function call( + prefix: 'assert' | 'verify', + method: string, + args: unknown[], + callSource = 'spec.js:8' +): NativeAssertCall { + return { prefix, method, args, callSource, timestamp: clock++ } +} + +describe('captureNativeAssertions (live pending → finalize)', () => { + it('streams neutral pending rows at call time, then finalizes pass/fail in place with a stable id and no duplicates', async () => { + // Preceding real commands: the last with a resolved screenshot is the DOM + // the assertions evaluated against — reused for the pending rows. + const precedingCommands: CommandLog[] = [ + { command: 'url', args: [], timestamp: 1, screenshot: 'URL_SHOT' }, + { + command: 'waitForElementVisible', + args: ['body'], + timestamp: 2, + screenshot: 'BODY_SHOT' + } + ] + const { + capturer, + sent, + replaced, + commandsLog, + captureAssertCommand, + sendReplaceCommand, + takeScreenshotViaHttp + } = makeFakeCapturer(precedingCommands) + const calls = [ + call('verify', 'titleContains', ['Example'], 'spec.js:11'), + call('verify', 'titleContains', ['SOFT_FAIL_ME'], 'spec.js:12'), + call('assert', 'titleContains', ['Example'], 'spec.js:15'), + call('assert', 'titleContains', ['HARD_FAIL_ME'], 'spec.js:16') + ] + + // 1) CALL TIME: each call streams one neutral pending row. + emitPending(capturer, calls, 'test-uid') + expect(captureAssertCommand).toHaveBeenCalledTimes(4) + expect(sent).toHaveLength(4) + for (const row of sent) { + expect(row.result).toBeUndefined() // neutral — not green + expect(row.error).toBeUndefined() // neutral — not red + expect(row.testUid).toBe('test-uid') + expect(row.screenshot).toBe('BODY_SHOT') // reused preceding DOM + expect(typeof (row as { id?: number }).id).toBe('number') + } + expect(sent[0].title).toBe("verify.titleContains('Example')") + expect(sent[0].command).toBe('verify.titleContains') + expect(sent[0].args).toEqual(['Example']) + expect(sent[0].callSource).toBe('spec.js:11') + expect(sent[0].timestamp).toBe(sent[0].startTime) + const pendingIds = sent.map((r) => (r as { id?: number }).id) + + // 2) TEST END: results.assertions includes the implicit waitForElementVisible + // assertion (first entry) which must NOT create/finalize a row. + const assertions = [ + passing('Element <body> was visible after 16 milliseconds'), + passing("Testing if the page title contains 'Example'"), + failing("Testing if the page title contains 'SOFT_FAIL_ME'"), + passing("Testing if the page title contains 'Example'"), + failing("Testing if the page title contains 'HARD_FAIL_ME'") + ] + await captureNativeAssertions( + capturer, + browser, + currentTestWith(assertions), + 'test-uid', + calls + ) + + // Each row updated exactly once, in place — no new rows, no duplicates. + expect(captureAssertCommand).toHaveBeenCalledTimes(4) + expect(sendReplaceCommand).toHaveBeenCalledTimes(4) + expect(commandsLog).toHaveLength(2 + 4) + expect(takeScreenshotViaHttp).not.toHaveBeenCalled() + + // Same row objects, same stable ids (updated, not recreated). + const finalized = calls.map((c) => c.entry!) + expect(finalized.map((r) => (r as { id?: number }).id)).toEqual(pendingIds) + + // Pass/fail applied; failures carry the verbose message as error. + expect(finalized[0].result).toBe('passed') + expect(finalized[0].error).toBeUndefined() + expect(finalized[1].result).toBeUndefined() + expect((finalized[1].error as { message: string }).message).toContain( + 'SOFT_FAIL_ME' + ) + expect(finalized[2].result).toBe('passed') // duplicate 'Example' → 2nd entry + expect(finalized[3].error).toBeDefined() + + // Labels/args/callSource preserved from the pending row. + expect(finalized[3].title).toBe("assert.titleContains('HARD_FAIL_ME')") + expect(finalized[3].callSource).toBe('spec.js:16') + + // With no results.commands timing, rows keep their enqueue timestamp, so + // the replace is keyed on that same timestamp. + replaced.forEach(({ oldTimestamp, command }) => { + expect(oldTimestamp).toBe(command.timestamp) + }) + }) + + it('repositions each row on its real execution window from results.commands (not enqueue time)', async () => { + const { capturer, sent, replaced } = makeFakeCapturer() + const calls = [ + call('verify', 'titleContains', ['Example']), + call('assert', 'titleContains', ['SOFT_FAIL_ME']) + ] + emitPending(capturer, calls, 'uid') + // Both enqueued ~together (clock++), clustered. + const enqueue = sent.map((r) => r.timestamp) + + // Nightwatch ran them ~29ms apart; results.commands carries the real window. + const assertions = [ + passing("Testing if the page title contains 'Example'"), + failing("Testing if the page title contains 'SOFT_FAIL_ME'") + ] + const commands = [ + { name: 'url', startTime: 5000, endTime: 5100 }, + { name: 'verify.titleContains', startTime: 6000, endTime: 6029 }, + { name: 'assert.titleContains', startTime: 6100, endTime: 6132 } + ] + await captureNativeAssertions( + capturer, + browser, + currentTestWith(assertions, commands), + 'uid', + calls + ) + + const finalized = calls.map((c) => c.entry!) + // startTime/timestamp now reflect the real execution window, spread apart. + expect(finalized[0].startTime).toBe(6000) + expect(finalized[0].timestamp).toBe(6029) + expect(finalized[1].startTime).toBe(6100) + expect(finalized[1].timestamp).toBe(6132) + expect(finalized[1].timestamp - finalized[0].timestamp).toBeGreaterThan(50) + // The replace is keyed on the ORIGINAL enqueue timestamp (stable id also + // matches), while the row now carries its real execution timestamp. + expect(replaced[0].oldTimestamp).toBe(enqueue[0]) + expect(replaced[0].command.timestamp).toBe(6029) + }) + + it('finalizes with a fresh screenshot when no preceding one has resolved yet', async () => { + // Race: preceding capture is fire-and-forget and unresolved → pending rows + // stream without a screenshot; finalize takes a fresh end-of-test one. + const pending: CommandLog[] = [ + { command: 'waitForElementVisible', args: ['body'], timestamp: 2 } + ] + const { capturer, sent, takeScreenshotViaHttp } = makeFakeCapturer( + pending, + 'FRESH_SHOT' + ) + const calls = [call('verify', 'titleContains', ['Example'])] + emitPending(capturer, calls, 'uid') + expect(sent[0].screenshot).toBeUndefined() + + await captureNativeAssertions( + capturer, + browser, + currentTestWith([ + passing("Testing if the page title contains 'Example'") + ]), + 'uid', + calls + ) + expect(takeScreenshotViaHttp).toHaveBeenCalledTimes(1) + expect(calls[0].entry!.screenshot).toBe('FRESH_SHOT') + expect(calls[0].entry!.result).toBe('passed') + }) + + it('preserves real multi-arg assertions (no faked args)', async () => { + const { capturer, sent, replaced } = makeFakeCapturer() + const calls = [call('assert', 'containsText', ['#btn', 'Save'])] + emitPending(capturer, calls, 'uid') + expect(sent[0].args).toEqual(['#btn', 'Save']) + expect(sent[0].title).toBe("assert.containsText('#btn', 'Save')") + + await captureNativeAssertions( + capturer, + browser, + currentTestWith([ + failing("Testing if element <#btn> contains text 'Save'") + ]), + 'uid', + calls + ) + expect(replaced).toHaveLength(1) + expect(calls[0].entry!.error).toBeDefined() + }) + + it('falls back to positional correlation when args are not literals', async () => { + const { capturer, sent } = makeFakeCapturer() + // Element-object arg won't substring-match; positional order still pairs + // the single call with the single explicit assertion outcome. + const calls = [call('assert', 'elementPresent', [{ selector: 'body' }])] + emitPending(capturer, calls, 'uid') + expect(sent[0].title).toBe('assert.elementPresent(…)') + + await captureNativeAssertions( + capturer, + browser, + currentTestWith([failing('Testing if element <body> is present')]), + 'uid', + calls + ) + expect(calls[0].entry!.error).toBeDefined() + }) + + it('leaves an uncorrelated pending row in its neutral state (defensive)', async () => { + const { capturer, sent, sendReplaceCommand } = makeFakeCapturer() + const calls = [call('assert', 'ok', [true])] + emitPending(capturer, calls, 'uid') + // No matching results entry — row must not be dropped or mis-coloured. + await captureNativeAssertions( + capturer, + browser, + currentTestWith([]), + 'uid', + calls + ) + expect(sent).toHaveLength(1) + expect(sendReplaceCommand).not.toHaveBeenCalled() + expect(calls[0].entry!.result).toBeUndefined() + expect(calls[0].entry!.error).toBeUndefined() + }) + + it('is a no-op when there are no recorded calls (implicit assertions ignored)', async () => { + const { capturer, sendReplaceCommand, takeScreenshotViaHttp } = + makeFakeCapturer() + await captureNativeAssertions( + capturer, + browser, + currentTestWith([passing('Element <body> was visible')]), + 'uid', + [] + ) + expect(sendReplaceCommand).not.toHaveBeenCalled() + expect(takeScreenshotViaHttp).not.toHaveBeenCalled() + }) +}) From 2c6feffc63e2b09d7693c3952df11605ee4057bc Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:24:34 +0530 Subject: [PATCH 034/109] fix(core): rate-limit repeated terminal lines and fix failLastAction --- examples/wdio/cucumber/wdio.conf.ts | 2 +- examples/wdio/cucumber/wdio.mobile.conf.ts | 2 +- examples/wdio/mocha/wdio.conf.ts | 2 +- packages/core/src/index.ts | 1 + packages/core/src/session-capturer.ts | 26 +++++-- packages/core/src/terminal-throttle.ts | 70 ++++++++++++++++++ .../core/tests/session-capturer-base.test.ts | 46 ++++++++++++ packages/core/tests/terminal-throttle.test.ts | 74 +++++++++++++++++++ 8 files changed, 214 insertions(+), 9 deletions(-) create mode 100644 packages/core/src/terminal-throttle.ts create mode 100644 packages/core/tests/terminal-throttle.test.ts diff --git a/examples/wdio/cucumber/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts index 68f7ee8b..4c535acc 100644 --- a/examples/wdio/cucumber/wdio.conf.ts +++ b/examples/wdio/cucumber/wdio.conf.ts @@ -89,7 +89,7 @@ export const config: Options.Testrunner = { // Define all options that are relevant for the WebdriverIO instance here // // Level of logging verbosity: trace | debug | info | warn | error | silent - logLevel: 'debug', + logLevel: 'warn', // // Set specific log levels per logger // loggers: diff --git a/examples/wdio/cucumber/wdio.mobile.conf.ts b/examples/wdio/cucumber/wdio.mobile.conf.ts index 7f693ab4..13618ffe 100644 --- a/examples/wdio/cucumber/wdio.mobile.conf.ts +++ b/examples/wdio/cucumber/wdio.mobile.conf.ts @@ -44,7 +44,7 @@ export const config: Options.Testrunner = { // eslint-disable-next-line @typescript-eslint/no-explicit-any ] as any, - logLevel: 'info', + logLevel: 'warn', bail: 0, baseUrl: 'http://localhost', waitforTimeout: 15000, diff --git a/examples/wdio/mocha/wdio.conf.ts b/examples/wdio/mocha/wdio.conf.ts index 7ccee43f..966226f9 100644 --- a/examples/wdio/mocha/wdio.conf.ts +++ b/examples/wdio/mocha/wdio.conf.ts @@ -29,7 +29,7 @@ export const config: Options.Testrunner = { } } ], - logLevel: 'debug', + logLevel: 'warn', bail: 0, baseUrl: 'http://localhost', waitforTimeout: 10000, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3c3325e2..89c6c301 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -25,6 +25,7 @@ export * from './console.js' export * from './uid.js' export * from './net.js' export * from './stack.js' +export * from './terminal-throttle.js' export * from './error.js' export * from './finalize-screencast.js' export * from './output-dir.js' diff --git a/packages/core/src/session-capturer.ts b/packages/core/src/session-capturer.ts index 82cfe0f6..f5b90f4e 100644 --- a/packages/core/src/session-capturer.ts +++ b/packages/core/src/session-capturer.ts @@ -21,6 +21,7 @@ import { isInternalStreamLine, stripAnsi } from './console.js' +import { TerminalLineThrottle } from './terminal-throttle.js' /** * Foundation class for adapter SessionCapturers. Owns the cross-framework @@ -62,6 +63,11 @@ export abstract class SessionCapturerBase { // stdout, OR when stream forwarding wants to log via console. #isCapturingConsole = false #isCapturingStream = false + // Collapses high-frequency identical terminal lines (e.g. WDIO's per-command + // COMMAND/RESULT logger frames reprinted every ~100ms during an expect poll) + // so they don't flood the console lane. Terminal-source only — user + // console.* is source='test' and never throttled. + #terminalThrottle = new TerminalLineThrottle() // Command bookkeeping — used by adapters that emit commands themselves // (nightwatch, selenium). The WDIO service adapter doesn't call sendCommand @@ -209,20 +215,27 @@ export abstract class SessionCapturerBase { } /** - * Mark the most recent user action of a test as failed. Assertion and step - * failures aren't their own command, so the action that ran (e.g. the query - * an expectation read) carries the error; broadcasts the swap so live mode - * highlights it too. Returns false when no eligible action is found. + * Mark the most recent user action of a test as failed — for framework + * failures that aren't captured as their own command. Broadcasts the swap so + * live mode highlights it too. Returns false when no eligible action is found, + * OR when that most-recent action already carries an error: the failure is + * then already represented (e.g. an expect matcher captured as its own row via + * afterAssertion), so it must not bleed onto an earlier *passing* action. */ failLastAction(testUid: string | undefined, error: SerializedError): boolean { for (let i = this.commandsLog.length - 1; i >= 0; i--) { const command = this.commandsLog[i] - if (command.error || !mapCommandToAction(command.command)) { + if (!mapCommandToAction(command.command)) { continue } if (testUid && command.testUid !== testUid) { continue } + // First (most-recent) action for this test. If it's already failed, the + // failure is captured — stop rather than marking an earlier passing one. + if (command.error) { + return false + } command.error = error this.sendReplaceCommand(command.timestamp, command) return true @@ -432,7 +445,8 @@ export abstract class SessionCapturerBase { if ( !clean || this.isInternalStreamLine(clean) || - SPINNER_RE.test(clean) + SPINNER_RE.test(clean) || + !this.#terminalThrottle.shouldEmit(clean) ) { continue } diff --git a/packages/core/src/terminal-throttle.ts b/packages/core/src/terminal-throttle.ts new file mode 100644 index 00000000..017cbf00 --- /dev/null +++ b/packages/core/src/terminal-throttle.ts @@ -0,0 +1,70 @@ +/** + * Rate-limits high-frequency identical terminal (stdout/stderr) lines so a + * polling framework that reprints the same line every ~100ms doesn't flood the + * trace's console lane. The motivating case: WDIO's logger writes a + * `COMMAND`/`RESULT` frame for every WebDriver command, so an `expect` that + * polls for its full 10s timeout emits hundreds of near-identical lines. + * + * Only terminal-source capture goes through this — user `console.*` is + * captured as `source: 'test'` and never throttled, so real user output is + * untouched. Distinct lines always pass immediately; a repeat is emitted at + * most once per window. + */ + +/** + * A repeated identical terminal line is emitted at most once per this window + * (ms). Sized so a 100ms poll collapses ~10:1 while a human-paced reprint of + * the same line (>1s apart) still shows every time. + */ +export const TERMINAL_REPEAT_WINDOW_MS = 1000 + +/** + * Leading ISO-8601 timestamp emitted by most structured loggers (`@wdio/logger`'s + * `%t %l %n:` template, pino, winston, …). It's the only volatile part of + * otherwise-identical successive log frames, so it's stripped from the throttle + * key — never from the emitted text. + */ +const LEADING_ISO_TIMESTAMP_RE = + /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d\d\d)?Z {1,4}/ + +/** Key a terminal line for repeat-detection: drop a leading ISO timestamp so + * successive log frames of the same message collapse. */ +export function terminalRepeatKey(line: string): string { + return line.replace(LEADING_ISO_TIMESTAMP_RE, '') +} + +export class TerminalLineThrottle { + #lastEmitted = new Map<string, number>() + readonly #windowMs: number + + constructor(windowMs: number = TERMINAL_REPEAT_WINDOW_MS) { + this.#windowMs = windowMs + } + + /** + * True if the line should be emitted, false if it's a within-window repeat of + * a line already emitted. The window is anchored to the last *emit*, not the + * last occurrence, so a sustained stream of one line still emits once per + * window instead of going silent after the first. Expired keys are pruned on + * each emit, so state stays bounded by the number of distinct lines seen + * within the window. + */ + shouldEmit(line: string, now: number = Date.now()): boolean { + const key = terminalRepeatKey(line) + const last = this.#lastEmitted.get(key) + if (last !== undefined && now - last < this.#windowMs) { + return false + } + this.#lastEmitted.set(key, now) + this.#prune(now) + return true + } + + #prune(now: number): void { + for (const [key, ts] of this.#lastEmitted) { + if (now - ts >= this.#windowMs) { + this.#lastEmitted.delete(key) + } + } + } +} diff --git a/packages/core/tests/session-capturer-base.test.ts b/packages/core/tests/session-capturer-base.test.ts index d89455ae..92ee7722 100644 --- a/packages/core/tests/session-capturer-base.test.ts +++ b/packages/core/tests/session-capturer-base.test.ts @@ -152,3 +152,49 @@ describe('sendCommand', () => { expect(cap.upstream.filter((u) => u.scope === 'commands')).toHaveLength(1) }) }) + +describe('failLastAction', () => { + const boom = { name: 'Error', message: 'boom' } + + it('marks the most-recent action of the test when it has no error', () => { + cap.commandsLog.push({ + command: 'expect.toBeExisting', + args: [], + timestamp: 1, + testUid: 't1' + }) + expect(cap.failLastAction('t1', boom)).toBe(true) + expect(cap.commandsLog[0]!.error).toEqual(boom) + }) + + it('does not bleed onto an earlier passing action when the latest one already failed', () => { + // Regression: a failing expect matcher is captured as its own row via + // afterAssertion, so failLastAction must stop at it — NOT stamp the error + // onto the preceding passing assertion (the toBeExisting-shown-red bug). + const matcherErr = { name: 'Error', message: 'to have text' } + cap.commandsLog.push( + { command: 'expect.toBeExisting', args: [], timestamp: 1, testUid: 't1' }, + { + command: 'expect.toHaveText', + args: [], + timestamp: 2, + testUid: 't1', + error: matcherErr + } + ) + expect(cap.failLastAction('t1', boom)).toBe(false) + expect(cap.commandsLog[0]!.error).toBeUndefined() + expect(cap.commandsLog[1]!.error).toEqual(matcherErr) + }) + + it('ignores actions belonging to a different test', () => { + cap.commandsLog.push({ + command: 'expect.toBeExisting', + args: [], + timestamp: 1, + testUid: 'other' + }) + expect(cap.failLastAction('t1', boom)).toBe(false) + expect(cap.commandsLog[0]!.error).toBeUndefined() + }) +}) diff --git a/packages/core/tests/terminal-throttle.test.ts b/packages/core/tests/terminal-throttle.test.ts new file mode 100644 index 00000000..4e26f11b --- /dev/null +++ b/packages/core/tests/terminal-throttle.test.ts @@ -0,0 +1,74 @@ +import { describe, it, expect } from 'vitest' +import { + TERMINAL_REPEAT_WINDOW_MS, + TerminalLineThrottle, + terminalRepeatKey +} from '../src/terminal-throttle.js' + +describe('terminalRepeatKey', () => { + it('strips a leading ISO-8601 timestamp so log frames of the same message match', () => { + const a = '2026-07-09T22:12:38.497Z INFO webdriver: COMMAND getText("#x")' + const b = '2026-07-09T22:12:38.597Z INFO webdriver: COMMAND getText("#x")' + expect(terminalRepeatKey(a)).toBe(terminalRepeatKey(b)) + expect(terminalRepeatKey(a)).toBe('INFO webdriver: COMMAND getText("#x")') + }) + + it('leaves lines without a leading timestamp untouched', () => { + expect(terminalRepeatKey('[TEST] hello')).toBe('[TEST] hello') + }) +}) + +describe('TerminalLineThrottle', () => { + it('emits distinct lines immediately', () => { + const t = new TerminalLineThrottle() + expect(t.shouldEmit('one', 0)).toBe(true) + expect(t.shouldEmit('two', 0)).toBe(true) + expect(t.shouldEmit('three', 0)).toBe(true) + }) + + it('suppresses a within-window repeat but re-emits once the window passes', () => { + const t = new TerminalLineThrottle(1000) + expect(t.shouldEmit('poll', 0)).toBe(true) // first + expect(t.shouldEmit('poll', 100)).toBe(false) // repeat within window + expect(t.shouldEmit('poll', 900)).toBe(false) + expect(t.shouldEmit('poll', 1000)).toBe(true) // window elapsed → re-emit + expect(t.shouldEmit('poll', 1100)).toBe(false) + }) + + it('anchors the window to the last emit, not the last occurrence (a sustained stream still emits ~1/window)', () => { + const t = new TerminalLineThrottle(1000) + let emitted = 0 + // 100ms poll for 10s = 101 occurrences of the same line. + for (let ms = 0; ms <= 10000; ms += 100) { + if (t.shouldEmit('COMMAND getText', ms)) { + emitted++ + } + } + // ~1 per second rather than ~100 total — flood collapsed ~10:1. + expect(emitted).toBe(11) + }) + + it('collapses successive WDIO logger frames of the same command despite changing timestamps', () => { + const t = new TerminalLineThrottle(1000) + const line = (ms: number) => + `2026-07-09T22:12:${String(30 + Math.floor(ms / 1000)).padStart(2, '0')}.${String(ms % 1000).padStart(3, '0')}Z INFO webdriver: COMMAND getText("#x")` + expect(t.shouldEmit(line(0), 0)).toBe(true) + expect(t.shouldEmit(line(100), 100)).toBe(false) + expect(t.shouldEmit(line(200), 200)).toBe(false) + }) + + it('treats different messages independently', () => { + const t = new TerminalLineThrottle(1000) + expect(t.shouldEmit('COMMAND getText', 0)).toBe(true) + expect(t.shouldEmit('RESULT ""', 10)).toBe(true) // interleaved, distinct + expect(t.shouldEmit('COMMAND getText', 100)).toBe(false) // repeat + expect(t.shouldEmit('RESULT ""', 110)).toBe(false) // repeat + }) + + it('defaults to the exported window constant', () => { + const t = new TerminalLineThrottle() + expect(t.shouldEmit('x', 0)).toBe(true) + expect(t.shouldEmit('x', TERMINAL_REPEAT_WINDOW_MS - 1)).toBe(false) + expect(t.shouldEmit('x', TERMINAL_REPEAT_WINDOW_MS)).toBe(true) + }) +}) From 01ad8711bae7810d74084cccf855092ed8188727 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:24:50 +0530 Subject: [PATCH 035/109] fix(app): real per-action duration and span-based active highlight --- .../src/components/browser/trace-timeline.ts | 20 ++-- .../workbench/actionItems/duration.ts | 20 ++++ .../app/src/components/workbench/actions.ts | 18 +--- .../src/components/workbench/active-entry.ts | 59 ++++++++--- packages/app/tests/active-entry.test.ts | 97 +++++++++++++++---- packages/app/tests/duration.test.ts | 33 +++++++ 6 files changed, 191 insertions(+), 56 deletions(-) diff --git a/packages/app/src/components/browser/trace-timeline.ts b/packages/app/src/components/browser/trace-timeline.ts index 21f7ffce..07cb81a1 100644 --- a/packages/app/src/components/browser/trace-timeline.ts +++ b/packages/app/src/components/browser/trace-timeline.ts @@ -5,7 +5,7 @@ import { consume } from '@lit/context' import type { CommandLog, TracePlayerFrame } from '@wdio/devtools-shared' import { commandContext, framesContext } from '../../controller/context.js' -import { activeTimestampAt } from '../workbench/active-entry.js' +import { activeSpanAt } from '../workbench/active-entry.js' import { KBD } from '../../controller/keyboard.js' import { PLAYER_RESTART_EVENT, @@ -42,7 +42,7 @@ export class TraceTimeline extends Element { #rafId?: number #rafLast = 0 - #activeTimestamp?: number + #activeCommand?: CommandLog #started = false @query('[data-scrub]') scrubEl?: HTMLElement @@ -229,19 +229,15 @@ export class TraceTimeline extends Element { return } const clock = this.#start + this.currentMs - const timestamps = sorted.map((c) => c.timestamp ?? 0) - const activeTs = activeTimestampAt(timestamps, clock) ?? timestamps[0] - if (this.#started && activeTs === this.#activeTimestamp) { + const command = activeSpanAt(sorted, clock) ?? sorted[0] + if (this.#started && command === this.#activeCommand) { return } this.#started = true - this.#activeTimestamp = activeTs - const command = sorted.find((c) => (c.timestamp ?? 0) === activeTs) - if (command) { - window.dispatchEvent( - new CustomEvent('show-command', { detail: { command } }) - ) - } + this.#activeCommand = command + window.dispatchEvent( + new CustomEvent('show-command', { detail: { command } }) + ) } // ─── scrubbing (drag anywhere on the strip) ─────────────────────────────── diff --git a/packages/app/src/components/workbench/actionItems/duration.ts b/packages/app/src/components/workbench/actionItems/duration.ts index 5d2df61f..f0dd5d63 100644 --- a/packages/app/src/components/workbench/actionItems/duration.ts +++ b/packages/app/src/components/workbench/actionItems/duration.ts @@ -1,3 +1,5 @@ +import type { CommandLog, TraceMutation } from '@wdio/devtools-shared' + export type DurationHeat = 'fast' | 'mid' | 'slow' const ONE_SECOND = 1000 @@ -29,6 +31,24 @@ export function durationHeat(ms: number): DurationHeat { return 'fast' } +/** + * True per-action duration: a command's own execution span (`timestamp − + * startTime`) when it has one, else the inter-action `gapFallback`. Prefer the + * span — the gap over-counts idle time before an action, so e.g. an assertion + * whose internal polling commands are suppressed would otherwise report the + * navigation gap that preceded it rather than its own runtime. Used by both the + * flat (live) and grouped (trace-player) action views so they agree. + */ +export function entryDuration( + entry: CommandLog | TraceMutation, + gapFallback: number | undefined +): number | undefined { + if ('command' in entry && entry.startTime !== undefined) { + return entry.timestamp - entry.startTime + } + return gapFallback +} + /** * Per-step duration for each timeline entry: the gap to the next entry. The * final entry has no next, so it falls back to the gap from the previous entry diff --git a/packages/app/src/components/workbench/actions.ts b/packages/app/src/components/workbench/actions.ts index 842f4f56..5e630c8e 100644 --- a/packages/app/src/components/workbench/actions.ts +++ b/packages/app/src/components/workbench/actions.ts @@ -18,8 +18,8 @@ import '../placeholder.js' import './actionItems/command.js' import './actionItems/group.js' import './actionItems/mutation.js' -import { stepDurations } from './actionItems/duration.js' -import { activeTimestampAt } from './active-entry.js' +import { entryDuration, stepDurations } from './actionItems/duration.js' +import { activeSpanAt } from './active-entry.js' import { defaultExpanded, flattenActionTree, @@ -128,12 +128,7 @@ export class DevtoolsActions extends Element { // every timeupdate tick. #onScreencastProgress = (event: Event) => { const { time } = (event as CustomEvent<{ time: number }>).detail - const entries = this.#sortedEntries() - const timestamp = activeTimestampAt( - entries.map((entry) => entry.timestamp), - time - ) - const active = entries.find((entry) => entry.timestamp === timestamp) + const active = activeSpanAt(this.#sortedEntries(), time) if (active === this.activeEntry) { return } @@ -228,10 +223,7 @@ export class DevtoolsActions extends Element { return nothing } // Reconstructed zips carry the real invocation span; gap is the fallback. - const duration = - entry.startTime !== undefined - ? entry.timestamp - entry.startTime - : gaps[row.commandIndex] + const duration = entryDuration(entry, gaps[row.commandIndex]) return html` <wdio-devtools-command-item style=${indent} @@ -257,7 +249,7 @@ export class DevtoolsActions extends Element { const rows = entries.map((entry, index) => { const elapsedTime = entry.timestamp - baselineTimestamp - const duration = durations[index] + const duration = entryDuration(entry, durations[index]) const active = entry === this.activeEntry if ('command' in entry) { diff --git a/packages/app/src/components/workbench/active-entry.ts b/packages/app/src/components/workbench/active-entry.ts index 3cdd2ed2..edbe3eb9 100644 --- a/packages/app/src/components/workbench/active-entry.ts +++ b/packages/app/src/components/workbench/active-entry.ts @@ -1,20 +1,51 @@ +/** Timeline item occupying a span from `startTime` (inclusive) to `timestamp` + * (inclusive). Items without a `startTime` occupy the single point `timestamp`. */ +export interface TimeSpanned { + timestamp: number + startTime?: number +} + /** - * Given action timestamps sorted ascending and a playback time (wall-clock ms), - * return the timestamp of the action that is "current" — the latest one at or - * before `time`. Returns undefined when `time` precedes the first action, so - * nothing is highlighted before the first command runs. + * Given timeline items and a playback time (wall-clock ms), return the item + * that is "current" at `time`. An item's span is `[startTime ?? timestamp, + * timestamp]` and the item is current when `time` falls inside it — so a + * long-running command (e.g. a polling `expect.*` matcher) stays selected for + * its whole duration, not just at completion. When several spans contain `time` + * (nested/overlapping commands), the one that started most recently wins, with + * ties broken toward the tighter span — the most specific action in progress. + * When none contain `time` (a point-like command, or a gap between actions), + * fall back to the latest item that has already ended at or before `time`. + * Returns undefined when `time` precedes every item, so nothing is highlighted + * before the first action runs. */ -export function activeTimestampAt( - sortedTimestamps: number[], +export function activeSpanAt<T extends TimeSpanned>( + items: readonly T[], time: number -): number | undefined { - let active: number | undefined - for (const ts of sortedTimestamps) { - if (ts <= time) { - active = ts - } else { - break +): T | undefined { + let containing: T | undefined + let containingStart = -Infinity + let containingEnd = Infinity + let ended: T | undefined + let endedAt = -Infinity + + for (const item of items) { + const end = item.timestamp + const start = item.startTime ?? end + if ( + start <= time && + time <= end && + (start > containingStart || + (start === containingStart && end < containingEnd)) + ) { + containing = item + containingStart = start + containingEnd = end + } + if (end <= time && end >= endedAt) { + ended = item + endedAt = end } } - return active + + return containing ?? ended } diff --git a/packages/app/tests/active-entry.test.ts b/packages/app/tests/active-entry.test.ts index 9dcf416f..c894f456 100644 --- a/packages/app/tests/active-entry.test.ts +++ b/packages/app/tests/active-entry.test.ts @@ -1,28 +1,91 @@ import { describe, it, expect } from 'vitest' -import { activeTimestampAt } from '../src/components/workbench/active-entry.js' +import { + activeSpanAt, + type TimeSpanned +} from '../src/components/workbench/active-entry.js' -describe('activeTimestampAt', () => { - const stamps = [100, 200, 300, 400] +describe('activeSpanAt', () => { + // Point-like commands (no startTime) — the pre-span behaviour must be intact. + describe('point-like items (no startTime)', () => { + const points: TimeSpanned[] = [ + { timestamp: 100 }, + { timestamp: 200 }, + { timestamp: 300 }, + { timestamp: 400 } + ] - it('returns undefined before the first action', () => { - expect(activeTimestampAt(stamps, 50)).toBeUndefined() - }) + it('returns undefined before the first item', () => { + expect(activeSpanAt(points, 50)).toBeUndefined() + }) - it('returns the action exactly at the playback time', () => { - expect(activeTimestampAt(stamps, 200)).toBe(200) - }) + it('returns the item exactly at the playback time', () => { + expect(activeSpanAt(points, 200)).toBe(points[1]) + }) - it('returns the latest action at or before the playback time', () => { - expect(activeTimestampAt(stamps, 250)).toBe(200) - expect(activeTimestampAt(stamps, 399)).toBe(300) - }) + it('returns the latest item at or before the playback time', () => { + expect(activeSpanAt(points, 250)).toBe(points[1]) + expect(activeSpanAt(points, 399)).toBe(points[2]) + }) - it('clamps to the last action once playback passes it', () => { - expect(activeTimestampAt(stamps, 999)).toBe(400) + it('clamps to the last item once playback passes it', () => { + expect(activeSpanAt(points, 999)).toBe(points[3]) + }) + + it('returns undefined for an empty timeline', () => { + expect(activeSpanAt([], 100)).toBeUndefined() + }) }) - it('returns undefined for an empty timeline', () => { - expect(activeTimestampAt([], 100)).toBeUndefined() + describe('spanned items (startTime → timestamp)', () => { + it('selects a long-running command while the clock is inside its span', () => { + const before = { timestamp: 1000 } + const poll = { startTime: 1000, timestamp: 11000 } + const items: TimeSpanned[] = [before, poll] + // Mid-poll: the span contains the clock, so the poll stays selected even + // though the preceding command ended earlier. + expect(activeSpanAt(items, 5000)).toBe(poll) + expect(activeSpanAt(items, 1500)).toBe(poll) + // At the span end the poll is still selected. + expect(activeSpanAt(items, 11000)).toBe(poll) + }) + + it('picks the most recently started span when several contain the clock', () => { + const outer = { startTime: 100, timestamp: 10000 } + const inner = { startTime: 4000, timestamp: 6000 } + const items: TimeSpanned[] = [outer, inner] + expect(activeSpanAt(items, 5000)).toBe(inner) + // Outside the inner span but still inside the outer one → outer. + expect(activeSpanAt(items, 2000)).toBe(outer) + expect(activeSpanAt(items, 8000)).toBe(outer) + }) + + it('breaks a start-time tie toward the tighter span', () => { + const wide = { startTime: 100, timestamp: 9000 } + const tight = { startTime: 100, timestamp: 3000 } + const items: TimeSpanned[] = [wide, tight] + expect(activeSpanAt(items, 2000)).toBe(tight) + }) + + it('falls back to the last-ended item when no span contains the clock', () => { + const first = { startTime: 100, timestamp: 2000 } + const second = { startTime: 5000, timestamp: 7000 } + const items: TimeSpanned[] = [first, second] + // Clock sits in the gap between the two spans → the last one that ended. + expect(activeSpanAt(items, 3500)).toBe(first) + }) + + it('returns undefined when the clock precedes the first span', () => { + const items: TimeSpanned[] = [{ startTime: 1000, timestamp: 5000 }] + expect(activeSpanAt(items, 500)).toBeUndefined() + }) + + it('prefers a containing span over an already-ended earlier item', () => { + const ended = { timestamp: 1000 } + const running = { startTime: 900, timestamp: 8000 } + const items: TimeSpanned[] = [ended, running] + // Clock is past the point command but inside the running span → running. + expect(activeSpanAt(items, 2000)).toBe(running) + }) }) }) diff --git a/packages/app/tests/duration.test.ts b/packages/app/tests/duration.test.ts index 0bfc90ba..92ab1c87 100644 --- a/packages/app/tests/duration.test.ts +++ b/packages/app/tests/duration.test.ts @@ -3,8 +3,10 @@ import { describe, it, expect } from 'vitest' import { formatDuration, durationHeat, + entryDuration, stepDurations } from '../src/components/workbench/actionItems/duration.js' +import type { CommandLog, TraceMutation } from '@wdio/devtools-shared' describe('formatDuration', () => { it('shows milliseconds under a second', () => { @@ -73,3 +75,34 @@ describe('stepDurations', () => { expect(stepDurations([0, 0, 0, 500])).toEqual([0, 0, 500, 500]) }) }) + +describe('entryDuration', () => { + const cmd = (over: Partial<CommandLog> = {}): CommandLog => ({ + command: 'expect.toExist', + args: [], + timestamp: 10603, + ...over + }) + + it('uses the command execution span (timestamp − startTime) when present', () => { + // Regression: an assertion whose internal polling is suppressed sits after a + // long navigation gap; the row must show its own 603ms runtime, not the gap. + expect(entryDuration(cmd({ startTime: 10000 }), 10650)).toBe(603) + }) + + it('falls back to the inter-action gap when the command has no startTime', () => { + expect(entryDuration(cmd(), 420)).toBe(420) + }) + + it('falls back to the gap for a mutation entry (no startTime field)', () => { + const mutation = { + type: 'childList', + timestamp: 5 + } as unknown as TraceMutation + expect(entryDuration(mutation, 42)).toBe(42) + }) + + it('returns undefined when neither a span nor a gap is available', () => { + expect(entryDuration(cmd(), undefined)).toBeUndefined() + }) +}) From f71481d520d2e8277d2ad58f5c8c6092b95a2023 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:25:14 +0530 Subject: [PATCH 036/109] fix(app): sidebar icon alignment and resizable-pane drag --- packages/app/src/components/sidebar/test-suite.ts | 11 +++++++---- packages/app/src/utils/DragController.ts | 11 +++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/sidebar/test-suite.ts b/packages/app/src/components/sidebar/test-suite.ts index cf0d43f3..9cc7e0ee 100644 --- a/packages/app/src/components/sidebar/test-suite.ts +++ b/packages/app/src/components/sidebar/test-suite.ts @@ -287,10 +287,11 @@ export class ExplorerTestEntry extends CollapseableEntry { return this.state === TestState.RUNNING } get testStateIcon() { - // Fixed-height box (= the label's line-height) centred so the icon aligns - // with the first line of the title whether it wraps or not — no margin hacks. + // Vertically centred in the row so the status icon lines up with the + // row's action buttons (run/stop), which are also centre-aligned. const box = (inner: unknown) => - html`<span class="w-4 h-[18px] shrink-0 flex items-center justify-center" + html`<span + class="w-4 h-[18px] shrink-0 self-center grid place-items-center" >${inner}</span >` if (this.isRunning) { @@ -407,7 +408,9 @@ export class ExplorerTestEntry extends CollapseableEntry { class="row flex w-full items-start text-sm group/sidebar rounded-md my-0.5 px-1 py-1 cursor-pointer hover:bg-toolbarHoverBackground" > <button - class="flex-none pointer px-2 h-8 ${hasNoChildren ? 'hidden' : ''}" + class="flex-none pointer px-2 h-[18px] flex items-center justify-center ${hasNoChildren + ? 'hidden' + : ''}" @click="${() => this.#toggleEntry()}" > <icon-mdi-menu-down diff --git a/packages/app/src/utils/DragController.ts b/packages/app/src/utils/DragController.ts index d675570f..e74d8d6e 100644 --- a/packages/app/src/utils/DragController.ts +++ b/packages/app/src/utils/DragController.ts @@ -256,6 +256,17 @@ export class DragController implements ReactiveController { // if slider was removed (collapsed) and re-added, re-init pointer tracker if (this.#draggableEl !== draggableEl) { this.#draggableEl = draggableEl as HTMLElement + // The container often doesn't exist at construction (the sidebar renders + // only after a connection), so it must be resolved here too — otherwise + // the tracker attaches but #handleWindowMove bails on a null container + // and the drag silently no-ops. + if (!this.#containerEl) { + const containerEl = await this.#options.getContainerEl() + if (containerEl) { + this.#containerEl = containerEl as HTMLElement + window.onresize = () => this.#adjustPosition() + } + } this.#init() } } From 1aac9795f47716edc04a26d2b760615b8f871f25 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:26:04 +0530 Subject: [PATCH 037/109] chore(examples): assertion + retry harnesses, chromedriver bump --- .../nightwatch/tests/assert-capture-check.js | 18 +++++++ examples/nightwatch/tests/login.js | 47 ------------------- examples/nightwatch/tests/sample.js | 21 --------- .../features/step-definitions/steps.ts | 8 ++-- examples/wdio/mocha/wdio.retry.conf.ts | 4 +- packages/nightwatch-devtools/package.json | 2 +- pnpm-lock.yaml | 30 +++++++++--- 7 files changed, 49 insertions(+), 81 deletions(-) create mode 100644 examples/nightwatch/tests/assert-capture-check.js delete mode 100644 examples/nightwatch/tests/login.js delete mode 100644 examples/nightwatch/tests/sample.js diff --git a/examples/nightwatch/tests/assert-capture-check.js b/examples/nightwatch/tests/assert-capture-check.js new file mode 100644 index 00000000..6f8511a3 --- /dev/null +++ b/examples/nightwatch/tests/assert-capture-check.js @@ -0,0 +1,18 @@ +// Verification harness for native-assert trace capture (browser.assert / verify). +// Run `pnpm demo:nightwatch` and inspect the dashboard Actions: the PASSING +// asserts must render green and the FAILING ones RED. If a failing assert shows +// green, the classic-chained capture is mis-reporting failures (the known risk +// in nativeAssertCapture — the wrapper sees the enqueue, not the queued result). +describe('Native assert capture check', function () { + it('renders passing and failing native asserts', async function (browser) { + await browser.url('https://example.com').waitForElementVisible('body', 5000) + + // Soft verify.* first — never aborts the test, so all four always run. + browser.verify.titleContains('Example') // PASS → expect green + browser.verify.titleContains('SOFT_FAIL_ME') // FAIL → expect RED + + // Hard assert.* — the classic-chained/queued path under test. + browser.assert.titleContains('Example') // PASS → expect green + browser.assert.titleContains('HARD_FAIL_ME') // FAIL → expect RED + }) +}) diff --git a/examples/nightwatch/tests/login.js b/examples/nightwatch/tests/login.js deleted file mode 100644 index d8964d8d..00000000 --- a/examples/nightwatch/tests/login.js +++ /dev/null @@ -1,47 +0,0 @@ -describe('The Internet Guinea Pig Website', function () { - afterEach(async function (browser) { - await browser.end() - }) - - it('should log into the secure area with valid credentials', async function (browser) { - console.log('[TEST] Navigating to login page') - await browser - .url('https://the-internet.herokuapp.com/login') - .waitForElementVisible('body') - - console.log('[TEST] Attempting login with username: tomsmith') - await browser - .setValue('#username', 'tomsmith') - .setValue('#password', 'SuperSecretPassword!') - .click('button[type="submit"]') - - console.log( - '[TEST] Verifying flash message: You logged into a secure area!' - ) - await browser - .waitForElementVisible('#flash', 10000) - .assert.textContains('#flash', 'You logged into a secure area!') - - console.log('[TEST] Flash message verified successfully') - }) - - it('should show error with invalid credentials', async function (browser) { - console.log('[TEST] Navigating to login page') - await browser - .url('https://the-internet.herokuapp.com/login') - .waitForElementVisible('body') - - console.log('[TEST] Attempting login with username: foobar') - await browser - .setValue('#username', 'foobar') - .setValue('#password', 'barfoo') - .click('button[type="submit"]') - - console.log('[TEST] Verifying flash message: Your username is invalid!') - await browser - .waitForElementVisible('#flash', 10000) - .assert.textContains('#flash', 'Your username is invalid!') - - console.log('[TEST] Flash message verified successfully') - }) -}) diff --git a/examples/nightwatch/tests/sample.js b/examples/nightwatch/tests/sample.js deleted file mode 100644 index ff2e4b2a..00000000 --- a/examples/nightwatch/tests/sample.js +++ /dev/null @@ -1,21 +0,0 @@ -describe('Sample Nightwatch Test with DevTools', function () { - it('should navigate to example.com and check title', async function (browser) { - await browser - .url('https://example.com') - .waitForElementVisible('body', 5000) - .assert.titleContains('Example') - .assert.visible('h1') - - const result = await browser.getText('h1') - browser.assert.ok(result.includes('Example'), 'H1 contains "Example"') - }) - - it('should perform basic interactions', async function (browser) { - await browser - .url('https://www.google.com') - .waitForElementVisible('body', 5000) - .assert.visible('textarea[name="q"]') - .setValue('textarea[name="q"]', 'WebdriverIO DevTools') - .pause(1000) - }) -}) diff --git a/examples/wdio/cucumber/features/step-definitions/steps.ts b/examples/wdio/cucumber/features/step-definitions/steps.ts index 3367b631..5d02133e 100644 --- a/examples/wdio/cucumber/features/step-definitions/steps.ts +++ b/examples/wdio/cucumber/features/step-definitions/steps.ts @@ -26,9 +26,9 @@ When(/^I login with (\w+) and (.+)$/, async (username, password) => { Then(/^I should see a flash message saying (.*)$/, async (message) => { console.log(`[TEST] Verifying flash message: ${message}`) - const el = await SecurePage.flashAlert - await expect(el).toBeExisting() - await expect(el).toHaveText(expect.stringContaining(message)) + await expect(SecurePage.flashAlert).toBeExisting() + await expect(SecurePage.flashAlert).toHaveText( + expect.stringContaining(message) + ) console.log('[TEST] Flash message verified successfully') - // await browser.pause(15000) }) diff --git a/examples/wdio/mocha/wdio.retry.conf.ts b/examples/wdio/mocha/wdio.retry.conf.ts index 90b87858..d9c873bb 100644 --- a/examples/wdio/mocha/wdio.retry.conf.ts +++ b/examples/wdio/mocha/wdio.retry.conf.ts @@ -42,8 +42,8 @@ export const config: Options.Testrunner = { 'devtools', { mode: 'trace' as const, - traceGranularity: 'spec' as const, - tracePolicy: 'on-first-retry' as const + traceGranularity: 'test' as const, + tracePolicy: 'retain-on-failure' as const } ] ], diff --git a/packages/nightwatch-devtools/package.json b/packages/nightwatch-devtools/package.json index d3736180..0c3339b0 100644 --- a/packages/nightwatch-devtools/package.json +++ b/packages/nightwatch-devtools/package.json @@ -62,7 +62,7 @@ "@types/ws": "^8.18.1", "@wdio/devtools-core": "workspace:^", "@wdio/devtools-shared": "workspace:^", - "chromedriver": "^148.0.4", + "chromedriver": "^150.0.0", "nightwatch": "^3.16.0", "tsup": "^8.5.1", "typescript": "^6.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2354ac3..528cbb11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,7 +109,7 @@ importers: version: link:../../packages/nightwatch-devtools nightwatch: specifier: ^3.16.0 - version: 3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@148.0.4) + version: 3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@150.0.1) examples/selenium: dependencies: @@ -422,11 +422,11 @@ importers: specifier: workspace:^ version: link:../shared chromedriver: - specifier: ^148.0.4 - version: 148.0.4 + specifier: ^150.0.0 + version: 150.0.1 nightwatch: specifier: ^3.16.0 - version: 3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@148.0.4) + version: 3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@150.0.1) tsup: specifier: ^8.5.1 version: 8.5.1(@microsoft/api-extractor@7.58.9(@types/node@25.9.3))(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3)(yaml@2.9.0) @@ -3338,6 +3338,11 @@ packages: engines: {node: '>=22'} hasBin: true + chromedriver@150.0.1: + resolution: {integrity: sha512-vpYskeQFyZGPNMEwc/5fuvfnxzfjljCO1EvwuF0dZGQ8KE0repYQar7eThTlT1IjznwVrirYRgXrRsJts7DRIQ==} + engines: {node: '>=22'} + hasBin: true + chromium-bidi@0.5.8: resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} peerDependencies: @@ -10656,6 +10661,19 @@ snapshots: - debug - supports-color + chromedriver@150.0.1: + dependencies: + '@testim/chrome-version': 1.1.4 + adm-zip: 0.5.17 + axios: 1.16.1 + compare-versions: 6.1.1 + proxy-agent: 8.0.1 + proxy-from-env: 2.1.0 + tcp-port-used: 1.0.2 + transitivePeerDependencies: + - debug + - supports-color + chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): dependencies: devtools-protocol: 0.0.1232444 @@ -13280,7 +13298,7 @@ snapshots: dependencies: axe-core: 4.12.0 - nightwatch@3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@148.0.4): + nightwatch@3.16.0(@cucumber/cucumber@13.0.0)(chromedriver@150.0.1): dependencies: '@nightwatch/chai': 5.0.3 '@nightwatch/html-reporter-template': 0.3.0 @@ -13318,7 +13336,7 @@ snapshots: uuid: 8.3.2 optionalDependencies: '@cucumber/cucumber': 13.0.0 - chromedriver: 148.0.4 + chromedriver: 150.0.1 transitivePeerDependencies: - bufferutil - canvas From b172befad571dcb877bd42d9eac040a907a1da8f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 10 Jul 2026 23:26:25 +0530 Subject: [PATCH 038/109] docs: test-results/ layout, traceGranularity:'test', tracePolicy, and known-debt --- CLAUDE.md | 8 +++++++- README.md | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f06ea24d..14fff1a0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -236,10 +236,16 @@ Documented divergences from the conventions above. They exist today as debt to b - `patchNodeAssert` (via `core/assert-patcher`) is now wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`). Framework matcher libraries differ: Service additionally taps expect-webdriverio's `afterAssertion` hook so passing+failing matchers render as `expect.*` actions; Selenium (chai/jest) and Nightwatch (`browser.assert`/`verify`) don't yet surface passing framework-matcher assertions as trace actions. - BiDi is auto-attached in Service and Selenium; Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities. - Retry-aware trace policies aren't uniform across adapters. Selenium emits one metadata entry per attempt (counter-based `generateStableUid` uid + retry-stable tracker key), so all six policies — including `retain-on-first-failure` (needs the first attempt's outcome) — evaluate correctly. Service and Nightwatch key metadata on the retry-stable uid and overwrite/mutate per attempt, collapsing to the *final* attempt's outcome; the retry-count policies (`retain-on-failure`, `on-first-retry`, `on-all-retries`, `retain-on-failure-and-retries`) are still correct, but `retain-on-first-failure` can't see a failed-then-passed first attempt and under-retains. Proper fix rides with B5 (per-test granularity preserves per-attempt slices); until then all three set `attemptInfoAvailable: true`. +- Nightwatch negated native asserts (`browser.assert.not.*` / `verify.not.*`) produce no trace row: the `not` namespace is a nested Proxy that `wrapAssertionNamespaces` passes through untouched, and the internal command it issues is dropped by the `hasUserSource` gate in `browserProxy`. Positive `assert.*`/`verify.*` still record. +- Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. +- Nightwatch native asserts populate all at once in live mode and finalize pass/fail in one test-end batch: Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin (`client.queue.tree` / `client.reporter` aren't on `browser`), so call-time capture streams neutral pending rows and `afterEach` reconciles outcomes. Trace-timeline positions are corrected from `results.commands`. +- Service assertion-suppression self-heal is command-triggered: a swallowed soft-assert (`expect.soft` / user `try/catch`) whose matcher hard-throws leaves `#assertionDepth` stuck until the next top-level user command's stack shows no `expect-webdriverio` frame (heal) or the next `beforeAssertion` (reset). A stuck depth with no following command or assertion before test end persists until the next test's `resetStack()` — benign (no later command in that test to suppress). ### File-size (raw line counts; soft cap is 500 logic lines) -None of the entries below trigger the `max-lines` lint rule after `skipBlankLines`/`skipComments`. They're documented because their raw line count is over 500, and the next substantive change to any of them should still look for an extraction opportunity. +Most entries below don't trigger the `max-lines` lint rule after `skipBlankLines`/`skipComments`; they're documented because their raw line count is over 500, and the next substantive change to any of them should still look for an extraction opportunity. The service plugin is the exception — it's now over the *logic*-line cap. + +- `packages/service/src/index.ts` — over the 500-**logic**-line soft cap (the WDIO plugin god-file: session/screencast/command/assertion/trace-slice wiring in one class). Split candidate; the trace-slice, assertion-capture, and screencast concerns are the natural extraction seams. - `packages/nightwatch-devtools/src/index.ts` (~536 raw). Cucumber/test/run-lifecycle, session-init, event-hub modules already extracted; remainder is the `PluginInternals` accessor bag plus per-method delegators plus the factory. Accept-as-is. - `packages/selenium-devtools/src/index.ts` (~560 raw). Session/test-lifecycle extracted; remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Same situation as nightwatch. diff --git a/README.md b/README.md index fa87cc71..09f93c2e 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ When BiDi is active in Selenium or Nightwatch, the per-command Chrome performanc ### 📦 Trace mode (trace.zip) -Headless capture path — no DevTools UI window opens. At session end the adapter writes a trace artifact next to the user's output directory, suitable for offline replay, AI-agent diffing, or any consumer that prefers a portable artifact over a live UI. +Headless capture path — no DevTools UI window opens. At session end the adapter writes trace artifacts into a `test-results/` folder (created next to the resolved spec/config directory), suitable for offline replay, AI-agent diffing, or any consumer that prefers a portable artifact over a live UI. | Adapter | How to enable | |---|---| @@ -79,7 +79,7 @@ Headless capture path — no DevTools UI window opens. At session end the adapte | **Nightwatch** | `globals: nightwatchDevtools({ mode: 'trace' })` | The trace artifact contains: -- `trace.trace` — NDJSON `context-options` + `before`/`after` action events. When test hooks are available (Mocha's `it()` / Cucumber's `Scenario()`), each test becomes a [`Tracing.tracingGroup`](https://github.com/VibiumDev/vibium/blob/main/docs/explanation/recording-format.md#action-groups-user-defined) span — an open/close `before`/`after` pair with `method: "tracingGroup"` and `params.name` set to the test title. Child actions inside the group carry `parentId` pointing back to the group's `callId`, so timeline viewers render tests as labelled spans wrapping their commands. +- `trace.trace` — NDJSON `context-options` + `before`/`after` action events. When test hooks are available (Mocha's `it()` / Cucumber's `Scenario()`), each test becomes a `Tracing.tracingGroup` span — an open/close `before`/`after` pair with `method: "tracingGroup"` and `params.name` set to the test title. Child actions inside the group carry `parentId` pointing back to the group's `callId`, so timeline viewers render tests as labelled spans wrapping their commands. - `trace.network` — HAR-style network entries derived from the existing capture - `resources/page@<id>-<ts>.jpeg` — screenshot per user-facing action - `resources/elements-page@<id>-<ts>.json` — flat interactable element list extracted by the page-injected scripts in `@wdio/devtools-core/element-scripts` @@ -103,7 +103,7 @@ npx show-trace path/to/trace.zip # in a project that installs an adapter The `show-trace` bin is exposed by each adapter (`@wdio/devtools-service`, `@wdio/nightwatch-devtools`, `@wdio/selenium-devtools`), so `pnpm show-trace <zip>` / `npx show-trace <zip>` work in any project that installs one — no extra dependency. -**Other viewers.** Because the format is unchanged, the same `.zip` also drops into [player.vibium.dev](https://player.vibium.dev) or `npx playwright show-trace <path>`. The format follows the [Vibium recording format](https://github.com/VibiumDev/vibium/blob/main/docs/explanation/recording-format.md) spec — a Playwright-compatible NDJSON schema that the ecosystem already renders. This is the same format [`@wdio/mcp`](https://webdriver.io/docs/mcp) uses for AI-driven session recording. +**Other viewers.** The trace uses a portable NDJSON schema, so the same `.zip` also opens in other compatible trace viewers that read the format. This is the same format [`@wdio/mcp`](https://webdriver.io/docs/mcp) uses for AI-driven session recording. #### Options @@ -111,7 +111,9 @@ The `show-trace` bin is exposed by each adapter (`@wdio/devtools-service`, `@wdi |--------|--------|---------|-------------| | `mode` | `'live'` \| `'trace'` | `'live'` | `'live'` launches the DevTools UI; `'trace'` writes an offline artifact. | | `traceFormat` | `'zip'` \| `'ndjson-directory'` | `'zip'` | Output layout. `'zip'` writes a single archive; `'ndjson-directory'` unpacks into `trace-<id>/`. | -| `traceGranularity` | `'session'` \| `'spec'` | `'session'` | `'session'` writes one trace per worker; `'spec'` writes one trace per spec file — smaller artifacts, easier to navigate. | +| `traceGranularity` | `'session'` \| `'spec'` \| `'test'` | `'session'` | `'session'` writes one trace per worker; `'spec'` one per spec file; `'test'` one per test into its own `<spec>-<title>-<browser>[-retryN]/trace.zip` folder — the smallest, most navigable artifacts, and the best pairing for a retention policy. | +| `tracePolicy` | `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. `'on'` keeps every trace; the rest keep only failing/retried tests — pairs well with `traceGranularity: 'test'`. | +| `captureAssertions` | `boolean` | `true` | Capture assertions as action rows: `node:assert` (all adapters), WebdriverIO `expect(...)` matchers, and Nightwatch `browser.assert`/`verify`. Set `false` to opt out. | WDIO config example: From 6c1abcfd4ff4f8ce4b3c8c7444c74ed537885edf Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:39:51 +0530 Subject: [PATCH 039/109] fix(core): bound the pending-snapshot settle in trace finalize --- packages/core/src/trace-finalizer.ts | 55 ++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index 415b6289..f0459590 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -79,6 +79,57 @@ const TEST_WITHOUT_BOUNDARIES_WARNING = /** Above this many slices, warn to pair granularity with a retention policy. */ const SLICE_COUNT_WARN_THRESHOLD = 200 +/** Cap on how long finalize waits for still-in-flight snapshot captures. A + * fire-and-forget capture against a tearing-down session can hang forever + * (never resolves nor rejects); blocking the export on it would deadlock the + * whole run (finalize never returns → the runner never tears the session down + * → the capture stays stuck). Past this bound we write whatever snapshots + * resolved in time — the same "flush from what exists" rule slices use. */ +const PENDING_SETTLE_TIMEOUT_MS = 5000 + +/** + * `Promise.allSettled` bounded by a timeout. Resolves when every pending + * capture settles OR the cap elapses, whichever comes first — a stuck capture + * can never hang the export. Returns whether it timed out so the caller can + * warn. The timer is unref'd so it can't itself keep the process alive. + */ +async function settlePending( + pending: Promise<unknown>[], + timeoutMs: number +): Promise<boolean> { + let timer: ReturnType<typeof setTimeout> | undefined + const timedOut = new Promise<true>((resolve) => { + timer = setTimeout(() => resolve(true), timeoutMs) + timer.unref?.() + }) + const settled = Promise.allSettled(pending).then(() => false) + const result = await Promise.race([settled, timedOut]) + if (timer) { + clearTimeout(timer) + } + return result +} + +/** Settle in-flight snapshot captures under the timeout cap, warning if the + * bound elapses. Never throws; never hangs. */ +async function awaitPendingCaptures(ctx: TraceExportContext): Promise<void> { + if (!ctx.awaitPending?.length) { + return + } + const timedOut = await settlePending( + ctx.awaitPending, + PENDING_SETTLE_TIMEOUT_MS + ) + if (timedOut) { + ctx.log?.( + 'warn', + `One or more of ${ctx.awaitPending.length} snapshot capture(s) did not ` + + `settle within ${PENDING_SETTLE_TIMEOUT_MS}ms; writing trace with the ` + + 'snapshots captured so far.' + ) + } +} + function sliceCountWarning(count: number): string { return ( `traceGranularity produced ${count} trace slices. Consider pairing it ` + @@ -269,9 +320,7 @@ export async function finalizeTraceExport( if (ctx.mode !== 'trace') { return [] } - if (ctx.awaitPending?.length) { - await Promise.allSettled(ctx.awaitPending) - } + await awaitPendingCaptures(ctx) const sliced = ctx.granularity === 'spec' || ctx.granularity === 'test' if (sliced && ctx.ranges.length > 0) { if (ctx.ranges.length > SLICE_COUNT_WARN_THRESHOLD) { From c9b6ffeeebfe88386ca5880e96d3cf0cdda3bf63 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:40:05 +0530 Subject: [PATCH 040/109] fix(core): order trace actions chronologically, not by insertion --- packages/core/src/trace-action-events.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/core/src/trace-action-events.ts b/packages/core/src/trace-action-events.ts index 7cd44eab..29eeb0b2 100644 --- a/packages/core/src/trace-action-events.ts +++ b/packages/core/src/trace-action-events.ts @@ -297,7 +297,18 @@ export function buildActionEvents( snapshotIndex?: FrameSnapshotIndex ): ActionEvent[] { const stream: ActionStream = { events: [], prevEndMs: 0, callCounter: 0 } - for (const cmd of commands) { + // Process in chronological order, not insertion order. Deferred rows (e.g. + // Nightwatch native asserts, finalized in one batch at test-end) are appended + // late but carry their real call-time `startTime`; since pushActionPair floors + // each start at the running prevEndMs, out-of-order input would clamp those + // late rows to the end of the timeline (clustering them after the last real + // command). A stable sort by start time restores true positions and keeps + // equal-time rows in insertion order (each command owns its own before/after + // pair, so pairing is unaffected). + const ordered = [...commands].sort( + (a, b) => (a.startTime ?? a.timestamp) - (b.startTime ?? b.timestamp) + ) + for (const cmd of ordered) { const action = mapCommandToAction(cmd.command) if (!action) { continue From 9bcc6b2ebb55d7ee5900b4380a736343d0a0a51e Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:40:25 +0530 Subject: [PATCH 041/109] fix(core): capture strict-mode node:assert and label asserts from args --- packages/core/src/action-mapping.ts | 12 +++--- packages/core/src/assert-patcher.ts | 44 +++++++++++++++----- packages/core/tests/assert-patcher.test.ts | 22 +++++++++- packages/core/tests/trace-assertions.test.ts | 19 ++++++++- 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/packages/core/src/action-mapping.ts b/packages/core/src/action-mapping.ts index 368ca8e3..eb31c2b2 100644 --- a/packages/core/src/action-mapping.ts +++ b/packages/core/src/action-mapping.ts @@ -46,8 +46,12 @@ function formatAssertValue(value: unknown): string { : text } -// Prefer normalized actual/expected params (nightwatch collapses them into -// the result); fall back to the first two positional args (node:assert order). +// The label mirrors the CALL the user wrote — its positional args +// (`assert.equal(a, b)`, `titleContains('x')`). The normalized actual/expected +// params drive the result diff, NOT the label: a single-arg assert like +// titleContains passes only the expected, so labelling it with the derived +// actual would misrepresent the call. Fall back to actual/expected only when +// no args survived (reader round-trips that dropped them). function formatAssertTitle( action: TraceAction, args: unknown[], @@ -55,9 +59,7 @@ function formatAssertTitle( command?: string ): string { const values = - params && ('actual' in params || 'expected' in params) - ? [params.actual, params.expected] - : args.slice(0, 2) + args.length > 0 ? args.slice(0, 2) : [params?.actual, params?.expected] const label = values .filter((value) => value !== undefined) .map(formatAssertValue) diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index c6b91bf2..c60f21ab 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -200,6 +200,29 @@ export function matcherAssertionToCommandLog( return entry } +/** Wrap every tracked method on one assert namespace object in place; returns + * how many were patched. Used for both `assert.*` and `assert.strict.*`. */ +function patchAssertNamespace( + nsObj: Record<string | symbol, unknown>, + onCommand: (cmd: CapturedAssert) => void +): number { + let count = 0 + for (const methodName of TRACKED_ASSERT_METHODS) { + const original = nsObj[methodName] + if (typeof original !== 'function') { + continue + } + nsObj[methodName] = makePatchedAssertMethod( + methodName, + nsObj, + original as (...a: unknown[]) => unknown, + onCommand + ) + count++ + } + return count +} + /** * Patch `node:assert` so each tracked method emits a `CapturedAssert` to the * supplied hook. Idempotent across calls (guarded by `ASSERT_PATCHED_SYMBOL`). @@ -239,19 +262,20 @@ export function patchNodeAssert( } assertObj[ASSERT_PATCHED_SYMBOL] = true - for (const methodName of TRACKED_ASSERT_METHODS) { - const original = assertObj[methodName] - if (typeof original !== 'function') { - continue - } - assertObj[methodName] = makePatchedAssertMethod( - methodName, - assertObj, - original as (...a: unknown[]) => unknown, + let patched = patchAssertNamespace(assertObj, onCommand) + // `import { strict as assert }` and `assert.strict.*` reference a separate + // object with its own method identities; patch it too so strict-mode + // assertions are captured the same as the default ones. `assert.strict` is a + // callable (strict-mode `assert()`) with the methods hung off it, so it's a + // function, not a plain object. + const strict = assertObj.strict + if (strict && (typeof strict === 'object' || typeof strict === 'function')) { + patched += patchAssertNamespace( + strict as Record<string | symbol, unknown>, onCommand ) } - log('info', `Patched ${TRACKED_ASSERT_METHODS.length} node:assert method(s)`) + log('info', `Patched ${patched} node:assert method(s)`) return true } diff --git a/packages/core/tests/assert-patcher.test.ts b/packages/core/tests/assert-patcher.test.ts index 38bea721..5eda95da 100644 --- a/packages/core/tests/assert-patcher.test.ts +++ b/packages/core/tests/assert-patcher.test.ts @@ -23,17 +23,24 @@ const USER_FRAME = { } const INTERNAL_FRAME = { filePath: undefined, callSource: 'unknown:0' } -// Snapshot real methods once so each test starts from a fresh assert. +// Snapshot real methods once so each test starts from a fresh assert. Both the +// default namespace and `assert.strict` are patched, so restore both. const ASSERT_MUT = assert as unknown as Record<string | symbol, unknown> +const STRICT_MUT = ( + assert as unknown as { strict: Record<string | symbol, unknown> } +).strict const originals: Record<string, unknown> = {} +const strictOriginals: Record<string, unknown> = {} for (const m of TRACKED_ASSERT_METHODS) { originals[m] = ASSERT_MUT[m] + strictOriginals[m] = STRICT_MUT[m] } beforeEach(() => { delete ASSERT_MUT[ASSERT_PATCHED_SYMBOL] for (const m of TRACKED_ASSERT_METHODS) { ASSERT_MUT[m] = originals[m] + STRICT_MUT[m] = strictOriginals[m] } // Default: every assert looks like it came from user code so captures fire. vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) @@ -84,6 +91,19 @@ describe('patchNodeAssert', () => { expect(results).toEqual(['passed', undefined]) // first resolved, second rejected }) + // `import { strict as assert }` (and `assert.strict.*`) reference a separate + // object; without patching it, strict-mode assertions were never captured. + it('captures assertions on the strict namespace too', () => { + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + assert.strict.equal(1, 1) + expect(() => assert.strict.equal(1, 2)).toThrow() + expect(captured.map((c) => [c.command, c.result])).toEqual([ + ['assert.equal', 'passed'], + ['assert.equal', undefined] + ]) + }) + // Only assertions that originate in user test code should reach the trace. // Dependency/framework-internal asserts have no user-code frame on the // stack (getCallSourceFromStack yields 'unknown:0') and must be dropped. diff --git a/packages/core/tests/trace-assertions.test.ts b/packages/core/tests/trace-assertions.test.ts index 0d3d4ccd..d28b8d55 100644 --- a/packages/core/tests/trace-assertions.test.ts +++ b/packages/core/tests/trace-assertions.test.ts @@ -67,7 +67,10 @@ describe('formatActionTitle for asserts', () => { ).toBe('assert.strictEqual("a", "b")') }) - it('prefers normalized actual/expected params over positional args', () => { + it('labels from the call args, not the derived actual/expected', () => { + // textContains('#el', 'foo') passes the selector + expected as args; the + // real "actual" ('bar') lives in params for the result diff and must NOT + // leak into the concise label, which mirrors the call the user wrote. expect( formatActionTitle( action, @@ -75,6 +78,17 @@ describe('formatActionTitle for asserts', () => { { actual: 'bar', expected: 'foo' }, 'verify.textContains' ) + ).toBe('verify.textContains("#el", "foo")') + }) + + it('falls back to actual/expected params only when no args survive', () => { + expect( + formatActionTitle( + action, + [], + { actual: 'bar', expected: 'foo' }, + 'verify.textContains' + ) ).toBe('verify.textContains("bar", "foo")') }) @@ -169,7 +183,8 @@ describe('buildActionEvents with assert commands', () => { expected: 'foo', message: 'nope' }) - expect(before.title).toBe('verify.textContains("bar", "foo")') + // Label mirrors the call args; actual/expected stay in params for the diff. + expect(before.title).toBe('verify.textContains("#el", "foo")') // No Error instance on the entry — the failure comes from the collapsed result. expect(afterOf(events, before.callId)?.error).toEqual({ message: 'nope' }) }) From 2fae5a2b72e2658633b82e99dae95e07057c840f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:40:42 +0530 Subject: [PATCH 042/109] fix(nightwatch): emit native asserts at test-end with real outcomes --- .../src/helpers/browserProxy.ts | 10 +- .../src/helpers/nativeAssertions.ts | 162 ++++++++++++++---- packages/nightwatch-devtools/src/index.ts | 2 + .../nightwatch-devtools/src/trace-context.ts | 6 +- .../tests/nativeAssertions.test.ts | 123 ++++++++----- 5 files changed, 219 insertions(+), 84 deletions(-) diff --git a/packages/nightwatch-devtools/src/helpers/browserProxy.ts b/packages/nightwatch-devtools/src/helpers/browserProxy.ts index dff01a1f..21225506 100644 --- a/packages/nightwatch-devtools/src/helpers/browserProxy.ts +++ b/packages/nightwatch-devtools/src/helpers/browserProxy.ts @@ -134,9 +134,12 @@ export class BrowserProxy { }) } - /** Stream a neutral pending row for an explicit assert/verify call the moment - * it's invoked, and buffer the call (with its emitted row) for `afterEach` - * to finalize pass/fail in place. */ + /** Buffer an explicit assert/verify call at invocation time (prebuilding its + * row with args/callSource/screenshot), but do NOT stream it yet. Nightwatch + * exposes no per-assertion result hook, so streaming here would show every + * assert as a neutral (green) row while the test is still Running — before + * its pass/fail is known. `captureNativeAssertions` emits the rows at test-end + * with real outcomes + execution timing instead. */ private emitPendingAssertion(call: NativeAssertCall): void { const testUid = this.getCurrentTest()?.uid const entry = pendingAssertionCommand( @@ -144,7 +147,6 @@ export class BrowserProxy { testUid, latestResolvedScreenshot(this.sessionCapturer) ) - this.sessionCapturer.captureAssertCommand(entry) call.entry = entry this.nativeAssertCalls.push(call) } diff --git a/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts index 16dd3bd2..1134047d 100644 --- a/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts +++ b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts @@ -1,19 +1,22 @@ // Native-assertion capture: turns explicit `browser.assert.*` / // `browser.verify.*` calls into concise trace/UI action rows with real args, -// a clickable source location, and pass/fail colour — streamed LIVE. +// a clickable source location, and pass/fail colour. // -// Nightwatch exposes no per-assertion hook, and its test-end -// `currentTest.results` carries no source location for PASSING assertions -// (results.assertions[i].stackTrace is '' on pass) and only stringified args. -// So each explicit call is intercepted at CALL TIME -// (BrowserProxy.wrapAssertionNamespaces): a neutral "pending" row is emitted -// immediately (concise title, real args, callSource) so rows stream in one by -// one like normal commands. At TEST END the pass/fail truth + verbose failure -// message are read from results.assertions and the already-emitted row is -// UPDATED IN PLACE (same stable id) — never re-created, so no duplicates. -// Iterating the recorded calls (not results.assertions) also excludes +// Nightwatch exposes no per-assertion hook. Each explicit call is intercepted +// at CALL TIME (BrowserProxy.wrapAssertionNamespaces) and BUFFERED — concise +// title, real args, callSource, the per-test testUid, and the preceding +// screenshot — but NOT streamed, because streaming a neutral row mid-run would +// render every assert green before its outcome is known. At test-end +// `captureNativeAssertions` reads the pass/fail truth + verbose failure message +// from the results bag and emits each row once, positioned on its real +// execution window (the exporter re-sorts by the buffered call timestamp). +// Correlating the recorded calls (not the raw results) also excludes // Nightwatch's implicit command-generated assertions (e.g. // waitForElementVisible's "element was visible" entry). +// +// The plugin `afterEach` fires once per describe-suite (not per `it`), so the +// finalize reads assertions from `results.testcases` (all tests) — see +// gatherResultAssertions. import logger from '@wdio/logger' import { @@ -96,6 +99,39 @@ interface Outcome { message: string } +/** + * All assertion entries for the suite, in declaration order. Nightwatch's + * plugin `afterEach` fires once per describe-suite (not per `it`), so the flat + * `results.assertions` reflects only the last testcase; the full per-test + * breakdown lives in `results.testcases[title].assertions`. Flattening every + * testcase's entries lets each buffered call correlate to its own test's + * outcome (without this, only the last test's asserts get a pass/fail and the + * rest render neutral). Falls back to the flat list for single-test modules or + * older Nightwatch that doesn't populate `testcases`. + */ +function gatherResultAssertions( + results: + | { + assertions?: NwAssertionEntry[] + testcases?: Record<string, { assertions?: unknown[] }> + } + | undefined +): NwAssertionEntry[] { + const testcases = results?.testcases + if (testcases && typeof testcases === 'object') { + const all: NwAssertionEntry[] = [] + for (const tc of Object.values(testcases)) { + if (Array.isArray(tc?.assertions)) { + all.push(...(tc.assertions as NwAssertionEntry[])) + } + } + if (all.length > 0) { + return all + } + } + return Array.isArray(results?.assertions) ? results.assertions : [] +} + /** * Pair each recorded call with its `results.assertions` entry for pass/fail + * verbose message. Both lists are in call/execution order and each explicit @@ -206,8 +242,55 @@ export function pendingAssertionCommand( return entry } -/** Update one streamed pending row in place: apply pass/fail + verbose error, - * a screenshot, and its real execution window, then re-broadcast by stable id. */ +/** Collapsed pass/fail result core's `collapsedAssertResult` reads. */ +interface CollapsedAssertResult { + passed: boolean + expected?: unknown + actual?: unknown + message?: string +} + +/** Nightwatch failure messages end with `… but got: "<actual>"`. Pull out the + * real observed value: Nightwatch passes only the EXPECTED as an arg, so the + * actual lives in the message (and only on failure). Undefined when absent. + * Uses indexOf + slice (no backtracking-prone regex) on the message tail. */ +function parseActualFromMessage(message: string): string | undefined { + const marker = 'but got:' + const idx = message.lastIndexOf(marker) + if (idx === -1) { + return undefined + } + let rest = message.slice(idx + marker.length).trim() + rest = rest.replace(/ \(\d+ms\)$/, '').trim() // drop trailing "(123ms)" + rest = rest.replace(/^["']/, '').replace(/["']$/, '').trim() // strip quotes + return rest || undefined +} + +/** Build the collapsed `{passed, expected, actual?, message}` result core's + * `buildAssertParams` prefers over the positional `[actual, expected]` arg + * convention — which is wrong for Nightwatch, whose asserts pass only the + * expected value (`titleContains('x')`), never the actual. */ +function collapsedAssertResult( + call: NativeAssertCall, + outcome: Outcome +): CollapsedAssertResult { + const result: CollapsedAssertResult = { + passed: outcome.passed, + expected: call.args.length <= 1 ? call.args[0] : call.args, + message: outcome.message + } + const actual = outcome.passed + ? undefined + : parseActualFromMessage(outcome.message) + if (actual !== undefined) { + result.actual = actual + } + return result +} + +/** Emit one assertion row at test-end: apply pass/fail + verbose error, a + * screenshot, and its real execution window, then send it. Rows are NOT + * streamed at call time, so this is the single emit (no neutral pending row). */ function finalizeAssertionRow( capturer: SessionCapturer, call: NativeAssertCall, @@ -229,32 +312,34 @@ function finalizeAssertionRow( }, testUid ) - entry.result = finalized.result + // Collapsed object result (not the plain 'passed' string) so the trace's + // action params show a true actual-vs-expected diff instead of mislabelling + // Nightwatch's single expected-arg as the actual. + entry.result = collapsedAssertResult(call, outcome) entry.error = finalized.error if (!entry.screenshot && screenshot) { entry.screenshot = screenshot } - // Reposition the row on its REAL execution window (Nightwatch enqueues all - // asserts at once, so the emit/enqueue timestamp clustered them). The row is - // matched for replacement by its stable id, so the old enqueue timestamp is - // what the UI still keys on until this swap lands. - const oldTimestamp = entry.timestamp + // Position the row on its REAL execution window (Nightwatch enqueues all + // asserts at once, so the call-time timestamp clustered them). The row was + // never streamed, so send it now — a single emit with the final outcome. if (timing) { entry.startTime = timing.startTime entry.timestamp = timing.endTime > timing.startTime ? timing.endTime : timing.startTime } - capturer.sendReplaceCommand(oldTimestamp, entry) + capturer.captureAssertCommand(entry) log.info(`[assert] ${entry.title} → ${outcome.passed ? 'pass' : 'fail'}`) } /** - * Finalize the streamed pending rows at test-end: correlate the recorded calls - * with `results.assertions`, then UPDATE each row's `entry` in place with - * pass/fail (`result`) + the verbose failure message (`error`, failures only) - * + a screenshot + its real execution window, and re-broadcast via - * `sendReplaceCommand` keyed on the row's stable id. No new rows are created - * (no duplicates); a call with no matching result is left pending (defensive). + * Emit the native assertion rows at test-end: correlate the recorded calls with + * `results.assertions`, then send each row with pass/fail (`result`) + the + * verbose failure message (`error`, failures only) + a screenshot + its real + * execution window. Rows are buffered (not streamed) at call time — Nightwatch + * has no per-assertion result hook, so streaming them during the run would show + * every assert as a neutral (green) row before its outcome is known. A call with + * no matching result is skipped (defensive). */ export async function captureNativeAssertions( capturer: SessionCapturer, @@ -269,11 +354,13 @@ export async function captureNativeAssertions( // Boundary cast: `results` is Nightwatch's loosely-typed per-test bag; we read // only the assertions + commands arrays whose shapes are documented above. const results = currentTest?.results as - | { assertions?: NwAssertionEntry[]; commands?: NwCommandEntry[] } + | { + assertions?: NwAssertionEntry[] + commands?: NwCommandEntry[] + testcases?: Record<string, { assertions?: unknown[] }> + } | undefined - const assertions = Array.isArray(results?.assertions) - ? results.assertions - : [] + const assertions = gatherResultAssertions(results) const outcomes = correlate(calls, assertions) const timings = assertCommandTimings( Array.isArray(results?.commands) ? results.commands : [], @@ -283,9 +370,11 @@ export async function captureNativeAssertions( const screenshot = await resolveAssertionScreenshot(capturer, browser) calls.forEach((call, index) => { + if (!call.entry) { + return + } const outcome = outcomes[index] - // Leave an unmatched (or never-emitted) row in its last state. - if (call.entry && outcome) { + if (outcome) { finalizeAssertionRow( capturer, call, @@ -294,6 +383,15 @@ export async function captureNativeAssertions( screenshot, testUid ) + return + } + // No execution outcome correlated to this call (defensive): emit the + // buffered row in its neutral state so the assertion still appears — never + // dropped, never mis-coloured as passed/failed. Rows are only buffered at + // call time, so without this an uncorrelated assert would vanish. + if (!call.entry.screenshot && screenshot) { + call.entry.screenshot = screenshot } + capturer.captureAssertCommand(call.entry) }) } diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index db5cefc0..53b1a3dd 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -589,6 +589,8 @@ class NightwatchDevToolsPlugin { ranges: this.#specRanges, flushed: this.#flushedSpecs, configPath: this.#configPath, + testFilePath: + this.browserProxy?.getCurrentTestFullPath?.() ?? undefined, log: (level, msg) => log[level](msg) }, sessionId diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts index 1e451ac7..359737b9 100644 --- a/packages/nightwatch-devtools/src/trace-context.ts +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -31,6 +31,7 @@ export interface TraceContextInput { ranges: SpecRange[] flushed: Set<string> configPath: string | undefined + testFilePath: string | undefined log: (level: 'info' | 'warn', msg: string) => void } @@ -50,7 +51,10 @@ export function buildTraceContext( ranges: input.ranges, flushed: input.flushed, resolveOutputDir: () => - resolveAdapterOutputDir({ configPath: input.configPath }), + resolveAdapterOutputDir({ + testFilePath: input.testFilePath, + configPath: input.configPath + }), awaitPending: input.capturer.snapshotCaptures, // Nightwatch feeds real per-test attempt numbers via TestAttemptTracker // (B4), so retry-aware policies use per-test attempts, not the fallback. diff --git a/packages/nightwatch-devtools/tests/nativeAssertions.test.ts b/packages/nightwatch-devtools/tests/nativeAssertions.test.ts index d904dbde..352875f2 100644 --- a/packages/nightwatch-devtools/tests/nativeAssertions.test.ts +++ b/packages/nightwatch-devtools/tests/nativeAssertions.test.ts @@ -56,21 +56,20 @@ function makeFakeCapturer( const browser = {} as unknown as NightwatchBrowser -/** Mimic BrowserProxy.emitPendingAssertion: stream a neutral pending row at - * call time and attach it to the call for later finalization. */ +/** Mimic BrowserProxy.emitPendingAssertion: build the row and buffer it on the + * call, but do NOT stream it — rows are emitted at test-end by + * captureNativeAssertions once their pass/fail is known. */ function emitPending( capturer: SessionCapturer, calls: NativeAssertCall[], testUid: string | undefined ) { for (const call of calls) { - const entry = pendingAssertionCommand( + call.entry = pendingAssertionCommand( call, testUid, latestResolvedScreenshot(capturer) ) - capturer.captureAssertCommand(entry) - call.entry = entry } } @@ -104,8 +103,8 @@ function call( return { prefix, method, args, callSource, timestamp: clock++ } } -describe('captureNativeAssertions (live pending → finalize)', () => { - it('streams neutral pending rows at call time, then finalizes pass/fail in place with a stable id and no duplicates', async () => { +describe('captureNativeAssertions (buffer → finalize at test-end)', () => { + it('buffers rows at call time (nothing streamed), then emits pass/fail once at test-end with no duplicates', async () => { // Preceding real commands: the last with a resolved screenshot is the DOM // the assertions evaluated against — reused for the pending rows. const precedingCommands: CommandLog[] = [ @@ -120,7 +119,6 @@ describe('captureNativeAssertions (live pending → finalize)', () => { const { capturer, sent, - replaced, commandsLog, captureAssertCommand, sendReplaceCommand, @@ -133,23 +131,23 @@ describe('captureNativeAssertions (live pending → finalize)', () => { call('assert', 'titleContains', ['HARD_FAIL_ME'], 'spec.js:16') ] - // 1) CALL TIME: each call streams one neutral pending row. + // 1) CALL TIME: rows are buffered, NOT streamed — nothing is sent, so no + // assert shows as a neutral (green) row before its outcome is known. emitPending(capturer, calls, 'test-uid') - expect(captureAssertCommand).toHaveBeenCalledTimes(4) - expect(sent).toHaveLength(4) - for (const row of sent) { + expect(captureAssertCommand).not.toHaveBeenCalled() + expect(sent).toHaveLength(0) + const buffered = calls.map((c) => c.entry!) + for (const row of buffered) { expect(row.result).toBeUndefined() // neutral — not green expect(row.error).toBeUndefined() // neutral — not red expect(row.testUid).toBe('test-uid') expect(row.screenshot).toBe('BODY_SHOT') // reused preceding DOM - expect(typeof (row as { id?: number }).id).toBe('number') } - expect(sent[0].title).toBe("verify.titleContains('Example')") - expect(sent[0].command).toBe('verify.titleContains') - expect(sent[0].args).toEqual(['Example']) - expect(sent[0].callSource).toBe('spec.js:11') - expect(sent[0].timestamp).toBe(sent[0].startTime) - const pendingIds = sent.map((r) => (r as { id?: number }).id) + expect(buffered[0].title).toBe("verify.titleContains('Example')") + expect(buffered[0].command).toBe('verify.titleContains') + expect(buffered[0].args).toEqual(['Example']) + expect(buffered[0].callSource).toBe('spec.js:11') + expect(buffered[0].timestamp).toBe(buffered[0].startTime) // 2) TEST END: results.assertions includes the implicit waitForElementVisible // assertion (first entry) which must NOT create/finalize a row. @@ -168,46 +166,45 @@ describe('captureNativeAssertions (live pending → finalize)', () => { calls ) - // Each row updated exactly once, in place — no new rows, no duplicates. + // Rows emitted exactly once at test-end — no call-time stream, no replace. expect(captureAssertCommand).toHaveBeenCalledTimes(4) - expect(sendReplaceCommand).toHaveBeenCalledTimes(4) + expect(sendReplaceCommand).not.toHaveBeenCalled() + expect(sent).toHaveLength(4) expect(commandsLog).toHaveLength(2 + 4) expect(takeScreenshotViaHttp).not.toHaveBeenCalled() - // Same row objects, same stable ids (updated, not recreated). const finalized = calls.map((c) => c.entry!) - expect(finalized.map((r) => (r as { id?: number }).id)).toEqual(pendingIds) - // Pass/fail applied; failures carry the verbose message as error. - expect(finalized[0].result).toBe('passed') + // Pass/fail applied as a collapsed { passed, expected, actual? } result; + // failures also carry the verbose message as error. + expect(finalized[0].result).toMatchObject({ passed: true }) expect(finalized[0].error).toBeUndefined() - expect(finalized[1].result).toBeUndefined() + expect(finalized[1].result).toMatchObject({ passed: false }) expect((finalized[1].error as { message: string }).message).toContain( 'SOFT_FAIL_ME' ) - expect(finalized[2].result).toBe('passed') // duplicate 'Example' → 2nd entry + expect(finalized[2].result).toMatchObject({ passed: true }) // 2nd 'Example' expect(finalized[3].error).toBeDefined() // Labels/args/callSource preserved from the pending row. expect(finalized[3].title).toBe("assert.titleContains('HARD_FAIL_ME')") expect(finalized[3].callSource).toBe('spec.js:16') - // With no results.commands timing, rows keep their enqueue timestamp, so - // the replace is keyed on that same timestamp. - replaced.forEach(({ oldTimestamp, command }) => { - expect(oldTimestamp).toBe(command.timestamp) + // With no results.commands timing, rows keep their call-time timestamp. + finalized.forEach((row) => { + expect(row.timestamp).toBe(row.startTime) }) }) it('repositions each row on its real execution window from results.commands (not enqueue time)', async () => { - const { capturer, sent, replaced } = makeFakeCapturer() + const { capturer, sent } = makeFakeCapturer() const calls = [ call('verify', 'titleContains', ['Example']), call('assert', 'titleContains', ['SOFT_FAIL_ME']) ] emitPending(capturer, calls, 'uid') - // Both enqueued ~together (clock++), clustered. - const enqueue = sent.map((r) => r.timestamp) + // Buffered ~together (clock++), clustered at call time — nothing sent yet. + expect(sent).toHaveLength(0) // Nightwatch ran them ~29ms apart; results.commands carries the real window. const assertions = [ @@ -234,10 +231,10 @@ describe('captureNativeAssertions (live pending → finalize)', () => { expect(finalized[1].startTime).toBe(6100) expect(finalized[1].timestamp).toBe(6132) expect(finalized[1].timestamp - finalized[0].timestamp).toBeGreaterThan(50) - // The replace is keyed on the ORIGINAL enqueue timestamp (stable id also - // matches), while the row now carries its real execution timestamp. - expect(replaced[0].oldTimestamp).toBe(enqueue[0]) - expect(replaced[0].command.timestamp).toBe(6029) + // Rows are sent (not replaced) at test-end, each carrying its real window. + expect(sent).toHaveLength(2) + expect(sent[0].timestamp).toBe(6029) + expect(sent[1].timestamp).toBe(6132) }) it('finalizes with a fresh screenshot when no preceding one has resolved yet', async () => { @@ -246,13 +243,13 @@ describe('captureNativeAssertions (live pending → finalize)', () => { const pending: CommandLog[] = [ { command: 'waitForElementVisible', args: ['body'], timestamp: 2 } ] - const { capturer, sent, takeScreenshotViaHttp } = makeFakeCapturer( + const { capturer, takeScreenshotViaHttp } = makeFakeCapturer( pending, 'FRESH_SHOT' ) const calls = [call('verify', 'titleContains', ['Example'])] emitPending(capturer, calls, 'uid') - expect(sent[0].screenshot).toBeUndefined() + expect(calls[0].entry!.screenshot).toBeUndefined() await captureNativeAssertions( capturer, @@ -265,15 +262,15 @@ describe('captureNativeAssertions (live pending → finalize)', () => { ) expect(takeScreenshotViaHttp).toHaveBeenCalledTimes(1) expect(calls[0].entry!.screenshot).toBe('FRESH_SHOT') - expect(calls[0].entry!.result).toBe('passed') + expect(calls[0].entry!.result).toMatchObject({ passed: true }) }) it('preserves real multi-arg assertions (no faked args)', async () => { - const { capturer, sent, replaced } = makeFakeCapturer() + const { capturer, sent } = makeFakeCapturer() const calls = [call('assert', 'containsText', ['#btn', 'Save'])] emitPending(capturer, calls, 'uid') - expect(sent[0].args).toEqual(['#btn', 'Save']) - expect(sent[0].title).toBe("assert.containsText('#btn', 'Save')") + expect(calls[0].entry!.args).toEqual(['#btn', 'Save']) + expect(calls[0].entry!.title).toBe("assert.containsText('#btn', 'Save')") await captureNativeAssertions( capturer, @@ -284,17 +281,17 @@ describe('captureNativeAssertions (live pending → finalize)', () => { 'uid', calls ) - expect(replaced).toHaveLength(1) + expect(sent).toHaveLength(1) expect(calls[0].entry!.error).toBeDefined() }) it('falls back to positional correlation when args are not literals', async () => { - const { capturer, sent } = makeFakeCapturer() + const { capturer } = makeFakeCapturer() // Element-object arg won't substring-match; positional order still pairs // the single call with the single explicit assertion outcome. const calls = [call('assert', 'elementPresent', [{ selector: 'body' }])] emitPending(capturer, calls, 'uid') - expect(sent[0].title).toBe('assert.elementPresent(…)') + expect(calls[0].entry!.title).toBe('assert.elementPresent(…)') await captureNativeAssertions( capturer, @@ -324,6 +321,38 @@ describe('captureNativeAssertions (live pending → finalize)', () => { expect(calls[0].entry!.error).toBeUndefined() }) + it('surfaces a real actual-vs-expected from the failure message (not the expected-only arg)', async () => { + const { capturer, sent } = makeFakeCapturer() + const calls = [call('assert', 'titleContains', ['This Is Not The Title'])] + emitPending(capturer, calls, 'uid') + + await captureNativeAssertions( + capturer, + browser, + currentTestWith([ + failing( + "Testing if the page title contains 'This Is Not The Title' in " + + '5000ms - expected "contains \'This Is Not The Title\'" but got: ' + + '"Example Domain"' + ) + ]), + 'uid', + calls + ) + + // Nightwatch passes only the EXPECTED as an arg; the real actual lives in + // the "but got: …" clause of the message. The collapsed result must carry + // the true diff, not mislabel the expected arg as the actual. + const result = sent[0].result as { + passed: boolean + expected: unknown + actual: unknown + } + expect(result.passed).toBe(false) + expect(result.expected).toBe('This Is Not The Title') + expect(result.actual).toBe('Example Domain') + }) + it('is a no-op when there are no recorded calls (implicit assertions ignored)', async () => { const { capturer, sendReplaceCommand, takeScreenshotViaHttp } = makeFakeCapturer() From f6fa93c4e74e9c165bb3a4341768ae7c302d4192 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:40:57 +0530 Subject: [PATCH 043/109] fix(service): keep expect matchers to a single row --- packages/service/src/index.ts | 58 +++++++++++++++++++--------- packages/service/tests/index.test.ts | 52 +++++++++++++++++++------ 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 5a266694..064be3a4 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -110,6 +110,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { * matching Playwright and the Nightwatch native-assert behaviour. */ #assertionDepth = 0 + /** True once the current matcher has issued an internal command whose stack + * shows an expect-webdriverio frame. Gates the stuck-depth self-heal: the + * matcher's FIRST internal command (an element re-lookup) traces to the + * user's expect() line but its sync stack has no matcher frame yet, which + * would otherwise be misread as "matcher ended" and reset the depth mid-run + * — capturing every later matcher command as a duplicate row. */ + #matcherStarted = false + /** Matcher start timestamps (stack, paired with #assertionDepth) so a captured * assertion spans [matcher start → end] — its poll duration — instead of * collapsing to a zero-width point at completion, which left the screencast @@ -481,6 +489,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#assertionCallSources = [] } this.#assertionDepth++ + this.#matcherStarted = false this.#assertionStartTimes.push(Date.now()) // Capture the user's expect() call site now — see #assertionCallSources. this.#assertionCallSources.push( @@ -497,6 +506,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (this.#assertionDepth > 0) { this.#assertionDepth-- } + this.#matcherStarted = false if (this.#options.captureAssertions === false) { return } @@ -563,6 +573,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { private resetStack() { this.#commandStack = [] this.#assertionDepth = 0 + this.#matcherStarted = false this.#assertionStartTimes = [] this.#assertionCallSources = [] this.#sessionCapturer.resetLastSelector() @@ -586,6 +597,30 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } + /** Maintain the expect-matcher suppression window for an incoming command. + * `inMatcher` marks the matcher as started (so its trailing internal + * commands stay suppressed); otherwise self-heal a depth left stuck by a + * matcher that hard-threw (skipping afterAssertion) — but only once the + * matcher has actually started, so its own leading element re-lookup (no + * matcher frame on the sync stack yet) can't reset the depth mid-run. */ + #trackAssertionWindow(inMatcher: boolean, hasSource: boolean): void { + if (inMatcher) { + this.#matcherStarted = true + return + } + if ( + hasSource && + this.#commandStack.length === 0 && + this.#assertionDepth > 0 && + this.#matcherStarted + ) { + this.#assertionDepth = 0 + this.#assertionStartTimes = [] + this.#assertionCallSources = [] + this.#matcherStarted = false + } + } + async beforeCommand(command: string, args: string[]) { if (!this.#browser) { return @@ -606,25 +641,10 @@ export default class DevToolsHookService implements Services.ServiceInstance { Error.stackTraceLimit = 20 const stack = parse(new Error('')).reverse() const source = stack.find((frame) => isUserSpecFile(frame.getFileName())) - // #assertionDepth > 0 → we believe we're inside an expect matcher; its - // internal commands trace back to the user's expect() line but must not - // become their own rows (only the expect.<matcher> assertion should). - // expect-webdriverio doesn't wrap afterAssertion in try/finally, though, so - // a matcher whose internal command hard-throws skips it and leaves the depth - // stuck ≥1 — which would then suppress every later user command. When a - // top-level user command arrives with the depth stuck but no live - // expect-webdriverio frame on the stack, the matcher already ended: self-heal - // the leftover depth + parallel stacks so this command captures normally. - if (source && this.#commandStack.length === 0 && this.#assertionDepth > 0) { - const inMatcher = stack.some((frame) => - frame.getFileName()?.includes('expect-webdriverio') - ) - if (!inMatcher) { - this.#assertionDepth = 0 - this.#assertionStartTimes = [] - this.#assertionCallSources = [] - } - } + const inMatcher = + this.#assertionDepth > 0 && + stack.some((frame) => frame.getFileName()?.includes('expect-webdriverio')) + this.#trackAssertionWindow(inMatcher, Boolean(source)) if ( source && this.#commandStack.length === 0 && diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index 1809fa6c..a4f4a229 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -2,14 +2,26 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as DevtoolsCore from '@wdio/devtools-core' import DevToolsHookService from '../src/index.js' -const fakeFrame = { - getFileName: () => '/test/specs/fake.spec.ts', - getLineNumber: () => 1, - getColumnNumber: () => 1 -} +// Controllable stack: `frames` defaults to a single user-spec frame (commands +// read as top-level). A test can splice in `matcherFrame` to simulate a command +// issued from inside an expect-webdriverio matcher. +const stackMock = vi.hoisted(() => { + const userFrame = { + getFileName: () => '/test/specs/fake.spec.ts', + getLineNumber: () => 1, + getColumnNumber: () => 1 + } + const matcherFrame = { + getFileName: () => + '/node_modules/expect-webdriverio/lib/matchers/toHaveText.js', + getLineNumber: () => 1, + getColumnNumber: () => 1 + } + return { frames: [userFrame], userFrame, matcherFrame } +}) // Create mock instance that will be returned by SessionCapturer constructor vi.mock('stack-trace', () => ({ - parse: () => [fakeFrame] + parse: () => stackMock.frames })) const mockSessionCapturerInstance = { afterCommand: vi.fn(), @@ -305,6 +317,7 @@ describe('DevtoolsService - assertion suppression self-heal', () => { beforeEach(async () => { vi.clearAllMocks() + stackMock.frames = [stackMock.userFrame] service = new DevToolsHookService() await service.before({} as any, [], mockBrowser) vi.clearAllMocks() @@ -314,18 +327,33 @@ describe('DevtoolsService - assertion suppression self-heal', () => { // whose internal command hard-throws runs beforeAssertion but skips // afterAssertion, leaving #assertionDepth stuck ≥ 1. Without the self-heal // that stuck depth suppresses every later user command in the test. - it('captures a top-level command after a matcher throw left the assertion depth stuck', async () => { - service.beforeAssertion() - service.beforeAssertion() // depth now 2, no matching afterAssertion - - // The mocked stack is a user-spec frame with no expect-webdriverio frame, - // so the command is recognised as top-level and the leftover depth resets. + it('captures a top-level command after a matcher that started then threw left the assertion depth stuck', async () => { + service.beforeAssertion() // depth 1 + // The matcher issues an internal command (stack shows an expect-webdriverio + // frame) → marks the matcher started, then hard-throws (afterAssertion + // skipped), leaving the depth stuck. + stackMock.frames = [stackMock.userFrame, stackMock.matcherFrame] + service.beforeCommand('getText' as any, ['#el']) + // A later top-level user command with no matcher frame self-heals the depth. + stackMock.frames = [stackMock.userFrame] service.beforeCommand('click' as any, ['.button']) await service.afterCommand('click' as any, ['.button'], undefined) expect(capturedCommands()).toEqual(['click']) }) + it('keeps suppressing the matcher’s own leading command (no premature self-heal)', async () => { + service.beforeAssertion() // depth 1 + // The matcher's FIRST internal command is an element re-lookup whose sync + // stack has no expect-webdriverio frame yet. It must NOT reset the depth — + // otherwise the subsequent matcher commands would surface as duplicate rows. + stackMock.frames = [stackMock.userFrame] + service.beforeCommand('$' as any, ['#el']) + await service.afterCommand('$' as any, ['#el'], undefined) + + expect(capturedCommands()).toEqual([]) + }) + it('a fresh beforeAssertion resets a stuck depth so the window stays balanced', async () => { service.beforeAssertion() service.beforeAssertion() // leftover depth from a prior throw From e71ef02e4eed6c64f5c5b6b266a8ed8c838f12ee Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:41:16 +0530 Subject: [PATCH 044/109] fix(app): render assertions consistently across frameworks --- .../app/src/components/browser/snapshot.ts | 22 ++++++- .../workbench/actionItems/category.ts | 9 ++- .../workbench/actionItems/command.ts | 25 +++++++- .../components/workbench/compare/markers.ts | 8 +++ .../workbench/compare/renderDetailBlock.ts | 60 +++++++++++++++---- .../app/src/components/workbench/errors.ts | 19 ++++-- .../components/workbench/errors/collect.ts | 22 ++++++- 7 files changed, 138 insertions(+), 27 deletions(-) diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index ce9ae709..9fe5f7b4 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -249,7 +249,7 @@ export class DevtoolsBrowser extends Element { } async #renderCommandScreenshot(command?: CommandLog) { - this.#screenshotData = command?.screenshot ?? null + this.#screenshotData = this.#screenshotForCommand(command) // Follow the selected command's page in the address bar — commands carry no // URL, so resolve it from the navigation active at the command's time. if (command) { @@ -466,6 +466,26 @@ export class DevtoolsBrowser extends Element { this.requestUpdate() } + /** Screenshot for the selected command. Assertions (and other snapshot-less + * commands) carry none, so fall back to the nearest PRECEDING command's frame + * — the page state the assertion observed — instead of a blank preview. */ + #screenshotForCommand(command?: CommandLog): string | null { + if (!command) { + return null + } + if (command.screenshot) { + return command.screenshot + } + const cmds = this.commands ?? [] + const idx = cmds.indexOf(command) + for (let i = (idx === -1 ? cmds.length : idx) - 1; i >= 0; i--) { + if (cmds[i].screenshot) { + return cmds[i].screenshot! + } + } + return null + } + /** Latest screenshot from any command — auto-updates the preview as tests run. */ get #latestAutoScreenshot(): string | null { if (!this.commands?.length) { diff --git a/packages/app/src/components/workbench/actionItems/category.ts b/packages/app/src/components/workbench/actionItems/category.ts index e40861a8..28b25db9 100644 --- a/packages/app/src/components/workbench/actionItems/category.ts +++ b/packages/app/src/components/workbench/actionItems/category.ts @@ -78,6 +78,11 @@ const QUERY = new Set([ 'findElements' ]) +/** assert.* (node:assert), expect.* (expect-webdriverio), verify.* (Nightwatch) + * — assertion rows across every framework, so they get the check icon + green + * like the WDIO state matchers above instead of the generic fallback. */ +const ASSERTION_PREFIX_RE = /^(?:assert|expect|verify)\./ + /** Group a command by intent so the timeline can colour it consistently. */ export function commandCategory(command: string): ActionCategory { if (NAVIGATION.has(command)) { @@ -86,7 +91,7 @@ export function commandCategory(command: string): ActionCategory { if (INPUT.has(command)) { return 'input' } - if (ASSERTION.has(command)) { + if (ASSERTION.has(command) || ASSERTION_PREFIX_RE.test(command)) { return 'assertion' } if (QUERY.has(command)) { @@ -133,7 +138,7 @@ export function commandIcon(command: string): ActionIcon { if (INPUT.has(command)) { return 'click' } - if (ASSERTION.has(command)) { + if (ASSERTION.has(command) || ASSERTION_PREFIX_RE.test(command)) { return 'assert' } if (QUERY.has(command)) { diff --git a/packages/app/src/components/workbench/actionItems/command.ts b/packages/app/src/components/workbench/actionItems/command.ts index 1a596f56..02631b0d 100644 --- a/packages/app/src/components/workbench/actionItems/command.ts +++ b/packages/app/src/components/workbench/actionItems/command.ts @@ -15,11 +15,20 @@ import '~icons/mdi/target.js' import '~icons/mdi/keyboard-outline.js' import '~icons/mdi/cursor-default-click-outline.js' import '~icons/mdi/check-circle-outline.js' +import '~icons/mdi/close-circle-outline.js' import '~icons/mdi/text.js' import '~icons/mdi/code-tags.js' const SOURCE_COMPONENT = 'wdio-devtools-command-item' +function capitalizeAssertLabel(label: string): string { + return label.replace( + /^(assert|expect|verify)\./, + (_m, prefix: string) => + prefix.charAt(0).toUpperCase() + prefix.slice(1) + '.' + ) +} + const CATEGORY_COLOR: Record<ActionCategory, string> = { navigation: 'text-chartsBlue', input: 'text-chartsPurple', @@ -48,8 +57,18 @@ export class CommandItem extends ActionItem { } #renderIcon(command: string): TemplateResult { - const cls = `${ICON_CLASS} ${CATEGORY_COLOR[commandCategory(command)]}` - switch (commandIcon(command)) { + // Failed commands render red (matching the label); a failed assertion also + // swaps its green ✓-circle for a red ✗-circle so it never reads as passed. + const cls = `${ICON_CLASS} ${ + this.failed ? 'text-chartsRed' : CATEGORY_COLOR[commandCategory(command)] + }` + const icon = commandIcon(command) + if (this.failed && icon === 'assert') { + return html`<icon-mdi-close-circle-outline + class="${cls}" + ></icon-mdi-close-circle-outline>` + } + switch (icon) { case 'navigate': return html`<icon-mdi-arrow-top-right class="${cls}" @@ -93,7 +112,7 @@ export class CommandItem extends ActionItem { class="text-[12.5px] flex-wrap text-left break-all ${this.failed ? 'text-chartsRed' : ''}" - >${entry.title ?? entry.command}</code + >${capitalizeAssertLabel(entry.title ?? entry.command)}</code > ${this.renderTime()} </button> diff --git a/packages/app/src/components/workbench/compare/markers.ts b/packages/app/src/components/workbench/compare/markers.ts index ccec430b..18945b4f 100644 --- a/packages/app/src/components/workbench/compare/markers.ts +++ b/packages/app/src/components/workbench/compare/markers.ts @@ -75,6 +75,14 @@ function renderStatusMarker( >✗ in failed step</span >` } + // A command that itself errored is a failure even when its step state didn't + // resolve — e.g. the rerun/latest side, whose live step state isn't tracked + // the way the baseline's PreservedStep is. Without this it shows a green ✓. + if (cmd.error?.message) { + return html`<span class="marker error" title="Failed: ${cmd.error.message}" + >✗ failed</span + >` + } if (step?.state === 'passed') { return html`<span class="marker ok" diff --git a/packages/app/src/components/workbench/compare/renderDetailBlock.ts b/packages/app/src/components/workbench/compare/renderDetailBlock.ts index 1c4c03ed..81dfcd80 100644 --- a/packages/app/src/components/workbench/compare/renderDetailBlock.ts +++ b/packages/app/src/components/workbench/compare/renderDetailBlock.ts @@ -10,9 +10,35 @@ import type { PreservedAttempt, PreservedStep } from '@wdio/devtools-shared' -import { safeJson } from './compareUtils.js' +import { cleanErrorMessage, safeJson } from './compareUtils.js' import { computeDetailBlockData } from './stepResolution.js' +/** Assertion commands carry `[actual, expected]` in args (mirrors the Errors + * tab). Surfacing those instead of the raw node:assert message keeps the + * detail free of the "+ actual - expected" diff noise + ANSI. */ +const ASSERTION_CMD_RE = /^(?:assert|expect|verify)\./ + +function assertionArgs( + cmd: CommandLog +): { actual: unknown; expected: unknown } | undefined { + if (!ASSERTION_CMD_RE.test(cmd.command)) { + return undefined + } + // Prefer a collapsed { actual, expected } result (Nightwatch native asserts) + // over positional args, which mislabel a single expected-only arg as actual. + const result = cmd.result + if (result && typeof result === 'object') { + const r = result as { actual?: unknown; expected?: unknown } + if ('actual' in r || 'expected' in r) { + return { actual: r.actual, expected: r.expected } + } + } + if ((cmd.args?.length ?? 0) < 2) { + return undefined + } + return { actual: cmd.args![0], expected: cmd.args![1] } +} + /** Hooks the detail-block renderers need to reach component state. */ export interface DetailBlockCtx { baseline: PreservedAttempt | undefined @@ -102,22 +128,32 @@ export function renderDetailBlock( ctx.findStepFor(cmd, side), allCmdsThisSide ) + const assertVals = assertionArgs(cmd) return html` <div class="detail-block"> <h4>${label} · ${cmd.command}</h4> ${renderDetailStepBanner(data.step, data.stepText)} <pre>args: ${data.argsStr}</pre> - ${cmd.error - ? html`<pre style="color:var(--vscode-charts-red,#f48771);"> -error: ${cmd.error.message || String(cmd.error)}</pre - >` - : html`<pre>result: ${data.resultStr}</pre>`} - ${renderExpectedActualAssertion( - data.expected, - data.actual, - data.assertionMessage, - data.fallbackExpected - )} + ${assertVals + ? renderExpectedActualAssertion( + assertVals.expected, + assertVals.actual, + undefined, + undefined + ) + : html` + ${cmd.error + ? html`<pre style="color:var(--vscode-charts-red,#f48771);"> +error: ${cleanErrorMessage(cmd.error.message || String(cmd.error))}</pre + >` + : html`<pre>result: ${data.resultStr}</pre>`} + ${renderExpectedActualAssertion( + data.expected, + data.actual, + data.assertionMessage, + data.fallbackExpected + )} + `} ${cmd.screenshot ? html`<img src="${cmd.screenshot.startsWith('data:') diff --git a/packages/app/src/components/workbench/errors.ts b/packages/app/src/components/workbench/errors.ts index f4470005..ef497850 100644 --- a/packages/app/src/components/workbench/errors.ts +++ b/packages/app/src/components/workbench/errors.ts @@ -16,6 +16,11 @@ function shortSource(callSource: string): string { return callSource.split(/[\\/]/).slice(-3).join('/') } +/** Show assertion values readably: quote strings, stringify everything else. */ +function fmtValue(value: unknown): string { + return typeof value === 'string' ? `'${value}'` : String(value) +} + @customElement(COMPONENT) export class DevtoolsErrors extends Element { @consume({ context: commandContext, subscribe: true }) @@ -155,13 +160,13 @@ export class DevtoolsErrors extends Element { return nothing } return html`<div class="error-diff"> + ${error.actual !== undefined + ? html`<span class="label">Actual</span + ><span class="received">${fmtValue(error.actual)}</span>` + : nothing} ${error.expected !== undefined ? html`<span class="label">Expected</span - ><span class="expected">${error.expected}</span>` - : nothing} - ${error.actual !== undefined - ? html`<span class="label">Received</span - ><span class="received">${error.actual}</span>` + ><span class="expected">${fmtValue(error.expected)}</span>` : nothing} </div>` } @@ -178,7 +183,9 @@ export class DevtoolsErrors extends Element { @${shortSource(error.callSource)} </button>` : nothing} - <div class="error-title">${error.message}</div> + ${error.expected === undefined && error.actual === undefined + ? html`<div class="error-title">${error.message}</div>` + : nothing} ${this.#renderDiff(error)} ${error.stack ? html`<details class="error-stack"> diff --git a/packages/app/src/components/workbench/errors/collect.ts b/packages/app/src/components/workbench/errors/collect.ts index ca7429e1..f28d8065 100644 --- a/packages/app/src/components/workbench/errors/collect.ts +++ b/packages/app/src/components/workbench/errors/collect.ts @@ -50,13 +50,29 @@ function displayValue(value: unknown): string | undefined { } } -/** Assertion commands carry `[actual, expected]` in args (see the exporter's - * Assert params + synthesizeExpectFailure). */ +/** Actual/expected for an assertion row. Prefer a collapsed `{actual, expected}` + * result (Nightwatch native asserts, and any framework that surfaces a + * structured result) over the positional `[actual, expected]` arg convention — + * the latter is wrong for asserts that pass only an expected value + * (`titleContains('x')`), which would mislabel the expected as the actual. */ function assertionValues(command: CommandLog): { actual?: string expected?: string } { - if (!ASSERTION_COMMAND_RE.test(command.command) || command.args.length < 2) { + if (!ASSERTION_COMMAND_RE.test(command.command)) { + return {} + } + const result = command.result + if (result && typeof result === 'object') { + const r = result as { actual?: unknown; expected?: unknown } + if ('actual' in r || 'expected' in r) { + return { + actual: displayValue(r.actual), + expected: displayValue(r.expected) + } + } + } + if (command.args.length < 2) { return {} } return { From ee88a9ac3fa11f7c4d1a6e2934a3268fc1947d42 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:41:31 +0530 Subject: [PATCH 045/109] fix(backend): escape test names in grep-style rerun filters --- packages/backend/src/runner.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/runner.ts b/packages/backend/src/runner.ts index da1104b5..95b3a14f 100644 --- a/packages/backend/src/runner.ts +++ b/packages/backend/src/runner.ts @@ -40,6 +40,14 @@ function stripNameTestNameSlot(template: string): string { return template.slice(0, leftEdge) + template.slice(idx + NAME_SLOT.length) } +// Grep-style rerun filters (mocha --grep, jest/vitest -t, cucumber --name) treat +// the value as a REGEX, so a test name containing (), [], ., etc. matches +// nothing unless escaped. The slot is double-quoted in the template, so the +// added backslashes survive shell parsing and reach the runner as literals. +function escapeRerunName(name: string): string { + return name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') +} + class TestRunner { #child?: ChildProcess #lastPayload?: RunnerRequestBody @@ -203,7 +211,7 @@ class TestRunner { return `${stripped} ${shellQuote([featureSpec])}` } const name = payload.label || payload.fullTitle || '' - return template.replace(/\{\{testName\}\}/g, name) + return template.replace(/\{\{testName\}\}/g, escapeRerunName(name)) } #parseGenericCommand(command: string): { file: string; args: string[] } { From 15bc580dfdacc767db4f922dde14162f43cea265 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:41:45 +0530 Subject: [PATCH 046/109] fix(selenium): read snapshot state via unpatched driver; forward tracePolicy --- .../selenium-devtools/src/action-snapshot.ts | 30 +++++++++++-------- .../selenium-devtools/src/driverPatcher.ts | 10 +++++++ packages/selenium-devtools/src/index.ts | 5 ++++ packages/selenium-devtools/src/types.ts | 2 ++ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/packages/selenium-devtools/src/action-snapshot.ts b/packages/selenium-devtools/src/action-snapshot.ts index 7644ae1d..83a81d3e 100644 --- a/packages/selenium-devtools/src/action-snapshot.ts +++ b/packages/selenium-devtools/src/action-snapshot.ts @@ -1,33 +1,37 @@ // Selenium adapter: wires SeleniumDriverLike into core's captureActionSnapshot. +// URL/title/screenshot/script are read through the UNPATCHED driver originals +// (getDriverOriginals) so the snapshot's own reads don't record as commands. +// getCurrentUrl/getTitle map to page.* actions, so capturing them would make +// every snapshot trigger another snapshot — a feedback loop that bloats the +// trace (observed: thousands of getUrl/getTitle actions in one run). import { captureActionSnapshot as coreCapture } from '@wdio/devtools-core' import type { ActionSnapshot } from '@wdio/devtools-shared' +import { getDriverOriginals } from './driverPatcher.js' import type { SeleniumDriverLike } from './types.js' -interface DriverWithUrl extends SeleniumDriverLike { - getCurrentUrl?: () => Promise<string> - getTitle?: () => Promise<string> -} - export function captureActionSnapshot( driver: SeleniumDriverLike, command: string ): Promise<ActionSnapshot | null> { - const d = driver as DriverWithUrl + const orig = getDriverOriginals() return coreCapture({ command, - runScript: (src) => driver.executeScript(`return (${src})`), + runScript: (src) => + orig.executeScript + ? orig.executeScript(driver, `return (${src})`) + : driver.executeScript(`return (${src})`), takeScreenshot: () => - d.takeScreenshot - ? d.takeScreenshot().catch(() => undefined) + orig.takeScreenshot + ? orig.takeScreenshot(driver).catch(() => undefined) : Promise.resolve(undefined), getUrl: () => - d.getCurrentUrl - ? d.getCurrentUrl().catch(() => undefined) + orig.getCurrentUrl + ? orig.getCurrentUrl(driver).catch(() => undefined) : Promise.resolve(undefined), getTitle: () => - d.getTitle - ? d.getTitle().catch(() => undefined) + orig.getTitle + ? orig.getTitle(driver).catch(() => undefined) : Promise.resolve(undefined) }) } diff --git a/packages/selenium-devtools/src/driverPatcher.ts b/packages/selenium-devtools/src/driverPatcher.ts index d4b4a1c5..d1aab68f 100644 --- a/packages/selenium-devtools/src/driverPatcher.ts +++ b/packages/selenium-devtools/src/driverPatcher.ts @@ -217,6 +217,16 @@ function stashDriverOriginals(driverProto: Patchable): void { originals.manage = (driver) => orig.call(driver) as ReturnType<typeof orig> & object } + const url = driverProto.getCurrentUrl + if (typeof url === 'function') { + const orig = url as (this: unknown) => unknown + originals.getCurrentUrl = (driver) => orig.call(driver) as Promise<string> + } + const title = driverProto.getTitle + if (typeof title === 'function') { + const orig = title as (this: unknown) => unknown + originals.getTitle = (driver) => orig.call(driver) as Promise<string> + } } // Lets onBeforeQuit flush async cleanup before runners that `process.exit()` diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 7289cd81..4c4b2406 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -64,6 +64,7 @@ import { type ScreencastOptions, type TraceFormat, type TraceGranularity, + type TraceRetentionPolicy, type SeleniumDriverLike, type TestStats } from './types.js' @@ -277,6 +278,7 @@ class SeleniumDevToolsPlugin { mode?: DevToolsMode traceFormat?: TraceFormat traceGranularity?: TraceGranularity + tracePolicy?: TraceRetentionPolicy } = {} ) { if ('rerunCommand' in opts) { @@ -301,6 +303,9 @@ class SeleniumDevToolsPlugin { if (opts.traceGranularity) { this.#options.traceGranularity = opts.traceGranularity } + if (opts.tracePolicy) { + this.#options.tracePolicy = opts.tracePolicy + } if (opts.screencast) { if (this.#options.mode === 'trace' && opts.screencast.enabled) { log.warn('trace mode: ignoring screencast option (live-mode feature)') diff --git a/packages/selenium-devtools/src/types.ts b/packages/selenium-devtools/src/types.ts index af764d69..e7aceb8f 100644 --- a/packages/selenium-devtools/src/types.ts +++ b/packages/selenium-devtools/src/types.ts @@ -101,6 +101,8 @@ export interface DriverOriginals { ...args: unknown[] ) => Promise<unknown> manage?: (driver: SeleniumDriverLike) => unknown + getCurrentUrl?: (driver: SeleniumDriverLike) => Promise<string> + getTitle?: (driver: SeleniumDriverLike) => Promise<string> } // Unwrapped WebElement methods for internal enrichment paths. From e1354ff75e561379024d0a0186c61f4145f8a5b8 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:41:59 +0530 Subject: [PATCH 047/109] chore(selenium): bump chromedriver to ^150 for Chrome 150 --- packages/selenium-devtools/package.json | 2 +- pnpm-lock.yaml | 22 ++-------------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/packages/selenium-devtools/package.json b/packages/selenium-devtools/package.json index 78c14547..7cc202bc 100644 --- a/packages/selenium-devtools/package.json +++ b/packages/selenium-devtools/package.json @@ -65,7 +65,7 @@ "@types/ws": "^8.18.1", "@wdio/devtools-core": "workspace:^", "@wdio/devtools-shared": "workspace:^", - "chromedriver": "^148.0.4", + "chromedriver": "^150.0.0", "jest": "^30.4.2", "mocha": "^11.7.6", "selenium-webdriver": "^4.44.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 528cbb11..a1de3557 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -499,8 +499,8 @@ importers: specifier: workspace:^ version: link:../shared chromedriver: - specifier: ^148.0.4 - version: 148.0.4 + specifier: ^150.0.0 + version: 150.0.1 jest: specifier: ^30.4.2 version: 30.4.2(@types/node@25.9.3)(ts-node@10.9.2(@types/node@25.9.3)(typescript@6.0.3)) @@ -3333,11 +3333,6 @@ packages: engines: {node: '>=12.13.0'} hasBin: true - chromedriver@148.0.4: - resolution: {integrity: sha512-3UyptFDG4YF1Pyv3fzn95s1CN4K3zCpHSmE6g+6J4f2u9KxxOYzrwN2GApVyM2z02hlbSqzo9Ajn2hMi7LnvCw==} - engines: {node: '>=22'} - hasBin: true - chromedriver@150.0.1: resolution: {integrity: sha512-vpYskeQFyZGPNMEwc/5fuvfnxzfjljCO1EvwuF0dZGQ8KE0repYQar7eThTlT1IjznwVrirYRgXrRsJts7DRIQ==} engines: {node: '>=22'} @@ -10648,19 +10643,6 @@ snapshots: transitivePeerDependencies: - supports-color - chromedriver@148.0.4: - dependencies: - '@testim/chrome-version': 1.1.4 - adm-zip: 0.5.17 - axios: 1.16.1 - compare-versions: 6.1.1 - proxy-agent: 8.0.1 - proxy-from-env: 2.1.0 - tcp-port-used: 1.0.2 - transitivePeerDependencies: - - debug - - supports-color - chromedriver@150.0.1: dependencies: '@testim/chrome-version': 1.1.4 From ca234b54f80b986ce9702a68c34bae80fbd8b893 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:42:17 +0530 Subject: [PATCH 048/109] chore(examples): live/trace config-ladder harnesses + retry scripts --- examples/nightwatch/nightwatch.conf.cjs | 22 +++++---- .../nightwatch/tests/assert-capture-check.js | 18 ------- examples/nightwatch/tests/smoke-test.js | 48 +++++++++++++++++++ examples/selenium/mocha-test/test/example.js | 40 +++++++++++++++- examples/wdio/cucumber/wdio.conf.ts | 2 +- examples/wdio/mocha/wdio.conf.ts | 11 +++-- package.json | 1 + packages/nightwatch-devtools/package.json | 1 + 8 files changed, 110 insertions(+), 33 deletions(-) delete mode 100644 examples/nightwatch/tests/assert-capture-check.js create mode 100644 examples/nightwatch/tests/smoke-test.js diff --git a/examples/nightwatch/nightwatch.conf.cjs b/examples/nightwatch/nightwatch.conf.cjs index 2a969097..3ec31930 100644 --- a/examples/nightwatch/nightwatch.conf.cjs +++ b/examples/nightwatch/nightwatch.conf.cjs @@ -37,16 +37,22 @@ module.exports = { }, 'goog:loggingPrefs': { performance: 'ALL' } }, - // Simple configuration - just call the function to get globals. - // - screencast: polling-mode .webm written to cwd as - // nightwatch-video-<sessionId>.webm. - // - bidi: opt-in WebDriver BiDi capture for console + network. When - // attached, the per-command Chrome perf-log network path is gated - // off to avoid duplicate entries. + // bidi: opt-in WebDriver BiDi capture for console + network. When + // attached, the per-command Chrome perf-log network path is gated off to + // avoid duplicate entries. globals: nightwatchDevtools({ port: 3000, - mode: 'live', - screencast: { enabled: true, pollIntervalMs: 200 }, + // ── Config ladder — change ONLY this block per rung ─────────────── + // 1 live: mode: 'live' + // 2 trace: mode: 'trace' + // 3 per-test: mode: 'trace', traceGranularity: 'test' + // 4 fail: mode: 'trace', traceGranularity: 'test', tracePolicy: 'retain-on-failure' + // 5 retry: mode: 'trace', traceGranularity: 'test', tracePolicy: 'on-first-retry' + // (rung 5 needs retries → run `pnpm demo:nightwatch:retry`) + // NOTE: the BDD describe/it interface fires the plugin's beforeEach once + // per module (no per-`it` hook), so traceGranularity:'test' collapses to + // a single session-scoped slice here. See CLAUDE.md § Known debt. + mode: 'trace', bidi: true }) } diff --git a/examples/nightwatch/tests/assert-capture-check.js b/examples/nightwatch/tests/assert-capture-check.js deleted file mode 100644 index 6f8511a3..00000000 --- a/examples/nightwatch/tests/assert-capture-check.js +++ /dev/null @@ -1,18 +0,0 @@ -// Verification harness for native-assert trace capture (browser.assert / verify). -// Run `pnpm demo:nightwatch` and inspect the dashboard Actions: the PASSING -// asserts must render green and the FAILING ones RED. If a failing assert shows -// green, the classic-chained capture is mis-reporting failures (the known risk -// in nativeAssertCapture — the wrapper sees the enqueue, not the queued result). -describe('Native assert capture check', function () { - it('renders passing and failing native asserts', async function (browser) { - await browser.url('https://example.com').waitForElementVisible('body', 5000) - - // Soft verify.* first — never aborts the test, so all four always run. - browser.verify.titleContains('Example') // PASS → expect green - browser.verify.titleContains('SOFT_FAIL_ME') // FAIL → expect RED - - // Hard assert.* — the classic-chained/queued path under test. - browser.assert.titleContains('Example') // PASS → expect green - browser.assert.titleContains('HARD_FAIL_ME') // FAIL → expect RED - }) -}) diff --git a/examples/nightwatch/tests/smoke-test.js b/examples/nightwatch/tests/smoke-test.js new file mode 100644 index 00000000..3cdca005 --- /dev/null +++ b/examples/nightwatch/tests/smoke-test.js @@ -0,0 +1,48 @@ +/** + * Example + config-sweep harness for @wdio/nightwatch-devtools. + * + * Walk the live/trace ladder by editing ONLY the mode/traceGranularity/ + * tracePolicy block in ../nightwatch.conf.cjs. The suite carries a passing + * pair, an always-failing test (retain-on-failure target), and a flaky + * fail-then-pass test (on-first-retry / attempt-capture target). + * + * Native asserts (browser.assert.*) double as the assertion-capture check: + * the passing ones must render green ✓, the failing one red ✗. + * + * Run from repo root: + * pnpm demo:nightwatch (rungs 1-4) + * pnpm demo:nightwatch:retry (rung 5 — adds --retries 1) + */ + +// Survives Nightwatch's testcase retry so the flaky test fails once, then passes. +let flakyAttempts = 0 + +describe('nightwatch-devtools smoke test', function () { + it('loads example.com and reads the heading', async function (browser) { + await browser.url('https://example.com') + await browser.waitForElementVisible('body', 5000) + browser.assert.titleContains('Example') + }) + + it('navigates and reads the page title', async function (browser) { + await browser.url('https://example.org') + await browser.waitForElementVisible('body', 5000) + browser.assert.titleContains('Example') + }) + + it('fails on a wrong title (retain-on-failure target)', async function (browser) { + await browser.url('https://example.com') + await browser.waitForElementVisible('body', 5000) + browser.assert.titleContains('This Is Not The Title') + }) + + it('flaky: fails the first attempt, then passes (retry target)', async function (browser) { + await browser.url('https://example.com') + await browser.waitForElementVisible('body', 5000) + flakyAttempts += 1 + if (flakyAttempts === 1) { + throw new Error('intentional first-attempt failure — should retry') + } + browser.assert.titleContains('Example') + }) +}) diff --git a/examples/selenium/mocha-test/test/example.js b/examples/selenium/mocha-test/test/example.js index be2a79e4..26360598 100644 --- a/examples/selenium/mocha-test/test/example.js +++ b/examples/selenium/mocha-test/test/example.js @@ -1,5 +1,10 @@ /** - * Smoke test for @wdio/selenium-devtools. + * Example + config-sweep harness for @wdio/selenium-devtools (Mocha runner). + * + * Walk the live/trace ladder by editing ONLY the DevTools.configure({...}) + * block below. The suite carries a passing pair, an always-failing test (for + * retain-on-failure), and a flaky fail-then-pass test with a per-test retry + * (for on-first-retry / attempt capture). * * Run from the package root: pnpm example:mocha */ @@ -8,11 +13,22 @@ import { strict as assert } from 'node:assert' import { Builder, By, until } from 'selenium-webdriver' import { DevTools } from '@wdio/selenium-devtools' +// ── Config ladder — change this block per rung ────────────────────────────── +// 1 live: { mode: 'live' } +// 2 trace: { mode: 'trace' } +// 3 per-test:{ mode: 'trace', traceGranularity: 'test' } +// 4 fail: { mode: 'trace', traceGranularity: 'test', tracePolicy: 'retain-on-failure' } +// 5 retry: { mode: 'trace', traceGranularity: 'test', tracePolicy: 'on-first-retry' } DevTools.configure({ - screencast: { enabled: true, quality: 70, maxWidth: 1280, maxHeight: 720 }, + mode: 'trace', + // traceGranularity: 'test', + // tracePolicy: 'on-first-retry', headless: true }) +// Survives Mocha's in-process retry so the flaky test fails once, then passes. +let flakyAttempts = 0 + describe('selenium-devtools smoke test', function () { let driver @@ -40,4 +56,24 @@ describe('selenium-devtools smoke test', function () { const title = await driver.getTitle() assert.match(title, /Example/i) }) + + it('fails on a wrong heading (retain-on-failure target)', async function () { + await driver.get('https://example.com') + await driver.sleep(1000) + const heading = await driver.wait(until.elementLocated(By.css('h1')), 10000) + const text = await heading.getText() + assert.equal(text, 'This Is Not The Heading') + }) + + it('flaky: fails the first attempt, then passes (retry target)', async function () { + this.retries(1) + await driver.get('https://example.com') + await driver.sleep(1000) + flakyAttempts += 1 + if (flakyAttempts === 1) { + throw new Error('intentional first-attempt failure — should retry') + } + const title = await driver.getTitle() + assert.match(title, /Example/i) + }) }) diff --git a/examples/wdio/cucumber/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts index 4c535acc..e1a82294 100644 --- a/examples/wdio/cucumber/wdio.conf.ts +++ b/examples/wdio/cucumber/wdio.conf.ts @@ -133,7 +133,7 @@ export const config: Options.Testrunner = { [ 'devtools', { - mode: 'live' as const, + mode: 'trace' as const, screencast: { enabled: true, pollIntervalMs: 200 } } ] diff --git a/examples/wdio/mocha/wdio.conf.ts b/examples/wdio/mocha/wdio.conf.ts index 966226f9..c7680f7d 100644 --- a/examples/wdio/mocha/wdio.conf.ts +++ b/examples/wdio/mocha/wdio.conf.ts @@ -39,10 +39,13 @@ export const config: Options.Testrunner = { [ 'devtools', { - mode: 'live' as const, - traceGranularity: 'spec' as const - // tracePolicy: 'retain-on-failure' as const - // screencast: { enabled: true, pollIntervalMs: 200 } + // ── Config ladder — change ONLY this block per rung ────────────── + // 1 live: mode: 'live' + // 2 trace: mode: 'trace' + // 3 per-test: mode: 'trace', traceGranularity: 'test' + // 4 fail: mode: 'trace', traceGranularity: 'test', tracePolicy: 'retain-on-failure' + // 5 retry: use `pnpm demo:wdio:retry` (adds retries:1 + on-first-retry) + mode: 'live' as const } ] ], diff --git a/package.json b/package.json index e8901c1b..68471b99 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "demo:wdio:mocha": "wdio run ./examples/wdio/mocha/wdio.conf.ts", "demo:wdio:retry": "wdio run ./examples/wdio/mocha/wdio.retry.conf.ts", "demo:nightwatch": "pnpm --filter @wdio/nightwatch-devtools example", + "demo:nightwatch:retry": "pnpm --filter @wdio/nightwatch-devtools example:retry", "demo:selenium": "pnpm --filter @wdio/selenium-devtools example", "dev": "pnpm --parallel dev", "preview": "pnpm --parallel preview", diff --git a/packages/nightwatch-devtools/package.json b/packages/nightwatch-devtools/package.json index 0c3339b0..1830cb38 100644 --- a/packages/nightwatch-devtools/package.json +++ b/packages/nightwatch-devtools/package.json @@ -34,6 +34,7 @@ "clean": "rm -rf dist", "lint": "eslint .", "example": "nightwatch -c ../../examples/nightwatch/nightwatch.conf.cjs", + "example:retry": "nightwatch -c ../../examples/nightwatch/nightwatch.conf.cjs --retries 1", "prepublishOnly": "pnpm build" }, "keywords": [ From d6af4167883d0d16e36f2d4eb574c27968755a93 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 18:42:32 +0530 Subject: [PATCH 049/109] docs: record Nightwatch BDD per-test and WDIO assert-capture debt --- CLAUDE.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 14fff1a0..1f33103e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -238,8 +238,11 @@ Documented divergences from the conventions above. They exist today as debt to b - Retry-aware trace policies aren't uniform across adapters. Selenium emits one metadata entry per attempt (counter-based `generateStableUid` uid + retry-stable tracker key), so all six policies — including `retain-on-first-failure` (needs the first attempt's outcome) — evaluate correctly. Service and Nightwatch key metadata on the retry-stable uid and overwrite/mutate per attempt, collapsing to the *final* attempt's outcome; the retry-count policies (`retain-on-failure`, `on-first-retry`, `on-all-retries`, `retain-on-failure-and-retries`) are still correct, but `retain-on-first-failure` can't see a failed-then-passed first attempt and under-retains. Proper fix rides with B5 (per-test granularity preserves per-attempt slices); until then all three set `attemptInfoAvailable: true`. - Nightwatch negated native asserts (`browser.assert.not.*` / `verify.not.*`) produce no trace row: the `not` namespace is a nested Proxy that `wrapAssertionNamespaces` passes through untouched, and the internal command it issues is dropped by the `hasUserSource` gate in `browserProxy`. Positive `assert.*`/`verify.*` still record. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. -- Nightwatch native asserts populate all at once in live mode and finalize pass/fail in one test-end batch: Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin (`client.queue.tree` / `client.reporter` aren't on `browser`), so call-time capture streams neutral pending rows and `afterEach` reconciles outcomes. Trace-timeline positions are corrected from `results.commands`. -- Service assertion-suppression self-heal is command-triggered: a swallowed soft-assert (`expect.soft` / user `try/catch`) whose matcher hard-throws leaves `#assertionDepth` stuck until the next top-level user command's stack shows no `expect-webdriverio` frame (heal) or the next `beforeAssertion` (reset). A stuck depth with no following command or assertion before test end persists until the next test's `resetStack()` — benign (no later command in that test to suppress). +- Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. +- Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. +- Service assertion-suppression self-heal is command-triggered and gated on `#matcherStarted`: a swallowed soft-assert (`expect.soft` / user `try/catch`) whose matcher hard-throws leaves `#assertionDepth` stuck; the next top-level user command with no `expect-webdriverio` frame heals it — but only once the matcher has issued at least one internal (ewdio-framed) command, because the matcher's own FIRST command (an element re-lookup) also lacks a matcher frame on its sync stack and would otherwise reset the depth mid-run (duplicating every later matcher command). A stuck depth with no following command before test end persists until the next `beforeAssertion`/`resetStack()` — benign. +- Service captures the assertion **target's** element resolution as its own row. `expect(page.el).toHaveText(x)` evaluates `page.el` → `$('#sel')`/`$$` as the ARGUMENT to `expect()`, before `beforeAssertion` fires, so `#assertionDepth` is 0 and the `$`/`$$`/`isExisting` lands as a top-level command alongside the `expect.*` row. The in-window suppression can't reach it (it runs pre-window). Proper fix: coalesce a trailing element-query into the imminent assertion, or detect query-commands whose only consumer is the next matcher. +- Service `expect.*` rows can resolve `callSource` to the service bundle (`dist/index.js`) instead of the user's `expect()` line. `#assertionCallSources` captures the spec frame in `beforeAssertion`, but the matcher runs async, so in some cases the parallel stack doesn't hold a user frame and the fallback resolves into the service dist. The failure's own error stack still points at the spec. ### File-size (raw line counts; soft cap is 500 logic lines) From 37f07786df07c9cb9502bc8dbb325513a5e58c30 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 19:28:07 +0530 Subject: [PATCH 050/109] refactor: dedupe assert-result type into shared; drop unused trace defaults --- packages/core/src/trace-action-events.ts | 18 +++++------ .../src/helpers/nativeAssertions.ts | 9 +----- packages/nightwatch-devtools/src/types.ts | 1 + packages/shared/src/types.ts | 30 ++++++++----------- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/packages/core/src/trace-action-events.ts b/packages/core/src/trace-action-events.ts index 29eeb0b2..114233d7 100644 --- a/packages/core/src/trace-action-events.ts +++ b/packages/core/src/trace-action-events.ts @@ -1,7 +1,11 @@ // Builds the before/after action events of the exported trace stream, // including tracingGroup test boundaries and frame-snapshot ref stamping. -import type { CommandLog, TestMetadataMap } from '@wdio/devtools-shared' +import type { + CollapsedAssertResult, + CommandLog, + TestMetadataMap +} from '@wdio/devtools-shared' import { ASSERT_ACTION_CLASS, formatActionTitle, @@ -75,15 +79,9 @@ interface ActionStream { groupCallId?: string } -// Nightwatch built-in assertions collapse {passed, actual, expected, message} -// into the command result on failure — surface those over positional args. -interface CollapsedAssertResult { - passed?: unknown - actual?: unknown - expected?: unknown - message?: unknown -} - +// An adapter may attach a normalized CollapsedAssertResult (see shared) to an +// assertion command — prefer its actual/expected over the positional args, +// which are only correct for node:assert-style `[actual, expected]` calls. function collapsedAssertResult( result: unknown ): CollapsedAssertResult | undefined { diff --git a/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts index 1134047d..b86beba2 100644 --- a/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts +++ b/packages/nightwatch-devtools/src/helpers/nativeAssertions.ts @@ -26,6 +26,7 @@ import { } from '@wdio/devtools-core' import type { SessionCapturer } from '../session.js' import type { + CollapsedAssertResult, CommandLog, NativeAssertCall, NightwatchBrowser, @@ -242,14 +243,6 @@ export function pendingAssertionCommand( return entry } -/** Collapsed pass/fail result core's `collapsedAssertResult` reads. */ -interface CollapsedAssertResult { - passed: boolean - expected?: unknown - actual?: unknown - message?: string -} - /** Nightwatch failure messages end with `… but got: "<actual>"`. Pull out the * real observed value: Nightwatch passes only the EXPECTED as an arg, so the * actual lives in the message (and only on failure). Undefined when absent. diff --git a/packages/nightwatch-devtools/src/types.ts b/packages/nightwatch-devtools/src/types.ts index 203dbbdb..d4c3f01e 100644 --- a/packages/nightwatch-devtools/src/types.ts +++ b/packages/nightwatch-devtools/src/types.ts @@ -3,6 +3,7 @@ export { TraceType, type ActionSnapshot, + type CollapsedAssertResult, type CommandLog, type ConsoleLog, type DevToolsMode, diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index f90db146..1e2c7033 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -49,10 +49,6 @@ export type TraceRetentionPolicy = | 'on-all-retries' | 'retain-on-failure-and-retries' -/** Video retention — video has no separate mode switch, so `off` is valid - * (and the default). */ -export type TraceVideoPolicy = 'off' | TraceRetentionPolicy - /** One node in a test's ancestor chain, outermost first. */ export interface TestAncestor { uid: string @@ -73,19 +69,19 @@ export interface TestMetadataEntry { * title + specFile for Tracing.tracingGroup events in trace output. */ export type TestMetadataMap = Map<string, TestMetadataEntry> -/** Defaults for trace-mode options when not specified by the user. */ -export const TRACE_DEFAULTS = { - mode: 'live', - traceFormat: 'zip', - traceGranularity: 'session', - tracePolicy: 'on', - video: 'off' -} as const satisfies { - mode: DevToolsMode - traceFormat: TraceFormat - traceGranularity: TraceGranularity - tracePolicy: TraceRetentionPolicy - video: TraceVideoPolicy +/** + * Normalized assertion result an adapter may attach to `CommandLog.result` for + * an assertion command. The trace exporter's assert-param builder prefers this + * over the positional `[actual, expected]` arg convention — correct for + * frameworks whose asserts pass only an expected value (a matcher like + * `titleContains('x')`), where args[0] is the expected, not the actual. + * Cross-package contract: adapters produce it, core's exporter consumes it. + */ +export interface CollapsedAssertResult { + passed: boolean + actual?: unknown + expected?: unknown + message?: string } /** From 085687c873d282c014c43ed2571893757b9fbede Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 13 Jul 2026 19:28:31 +0530 Subject: [PATCH 051/109] refactor(core): one findFlushableRange for the three adapters' slice flush --- packages/core/src/spec-trace-helpers.ts | 24 ++++++++++++++ .../core/tests/spec-trace-helpers.test.ts | 32 +++++++++++++++++++ .../nightwatch-devtools/src/trace-slices.ts | 3 +- .../src/session-lifecycle.ts | 3 +- packages/service/src/trace-slices.ts | 18 ++--------- .../service/tests/trace-granularity.test.ts | 29 ----------------- 6 files changed, 62 insertions(+), 47 deletions(-) diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index 2eb69298..6de04bf8 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -36,6 +36,30 @@ export interface SpecRange { snapshotCount: number } +/** + * The slice range to eager-flush for a just-ended test. When the caller knows + * the test's uid (e.g. WDIO's `afterTest`), reverse-scan for it — retries push + * a new range under the same uid, and the next test's boundary may already be + * recorded, so the last range isn't reliably this test's. When the uid isn't + * independently known (Nightwatch/Selenium discover it from the range itself), + * the last recorded range is the just-ended test's. Undefined when there is no + * range to flush. One helper for what the three adapters each open-coded. + */ +export function findFlushableRange( + ranges: readonly SpecRange[], + testUid?: string +): SpecRange | undefined { + if (testUid !== undefined) { + for (let i = ranges.length - 1; i >= 0; i--) { + if (ranges[i]!.testUid === testUid) { + return ranges[i] + } + } + return undefined + } + return ranges[ranges.length - 1] +} + // ─── Spec name sanitization ─────────────────────────────────────────────────── /** diff --git a/packages/core/tests/spec-trace-helpers.test.ts b/packages/core/tests/spec-trace-helpers.test.ts index 95257afe..27f4f694 100644 --- a/packages/core/tests/spec-trace-helpers.test.ts +++ b/packages/core/tests/spec-trace-helpers.test.ts @@ -8,6 +8,7 @@ import { buildTestSliceFolder, buildTestSliceSessionId, filterTestMetadataBySpec, + findFlushableRange, filterTestMetadataByUid, recordSliceBoundary, recordSpecBoundary, @@ -335,3 +336,34 @@ describe('recordSliceBoundary / recordSpecBoundary (spec granularity)', () => { expect(ctx.specRanges[0]!.key).toBe('/a.js') }) }) + +describe('findFlushableRange', () => { + const mk = (key: string, testUid?: string): SpecRange => ({ + specFile: 'f', + key, + testUid, + commandStartIdx: 0, + consoleStartIdx: 0, + networkStartIdx: 0, + mutationStartIdx: 0, + traceLogStartIdx: 0, + snapshotCount: 0 + }) + + it('reverse-scans for the given testUid (latest retry attempt wins)', () => { + const ranges = [mk('a', 'a'), mk('b', 'b'), mk('b-retry1', 'b')] + expect(findFlushableRange(ranges, 'b')?.key).toBe('b-retry1') + expect(findFlushableRange(ranges, 'a')?.key).toBe('a') + }) + + it('returns undefined when no range matches the testUid', () => { + expect(findFlushableRange([mk('spec.ts', undefined)], 'x')).toBeUndefined() + expect(findFlushableRange([], 'x')).toBeUndefined() + }) + + it('falls back to the last recorded range when no testUid is given', () => { + const ranges = [mk('a', 'a'), mk('b', 'b')] + expect(findFlushableRange(ranges)?.key).toBe('b') + expect(findFlushableRange([])).toBeUndefined() + }) +}) diff --git a/packages/nightwatch-devtools/src/trace-slices.ts b/packages/nightwatch-devtools/src/trace-slices.ts index bdd0cf0d..c69f8fe7 100644 --- a/packages/nightwatch-devtools/src/trace-slices.ts +++ b/packages/nightwatch-devtools/src/trace-slices.ts @@ -12,6 +12,7 @@ */ import { + findFlushableRange, recordSliceBoundary, recordSpecBoundary, type SpecBoundaryContext, @@ -93,7 +94,7 @@ export function flushTestSlice(ctx: TestSliceCtx): void { if (!sliceActive(ctx)) { return } - const range = ctx.specRanges[ctx.specRanges.length - 1] + const range = findFlushableRange(ctx.specRanges) if (!range) { return } diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index 856d05ee..7716210b 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -14,6 +14,7 @@ import { errorMessage, finalizeScreencast, finalizeTraceExport, + findFlushableRange, flushRangeLogged, recordSliceBoundary as coreRecordSliceBoundary, recordSpecBoundary as coreRecordSpecBoundary, @@ -425,7 +426,7 @@ export function flushCurrentTestTrace(ctx: SessionLifecycleCtx): void { return } const sessionId = ctx.sessionCapturer.metadata?.sessionId - const currentRange = ctx.specRanges[ctx.specRanges.length - 1] + const currentRange = findFlushableRange(ctx.specRanges) if (!sessionId || currentRange?.testUid === undefined) { return } diff --git a/packages/service/src/trace-slices.ts b/packages/service/src/trace-slices.ts index fcc36962..5da66806 100644 --- a/packages/service/src/trace-slices.ts +++ b/packages/service/src/trace-slices.ts @@ -3,26 +3,12 @@ // selection and flush I/O are unit-testable and the god-file stays lean. import { + findFlushableRange, flushRangeLogged, type SpecRange, type TraceExportContext } from '@wdio/devtools-core' -/** The range for the test that just ended is the most recent slice recorded - * under this base testUid — retries push a new range under the same testUid, - * so reverse-scanning finds the attempt whose afterTest is now firing. */ -export function findCurrentTestRange( - ranges: readonly SpecRange[], - testUid: string -): SpecRange | undefined { - for (let i = ranges.length - 1; i >= 0; i--) { - if (ranges[i]!.testUid === testUid) { - return ranges[i] - } - } - return undefined -} - /** Fire-and-forget flush of the previous unflushed slice at a boundary change * (spec granularity, or a test slice whose eager flush was missed). Errors are * logged, never thrown, so a failed flush can't abort the next test. */ @@ -41,7 +27,7 @@ export async function flushTestSlice( ranges: readonly SpecRange[], testUid: string ): Promise<void> { - const range = findCurrentTestRange(ranges, testUid) + const range = findFlushableRange(ranges, testUid) if (!range) { return } diff --git a/packages/service/tests/trace-granularity.test.ts b/packages/service/tests/trace-granularity.test.ts index c43b6b66..66a3b971 100644 --- a/packages/service/tests/trace-granularity.test.ts +++ b/packages/service/tests/trace-granularity.test.ts @@ -1,7 +1,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as DevtoolsCore from '@wdio/devtools-core' import { deterministicUid, type SpecRange } from '@wdio/devtools-core' -import { findCurrentTestRange } from '../src/trace-slices.js' // Records the key/state observed at each per-slice flush and replays the real // dedupe (flushed.add) so recordSliceBoundary's prev-slice logic behaves as in @@ -87,34 +86,6 @@ vi.mock('@wdio/devtools-core', async (importOriginal) => { // Imported after the mocks are declared so the mocked core module is used. const { default: DevToolsHookService } = await import('../src/index.js') -describe('findCurrentTestRange', () => { - const mk = (key: string, testUid?: string): SpecRange => ({ - specFile: 'f', - key, - testUid, - commandStartIdx: 0, - consoleStartIdx: 0, - networkStartIdx: 0, - mutationStartIdx: 0, - traceLogStartIdx: 0, - snapshotCount: 0 - }) - - it('returns the most recent range recorded under the base testUid', () => { - const ranges = [mk('a', 'a'), mk('b', 'b'), mk('b-retry1', 'b')] - // A retry pushes a new range under the same testUid; the latest one wins. - expect(findCurrentTestRange(ranges, 'b')?.key).toBe('b-retry1') - expect(findCurrentTestRange(ranges, 'a')?.key).toBe('a') - }) - - it('returns undefined when no range matches (spec/session slices)', () => { - expect( - findCurrentTestRange([mk('spec.ts', undefined)], 'x') - ).toBeUndefined() - expect(findCurrentTestRange([], 'x')).toBeUndefined() - }) -}) - describe('DevtoolsService - trace granularity slicing', () => { const file = '/proj/specs/login.spec.ts' const mockBrowser = { From 3f3606278ef93cf5acf1e334480c13ec77742148 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 02:02:26 +0530 Subject: [PATCH 052/109] refactor(service): rebuild expect-matcher capture around before/afterAssertion --- packages/service/src/assert-capture.ts | 108 +++++---- packages/service/src/index.ts | 222 +++++++++--------- packages/service/src/session.ts | 44 ++++ packages/service/tests/assert-capture.test.ts | 73 ++---- packages/service/tests/assertion-rows.test.ts | 189 ++++++++++----- packages/service/tests/index.test.ts | 78 ------ packages/service/tests/session.test.ts | 106 +++++++++ 7 files changed, 481 insertions(+), 339 deletions(-) diff --git a/packages/service/src/assert-capture.ts b/packages/service/src/assert-capture.ts index 49725ec8..a62b4cff 100644 --- a/packages/service/src/assert-capture.ts +++ b/packages/service/src/assert-capture.ts @@ -9,42 +9,45 @@ import { stripAnsi } from '@wdio/devtools-core' import type { CommandLog, SerializedError } from '@wdio/devtools-shared' -import { parse } from 'stack-trace' -import { - resolveCallSourceFromFrame, - resolveFilePathFromFrame -} from './call-source.js' -import { isUserSpecFile } from './utils.js' import type { SessionCapturer } from './session.js' const log = logger('@wdio/devtools-service:assert-capture') /** - * Capture the user's `expect()` call site from the SYNCHRONOUS stack at matcher - * entry (call from `beforeAssertion`). The matcher then runs async, so this is - * the only point a user frame is still on the stack — reading it in - * `afterAssertion` resolves to the service bundle instead. Mirrors - * `beforeCommand`'s resolver (`parse(new Error()).reverse()` → first user-spec - * frame → `resolveCallSourceFromFrame`) so assertion rows share regular - * commands' Source-tab behaviour. Also loads that file's source via - * `captureSource` so the tab renders. Returns `undefined` when no user frame is - * present (row falls back to no callSource, exactly as before this fix). + * The WDIO element/browser query commands an expect-webdriverio matcher issues + * to read the value it asserts on (`toHaveText`→`getText`, `toExist`→ + * `isExisting`, …). The matcher's read is captured as a normal command; on + * `afterAssertion` the synthesized `expect.*` row is coalesced into it (it + * already carries the correct callSource, screenshot, and timeline position), + * so only one row remains — no timing/stack heuristics. Not exhaustive: an + * unlisted matcher just leaves its read visible plus the assertion row. */ -export function resolveAssertionCallSource( - captureSource: (filePath: string) => void -): string | undefined { - Error.stackTraceLimit = 20 - const frame = parse(new Error('')) - .reverse() - .find((f) => isUserSpecFile(f.getFileName())) - if (!frame) { - return undefined - } - const filePath = resolveFilePathFromFrame(frame) - if (filePath) { - captureSource(filePath) - } - return resolveCallSourceFromFrame(frame) +const MATCHER_READ_COMMANDS = new Set([ + 'getText', + 'getHTML', + 'isExisting', + 'isDisplayed', + 'isDisplayedInViewport', + 'getValue', + 'getAttribute', + 'getProperty', + 'getComputedRole', + 'getComputedLabel', + 'isEnabled', + 'isClickable', + 'isSelected', + 'isFocused', + 'getSize', + 'getLocation', + 'getCSSProperty', + 'getTagName', + 'getUrl', + 'getTitle' +]) + +/** True when a command is a matcher's value-read (see MATCHER_READ_COMMANDS). */ +export function isMatcherReadCommand(command: string): boolean { + return MATCHER_READ_COMMANDS.has(command) } /** @@ -131,33 +134,48 @@ export interface ExpectAssertion { result: { pass?: boolean; result?: boolean; message?: () => string } } +/** `expect.stringContaining(x)` / `objectContaining` etc. are jest asymmetric + * matchers — objects carrying a `sample` payload and an `asymmetricMatch` + * method. Surface the payload so a row reads `toHaveText("x")` instead of + * `toHaveText({"sample":"x"})`; non-matchers pass through unchanged. */ +function unwrapAsymmetricMatcher(value: unknown): unknown { + if ( + value !== null && + typeof value === 'object' && + 'sample' in value && + typeof (value as { asymmetricMatch?: unknown }).asymmetricMatch === + 'function' + ) { + return (value as { sample: unknown }).sample + } + return value +} + /** * Adapt expect-webdriverio's afterAssertion params to the shared matcher * converter. Framework-specific extraction only (matcher name, expectedValue → - * args, the runtime `pass` vs typed `result` flag); the actual CommandLog - * shaping lives once in core's `matcherAssertionToCommandLog`. `callSource` is - * the user's `expect()` call site captured in `beforeAssertion` (the matcher - * runs async, so afterAssertion's own stack no longer holds a user frame) — it - * makes the row's Source tab point at the spec, not the service bundle. + * args, the runtime `pass` vs typed `result` flag); the CommandLog shaping + * lives once in core's `matcherAssertionToCommandLog`. The row's callSource + + * screenshot come from the matcher's read command it's coalesced into (see + * `coalesceAssertionIntoLastRead`), not from a stack walk here. */ export function expectAssertionToCommandLog( params: ExpectAssertion, - testUid: string | undefined, - callSource?: string + testUid: string | undefined ): CommandLog { const { matcherName, expectedValue, result } = params + const rawArgs = + expectedValue === undefined + ? [] + : Array.isArray(expectedValue) + ? expectedValue + : [expectedValue] return matcherAssertionToCommandLog( { method: matcherName, - args: - expectedValue === undefined - ? [] - : Array.isArray(expectedValue) - ? expectedValue - : [expectedValue], + args: rawArgs.map(unwrapAsymmetricMatcher), passed: result.pass ?? result.result ?? false, - message: result.message, - callSource + message: result.message }, testUid ) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 064be3a4..0b1bcf71 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -15,7 +15,7 @@ import { import { captureExpectFailure, expectAssertionToCommandLog, - resolveAssertionCallSource, + isMatcherReadCommand, wireAssertCapture, type ExpectAssertion } from './assert-capture.js' @@ -104,35 +104,23 @@ export default class DevToolsHookService implements Services.ServiceInstance { */ #commandStack: CommandFrame[] = [] - /** Depth of the current expect-webdriverio matcher evaluation. While > 0, the - * matcher's internal WebDriver commands (getText/isExisting polling) are - * suppressed so only the `expect.<matcher>` assertion row is captured — - * matching Playwright and the Nightwatch native-assert behaviour. */ - #assertionDepth = 0 - - /** True once the current matcher has issued an internal command whose stack - * shows an expect-webdriverio frame. Gates the stuck-depth self-heal: the - * matcher's FIRST internal command (an element re-lookup) traces to the - * user's expect() line but its sync stack has no matcher frame yet, which - * would otherwise be misread as "matcher ended" and reset the depth mid-run - * — capturing every later matcher command as a duplicate row. */ - #matcherStarted = false - - /** Matcher start timestamps (stack, paired with #assertionDepth) so a captured - * assertion spans [matcher start → end] — its poll duration — instead of - * collapsing to a zero-width point at completion, which left the screencast - * tracking the preceding command during the poll. */ - #assertionStartTimes: number[] = [] - - /** User `expect()` call sites (stack, paired with #assertionStartTimes), - * captured in beforeAssertion while a user frame is still synchronous. The - * matcher runs async, so afterAssertion's own stack resolves to the service - * bundle — this parallel stack lets each row keep its spec-file callSource. */ - #assertionCallSources: (string | undefined)[] = [] - /** Current test UID, set in beforeTest(), used by afterCommand() to tag commands. */ #currentTestUid?: string + /** expect-webdriverio matcher nesting depth. Aliases fire before/afterAssertion + * twice (toBeChecked→toBeSelected), so only the outermost pair owns the row. */ + #assertionDepth = 0 + + /** Matcher armed at beforeAssertion, cleared at its afterAssertion. It survives + * to test end only when the matcher hard-threw (element never resolved, so + * waitUntil rethrew and afterAssertion never fired) — then it's synthesized as + * a failing expect.<matcher> row instead of leaving a raw read. */ + #pendingAssertion?: { + matcherName: string + expectedValue?: unknown + testUid?: string + } + /** Map of testUid → metadata for trace group events and per-spec partitioning. */ #testMetadata: TestMetadataMap = new Map() @@ -417,7 +405,54 @@ export default class DevToolsHookService implements Services.ServiceInstance { _scenario?: unknown, result?: { error?: unknown } ) { - this.#captureExpectFailure(result?.error) + this.#handleAssertionOutcome(result?.error) + } + + /** Route a test/step failure to assertion capture. A matcher that hard-threw + * (element never resolved) left an armed #pendingAssertion because + * afterAssertion never fired — synthesize its failing expect row. Any other + * failure just marks the last action with the error. */ + #handleAssertionOutcome(error: unknown): void { + if (this.#options.captureAssertions === false) { + return + } + if (this.#pendingAssertion) { + this.#finalizePendingAssertion(error) + return + } + this.#captureExpectFailure(error) + } + + /** Synthesize the failing expect.<matcher> row for a hard-thrown matcher: fold + * it into the throwing read (relabel `getText`→`expect.toHaveText`, keeping + * the error) so the assertion renders consistently whether or not the element + * resolved; fall back to a fresh row when there is no read to fold. */ + #finalizePendingAssertion(error: unknown): void { + const pending = this.#pendingAssertion + this.#pendingAssertion = undefined + this.#assertionDepth = 0 + if (!pending) { + return + } + const message = errorMessage(error) || `${pending.matcherName} failed` + const entry = expectAssertionToCommandLog( + { + matcherName: pending.matcherName, + expectedValue: pending.expectedValue, + result: { pass: false, message: () => message } + }, + pending.testUid + ) + if ( + this.#sessionCapturer.coalesceAssertionIntoLastRead( + entry, + isMatcherReadCommand, + true + ) + ) { + return + } + this.#sessionCapturer.captureAssertCommand(entry) } /** Mark the failing action from a matcher error (afterStep for Cucumber, @@ -463,7 +498,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { _context?: unknown, result?: TestOutcomeResult ) { - this.#captureExpectFailure(result?.error) + this.#handleAssertionOutcome(result?.error) const testTitle = test?.fullTitle || test?.title const uid = testTitle ? testMetadataUid(test?.file, testTitle) : undefined if (uid) { @@ -476,52 +511,63 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** expect-webdriverio fires this before each matcher evaluates. The matcher's - * internal polling commands run inside the before→after window and must not - * surface as their own rows — only the `expect.<matcher>` assertion should. */ - beforeAssertion(): void { - // Matchers don't nest, so any residual depth here is a prior matcher whose - // afterAssertion was skipped by a hard throw. Reset before pushing so the - // suppression window can't stay stuck open across assertions. - if (this.#assertionDepth > 0) { - this.#assertionDepth = 0 - this.#assertionStartTimes = [] - this.#assertionCallSources = [] + /** + * expect-webdriverio fires this after each matcher evaluates, with the matcher + * name + pass/fail + expected value. The matcher's value-read (getText / + * isExisting / …) was captured as a normal command; fold this assertion into + * that read so one `expect.<matcher>` row remains — inheriting the read's real + * callSource, screenshot, and timeline position. Deterministic and anchored to + * this reliable hook: no `#assertionDepth`, no stack-frame detection. + */ + /** + * expect-webdriverio fires this at the START of every matcher, before it polls + * — so it fires even for a matcher that later hard-throws (element never + * resolved), unlike afterAssertion. Arm the pending matcher here so test-end + * can synthesize its expect row if afterAssertion never comes. Depth-counted: + * aliases (toBeChecked→toBeSelected) fire this twice, so only the outermost + * arms the row. + */ + beforeAssertion(params: { + matcherName: string + expectedValue?: unknown + }): void { + if (this.#options.captureAssertions === false) { + return + } + if (this.#assertionDepth === 0) { + this.#pendingAssertion = { + matcherName: params.matcherName, + expectedValue: params.expectedValue, + testUid: this.#currentTestUid + } } this.#assertionDepth++ - this.#matcherStarted = false - this.#assertionStartTimes.push(Date.now()) - // Capture the user's expect() call site now — see #assertionCallSources. - this.#assertionCallSources.push( - resolveAssertionCallSource( - (file) => void this.#sessionCapturer.captureSource(file) - ) - ) } async afterAssertion(params: ExpectAssertion): Promise<void> { - // Decrement first (even when capture is off) so the window stays balanced. - const startTime = this.#assertionStartTimes.pop() - const callSource = this.#assertionCallSources.pop() - if (this.#assertionDepth > 0) { - this.#assertionDepth-- - } - this.#matcherStarted = false if (this.#options.captureAssertions === false) { return } - const entry = expectAssertionToCommandLog( - params, - this.#currentTestUid, - callSource - ) - // Span the matcher's poll window so the row's duration is real and the - // screencast tracks the assertion (not the preceding command) during it. - if (startTime !== undefined) { - entry.startTime = startTime + this.#assertionDepth = Math.max(0, this.#assertionDepth - 1) + // Inner matcher of a nested pair (toBeChecked→toBeSelected): the outer + // afterAssertion owns the row. + if (this.#assertionDepth > 0) { + return } - // The suppressed matcher-internal command carried the DOM screenshot; - // capture one here so the assertion row's Snapshot panel isn't blank. + // Reached afterAssertion → the matcher resolved (pass or value-fail), so no + // hard-throw synthesis is needed at test end. + this.#pendingAssertion = undefined + const entry = expectAssertionToCommandLog(params, this.#currentTestUid) + if ( + this.#sessionCapturer.coalesceAssertionIntoLastRead( + entry, + isMatcherReadCommand + ) + ) { + return + } + // No matcher read to fold into (a value matcher like toBe(x), or the read + // hard-threw): emit a fresh row with its own screenshot + trace snapshot. if (this.#browser && !isNativeMobile(this.#browser)) { try { entry.screenshot = await this.#browser.takeScreenshot() @@ -530,9 +576,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { log.debug(`assertion screenshot skipped: ${errorMessage(err)}`) } } - // Trace mode: push a DOM action-snapshot stamped at this row's timestamp so - // the trace player's Snapshot tab renders it, exactly like a regular - // command's post-action snapshot (captureActionResult). if (this.#options.mode === 'trace' && this.#browser) { await pushActionSnapshotAt( this.#browser, @@ -573,9 +616,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { private resetStack() { this.#commandStack = [] this.#assertionDepth = 0 - this.#matcherStarted = false - this.#assertionStartTimes = [] - this.#assertionCallSources = [] + this.#pendingAssertion = undefined this.#sessionCapturer.resetLastSelector() this.#sessionCapturer.resetRetryTracker() } @@ -597,30 +638,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** Maintain the expect-matcher suppression window for an incoming command. - * `inMatcher` marks the matcher as started (so its trailing internal - * commands stay suppressed); otherwise self-heal a depth left stuck by a - * matcher that hard-threw (skipping afterAssertion) — but only once the - * matcher has actually started, so its own leading element re-lookup (no - * matcher frame on the sync stack yet) can't reset the depth mid-run. */ - #trackAssertionWindow(inMatcher: boolean, hasSource: boolean): void { - if (inMatcher) { - this.#matcherStarted = true - return - } - if ( - hasSource && - this.#commandStack.length === 0 && - this.#assertionDepth > 0 && - this.#matcherStarted - ) { - this.#assertionDepth = 0 - this.#assertionStartTimes = [] - this.#assertionCallSources = [] - this.#matcherStarted = false - } - } - async beforeCommand(command: string, args: string[]) { if (!this.#browser) { return @@ -641,15 +658,10 @@ export default class DevToolsHookService implements Services.ServiceInstance { Error.stackTraceLimit = 20 const stack = parse(new Error('')).reverse() const source = stack.find((frame) => isUserSpecFile(frame.getFileName())) - const inMatcher = - this.#assertionDepth > 0 && - stack.some((frame) => frame.getFileName()?.includes('expect-webdriverio')) - this.#trackAssertionWindow(inMatcher, Boolean(source)) - if ( - source && - this.#commandStack.length === 0 && - this.#assertionDepth === 0 - ) { + // A matcher's value-read (getText/isExisting) is captured normally like any + // command; afterAssertion later folds it into the expect.<matcher> row (see + // coalesceAssertionIntoLastRead) — no suppression window needed here. + if (source && this.#commandStack.length === 0) { this.#pushTopLevelCommandFrame( command, resolveCallSourceFromFrame(source) diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index 58a90a24..6e8b2b9a 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -254,6 +254,50 @@ export class SessionCapturer extends SessionCapturerBase { this.#captureOrReplace(entry) } + /** + * Fold an expect-matcher assertion into the matcher's value-read command when + * that read is the most recent captured command (per `isRead`). The read + * already carries the correct callSource, screenshot, and timeline position — + * the DOM the matcher evaluated — so replace it in place with the assertion + * row: one row, no duplicate, and no timing/stack heuristics. WDIO's + * RetryTracker already collapses a matcher's repeated polls to that one read. + * Returns false when the last command isn't a matcher read (a value matcher), + * so the caller emits a fresh assertion row instead. + * + * `foldErrored` folds even when the read carries an error — used by the + * hard-throw path (element never resolved, so afterAssertion never fired and + * the read threw): relabel the throwing read as the failing expect row rather + * than leave a raw `getText`. The normal path keeps the guard so a value + * matcher can't accidentally swallow an unrelated errored command. + */ + coalesceAssertionIntoLastRead( + entry: CommandLog, + isRead: (command: string) => boolean, + foldErrored = false + ): boolean { + const log = this.commandsLog as (CommandLog & { _id?: number })[] + const last = log[log.length - 1] + if (!last || !isRead(last.command) || (last.error && !foldErrored)) { + return false + } + // Inherit the read's `_id` (local dedup bookkeeping) and timestamp, but do + // NOT stamp a public `id`: WDIO replaces by timestamp (like #captureOrReplace), + // and `commandCounter` resets per worker/spec, so a bare `id` collides across + // specs and the app's id-first replaceCommand would swap the wrong row. + const merged: CommandLog & { _id?: number } = { + ...entry, + _id: last._id, + timestamp: last.timestamp, + startTime: last.startTime, + callSource: entry.callSource ?? last.callSource, + screenshot: entry.screenshot ?? last.screenshot, + error: entry.error ?? last.error + } + log[log.length - 1] = merged + this.sendReplaceCommand(last.timestamp, merged) + return true + } + /** * Run the shared Performance API capture script and attach the result to * the given CommandLog entry. Same `CAPTURE_PERFORMANCE_SCRIPT` + diff --git a/packages/service/tests/assert-capture.test.ts b/packages/service/tests/assert-capture.test.ts index 534945e3..e88f3dca 100644 --- a/packages/service/tests/assert-capture.test.ts +++ b/packages/service/tests/assert-capture.test.ts @@ -7,30 +7,11 @@ import { import { captureExpectFailure, expectAssertionToCommandLog, - resolveAssertionCallSource, toCommandError, wireAssertCapture } from '../src/assert-capture.js' import type { SessionCapturer } from '../src/session.js' -const stackFrames = vi.hoisted(() => ({ - value: [] as Array<{ - getFileName: () => string | null - getLineNumber: () => number | null - getColumnNumber: () => number | null - }> -})) - -// Only resolveAssertionCallSource reads 'stack-trace'; node:assert capture uses -// core's stacktrace-parser path, so mocking here doesn't affect those tests. -vi.mock('stack-trace', () => ({ parse: () => stackFrames.value })) - -const frame = (file: string | null, line = 1, column = 1) => ({ - getFileName: () => file, - getLineNumber: () => line, - getColumnNumber: () => column -}) - describe('toCommandError', () => { it('normalizes a plain Error object (ANSI stripped)', () => { // Matcher errors are skipped now (afterAssertion owns them); a plain @@ -178,6 +159,23 @@ describe('expectAssertionToCommandLog', () => { expect(entry.error).toBeUndefined() }) + it('unwraps a jest asymmetric matcher (stringContaining) to its payload', () => { + const entry = expectAssertionToCommandLog( + { + matcherName: 'toHaveText', + // expect.stringContaining('You logged in') shape. + expectedValue: { + sample: 'You logged in', + asymmetricMatch: () => true + }, + result: { pass: true, message: () => 'ok' } + }, + 'uid-2' + ) + // Label reads toHaveText("You logged in"), not toHaveText({"sample":…}). + expect(entry.args).toEqual(['You logged in']) + }) + it('captures a failing matcher with its ANSI-stripped message as the error', () => { const entry = expectAssertionToCommandLog( { @@ -215,41 +213,4 @@ describe('expectAssertionToCommandLog', () => { ) expect(entry).toMatchObject({ command: 'expect.toBeClickable', args: [] }) }) - - it('forwards the captured callSource onto the assertion row', () => { - const entry = expectAssertionToCommandLog( - { matcherName: 'toExist', result: { pass: true } }, - 'uid-1', - '/proj/specs/login.e2e.ts:30:7' - ) - expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') - }) -}) - -describe('resolveAssertionCallSource', () => { - it('returns the outermost user-spec frame and loads its source', () => { - // innermost → outermost: service bundle, expect-webdriverio matcher, the - // user spec, then node internals. The user spec must win, not the bundle. - stackFrames.value = [ - frame('/repo/packages/service/dist/index.js', 4045, 12), - frame('/repo/node_modules/expect-webdriverio/lib/matchers.js', 9, 3), - frame('/proj/specs/login.e2e.ts', 30, 7), - frame('node:internal/process/task_queues', 95, 5) - ] - const captured: string[] = [] - const callSource = resolveAssertionCallSource((f) => captured.push(f)) - expect(callSource).toBe('/proj/specs/login.e2e.ts:30:7') - expect(callSource).not.toContain('/dist/') - expect(captured).toEqual(['/proj/specs/login.e2e.ts']) - }) - - it('returns undefined and loads nothing when only dependency frames exist', () => { - stackFrames.value = [ - frame('/repo/node_modules/expect-webdriverio/lib/matchers.js', 9, 3), - frame('node:internal/process/task_queues', 95, 5) - ] - const captured: string[] = [] - expect(resolveAssertionCallSource((f) => captured.push(f))).toBeUndefined() - expect(captured).toEqual([]) - }) }) diff --git a/packages/service/tests/assertion-rows.test.ts b/packages/service/tests/assertion-rows.test.ts index 5a5b09ac..ddd216b2 100644 --- a/packages/service/tests/assertion-rows.test.ts +++ b/packages/service/tests/assertion-rows.test.ts @@ -5,18 +5,14 @@ import { TRACKED_ASSERT_METHODS } from '@wdio/devtools-core' -// Controlled synchronous stack for the beforeAssertion call-source walk. -const stackFrames = vi.hoisted(() => ({ - value: [] as Array<{ - getFileName: () => string | null - getLineNumber: () => number | null - getColumnNumber: () => number | null - }> -})) -vi.mock('stack-trace', () => ({ parse: () => stackFrames.value })) - +// Mock the capturer: the service routes each expect matcher through +// coalesceAssertionIntoLastRead (fold into the matcher's read command) or, when +// there's no read to fold into, captureAssertCommand (a fresh row). These tests +// assert that routing; the fold itself is a capturer unit test (session.test). const capturer = vi.hoisted(() => ({ captureAssertCommand: vi.fn(), + coalesceAssertionIntoLastRead: vi.fn(), + failLastAction: vi.fn(), captureSource: vi.fn().mockResolvedValue(undefined), injectScript: vi.fn().mockResolvedValue(undefined), sendUpstream: vi.fn(), @@ -42,13 +38,6 @@ vi.mock('../src/action-snapshot.js', () => ({ })) import DevToolsHookService from '../src/index.js' -import type { ExpectAssertion } from '../src/assert-capture.js' - -const userFrame = { - getFileName: () => '/proj/specs/login.e2e.ts', - getLineNumber: () => 30, - getColumnNumber: () => 7 -} const mockBrowser = { isBidi: true, @@ -76,82 +65,172 @@ afterAll(() => { } }) -const capturedEntry = () => capturer.captureAssertCommand.mock.calls[0]![0] - describe('DevtoolsService — expect.* assertion rows', () => { beforeEach(() => { vi.clearAllMocks() - stackFrames.value = [userFrame] }) - it('trace mode: user-spec callSource, spec source loaded, DOM snapshot pushed', async () => { + it('folds the assertion into the matcher read (no fresh row or snapshot)', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(true) const service = new DevToolsHookService({ mode: 'trace' }) await service.before({} as never, [], mockBrowser) - service.beforeAssertion() - const params: ExpectAssertion = { - matcherName: 'toExist', - result: { pass: true, message: () => 'ok' } - } - await service.afterAssertion(params) - - const entry = capturedEntry() - expect(entry.command).toBe('expect.toExist') - // The regression: callSource must point at the user's spec, not the - // service bundle (…/service/dist/index.js). - expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') - expect(entry.callSource).not.toContain('/dist/') - // Source of that file is loaded so the Source tab can render it. - expect(capturer.captureSource).toHaveBeenCalledWith( - '/proj/specs/login.e2e.ts' - ) - // Live-mode screenshot kept for the CommandLog. + await service.afterAssertion({ + matcherName: 'toHaveText', + expectedValue: 'Hi', + result: { pass: false, message: () => 'nope' } + }) + + // Routed through the fold: the matcher's read becomes the expect row (it + // already carries the correct callSource + screenshot + position). + const [entry, isRead] = + capturer.coalesceAssertionIntoLastRead.mock.calls[0]! + expect(entry.command).toBe('expect.toHaveText') + expect(entry.error).toMatchObject({ message: 'nope' }) + expect(isRead('getText')).toBe(true) + expect(isRead('click')).toBe(false) + // No duplicate fresh row, no fresh screenshot/snapshot. + expect(capturer.captureAssertCommand).not.toHaveBeenCalled() + expect(pushActionSnapshotAt).not.toHaveBeenCalled() + }) + + it('trace fallback: fresh row + screenshot + DOM snapshot when there is no read to fold', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(false) + const service = new DevToolsHookService({ mode: 'trace' }) + await service.before({} as never, [], mockBrowser) + + await service.afterAssertion({ + matcherName: 'toBe', + expectedValue: 1, + result: { pass: true } + }) + + const entry = capturer.captureAssertCommand.mock.calls[0]![0] + expect(entry.command).toBe('expect.toBe') expect(entry.screenshot).toBe('SHOT') - // Trace-player Snapshot tab: a DOM snapshot stamped at the row timestamp. expect(pushActionSnapshotAt).toHaveBeenCalledWith( mockBrowser, - 'expect.toExist', + 'expect.toBe', entry.timestamp, expect.any(Array) ) - // WDIO reconciles rows by timestamp (like every regular WDIO command), - // so assertion rows carry no public id — parity with regular commands. - expect(entry.id).toBeUndefined() }) - it('live mode: keeps the screenshot but pushes no DOM snapshot', async () => { + it('live fallback: keeps the screenshot but pushes no DOM snapshot', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(false) const service = new DevToolsHookService({ mode: 'live' }) await service.before({} as never, [], mockBrowser) - service.beforeAssertion() await service.afterAssertion({ - matcherName: 'toHaveText', - expectedValue: 'Hi', - result: { pass: false, message: () => 'nope' } + matcherName: 'toBe', + expectedValue: 1, + result: { pass: true } }) - const entry = capturedEntry() - expect(entry.command).toBe('expect.toHaveText') - expect(entry.callSource).toBe('/proj/specs/login.e2e.ts:30:7') - expect(entry.error).toMatchObject({ message: 'nope' }) + const entry = capturer.captureAssertCommand.mock.calls[0]![0] expect(entry.screenshot).toBe('SHOT') expect(pushActionSnapshotAt).not.toHaveBeenCalled() }) - it('captureAssertions: false suppresses the row but keeps the window balanced', async () => { + it('captureAssertions: false emits nothing (no fold, no fresh row)', async () => { const service = new DevToolsHookService({ mode: 'trace', captureAssertions: false }) await service.before({} as never, [], mockBrowser) - service.beforeAssertion() await service.afterAssertion({ matcherName: 'toExist', result: { pass: true } }) + expect(capturer.coalesceAssertionIntoLastRead).not.toHaveBeenCalled() expect(capturer.captureAssertCommand).not.toHaveBeenCalled() expect(pushActionSnapshotAt).not.toHaveBeenCalled() }) + + it('afterAssertion clears the armed matcher so test end does not re-synthesize', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(true) + const service = new DevToolsHookService({ mode: 'live' }) + await service.before({} as never, [], mockBrowser) + + service.beforeAssertion({ matcherName: 'toHaveText', expectedValue: 'Hi' }) + await service.afterAssertion({ + matcherName: 'toHaveText', + expectedValue: 'Hi', + // a real matcher failure carries matcherResult, so failLastAction skips it + result: { pass: false, message: () => 'nope' } + }) + // afterAssertion fired → pending cleared; test end must not fold again. + await service.afterTest({ file: '/s.ts' } as never, undefined, { + error: Object.assign(new Error('nope'), { + matcherResult: { pass: false } + }) + } as never) + + expect(capturer.coalesceAssertionIntoLastRead).toHaveBeenCalledTimes(1) + expect(capturer.captureAssertCommand).not.toHaveBeenCalled() + }) + + it('hard-throw (no afterAssertion): folds the throwing read into a failing expect row', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(true) + const service = new DevToolsHookService({ mode: 'live' }) + await service.before({} as never, [], mockBrowser) + + // Matcher armed, then getText hard-threw → afterAssertion never fires. + service.beforeAssertion({ + matcherName: 'toHaveText', + expectedValue: 'Your username is invalid!' + }) + await service.afterTest({ file: '/s.ts' } as never, undefined, { + error: new Error('element ("#flash") still not existing') + } as never) + + const [entry, , foldErrored] = + capturer.coalesceAssertionIntoLastRead.mock.calls[0]! + expect(entry.command).toBe('expect.toHaveText') + expect(entry.args).toEqual(['Your username is invalid!']) + expect(entry.error.message).toContain('still not existing') + expect(foldErrored).toBe(true) // folds even though the read carries an error + expect(capturer.captureAssertCommand).not.toHaveBeenCalled() + }) + + it('hard-throw with no read to fold: emits a fresh failing expect row', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(false) + const service = new DevToolsHookService({ mode: 'live' }) + await service.before({} as never, [], mockBrowser) + + service.beforeAssertion({ matcherName: 'toBeDisplayed' }) + await service.afterTest({ file: '/s.ts' } as never, undefined, { + error: new Error('element not found') + } as never) + + const entry = capturer.captureAssertCommand.mock.calls[0]![0] + expect(entry.command).toBe('expect.toBeDisplayed') + expect(entry.error.message).toContain('element not found') + }) + + it('nested matcher aliases fold once (toBeChecked→toBeSelected)', async () => { + capturer.coalesceAssertionIntoLastRead.mockReturnValue(true) + const service = new DevToolsHookService({ mode: 'live' }) + await service.before({} as never, [], mockBrowser) + + // toBeChecked delegates to toBeSelected — before/after fire twice, nested. + service.beforeAssertion({ matcherName: 'toBeChecked' }) + service.beforeAssertion({ matcherName: 'toBeSelected' }) + await service.afterAssertion({ + matcherName: 'toBeSelected', + result: { pass: true } + }) + await service.afterAssertion({ + matcherName: 'toBeChecked', + result: { pass: true } + }) + + // Only the outer afterAssertion emits — one row, labelled by the alias. + expect(capturer.coalesceAssertionIntoLastRead).toHaveBeenCalledTimes(1) + expect( + capturer.coalesceAssertionIntoLastRead.mock.calls[0]![0].command + ).toBe('expect.toBeChecked') + }) }) diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index a4f4a229..ba881d4a 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -294,81 +294,3 @@ describe('DevtoolsService - Screencast Integration', () => { expect(mockScreencastRecorder.start).toHaveBeenCalledWith(mockBrowser) }) }) - -describe('DevtoolsService - assertion suppression self-heal', () => { - let service: DevToolsHookService - const mockBrowser = { - isBidi: true, - sessionId: 'heal-session', - scriptAddPreloadScript: vi.fn().mockResolvedValue(undefined), - takeScreenshot: vi.fn().mockResolvedValue('screenshot'), - execute: vi.fn().mockResolvedValue({ - width: 1200, - height: 800, - offsetLeft: 0, - offsetTop: 0 - }), - on: vi.fn(), - emit: vi.fn() - } as any - - const capturedCommands = () => - mockSessionCapturerInstance.afterCommand.mock.calls.map((call) => call[1]) - - beforeEach(async () => { - vi.clearAllMocks() - stackMock.frames = [stackMock.userFrame] - service = new DevToolsHookService() - await service.before({} as any, [], mockBrowser) - vi.clearAllMocks() - }) - - // expect-webdriverio doesn't wrap afterAssertion in try/finally, so a matcher - // whose internal command hard-throws runs beforeAssertion but skips - // afterAssertion, leaving #assertionDepth stuck ≥ 1. Without the self-heal - // that stuck depth suppresses every later user command in the test. - it('captures a top-level command after a matcher that started then threw left the assertion depth stuck', async () => { - service.beforeAssertion() // depth 1 - // The matcher issues an internal command (stack shows an expect-webdriverio - // frame) → marks the matcher started, then hard-throws (afterAssertion - // skipped), leaving the depth stuck. - stackMock.frames = [stackMock.userFrame, stackMock.matcherFrame] - service.beforeCommand('getText' as any, ['#el']) - // A later top-level user command with no matcher frame self-heals the depth. - stackMock.frames = [stackMock.userFrame] - service.beforeCommand('click' as any, ['.button']) - await service.afterCommand('click' as any, ['.button'], undefined) - - expect(capturedCommands()).toEqual(['click']) - }) - - it('keeps suppressing the matcher’s own leading command (no premature self-heal)', async () => { - service.beforeAssertion() // depth 1 - // The matcher's FIRST internal command is an element re-lookup whose sync - // stack has no expect-webdriverio frame yet. It must NOT reset the depth — - // otherwise the subsequent matcher commands would surface as duplicate rows. - stackMock.frames = [stackMock.userFrame] - service.beforeCommand('$' as any, ['#el']) - await service.afterCommand('$' as any, ['#el'], undefined) - - expect(capturedCommands()).toEqual([]) - }) - - it('a fresh beforeAssertion resets a stuck depth so the window stays balanced', async () => { - service.beforeAssertion() - service.beforeAssertion() // leftover depth from a prior throw - - // A new matcher starts (resetting the stuck depth) and completes normally. - service.beforeAssertion() - await service.afterAssertion({ - matcherName: 'toBeDisplayed', - result: { pass: true } - } as any) - - // Depth is balanced again, so the next top-level command is captured. - service.beforeCommand('setValue' as any, ['.input', 'hi']) - await service.afterCommand('setValue' as any, ['.input', 'hi'], undefined) - - expect(capturedCommands()).toEqual(['setValue']) - }) -}) diff --git a/packages/service/tests/session.test.ts b/packages/service/tests/session.test.ts index 43f9853b..1f1185f2 100644 --- a/packages/service/tests/session.test.ts +++ b/packages/service/tests/session.test.ts @@ -769,4 +769,110 @@ describe('SessionCapturer', () => { expect(capturer.commandsLog[0].testUid).toBeUndefined() }) }) + + describe('coalesceAssertionIntoLastRead', () => { + const isRead = (c: string) => c === 'getText' + + it('folds the assertion into the trailing matcher read, in place', () => { + const capturer = new SessionCapturer() + capturer.commandsLog.push({ + command: 'getText', + args: [], + timestamp: 100, + startTime: 90, + callSource: '/spec.ts:13:5', + screenshot: 'READ_SHOT', + _id: 7 + } as never) + + const folded = capturer.coalesceAssertionIntoLastRead( + { + command: 'expect.toHaveText', + args: ['x'], + timestamp: 999, + result: 'passed' + } as never, + isRead + ) + + expect(folded).toBe(true) + expect(capturer.commandsLog).toHaveLength(1) + const row = capturer.commandsLog[0] as Record<string, unknown> + expect(row.command).toBe('expect.toHaveText') // became the assertion + expect(row.callSource).toBe('/spec.ts:13:5') // inherited from the read + expect(row.screenshot).toBe('READ_SHOT') // inherited from the read + expect(row.timestamp).toBe(100) // kept the read's timeline position + expect(row._id).toBe(7) // local dedup bookkeeping preserved + // No public `id`: WDIO replaces by timestamp, and commandCounter resets + // per worker/spec, so a bare id would collide across specs and the app's + // id-first replaceCommand would swap the wrong row. + expect(row.id).toBeUndefined() + }) + + it('returns false and leaves the log untouched when the last command is not a matcher read', () => { + const capturer = new SessionCapturer() + capturer.commandsLog.push({ + command: 'click', + args: [], + timestamp: 100 + } as never) + + const folded = capturer.coalesceAssertionIntoLastRead( + { command: 'expect.toExist', args: [], timestamp: 999 } as never, + isRead + ) + + expect(folded).toBe(false) + expect(capturer.commandsLog).toHaveLength(1) + expect((capturer.commandsLog[0] as Record<string, unknown>).command).toBe( + 'click' + ) + }) + + it('returns false when the trailing read hard-threw (carries an error)', () => { + const capturer = new SessionCapturer() + capturer.commandsLog.push({ + command: 'getText', + args: [], + timestamp: 100, + error: { message: 'element not found' } + } as never) + + expect( + capturer.coalesceAssertionIntoLastRead( + { command: 'expect.toHaveText', args: [], timestamp: 999 } as never, + isRead + ) + ).toBe(false) + }) + + it('foldErrored=true folds a throwing read, keeping its error (hard-throw)', () => { + const capturer = new SessionCapturer() + capturer.commandsLog.push({ + command: 'getText', + args: [], + timestamp: 100, + callSource: '/spec.ts:22:5', + error: { message: 'element not found' }, + _id: 3 + } as never) + + const folded = capturer.coalesceAssertionIntoLastRead( + { command: 'expect.toHaveText', args: ['x'], timestamp: 999 } as never, + isRead, + true + ) + + expect(folded).toBe(true) + expect(capturer.commandsLog).toHaveLength(1) + const row = capturer.commandsLog[0] as Record<string, unknown> + expect(row.command).toBe('expect.toHaveText') // relabelled from the read + expect(row.callSource).toBe('/spec.ts:22:5') // inherited from the read + expect(row.timestamp).toBe(100) // kept the read's timeline position + expect((row.error as { message: string }).message).toBe( + 'element not found' + ) // the throw's error carries through + expect(row.id).toBeUndefined() // still no cross-spec-colliding public id + }) + }) }) From 9e224556a40fb861a994d612829c848830836a48 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 02:02:42 +0530 Subject: [PATCH 053/109] fix(service): exclude the devtools bundle from user-frame detection --- packages/service/src/utils.ts | 33 +++++++++++++++++++++++++--- packages/service/tests/utils.test.ts | 16 ++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/packages/service/src/utils.ts b/packages/service/src/utils.ts index dc58e737..ebb7c94a 100644 --- a/packages/service/src/utils.ts +++ b/packages/service/src/utils.ts @@ -2,6 +2,9 @@ // (AST parsing, source mapping, cucumber step-def lookup) lives in // utils/source-mapping.ts and utils/step-defs.ts. +import path from 'node:path' +import { fileURLToPath } from 'node:url' + export { setCurrentSpecFile, findTestLocations, @@ -11,8 +14,17 @@ export { } from './utils/source-mapping.js' export { findStepDefinitionLocation } from './utils/step-defs.js' -/** A spec file owned by the user — excludes node-builtins and node_modules, - * but keeps WDIO's expect helpers (callers may want to step into those). */ +/** The service's own bundle directory. Stack frames from here are the service's + * instrumentation, not user code — a normal install has the service under + * node_modules (already excluded below), but a monorepo/linked setup puts the + * built service outside node_modules, so exclude it explicitly. */ +const SELF_DIR = path + .dirname(fileURLToPath(import.meta.url)) + .replace(/\\/g, '/') + +/** A spec file owned by the user — excludes node-builtins, node_modules, and + * the service's own bundle, but keeps WDIO's expect helpers (callers may want + * to step into those). */ export function isUserSpecFile(file?: string | null): boolean { if (!file) { return false @@ -20,10 +32,25 @@ export function isUserSpecFile(file?: string | null): boolean { if (file.startsWith('node:')) { return false } - const normalized = file.replace(/\\/g, '/') + // ESM stack frames report a file:// URL; SELF_DIR is a plain path, so decode + // to a plain path first or the self-bundle exclusion below silently no-ops. + // Use fileURLToPath (not `new URL().pathname`) so the Windows drive-letter is + // normalized the same way SELF_DIR is — otherwise `/C:/…` vs `C:/…` mismatch. + let normalized = file + if (normalized.startsWith('file://')) { + try { + normalized = fileURLToPath(normalized) + } catch { + /* keep the raw value */ + } + } + normalized = normalized.replace(/\\/g, '/') if (normalized.includes('/@wdio/expect-webdriverio/')) { return true } + if (normalized.startsWith(SELF_DIR)) { + return false + } return !normalized.includes('/node_modules/') } diff --git a/packages/service/tests/utils.test.ts b/packages/service/tests/utils.test.ts index bb9ffb76..2583e2cb 100644 --- a/packages/service/tests/utils.test.ts +++ b/packages/service/tests/utils.test.ts @@ -1,4 +1,5 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' +import { fileURLToPath } from 'node:url' import { getBrowserObject, isUserSpecFile, @@ -82,5 +83,20 @@ describe('service utils', () => { ).toBe(false) expect(isUserSpecFile('C:\\proj\\test\\login.spec.ts')).toBe(true) }) + + it('decodes file:// URLs (incl. percent-encoding) before matching', () => { + expect(isUserSpecFile('file:///proj/test/login%20spec.ts')).toBe(true) + expect(isUserSpecFile('file:///proj/node_modules/lib/index.js')).toBe( + false + ) + }) + + it("excludes the service's own bundle dir, plain and as a file:// frame", () => { + // SELF_DIR is the dir this module resolves from; at test time that's + // packages/service/src. A frame from there is instrumentation, not a spec. + const selfDir = fileURLToPath(new URL('../src/', import.meta.url)) + expect(isUserSpecFile(`${selfDir}index.js`)).toBe(false) + expect(isUserSpecFile(`file://${selfDir}session.js`)).toBe(false) + }) }) }) From d4deea37ca984cd1fbb5ded5c5fa22da144c1b40 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 15:01:28 +0530 Subject: [PATCH 054/109] fix(nightwatch): record negated native asserts (assert.not.* / verify.not.*) --- .../src/helpers/browserProxy.ts | 64 +++++++---- .../tests/browserProxy.test.ts | 100 +++++++++++++++++- 2 files changed, 142 insertions(+), 22 deletions(-) diff --git a/packages/nightwatch-devtools/src/helpers/browserProxy.ts b/packages/nightwatch-devtools/src/helpers/browserProxy.ts index 21225506..1d41c4fb 100644 --- a/packages/nightwatch-devtools/src/helpers/browserProxy.ts +++ b/packages/nightwatch-devtools/src/helpers/browserProxy.ts @@ -109,28 +109,52 @@ export class BrowserProxy { if (!original || typeof original !== 'object') { return } - b[prefix] = new Proxy(original as object, { - get: (target, name, receiver) => { - const orig = Reflect.get(target, name, receiver) - // `not` (negation Proxy) and non-method props pass through untouched. - if (typeof orig !== 'function' || typeof name !== 'string') { - return orig - } - return (...args: unknown[]) => { - const callInfo = getCallSourceFromStack() - if (callInfo.filePath !== undefined) { - this.emitPendingAssertion({ - prefix, - method: name, - args, - callSource: callInfo.callSource, - timestamp: Date.now() - }) - } - return (orig as (...a: unknown[]) => unknown)(...args) + b[prefix] = this.recordingNamespaceProxy(original, prefix, []) + }) + } + + /** + * Recording Proxy over one assert/verify namespace. A function property + * becomes a call-time recorder keyed by its full dotted path + * (`titleContains`, `not.titleContains`); a nested namespace object recurses + * through the SAME wrapper — Nightwatch exposes `assert.not` as its own Proxy, + * so negated asserts are recorded via the identical mechanism as positive + * ones instead of a parallel path. The recorder buffers a pending row, then + * delegates to the ORIGINAL method so Nightwatch's queue, chaining, and + * abort/negate semantics stay byte-for-byte unchanged. Non-method, + * non-namespace props pass through untouched. + */ + private recordingNamespaceProxy( + target: object, + prefix: 'assert' | 'verify', + path: readonly string[] + ): object { + return new Proxy(target, { + get: (t, name, receiver) => { + const orig = Reflect.get(t, name, receiver) + if (typeof name !== 'string') { + return orig + } + if (orig !== null && typeof orig === 'object') { + return this.recordingNamespaceProxy(orig, prefix, [...path, name]) + } + if (typeof orig !== 'function') { + return orig + } + return (...args: unknown[]) => { + const callInfo = getCallSourceFromStack() + if (callInfo.filePath !== undefined) { + this.emitPendingAssertion({ + prefix, + method: [...path, name].join('.'), + args, + callSource: callInfo.callSource, + timestamp: Date.now() + }) } + return (orig as (...a: unknown[]) => unknown)(...args) } - }) + } }) } diff --git a/packages/nightwatch-devtools/tests/browserProxy.test.ts b/packages/nightwatch-devtools/tests/browserProxy.test.ts index d69ffcf3..d6b7605d 100644 --- a/packages/nightwatch-devtools/tests/browserProxy.test.ts +++ b/packages/nightwatch-devtools/tests/browserProxy.test.ts @@ -1,5 +1,9 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' -import type { CommandLog, NightwatchBrowser } from '../src/types.js' +import type { + CommandLog, + NightwatchBrowser, + NightwatchCurrentTest +} from '../src/types.js' // browserProxy resolves the caller's source via this helper; stub it so each // test can decide whether the command looks user-issued or framework-internal. @@ -10,6 +14,7 @@ const { getCallSourceFromStack } = vi.hoisted(() => ({ vi.mock('../src/helpers/utils.js', () => ({ getCallSourceFromStack })) import { BrowserProxy } from '../src/helpers/browserProxy.js' +import { captureNativeAssertions } from '../src/helpers/nativeAssertions.js' import type { SessionCapturer } from '../src/session.js' import type { TestManager } from '../src/helpers/testManager.js' @@ -39,16 +44,24 @@ function makeCapturer() { return true } ) + const captureAssertCommand = vi.fn( + (entry: CommandLog & { _id?: number; id?: number }) => { + entry._id = counter++ + entry.id = entry._id + commandsLog.push(entry) + } + ) const capturer = { commandsLog, captureCommand, + captureAssertCommand, replaceCommand: vi.fn(), sendCommand: vi.fn(), sendReplaceCommand: vi.fn(), takeScreenshotViaHttp: vi.fn(async () => null), captureTrace: vi.fn(async () => {}) } as unknown as SessionCapturer - return { capturer, commandsLog, captureCommand } + return { capturer, commandsLog, captureCommand, captureAssertCommand } } function makeTestManager() { @@ -166,3 +179,86 @@ describe('BrowserProxy captureAssertions gating', () => { expect(browser.verify).not.toBe(originalVerify) }) }) + +describe('BrowserProxy negated native assertions (assert.not.* / verify.not.*)', () => { + beforeEach(() => { + getCallSourceFromStack.mockReset() + }) + + /** Browser whose assert/verify mirror Nightwatch's structure: a positive + * namespace plus a nested `not` namespace object (Nightwatch exposes the + * negation as its own Proxy). Each leaf method records so the test can assert + * the wrapper still delegates to the real negated method. */ + function makeNegatableAssertBrowser() { + const record: string[] = [] + const ns = (label: string) => ({ + titleContains: vi.fn(() => { + record.push(`${label}titleContains`) + }) + }) + const browser = { + assert: { ...ns(''), not: ns('not.') }, + verify: { ...ns(''), not: ns('not.') } + } as unknown as NightwatchBrowser + return { browser, record } + } + + it('buffers a negated assert with a negation-reflecting label and finalizes its outcome', async () => { + const { capturer, commandsLog } = makeCapturer() + getCallSourceFromStack.mockReturnValue({ + filePath: '/tests/spec.js', + callSource: '/tests/spec.js:9' + }) + const proxy = new BrowserProxy(capturer, makeTestManager(), () => ({ + uid: 't1' + })) + const { browser, record } = makeNegatableAssertBrowser() + proxy.wrapBrowserCommands(browser) + + // browser.assert.not.titleContains('Example') — a negated call from user code. + ;( + browser as unknown as { + assert: { not: { titleContains: (a: unknown) => unknown } } + } + ).assert.not.titleContains('Example') + + // Delegated to the ORIGINAL negated method (Nightwatch semantics unchanged). + expect(record).toEqual(['not.titleContains']) + + // Buffered exactly one recorded call, keyed by its full dotted path — so the + // negation is captured through the SAME mechanism as positive asserts. + const calls = proxy.drainNativeAssertCalls() + expect(calls).toHaveLength(1) + expect(calls[0].prefix).toBe('assert') + expect(calls[0].method).toBe('not.titleContains') + expect(calls[0].args).toEqual(['Example']) + expect(calls[0].callSource).toBe('/tests/spec.js:9') + expect(calls[0].entry?.command).toBe('assert.not.titleContains') + expect(calls[0].entry?.title).toBe("assert.not.titleContains('Example')") + + // Reconciled at test-end through the same finalize path as positive asserts: + // a failing negated entry yields one row with the negated label + fail outcome. + const results = { + assertions: [ + { + message: "Testing if the page title doesn't contain 'Example'", + fullMsg: "Testing if the page title doesn't contain 'Example'", + failure: + "Testing if the page title doesn't contain 'Example' — failed" + } + ], + commands: [] + } + const currentTest = { + name: 't', + results + } as unknown as NightwatchCurrentTest + await captureNativeAssertions(capturer, browser, currentTest, 't1', calls) + + const row = commandsLog[commandsLog.length - 1] + expect(row.command).toBe('assert.not.titleContains') + expect(row.title).toBe("assert.not.titleContains('Example')") + expect(row.result).toMatchObject({ passed: false }) + expect(row.error).toBeDefined() + }) +}) From 98af19aa55b2ecc4a88b660fe906c747a45ae542 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 15:06:05 +0530 Subject: [PATCH 055/109] refactor(service): extract assertion capture into AssertionTracker --- packages/service/src/assertion-tracker.ts | 187 ++++++++++++++++++++++ packages/service/src/index.ts | 171 +++----------------- 2 files changed, 205 insertions(+), 153 deletions(-) create mode 100644 packages/service/src/assertion-tracker.ts diff --git a/packages/service/src/assertion-tracker.ts b/packages/service/src/assertion-tracker.ts new file mode 100644 index 00000000..b0ab2f3d --- /dev/null +++ b/packages/service/src/assertion-tracker.ts @@ -0,0 +1,187 @@ +// Owns the expect-webdriverio matcher lifecycle for the WDIO worker: the matcher +// nesting depth and the pending-matcher state machine that turns a matcher call +// into a single trace row. Pure CommandLog shaping lives in ./assert-capture. + +import logger from '@wdio/logger' +import { errorMessage } from '@wdio/devtools-core' +import type { ActionSnapshot } from '@wdio/devtools-shared' +import { + captureExpectFailure, + expectAssertionToCommandLog, + isMatcherReadCommand, + type ExpectAssertion +} from './assert-capture.js' +import { pushActionSnapshotAt } from './action-snapshot.js' +import { isNativeMobile } from './mobile.js' +import type { SessionCapturer } from './session.js' +import type { ServiceOptions } from './types.js' + +const log = logger('@wdio/devtools-service:assertion-tracker') + +/** Live accessors into the owning service's state. The capturer is replaced in + * before() and the browser/test uid change per test, so each is read lazily. */ +export interface AssertionTrackerContext { + getCapturer: () => SessionCapturer + getBrowser: () => WebdriverIO.Browser | undefined + getTestUid: () => string | undefined + options: ServiceOptions + actionSnapshots: ActionSnapshot[] +} + +interface PendingAssertion { + matcherName: string + expectedValue?: unknown + testUid?: string +} + +export class AssertionTracker { + #ctx: AssertionTrackerContext + + /** expect-webdriverio matcher nesting depth. Aliases fire before/afterAssertion + * twice (toBeChecked→toBeSelected), so only the outermost pair owns the row. */ + #assertionDepth = 0 + + /** Matcher armed at beforeAssertion, cleared at its afterAssertion. It survives + * to test end only when the matcher hard-threw (element never resolved, so + * waitUntil rethrew and afterAssertion never fired) — then it's synthesized as + * a failing expect.<matcher> row instead of leaving a raw read. */ + #pendingAssertion?: PendingAssertion + + constructor(ctx: AssertionTrackerContext) { + this.#ctx = ctx + } + + /** Clear per-test matcher state; called from the service's resetStack. */ + reset(): void { + this.#assertionDepth = 0 + this.#pendingAssertion = undefined + } + + /** + * expect-webdriverio fires this at the START of every matcher, before it polls + * — so it fires even for a matcher that later hard-throws (element never + * resolved), unlike afterAssertion. Arm the pending matcher here so test-end + * can synthesize its expect row if afterAssertion never comes. Depth-counted: + * aliases (toBeChecked→toBeSelected) fire this twice, so only the outermost + * arms the row. + */ + beforeAssertion(params: { + matcherName: string + expectedValue?: unknown + }): void { + if (this.#ctx.options.captureAssertions === false) { + return + } + if (this.#assertionDepth === 0) { + this.#pendingAssertion = { + matcherName: params.matcherName, + expectedValue: params.expectedValue, + testUid: this.#ctx.getTestUid() + } + } + this.#assertionDepth++ + } + + /** + * expect-webdriverio fires this after each matcher evaluates, with the matcher + * name + pass/fail + expected value. The matcher's value-read (getText / + * isExisting / …) was captured as a normal command; fold this assertion into + * that read so one `expect.<matcher>` row remains — inheriting the read's real + * callSource, screenshot, and timeline position. Deterministic and anchored to + * this reliable hook: no `#assertionDepth`, no stack-frame detection. + */ + async afterAssertion(params: ExpectAssertion): Promise<void> { + if (this.#ctx.options.captureAssertions === false) { + return + } + this.#assertionDepth = Math.max(0, this.#assertionDepth - 1) + // Inner matcher of a nested pair (toBeChecked→toBeSelected): the outer + // afterAssertion owns the row. + if (this.#assertionDepth > 0) { + return + } + // Reached afterAssertion → the matcher resolved (pass or value-fail), so no + // hard-throw synthesis is needed at test end. + this.#pendingAssertion = undefined + const capturer = this.#ctx.getCapturer() + const entry = expectAssertionToCommandLog(params, this.#ctx.getTestUid()) + if (capturer.coalesceAssertionIntoLastRead(entry, isMatcherReadCommand)) { + return + } + // No matcher read to fold into (a value matcher like toBe(x), or the read + // hard-threw): emit a fresh row with its own screenshot + trace snapshot. + const browser = this.#ctx.getBrowser() + if (browser && !isNativeMobile(browser)) { + try { + entry.screenshot = await browser.takeScreenshot() + } catch (err) { + // best-effort: a missing screenshot must not fail the assertion hook + log.debug(`assertion screenshot skipped: ${errorMessage(err)}`) + } + } + if (this.#ctx.options.mode === 'trace' && browser) { + await pushActionSnapshotAt( + browser, + entry.command, + entry.timestamp, + this.#ctx.actionSnapshots + ) + } + capturer.captureAssertCommand(entry) + } + + /** Route a test/step failure to assertion capture. A matcher that hard-threw + * (element never resolved) left an armed pendingAssertion because + * afterAssertion never fired — synthesize its failing expect row. Any other + * failure just marks the last action with the error. */ + handleOutcome(error: unknown): void { + if (this.#ctx.options.captureAssertions === false) { + return + } + if (this.#pendingAssertion) { + this.#finalizePendingAssertion(error) + return + } + this.#captureExpectFailure(error) + } + + /** Mark the failing action from a matcher error (afterStep for Cucumber, + * afterTest for Mocha route here). */ + #captureExpectFailure(error: unknown): void { + captureExpectFailure( + this.#ctx.getCapturer(), + this.#ctx.getTestUid(), + error, + this.#ctx.options.captureAssertions !== false + ) + } + + /** Synthesize the failing expect.<matcher> row for a hard-thrown matcher: fold + * it into the throwing read (relabel `getText`→`expect.toHaveText`, keeping + * the error) so the assertion renders consistently whether or not the element + * resolved; fall back to a fresh row when there is no read to fold. */ + #finalizePendingAssertion(error: unknown): void { + const pending = this.#pendingAssertion + this.#pendingAssertion = undefined + this.#assertionDepth = 0 + if (!pending) { + return + } + const message = errorMessage(error) || `${pending.matcherName} failed` + const entry = expectAssertionToCommandLog( + { + matcherName: pending.matcherName, + expectedValue: pending.expectedValue, + result: { pass: false, message: () => message } + }, + pending.testUid + ) + const capturer = this.#ctx.getCapturer() + if ( + capturer.coalesceAssertionIntoLastRead(entry, isMatcherReadCommand, true) + ) { + return + } + capturer.captureAssertCommand(entry) + } +} diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 0b1bcf71..e2d770c1 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -12,13 +12,8 @@ import { type SpecRange, type TraceExportContext } from '@wdio/devtools-core' -import { - captureExpectFailure, - expectAssertionToCommandLog, - isMatcherReadCommand, - wireAssertCapture, - type ExpectAssertion -} from './assert-capture.js' +import { wireAssertCapture, type ExpectAssertion } from './assert-capture.js' +import { AssertionTracker } from './assertion-tracker.js' import { cucumberScenarioUid, resolveTestAttempt, @@ -30,8 +25,7 @@ import { resolveCallSourceFromFrame } from './call-source.js' import { flushPrevSlice, flushTestSlice } from './trace-slices.js' import { captureActionResult, - captureActionSnapshot, - pushActionSnapshotAt + captureActionSnapshot } from './action-snapshot.js' import { dedupeSnapshotsByTimestamp, @@ -80,9 +74,17 @@ export default class DevToolsHookService implements Services.ServiceInstance { #screencastOptions?: ScreencastOptions #options: ServiceOptions #actionSnapshots: ActionSnapshot[] = [] + #assertionTracker: AssertionTracker constructor(serviceOptions: ServiceOptions = {}) { this.#options = serviceOptions + this.#assertionTracker = new AssertionTracker({ + getCapturer: () => this.#sessionCapturer, + getBrowser: () => this.#browser, + getTestUid: () => this.#currentTestUid, + options: this.#options, + actionSnapshots: this.#actionSnapshots + }) const policyWarning = tracePolicyModeWarning( serviceOptions.tracePolicy, serviceOptions.mode @@ -107,20 +109,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Current test UID, set in beforeTest(), used by afterCommand() to tag commands. */ #currentTestUid?: string - /** expect-webdriverio matcher nesting depth. Aliases fire before/afterAssertion - * twice (toBeChecked→toBeSelected), so only the outermost pair owns the row. */ - #assertionDepth = 0 - - /** Matcher armed at beforeAssertion, cleared at its afterAssertion. It survives - * to test end only when the matcher hard-threw (element never resolved, so - * waitUntil rethrew and afterAssertion never fired) — then it's synthesized as - * a failing expect.<matcher> row instead of leaving a raw read. */ - #pendingAssertion?: { - matcherName: string - expectedValue?: unknown - testUid?: string - } - /** Map of testUid → metadata for trace group events and per-spec partitioning. */ #testMetadata: TestMetadataMap = new Map() @@ -405,65 +393,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { _scenario?: unknown, result?: { error?: unknown } ) { - this.#handleAssertionOutcome(result?.error) - } - - /** Route a test/step failure to assertion capture. A matcher that hard-threw - * (element never resolved) left an armed #pendingAssertion because - * afterAssertion never fired — synthesize its failing expect row. Any other - * failure just marks the last action with the error. */ - #handleAssertionOutcome(error: unknown): void { - if (this.#options.captureAssertions === false) { - return - } - if (this.#pendingAssertion) { - this.#finalizePendingAssertion(error) - return - } - this.#captureExpectFailure(error) - } - - /** Synthesize the failing expect.<matcher> row for a hard-thrown matcher: fold - * it into the throwing read (relabel `getText`→`expect.toHaveText`, keeping - * the error) so the assertion renders consistently whether or not the element - * resolved; fall back to a fresh row when there is no read to fold. */ - #finalizePendingAssertion(error: unknown): void { - const pending = this.#pendingAssertion - this.#pendingAssertion = undefined - this.#assertionDepth = 0 - if (!pending) { - return - } - const message = errorMessage(error) || `${pending.matcherName} failed` - const entry = expectAssertionToCommandLog( - { - matcherName: pending.matcherName, - expectedValue: pending.expectedValue, - result: { pass: false, message: () => message } - }, - pending.testUid - ) - if ( - this.#sessionCapturer.coalesceAssertionIntoLastRead( - entry, - isMatcherReadCommand, - true - ) - ) { - return - } - this.#sessionCapturer.captureAssertCommand(entry) - } - - /** Mark the failing action from a matcher error (afterStep for Cucumber, - * afterTest for Mocha route here). */ - #captureExpectFailure(error: unknown): void { - captureExpectFailure( - this.#sessionCapturer, - this.#currentTestUid, - error, - this.#options.captureAssertions !== false - ) + this.#assertionTracker.handleOutcome(result?.error) } /** Stamp final state + the resolved 0-based attempt onto the test's metadata @@ -498,7 +428,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { _context?: unknown, result?: TestOutcomeResult ) { - this.#handleAssertionOutcome(result?.error) + this.#assertionTracker.handleOutcome(result?.error) const testTitle = test?.fullTitle || test?.title const uid = testTitle ? testMetadataUid(test?.file, testTitle) : undefined if (uid) { @@ -511,80 +441,16 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** - * expect-webdriverio fires this after each matcher evaluates, with the matcher - * name + pass/fail + expected value. The matcher's value-read (getText / - * isExisting / …) was captured as a normal command; fold this assertion into - * that read so one `expect.<matcher>` row remains — inheriting the read's real - * callSource, screenshot, and timeline position. Deterministic and anchored to - * this reliable hook: no `#assertionDepth`, no stack-frame detection. - */ - /** - * expect-webdriverio fires this at the START of every matcher, before it polls - * — so it fires even for a matcher that later hard-throws (element never - * resolved), unlike afterAssertion. Arm the pending matcher here so test-end - * can synthesize its expect row if afterAssertion never comes. Depth-counted: - * aliases (toBeChecked→toBeSelected) fire this twice, so only the outermost - * arms the row. - */ + /** expect-webdriverio matcher hooks — delegated to the assertion tracker. */ beforeAssertion(params: { matcherName: string expectedValue?: unknown }): void { - if (this.#options.captureAssertions === false) { - return - } - if (this.#assertionDepth === 0) { - this.#pendingAssertion = { - matcherName: params.matcherName, - expectedValue: params.expectedValue, - testUid: this.#currentTestUid - } - } - this.#assertionDepth++ + this.#assertionTracker.beforeAssertion(params) } - async afterAssertion(params: ExpectAssertion): Promise<void> { - if (this.#options.captureAssertions === false) { - return - } - this.#assertionDepth = Math.max(0, this.#assertionDepth - 1) - // Inner matcher of a nested pair (toBeChecked→toBeSelected): the outer - // afterAssertion owns the row. - if (this.#assertionDepth > 0) { - return - } - // Reached afterAssertion → the matcher resolved (pass or value-fail), so no - // hard-throw synthesis is needed at test end. - this.#pendingAssertion = undefined - const entry = expectAssertionToCommandLog(params, this.#currentTestUid) - if ( - this.#sessionCapturer.coalesceAssertionIntoLastRead( - entry, - isMatcherReadCommand - ) - ) { - return - } - // No matcher read to fold into (a value matcher like toBe(x), or the read - // hard-threw): emit a fresh row with its own screenshot + trace snapshot. - if (this.#browser && !isNativeMobile(this.#browser)) { - try { - entry.screenshot = await this.#browser.takeScreenshot() - } catch (err) { - // best-effort: a missing screenshot must not fail the assertion hook - log.debug(`assertion screenshot skipped: ${errorMessage(err)}`) - } - } - if (this.#options.mode === 'trace' && this.#browser) { - await pushActionSnapshotAt( - this.#browser, - entry.command, - entry.timestamp, - this.#actionSnapshots - ) - } - this.#sessionCapturer.captureAssertCommand(entry) + afterAssertion(params: ExpectAssertion): Promise<void> { + return this.#assertionTracker.afterAssertion(params) } async #finalizePerScenario() { @@ -615,8 +481,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { private resetStack() { this.#commandStack = [] - this.#assertionDepth = 0 - this.#pendingAssertion = undefined + this.#assertionTracker.reset() this.#sessionCapturer.resetLastSelector() this.#sessionCapturer.resetRetryTracker() } From 0a54e8a4f1c29a05b4e766fd5ebe421d4b6be3fa Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 16:37:17 +0530 Subject: [PATCH 056/109] docs: sync WDIO assert-capture debt to the fold model; drop fixed entries --- CLAUDE.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 1f33103e..007cc486 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -233,22 +233,19 @@ Documented divergences from the conventions above. They exist today as debt to b ### Architecture - `replaceCommand` has two semantics — Selenium mutates in place (preserves `_id`/`id` for chained calls); Nightwatch splices and reissues. Both call the same `core/suite-helpers` factories; the storage strategy stays adapter-specific because runner integrations differ. Could be unified by parameterizing the policy if the divergence ever causes a real problem. -- `patchNodeAssert` (via `core/assert-patcher`) is now wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`). Framework matcher libraries differ: Service additionally taps expect-webdriverio's `afterAssertion` hook so passing+failing matchers render as `expect.*` actions; Selenium (chai/jest) and Nightwatch (`browser.assert`/`verify`) don't yet surface passing framework-matcher assertions as trace actions. +- `patchNodeAssert` (via `core/assert-patcher`) is now wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`). Framework matcher libraries differ: Service taps expect-webdriverio's `beforeAssertion`/`afterAssertion` hooks so passing+failing matchers render as `expect.*` actions (mechanism in the assert-capture entry below); Nightwatch native `assert`/`verify` and Selenium's `node:assert` also surface passing+failing rows via their reconcile/patch paths. The remaining gap is Selenium's jest-style `expect()` (and chai): jest/vitest expose no pass+fail assertion hook, so only failing matchers surface there. - BiDi is auto-attached in Service and Selenium; Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities. - Retry-aware trace policies aren't uniform across adapters. Selenium emits one metadata entry per attempt (counter-based `generateStableUid` uid + retry-stable tracker key), so all six policies — including `retain-on-first-failure` (needs the first attempt's outcome) — evaluate correctly. Service and Nightwatch key metadata on the retry-stable uid and overwrite/mutate per attempt, collapsing to the *final* attempt's outcome; the retry-count policies (`retain-on-failure`, `on-first-retry`, `on-all-retries`, `retain-on-failure-and-retries`) are still correct, but `retain-on-first-failure` can't see a failed-then-passed first attempt and under-retains. Proper fix rides with B5 (per-test granularity preserves per-attempt slices); until then all three set `attemptInfoAvailable: true`. -- Nightwatch negated native asserts (`browser.assert.not.*` / `verify.not.*`) produce no trace row: the `not` namespace is a nested Proxy that `wrapAssertionNamespaces` passes through untouched, and the internal command it issues is dropped by the `hasUserSource` gate in `browserProxy`. Positive `assert.*`/`verify.*` still record. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. - Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. -- Service assertion-suppression self-heal is command-triggered and gated on `#matcherStarted`: a swallowed soft-assert (`expect.soft` / user `try/catch`) whose matcher hard-throws leaves `#assertionDepth` stuck; the next top-level user command with no `expect-webdriverio` frame heals it — but only once the matcher has issued at least one internal (ewdio-framed) command, because the matcher's own FIRST command (an element re-lookup) also lacks a matcher frame on its sync stack and would otherwise reset the depth mid-run (duplicating every later matcher command). A stuck depth with no following command before test end persists until the next `beforeAssertion`/`resetStack()` — benign. -- Service captures the assertion **target's** element resolution as its own row. `expect(page.el).toHaveText(x)` evaluates `page.el` → `$('#sel')`/`$$` as the ARGUMENT to `expect()`, before `beforeAssertion` fires, so `#assertionDepth` is 0 and the `$`/`$$`/`isExisting` lands as a top-level command alongside the `expect.*` row. The in-window suppression can't reach it (it runs pre-window). Proper fix: coalesce a trailing element-query into the imminent assertion, or detect query-commands whose only consumer is the next matcher. -- Service `expect.*` rows can resolve `callSource` to the service bundle (`dist/index.js`) instead of the user's `expect()` line. `#assertionCallSources` captures the spec frame in `beforeAssertion`, but the matcher runs async, so in some cases the parallel stack doesn't hold a user frame and the fallback resolves into the service dist. The failure's own error stack still points at the spec. +- Service renders expect-webdriverio matchers as single `expect.<matcher>` rows by **folding**, not stack/depth suppression (the old `#assertionDepth`/`#matcherStarted`/self-heal machinery is gone). The matcher's value-read (`toHaveText`→`getText`, `toExist`→`isExisting`, …) is captured as a normal command; `afterAssertion` then coalesces the synthesized `expect.*` row into that read in place — inheriting its callSource, screenshot, and timeline position — and the fold replaces **by timestamp, never a public `id`**: `id` is the per-worker `commandCounter`, which resets per spec, so stamping one lets the app's id-first `replaceCommand` swap a same-id row from another spec (duplicate rows + a fold from another spec vanishing, in multi-spec live mode). `beforeAssertion` arms the pending matcher (depth-counted so aliases like `toBeChecked`→`toBeSelected` fold once); a matcher that **hard-throws** — element never resolves, so expect-webdriverio's `waitUntil` rethrows and `afterAssertion` never fires — is synthesized at `afterTest`/`afterStep` from the throwing read, so a failing assertion renders as `expect.<matcher>` whether or not the element existed. Two limits: its error is then the read's (`Can't call getText on … element wasn't found`), not an assertion-phrased message; and `MATCHER_READ_COMMANDS` is a hand-maintained allowlist, so a matcher whose read isn't listed leaves its raw read visible alongside the `expect.*` row. Plain-value jest matchers (`expect(x).toBe(y)`) don't fire the ewdio hooks, so they aren't captured as rows. ### File-size (raw line counts; soft cap is 500 logic lines) Most entries below don't trigger the `max-lines` lint rule after `skipBlankLines`/`skipComments`; they're documented because their raw line count is over 500, and the next substantive change to any of them should still look for an extraction opportunity. The service plugin is the exception — it's now over the *logic*-line cap. -- `packages/service/src/index.ts` — over the 500-**logic**-line soft cap (the WDIO plugin god-file: session/screencast/command/assertion/trace-slice wiring in one class). Split candidate; the trace-slice, assertion-capture, and screencast concerns are the natural extraction seams. +- `packages/service/src/index.ts` — over the 500-**logic**-line soft cap and ~620 raw (the WDIO plugin god-file: session/screencast/command/assertion/trace-slice wiring in one class). The assertion-capture block (`beforeAssertion`/`afterAssertion`/`#handleAssertionOutcome`/`#finalizePendingAssertion`, plus the `#assertionDepth`/`#pendingAssertion` state) is now the largest self-contained seam and the prime extraction candidate; trace-slice and screencast are the next two. - `packages/nightwatch-devtools/src/index.ts` (~536 raw). Cucumber/test/run-lifecycle, session-init, event-hub modules already extracted; remainder is the `PluginInternals` accessor bag plus per-method delegators plus the factory. Accept-as-is. - `packages/selenium-devtools/src/index.ts` (~560 raw). Session/test-lifecycle extracted; remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Same situation as nightwatch. From c5f3f0defa0e8f404719cd8d204563ded4b58452 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 17:35:59 +0530 Subject: [PATCH 057/109] feat(core): per-attempt outcome ledger + group-by-test retention --- packages/core/src/attempt-tracker.ts | 97 +++++++++++++++++---- packages/core/src/trace-finalizer.ts | 32 ++++++- packages/core/src/trace-retention.ts | 60 +++++++++++-- packages/core/tests/attempt-tracker.test.ts | 75 ++++++++++++++++ packages/core/tests/trace-finalizer.test.ts | 44 ++++++++++ packages/core/tests/trace-retention.test.ts | 44 ++++++++++ 6 files changed, 326 insertions(+), 26 deletions(-) diff --git a/packages/core/src/attempt-tracker.ts b/packages/core/src/attempt-tracker.ts index e4915584..60bbdfa4 100644 --- a/packages/core/src/attempt-tracker.ts +++ b/packages/core/src/attempt-tracker.ts @@ -1,29 +1,71 @@ +import type { TestStatus } from '@wdio/devtools-shared' +import type { TestOutcome } from './trace-retention.js' + /** - * Framework-agnostic per-test attempt counting. Every supported runner - * re-enters its per-test start hook when a test is retried, so recording the - * same uid again yields an incremented attempt number (0-based: the first run - * is attempt 0, the first retry is attempt 1). This is the primary, - * runner-independent retry signal feeding `TestOutcome.attempt` for the - * retry-aware trace policies (see trace-retention.ts). + * Framework-agnostic per-test attempt ledger. Every supported runner re-enters + * its per-test start hook when a test is retried, so recording the same uid + * again appends a new attempt slot (0-based: first run is attempt 0, first retry + * is attempt 1). Once the outcome is known the adapter stamps it onto the slot. + * This is the primary, runner-independent retry signal feeding the retry-aware + * trace policies — the finalizer reads the scoped views to evaluate retention + * per test/spec/session with real per-attempt outcomes (see trace-retention.ts). */ -export class TestAttemptTracker { - #attempts = new Map<string, number>() +export interface RetryOutcomeView { + /** Every attempt of every test — for session-scope retention. */ + all(): TestOutcome[] + /** Every attempt of the tests recorded against `specFile` — for spec scope. */ + forSpec(specFile: string): TestOutcome[] + /** A single test's attempts; pass `attempt` to scope to one attempt's slice. */ + forTest(uid: string, attempt?: number): TestOutcome[] +} + +export class TestAttemptTracker implements RetryOutcomeView { + #ledger = new Map<string, { specFile?: string; attempts: TestOutcome[] }>() #sawRetry = false - /** Record a starting test; returns its attempt number (0 first, +1 per rerun). */ - recordStart(uid: string): number { - const prior = this.#attempts.get(uid) - const attempt = prior === undefined ? 0 : prior + 1 - this.#attempts.set(uid, attempt) + /** Record a starting test; returns its attempt number (0 first, +1 per rerun). + * `specFile` (optional) enables spec-scoped retention lookups. */ + recordStart(uid: string, specFile?: string): number { + const entry = this.#ledger.get(uid) + const attempt = entry ? entry.attempts.length : 0 if (attempt > 0) { this.#sawRetry = true } + const slot: TestOutcome = { uid, attempt } + if (entry) { + entry.attempts.push(slot) + if (specFile !== undefined) { + entry.specFile = specFile + } + } else { + this.#ledger.set(uid, { specFile, attempts: [slot] }) + } return attempt } + /** Stamp the resolved state onto uid's most recent attempt slot once the + * outcome is known. `attempt` overrides the slot's number when the adapter + * resolved a more authoritative value (e.g. WDIO's result.retries). */ + recordOutcome( + uid: string, + state: TestStatus | undefined, + attempt?: number + ): void { + const attempts = this.#ledger.get(uid)?.attempts + const slot = attempts?.[attempts.length - 1] + if (!slot) { + return + } + slot.state = state + if (attempt !== undefined) { + slot.attempt = attempt + } + } + /** Latest attempt recorded for `uid`, or undefined if it never started. */ attemptFor(uid: string): number | undefined { - return this.#attempts.get(uid) + const entry = this.#ledger.get(uid) + return entry ? entry.attempts.length - 1 : undefined } /** True once any test has started more than once (a retry occurred). */ @@ -31,9 +73,34 @@ export class TestAttemptTracker { return this.#sawRetry } + all(): TestOutcome[] { + const out: TestOutcome[] = [] + for (const entry of this.#ledger.values()) { + out.push(...entry.attempts) + } + return out + } + + forSpec(specFile: string): TestOutcome[] { + const out: TestOutcome[] = [] + for (const entry of this.#ledger.values()) { + if (entry.specFile === specFile) { + out.push(...entry.attempts) + } + } + return out + } + + forTest(uid: string, attempt?: number): TestOutcome[] { + const attempts = this.#ledger.get(uid)?.attempts ?? [] + return attempt === undefined + ? attempts + : attempts.filter((a) => a.attempt === attempt) + } + /** Clear all state — used at session boundaries and reuse-mode reconnects. */ reset(): void { - this.#attempts.clear() + this.#ledger.clear() this.#sawRetry = false } } diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index f0459590..a07286af 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -23,6 +23,7 @@ import { type SpecRange } from './spec-trace-helpers.js' import { shouldRetainTrace, type TestOutcome } from './trace-retention.js' +import type { RetryOutcomeView } from './attempt-tracker.js' import { writeTraceZip, type TraceCapturer } from './trace-exporter.js' /** One artifact produced (or, when `retained` is false, decided-against) by a @@ -45,6 +46,13 @@ export interface TraceExportContext { /** True when the adapter fed real per-test attempt numbers (B4); retry-aware * policies degrade to retain-on-failure when this is false. */ attemptInfoAvailable?: boolean + /** Per-attempt outcome ledger. When present, retention is evaluated against + * real per-attempt outcomes (scoped per session/spec/test) instead of the + * collapsed final-attempt state in `testMetadata` — this is what lets + * retain-on-first-failure see a failed-then-passed first attempt and stops + * retain-on-failure over-retaining it. Absent → falls back to `testMetadata` + * (unchanged behavior). */ + outcomes?: RetryOutcomeView granularity?: TraceGranularity format?: TraceFormat capturer: TraceCapturer @@ -153,14 +161,22 @@ function toOutcomes(metadata: TestMetadataMap): TestOutcome[] { */ function shouldRetain( ctx: TraceExportContext, - metadata: TestMetadataMap + metadata: TestMetadataMap, + ledgerOutcomes?: TestOutcome[] ): boolean { return shouldRetainTrace(ctx.policy, { - outcomes: toOutcomes(metadata), + outcomes: ledgerOutcomes ?? toOutcomes(metadata), attemptInfoAvailable: ctx.attemptInfoAvailable ?? false }).retain } +/** Attempt number encoded in a test-slice key (`<uid>-retry<n>`); 0 when the + * key is the base uid (the first attempt / no retry suffix). */ +function attemptFromKey(key: string): number { + const match = /-retry(\d+)$/.exec(key) + return match ? Number(match[1]) : 0 +} + /** * Policy-aware single-range flush: dedupes via `ctx.flushed` on the slice * `key`, applies the retention decision, and delegates the byte-level @@ -182,13 +198,21 @@ export async function flushRangeTrace( const sliceMetadata = isTestSlice ? filterTestMetadataByUid(ctx.testMetadata, range.testUid!) : filterTestMetadataBySpec(ctx.testMetadata, range.specFile) + // Scope the per-attempt ledger to this slice: a test slice sees only its own + // attempt (so a passing retry's slice isn't retained on first-failure), a spec + // slice sees every attempt of its tests. + const sliceOutcomes = ctx.outcomes + ? isTestSlice + ? ctx.outcomes.forTest(range.testUid!, attemptFromKey(range.key)) + : ctx.outcomes.forSpec(range.specFile) + : undefined const artifact: TraceArtifact = { kind: 'trace', path: '', scope: isTestSlice ? 'test' : 'spec', key: range.key, testUids: Array.from(sliceMetadata.keys()), - retained: shouldRetain(ctx, sliceMetadata) + retained: shouldRetain(ctx, sliceMetadata, sliceOutcomes) } if (!artifact.retained) { ctx.onArtifact?.(artifact) @@ -255,7 +279,7 @@ async function writeSessionTrace( path: '', scope: 'session', testUids: Array.from(ctx.testMetadata.keys()), - retained: shouldRetain(ctx, ctx.testMetadata) + retained: shouldRetain(ctx, ctx.testMetadata, ctx.outcomes?.all()) } if (!artifact.retained) { ctx.onArtifact?.(artifact) diff --git a/packages/core/src/trace-retention.ts b/packages/core/src/trace-retention.ts index 6688dfcb..cdc35013 100644 --- a/packages/core/src/trace-retention.ts +++ b/packages/core/src/trace-retention.ts @@ -23,6 +23,10 @@ const KNOWN_POLICIES = new Set<TraceRetentionPolicy>([ ]) export interface TestOutcome { + /** Retry-stable test identity. Outcomes sharing a uid are one test's attempts + * (attempt 0, 1, …); an outcome with no uid is its own single-attempt group, + * so a flat/uid-less feed evaluates exactly as one-outcome-per-test. */ + uid?: string state?: TestStatus attempt?: number } @@ -56,26 +60,68 @@ export function shouldRetainTrace( if (!input.attemptInfoAvailable && policy !== 'retain-on-failure') { return { retain: anyFailed, degradedToFailure: true } } + // Group a test's attempts so failure policies key on the RIGHT attempt: the + // *final* attempt (retain-on-failure — a fail-then-pass ends passed) vs the + // *first* attempt (retain-on-first-failure). A uid-less feed makes every + // outcome its own group, so this reduces to the flat one-outcome-per-test + // logic and is byte-identical for callers that don't supply per-attempt uids. + const groups = groupByTest(outcomes) switch (policy) { case 'retain-on-failure': - return { retain: anyFailed } + return { retain: groups.some((g) => finalAttempt(g).state === 'failed') } case 'retain-on-first-failure': return { - retain: outcomes.some( - (o) => o.state === 'failed' && (o.attempt ?? 0) === 0 - ) + retain: groups.some((g) => firstAttempt(g)?.state === 'failed') } case 'on-first-retry': - return { retain: outcomes.some((o) => o.attempt === 1) } + return { retain: groups.some((g) => g.some((o) => o.attempt === 1)) } case 'on-all-retries': - return { retain: outcomes.some((o) => (o.attempt ?? 0) >= 1) } + return { retain: groups.some((g) => g.some((o) => attemptOf(o) >= 1)) } case 'retain-on-failure-and-retries': return { - retain: anyFailed || outcomes.some((o) => (o.attempt ?? 0) >= 1) + retain: groups.some( + (g) => + finalAttempt(g).state === 'failed' || + g.some((o) => attemptOf(o) >= 1) + ) } } } +const attemptOf = (o: TestOutcome): number => o.attempt ?? 0 + +/** Group outcomes by `uid`; a uid-less outcome becomes its own singleton group + * (preserving flat, one-outcome-per-test evaluation for callers without uids). */ +function groupByTest(outcomes: TestOutcome[]): TestOutcome[][] { + const byUid = new Map<string, TestOutcome[]>() + const groups: TestOutcome[][] = [] + for (const outcome of outcomes) { + if (outcome.uid === undefined) { + groups.push([outcome]) + continue + } + const existing = byUid.get(outcome.uid) + if (existing) { + existing.push(outcome) + } else { + const group = [outcome] + byUid.set(outcome.uid, group) + groups.push(group) + } + } + return groups +} + +/** The highest-numbered attempt's outcome — the test's final result. */ +function finalAttempt(group: TestOutcome[]): TestOutcome { + return group.reduce((best, o) => (attemptOf(o) >= attemptOf(best) ? o : best)) +} + +/** The attempt-0 outcome, if the group recorded one. */ +function firstAttempt(group: TestOutcome[]): TestOutcome | undefined { + return group.find((o) => attemptOf(o) === 0) +} + /** * Warning text when a retention policy is configured outside trace mode, where * it has no effect (the finalizer no-ops in live mode). Returns undefined when diff --git a/packages/core/tests/attempt-tracker.test.ts b/packages/core/tests/attempt-tracker.test.ts index 5d9a44b4..012fbaf7 100644 --- a/packages/core/tests/attempt-tracker.test.ts +++ b/packages/core/tests/attempt-tracker.test.ts @@ -43,4 +43,79 @@ describe('TestAttemptTracker', () => { expect(t.attemptFor('a')).toBeUndefined() expect(t.recordStart('a')).toBe(0) }) + + describe('outcome ledger', () => { + it('records per-attempt outcomes with uid + attempt for a retried test', () => { + const t = new TestAttemptTracker() + t.recordStart('a', 'login.spec.ts') + t.recordOutcome('a', 'failed') + t.recordStart('a', 'login.spec.ts') + t.recordOutcome('a', 'passed') + expect(t.forTest('a')).toEqual([ + { uid: 'a', attempt: 0, state: 'failed' }, + { uid: 'a', attempt: 1, state: 'passed' } + ]) + }) + + it('recordOutcome stamps only the latest attempt slot', () => { + const t = new TestAttemptTracker() + t.recordStart('a') + t.recordOutcome('a', 'passed') + t.recordStart('a') + t.recordOutcome('a', 'failed') + expect(t.forTest('a').map((o) => o.state)).toEqual(['passed', 'failed']) + }) + + it('recordOutcome can override the slot attempt (authoritative retry #)', () => { + const t = new TestAttemptTracker() + t.recordStart('a') + t.recordOutcome('a', 'failed', 3) + expect(t.forTest('a')).toEqual([ + { uid: 'a', attempt: 3, state: 'failed' } + ]) + }) + + it('forTest(uid, attempt) scopes to one attempt (per-slice retention)', () => { + const t = new TestAttemptTracker() + t.recordStart('a') + t.recordOutcome('a', 'failed') + t.recordStart('a') + t.recordOutcome('a', 'passed') + expect(t.forTest('a', 0)).toEqual([ + { uid: 'a', attempt: 0, state: 'failed' } + ]) + expect(t.forTest('a', 1)).toEqual([ + { uid: 'a', attempt: 1, state: 'passed' } + ]) + }) + + it('all() and forSpec() gather attempts across tests', () => { + const t = new TestAttemptTracker() + t.recordStart('a', 'one.spec.ts') + t.recordOutcome('a', 'failed') + t.recordStart('a', 'one.spec.ts') + t.recordOutcome('a', 'passed') + t.recordStart('b', 'two.spec.ts') + t.recordOutcome('b', 'passed') + expect(t.all()).toHaveLength(3) + expect(t.forSpec('one.spec.ts').map((o) => o.uid)).toEqual(['a', 'a']) + expect(t.forSpec('two.spec.ts')).toEqual([ + { uid: 'b', attempt: 0, state: 'passed' } + ]) + }) + + it('recordOutcome is a safe no-op for an unstarted uid', () => { + const t = new TestAttemptTracker() + expect(() => t.recordOutcome('ghost', 'failed')).not.toThrow() + expect(t.forTest('ghost')).toEqual([]) + }) + + it('reset clears the ledger too', () => { + const t = new TestAttemptTracker() + t.recordStart('a') + t.recordOutcome('a', 'failed') + t.reset() + expect(t.all()).toEqual([]) + }) + }) }) diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index 6d2b5013..a73df5d8 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -7,6 +7,7 @@ import { buildTestSliceFolder, finalizeTraceExport, flushRangeTrace, + TestAttemptTracker, type SpecRange, type TraceArtifact, type TraceCapturer, @@ -374,6 +375,49 @@ describe('finalizeTraceExport', () => { ) }) + // The ledger fix: collapsed testMetadata carries only the final (passed) + // attempt, so a metadata-only feed can't see the failed first attempt. The + // per-attempt ledger supplies both, so the failure policies key correctly. + function failThenPassLedger(): TestAttemptTracker { + const ledger = new TestAttemptTracker() + ledger.recordStart('u1', '/a.js') + ledger.recordOutcome('u1', 'failed') + ledger.recordStart('u1', '/a.js') + ledger.recordOutcome('u1', 'passed') + return ledger + } + const finalPassedMeta = meta([ + ['u1', { title: 'T', specFile: '/a.js', state: 'passed', attempt: 1 }] + ]) + + it('retain-on-first-failure retains a fail-then-pass via the ledger', async () => { + const result = await finalizeTraceExport( + baseCtx({ + policy: 'retain-on-first-failure', + attemptInfoAvailable: true, + outcomes: failThenPassLedger(), + testMetadata: finalPassedMeta + }) + ) + expect(result[0]!.retained).toBe(true) + expect(await exists(path.join(outputDir, 'trace-abcd1234.zip'))).toBe( + true + ) + }) + + it('retain-on-failure does NOT retain a fail-then-pass (final attempt passed)', async () => { + const result = await finalizeTraceExport( + baseCtx({ + policy: 'retain-on-failure', + attemptInfoAvailable: true, + outcomes: failThenPassLedger(), + testMetadata: finalPassedMeta + }) + ) + expect(result[0]!.retained).toBe(false) + expect(result[0]!.path).toBe('') + }) + // Session slice = OR over every test: one failure keeps the whole trace. it('session slice retains when ANY test failed under retain-on-failure', async () => { const result = await finalizeTraceExport( diff --git a/packages/core/tests/trace-retention.test.ts b/packages/core/tests/trace-retention.test.ts index f2e34f82..00982ea2 100644 --- a/packages/core/tests/trace-retention.test.ts +++ b/packages/core/tests/trace-retention.test.ts @@ -216,6 +216,50 @@ describe('shouldRetainTrace unknown policy (fail open)', () => { }) }) +describe('shouldRetainTrace groups a test’s attempts by uid', () => { + // One test, failed then passed on retry. + const failThenPass: TestOutcome[] = [ + { uid: 't', state: 'failed', attempt: 0 }, + { uid: 't', state: 'passed', attempt: 1 } + ] + // One test, passed then failed on retry. + const passThenFail: TestOutcome[] = [ + { uid: 't', state: 'passed', attempt: 0 }, + { uid: 't', state: 'failed', attempt: 1 } + ] + + it('retain-on-failure keys on the FINAL attempt, not any attempt', () => { + // Ends passed → not retained (flat any-failed logic over-retained here). + expect(retain('retain-on-failure', failThenPass)).toBe(false) + // Ends failed → retained. + expect(retain('retain-on-failure', passThenFail)).toBe(true) + }) + + it('retain-on-first-failure keys on attempt 0', () => { + // First attempt failed → retained even though it later passed. + expect(retain('retain-on-first-failure', failThenPass)).toBe(true) + // First attempt passed → not retained. + expect(retain('retain-on-first-failure', passThenFail)).toBe(false) + }) + + it('treats distinct uids as independent groups', () => { + const mixed: TestOutcome[] = [ + { uid: 'a', state: 'failed', attempt: 0 }, + { uid: 'a', state: 'passed', attempt: 1 }, + { uid: 'b', state: 'passed', attempt: 0 } + ] + // a ends passed, b passed → nothing to retain on final-attempt failure. + expect(retain('retain-on-failure', mixed)).toBe(false) + // a's first attempt failed → retained. + expect(retain('retain-on-first-failure', mixed)).toBe(true) + }) + + it('retry-count policies see the grouped attempts', () => { + expect(retain('on-first-retry', failThenPass)).toBe(true) + expect(retain('on-all-retries', passThenFail)).toBe(true) + }) +}) + describe('tracePolicyModeWarning', () => { it('warns when a policy is set outside trace mode', () => { expect(tracePolicyModeWarning('retain-on-failure', 'live')).toMatch( From 54e3bf3e84c27627ead21ce6d3744e2d37b92987 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 17:36:16 +0530 Subject: [PATCH 058/109] fix(service): feed the retention ledger for correct retry-aware policies --- packages/service/src/index.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index e2d770c1..be45c5f3 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -185,6 +185,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { capabilities: browser.capabilities, testMetadata: this.#testMetadata, attemptInfoAvailable: true, + outcomes: this.#attemptTracker, ranges: this.#specRanges, flushed: this.#flushedSpecs, resolveOutputDir: () => this.#outputDir, @@ -354,7 +355,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { // ── Test identity for command tagging ── if (uid && scenarioName && featureFile) { this.#currentTestUid = uid - this.#attemptTracker.recordStart(uid) + this.#attemptTracker.recordStart(uid, featureFile) this.#testMetadata.set(uid, { title: scenarioName, specFile: featureFile @@ -378,7 +379,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (uid && testTitle) { this.#currentTestUid = uid - this.#attemptTracker.recordStart(uid) + this.#attemptTracker.recordStart(uid, test?.file) this.#testMetadata.set(uid, { title: testTitle, specFile: test?.file ?? '' @@ -402,6 +403,13 @@ export default class DevToolsHookService implements Services.ServiceInstance { const fallback = this.#attemptTracker.attemptFor(uid) ?? 0 const attempt = resolveTestAttempt(result, fallback) stampTestState(this.#testMetadata, uid, result, attempt) + // Feed the per-attempt ledger so session/spec retention sees this attempt's + // real outcome, not just the final state that overwrites #testMetadata. + this.#attemptTracker.recordOutcome( + uid, + this.#testMetadata.get(uid)?.state, + attempt + ) } async afterScenario( From 8710e164092d68859c29b5f37d8aa744b0c650a5 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 17:45:52 +0530 Subject: [PATCH 059/109] fix(core): fall back to metadata when a scoped retention ledger view is empty --- packages/core/src/trace-finalizer.ts | 5 ++++- packages/core/tests/trace-finalizer.test.ts | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index a07286af..d69a2898 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -164,8 +164,11 @@ function shouldRetain( metadata: TestMetadataMap, ledgerOutcomes?: TestOutcome[] ): boolean { + // An empty scoped ledger view (adapter fed outcomes but not for this scope) + // falls back to metadata rather than fail-opening the evaluator into retaining + // everything — only a genuinely empty metadata slice fails open. return shouldRetainTrace(ctx.policy, { - outcomes: ledgerOutcomes ?? toOutcomes(metadata), + outcomes: ledgerOutcomes?.length ? ledgerOutcomes : toOutcomes(metadata), attemptInfoAvailable: ctx.attemptInfoAvailable ?? false }).retain } diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index a73df5d8..d25e30b8 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -418,6 +418,27 @@ describe('finalizeTraceExport', () => { expect(result[0]!.path).toBe('') }) + it('falls back to metadata when the scoped ledger view is empty', async () => { + // outcomes present but this scope's view is empty (e.g. an adapter that + // didn't feed this scope): must use metadata, not fail-open into retaining + // a passing test. + const emptyView = { all: () => [], forSpec: () => [], forTest: () => [] } + const result = await finalizeTraceExport( + baseCtx({ + policy: 'retain-on-failure', + attemptInfoAvailable: true, + outcomes: emptyView, + testMetadata: meta([ + [ + 'u1', + { title: 'T', specFile: '/a.js', state: 'passed', attempt: 0 } + ] + ]) + }) + ) + expect(result[0]!.retained).toBe(false) + }) + // Session slice = OR over every test: one failure keeps the whole trace. it('session slice retains when ANY test failed under retain-on-failure', async () => { const result = await finalizeTraceExport( From 1786a25e0722d013b7e8d50d6b3a12f1139aa168 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 19:11:52 +0530 Subject: [PATCH 060/109] fix(core): infer the failed attempt from a retry in the outcome ledger (message given earlier) --- packages/core/src/attempt-tracker.ts | 9 +++++++-- packages/core/tests/attempt-tracker.test.ts | 20 +++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/core/src/attempt-tracker.ts b/packages/core/src/attempt-tracker.ts index 60bbdfa4..6f6f8bc1 100644 --- a/packages/core/src/attempt-tracker.ts +++ b/packages/core/src/attempt-tracker.ts @@ -27,10 +27,15 @@ export class TestAttemptTracker implements RetryOutcomeView { * `specFile` (optional) enables spec-scoped retention lookups. */ recordStart(uid: string, specFile?: string): number { const entry = this.#ledger.get(uid) - const attempt = entry ? entry.attempts.length : 0 - if (attempt > 0) { + if (entry && entry.attempts.length > 0) { this.#sawRetry = true + // A retry only follows a failure. Some runners (e.g. Mocha through a + // --require plugin) can't observe the failed attempt's state from their + // outcome hook and report it as passed — the retry starting IS the + // reliable failure signal, so stamp the prior attempt failed here. + entry.attempts[entry.attempts.length - 1].state = 'failed' } + const attempt = entry ? entry.attempts.length : 0 const slot: TestOutcome = { uid, attempt } if (entry) { entry.attempts.push(slot) diff --git a/packages/core/tests/attempt-tracker.test.ts b/packages/core/tests/attempt-tracker.test.ts index 012fbaf7..845e6f8b 100644 --- a/packages/core/tests/attempt-tracker.test.ts +++ b/packages/core/tests/attempt-tracker.test.ts @@ -57,13 +57,27 @@ describe('TestAttemptTracker', () => { ]) }) - it('recordOutcome stamps only the latest attempt slot', () => { + it('recordOutcome stamps the latest slot', () => { const t = new TestAttemptTracker() t.recordStart('a') t.recordOutcome('a', 'passed') + expect(t.forTest('a')).toEqual([ + { uid: 'a', attempt: 0, state: 'passed' } + ]) + }) + + it('a retry stamps the prior attempt failed (swallowed-failure runners)', () => { + // Mocha via a --require plugin reports the retried attempt as passed; the + // retry starting is the reliable failure signal, so attempt 0 is corrected. + const t = new TestAttemptTracker() t.recordStart('a') - t.recordOutcome('a', 'failed') - expect(t.forTest('a').map((o) => o.state)).toEqual(['passed', 'failed']) + t.recordOutcome('a', 'passed') // outcome hook couldn't see the failure + t.recordStart('a') // retry ⟹ attempt 0 must have failed + t.recordOutcome('a', 'passed') // attempt 1 genuinely passed + expect(t.forTest('a')).toEqual([ + { uid: 'a', attempt: 0, state: 'failed' }, + { uid: 'a', attempt: 1, state: 'passed' } + ]) }) it('recordOutcome can override the slot attempt (authoritative retry #)', () => { From 1cafc78ba62f5e85db0ad145c4e2eab66455fbbb Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 19:12:25 +0530 Subject: [PATCH 061/109] fix(nightwatch): feed the retention ledger for correct retry-aware policies --- .../src/cucumber-lifecycle.ts | 8 ++- .../src/helpers/cucumberScenarioBuilder.ts | 8 +-- .../src/helpers/testManager.ts | 7 ++- packages/nightwatch-devtools/src/index.ts | 6 +- .../src/plugin-internals.ts | 10 +++- .../nightwatch-devtools/src/session-init.ts | 8 ++- .../nightwatch-devtools/src/test-lifecycle.ts | 4 +- .../nightwatch-devtools/src/trace-context.ts | 3 + .../tests/attemptTracking.test.ts | 55 ++++++++++++++++++- 9 files changed, 93 insertions(+), 16 deletions(-) diff --git a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts index 44197c0e..46684570 100644 --- a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts +++ b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts @@ -61,7 +61,8 @@ export interface CucumberLifecycleCtx extends TestSliceCtx { setCurrentStep(s: unknown): void getCurrentStep(): unknown setCurrentTest(t: unknown): void - recordAttempt(uid: string): number + recordAttempt(uid: string, specFile?: string): number + recordOutcome(uid: string, state: TestStats['state']): void } type MutStep = { @@ -182,7 +183,7 @@ export async function initCucumberScenario( stepKeywords, scenarioLine, parentFeatureSuiteUid: featureSuite.uid, - recordAttempt: (uid) => ctx.recordAttempt(uid) + recordAttempt: (uid, specFile) => ctx.recordAttempt(uid, specFile) }) attachScenarioToFeature(ctx, featureSuite, scenarioSuite) // The scenario is the `test` unit; its steps are the leaf metadata entries. @@ -211,6 +212,9 @@ export async function finalizeCucumberScenario( scenario.state = scenarioState scenario.end = now scenario._duration = duration + // Stamp this attempt's real outcome so spec/session retention doesn't + // collapse to the retry-stable suite's last-overwritten state. + ctx.recordOutcome(scenario.uid, scenarioState) closeOpenSteps(scenario, scenarioState, now) const featureUri: string = pickle?.uri ?? 'unknown.feature' diff --git a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts index b60d5ad4..af617f91 100644 --- a/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts +++ b/packages/nightwatch-devtools/src/helpers/cucumberScenarioBuilder.ts @@ -21,9 +21,9 @@ export interface CucumberScenarioBuildInput { scenarioLine: number /** Parent feature-suite uid — scenarios nest under this. */ parentFeatureSuiteUid: string - /** Records the scenario start under its (retry-stable) uid and returns the - * 0-based attempt number stamped on every step. Omitted → attempt 0. */ - recordAttempt?: (scenarioUid: string) => number + /** Records the scenario start under its (retry-stable) uid + feature file and + * returns the 0-based attempt number stamped on every step. Omitted → 0. */ + recordAttempt?: (scenarioUid: string, specFile?: string) => number } /** @@ -101,7 +101,7 @@ export function buildCucumberScenarioSuite( featureUri, `scenario:${scenarioName}:${scenarioLine}` ) - const attempt = input.recordAttempt?.(scenarioUid) ?? 0 + const attempt = input.recordAttempt?.(scenarioUid, featureUri) ?? 0 const scenarioSuite: SuiteStats = { uid: scenarioUid, cid: DEFAULTS.CID, diff --git a/packages/nightwatch-devtools/src/helpers/testManager.ts b/packages/nightwatch-devtools/src/helpers/testManager.ts index 0edc5ead..2b98c5d3 100644 --- a/packages/nightwatch-devtools/src/helpers/testManager.ts +++ b/packages/nightwatch-devtools/src/helpers/testManager.ts @@ -13,7 +13,11 @@ export class TestManager { private processedTests = new Map<string, Set<string>>() private lastKnownTestName: string | null = null - constructor(private testReporter: TestReporter) {} + constructor( + private testReporter: TestReporter, + /** Stamps a test's resolved terminal state onto the retry ledger. */ + private recordOutcome?: (uid: string, state: TestStats['state']) => void + ) {} /** * Update test state and report to UI @@ -42,6 +46,7 @@ export class TestManager { if (state !== TEST_STATE.RUNNING) { this.testReporter.onTestEnd(test) + this.recordOutcome?.(test.uid, state) } } diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index 53b1a3dd..a4084321 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -299,7 +299,10 @@ class NightwatchDevToolsPlugin { self.suiteManager.clearExecutionData() self.#attemptTracker.reset() }, - recordAttempt: (uid) => self.#attemptTracker.recordStart(uid), + recordAttempt: (uid, specFile) => + self.#attemptTracker.recordStart(uid, specFile), + recordOutcome: (uid, state) => + self.#attemptTracker.recordOutcome(uid, state), attemptFor: (uid) => self.#attemptTracker.attemptFor(uid), buildMetadataOptions: () => self.#buildMetadataOptions(), ensureSessionInitialized: (b) => self.#ensureSessionInitialized(b), @@ -586,6 +589,7 @@ class NightwatchDevToolsPlugin { format: this.options.traceFormat, capturer: this.sessionCapturer, suites: this.suiteManager.getAllSuites().values(), + outcomes: this.#attemptTracker, ranges: this.#specRanges, flushed: this.#flushedSpecs, configPath: this.#configPath, diff --git a/packages/nightwatch-devtools/src/plugin-internals.ts b/packages/nightwatch-devtools/src/plugin-internals.ts index 1753d09c..4279d360 100644 --- a/packages/nightwatch-devtools/src/plugin-internals.ts +++ b/packages/nightwatch-devtools/src/plugin-internals.ts @@ -77,9 +77,13 @@ export interface PluginInternals { setCucumberRunner(v: boolean): void getRerunLabel(): string | undefined - /** Records a test/scenario start under its retry-stable uid; returns the - * 0-based attempt number (0 first run, +1 per rerun). */ - recordAttempt(uid: string): number + /** Records a test/scenario start under its retry-stable uid; `specFile` + * (when known) enables spec-scoped retention. Returns the 0-based attempt + * number (0 first run, +1 per rerun). */ + recordAttempt(uid: string, specFile?: string): number + /** Stamps the resolved terminal state onto uid's latest attempt slot so the + * retry-aware retention policies see real per-attempt outcomes. */ + recordOutcome(uid: string, state: TestStats['state']): void /** Latest attempt recorded for `uid`, or undefined if it never started. */ attemptFor(uid: string): number | undefined diff --git a/packages/nightwatch-devtools/src/session-init.ts b/packages/nightwatch-devtools/src/session-init.ts index e9d1004a..8e485a21 100644 --- a/packages/nightwatch-devtools/src/session-init.ts +++ b/packages/nightwatch-devtools/src/session-init.ts @@ -28,7 +28,8 @@ import type { DevToolsMode, NightwatchBrowser, ScreencastOptions, - SuiteStats + SuiteStats, + TestStats } from './types.js' const log = logger('@wdio/nightwatch-devtools:session-init') @@ -59,6 +60,7 @@ export interface SessionInitCtx { getCurrentScenarioSuite(): SuiteStats | null buildMetadataOptions(): unknown attemptFor(uid: string): number | undefined + recordOutcome(uid: string, state: TestStats['state']): void } async function handleSessionChange( @@ -94,7 +96,9 @@ function initReporterChain(ctx: SessionInitCtx): void { }, (uid) => ctx.attemptFor(uid) ) - ctx.testManager = new TestManager(ctx.testReporter) + ctx.testManager = new TestManager(ctx.testReporter, (uid, state) => + ctx.recordOutcome(uid, state) + ) ctx.suiteManager = new SuiteManager(ctx.testReporter) ctx.browserProxy = new BrowserProxy( ctx.sessionCapturer, diff --git a/packages/nightwatch-devtools/src/test-lifecycle.ts b/packages/nightwatch-devtools/src/test-lifecycle.ts index 7192c12a..e8e0c60d 100644 --- a/packages/nightwatch-devtools/src/test-lifecycle.ts +++ b/packages/nightwatch-devtools/src/test-lifecycle.ts @@ -40,7 +40,7 @@ export interface TestLifecycleCtx extends TestSliceCtx { incrementCount(state: TestStats['state']): void testIcon(state: TestStats['state']): string setCurrentTest(t: unknown): void - recordAttempt(uid: string): number + recordAttempt(uid: string, specFile?: string): number } interface SuiteMetadata { @@ -126,7 +126,7 @@ export async function startNextTest( const test = ctx.testManager.findTestInSuite(currentSuite, currentTestName) if (test) { // Nightwatch has no per-test retry index; the tracker is the retry signal. - test.retries = ctx.recordAttempt(test.uid) + test.retries = ctx.recordAttempt(test.uid, specFile ?? undefined) if (specFile) { recordTestSliceBoundary(ctx, specFile, test.uid) } diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts index 359737b9..bf217fb2 100644 --- a/packages/nightwatch-devtools/src/trace-context.ts +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -9,6 +9,7 @@ import { collectSuiteTestMetadata, resolveAdapterOutputDir, + type RetryOutcomeView, type SpecRange, type TraceExportContext } from '@wdio/devtools-core' @@ -28,6 +29,7 @@ export interface TraceContextInput { format: TraceFormat capturer: SessionCapturer suites: Iterable<SuiteStats> + outcomes?: RetryOutcomeView ranges: SpecRange[] flushed: Set<string> configPath: string | undefined @@ -48,6 +50,7 @@ export function buildTraceContext( actionSnapshots: input.capturer.actionSnapshots, sessionId, testMetadata: collectSuiteTestMetadata(input.suites), + outcomes: input.outcomes, ranges: input.ranges, flushed: input.flushed, resolveOutputDir: () => diff --git a/packages/nightwatch-devtools/tests/attemptTracking.test.ts b/packages/nightwatch-devtools/tests/attemptTracking.test.ts index 30df38e2..7d5eacd3 100644 --- a/packages/nightwatch-devtools/tests/attemptTracking.test.ts +++ b/packages/nightwatch-devtools/tests/attemptTracking.test.ts @@ -10,7 +10,9 @@ import { TEST_STATE } from '../src/constants.js' import type { SessionCapturer } from '../src/session.js' import type { SuiteStats, TestStats } from '../src/types.js' -function scenarioInput(recordAttempt: (uid: string) => number) { +function scenarioInput( + recordAttempt: (uid: string, specFile?: string) => number +) { return { featureUri: 'login.feature', scenarioName: 'Valid login', @@ -71,6 +73,25 @@ describe('cucumber scenario retry attempt', () => { true ) }) + + it('feeds the ledger per attempt with specFile so forSpec sees real outcomes', () => { + const tracker = new TestAttemptTracker() + const record = (uid: string, specFile?: string) => + tracker.recordStart(uid, specFile) + + // Attempt 0 fails, then the retry (same uid) passes — each attempt's real + // outcome must survive, not collapse to the retry-stable suite's last state. + const first = buildCucumberScenarioSuite(scenarioInput(record)) + tracker.recordOutcome(first.uid, TEST_STATE.FAILED as TestStats['state']) + const retried = buildCucumberScenarioSuite(scenarioInput(record)) + tracker.recordOutcome(retried.uid, TEST_STATE.PASSED as TestStats['state']) + + expect(first.uid).toBe(retried.uid) + expect(tracker.forSpec('login.feature')).toEqual([ + { uid: first.uid, attempt: 0, state: 'failed' }, + { uid: first.uid, attempt: 1, state: 'passed' } + ]) + }) }) describe('regular test retry attempt via startNextTest', () => { @@ -131,4 +152,36 @@ describe('buildTraceContext', () => { expect(ctx.sessionId).toBe('session-1') expect(ctx.testMetadata.get('t1')?.attempt).toBe(2) }) + + it('exposes the attempt-outcome ledger on the trace context', () => { + const capturer = { + actionSnapshots: [], + snapshotCaptures: [] + } as unknown as SessionCapturer + const tracker = new TestAttemptTracker() + tracker.recordStart('t1', '/spec.ts') + tracker.recordOutcome('t1', TEST_STATE.FAILED as TestStats['state']) + + const ctx = buildTraceContext( + { + mode: 'trace', + policy: 'retain-on-failure', + granularity: 'spec', + format: 'zip', + capturer, + suites: [], + outcomes: tracker, + ranges: [], + flushed: new Set(), + configPath: undefined, + log: () => {} + }, + 'session-1' + ) + + expect(ctx.outcomes).toBe(tracker) + expect(ctx.outcomes?.forSpec('/spec.ts')).toEqual([ + { uid: 't1', attempt: 0, state: 'failed' } + ]) + }) }) From 9b864c03c377c3b56f8ea9453f2e935b142ef74e Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 19:12:42 +0530 Subject: [PATCH 062/109] fix(selenium): feed the retention ledger for correct retry-aware policies --- .../src/helpers/testManager.ts | 33 +++++++- .../src/session-lifecycle.ts | 5 ++ .../tests/attempt-capture.test.ts | 81 ++++++++++++++++++- 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/packages/selenium-devtools/src/helpers/testManager.ts b/packages/selenium-devtools/src/helpers/testManager.ts index 70fcb14b..09c741c7 100644 --- a/packages/selenium-devtools/src/helpers/testManager.ts +++ b/packages/selenium-devtools/src/helpers/testManager.ts @@ -2,7 +2,8 @@ import logger from '@wdio/logger' import { createTestStats, stampTestEnd, - TestAttemptTracker + TestAttemptTracker, + type RetryOutcomeView } from '@wdio/devtools-core' import { DEFAULTS, TEST_STATE } from '../constants.js' import type { SuiteStats, TestStats } from '../types.js' @@ -23,9 +24,14 @@ export class TestManager { #currentTest: TestStats | null = null #lastMarkedTest: TestStats | null = null #mode: 'session' | 'marked' = 'session' - // Per-test attempt counter. Persists for the whole in-process session so + // Per-test attempt ledger. Persists for the whole in-process session so // same-process retries (Mocha/Jest/etc re-entering the start hook) accumulate. + // Retry-stable-keyed so a test's attempts group under one entry; the trace + // finalizer reads it (attemptOutcomes) for retry-aware retention. #attemptTracker = new TestAttemptTracker() + // Retry-stable uid of the in-progress marked test, so endCurrent can stamp + // this attempt's outcome onto the same ledger entry recordStart opened. + #currentRetryStableUid: string | undefined /** Set true the first time the user calls startMarkedTest. Once true we * never auto-create the synthetic session test — orphan commands attach * to the most-recently-marked test instead. */ @@ -134,9 +140,12 @@ export class TestManager { // deterministicUid is retry-stable (no counter), so re-entering with the // same logical test increments the heuristic. Mocha supplies an // authoritative per-test retry index via opts.attempt; prefer it. + const retryStableUid = deterministicUid(file, signature) const heuristicAttempt = this.#attemptTracker.recordStart( - deterministicUid(file, signature) + retryStableUid, + file ) + this.#currentRetryStableUid = retryStableUid test.retries = opts.attempt ?? heuristicAttempt log.info( `Started marked test "${name}" (callSource: ${opts.callSource || 'n/a'})` @@ -155,6 +164,18 @@ export class TestManager { } test.state = state stampTestEnd(test) + // Stamp this attempt's real outcome onto its retry-stable ledger slot so a + // fail-then-pass groups under one test: retain-on-failure keys on the final + // (passed) attempt and stops over-retaining, retain-on-first-failure on + // attempt 0. Skipped for the synthetic session test (no recordStart). + if (this.#currentRetryStableUid !== undefined) { + this.#attemptTracker.recordOutcome( + this.#currentRetryStableUid, + state, + test.retries + ) + this.#currentRetryStableUid = undefined + } this.testReporter.onTestEnd(test) this.#currentTest = null } @@ -163,6 +184,12 @@ export class TestManager { return this.#currentTest } + /** Read-only per-attempt outcome ledger for the trace finalizer's retry-aware + * retention evaluation (retry-stable-keyed, so a test's attempts group). */ + get attemptOutcomes(): RetryOutcomeView { + return this.#attemptTracker + } + /** Called when the driver session is closing (process exit / quit). */ finalizeSession(): void { if (this.#currentTest) { diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index 7716210b..ca4bab76 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -315,6 +315,11 @@ export function buildTraceExportContext( // TestStats.retries carries the per-test attempt (Mocha authoritative, // other runners heuristic), so retry-aware policies can trust it. attemptInfoAvailable: true, + // Per-attempt outcome ledger, retry-stable-keyed so a test's attempts + // group as one test. Without it, session/spec retention reads the + // per-attempt suite-node metadata — which sees a fail-then-pass as two + // separate one-shot tests and over-retains it under retain-on-failure. + outcomes: ctx.testManager?.attemptOutcomes, ranges: ctx.specRanges, flushed: ctx.flushedSpecs, resolveOutputDir: (range) => diff --git a/packages/selenium-devtools/tests/attempt-capture.test.ts b/packages/selenium-devtools/tests/attempt-capture.test.ts index 2f2840ff..173acfc8 100644 --- a/packages/selenium-devtools/tests/attempt-capture.test.ts +++ b/packages/selenium-devtools/tests/attempt-capture.test.ts @@ -1,5 +1,8 @@ import { describe, it, expect, vi } from 'vitest' -import { collectSuiteTestMetadata } from '@wdio/devtools-core' +import { + collectSuiteTestMetadata, + shouldRetainTrace +} from '@wdio/devtools-core' import { resetSignatureCounters } from '../src/helpers/utils.js' import { TestManager } from '../src/helpers/testManager.js' @@ -94,3 +97,79 @@ describe('retry/attempt capture', () => { } }) }) + +describe('retry outcome ledger feeds retry-aware retention', () => { + it('groups a fail-then-pass retry under one retry-stable uid', () => { + const { mgr } = makeManager() + + const first = mgr.startMarkedTest('flaky') + mgr.endCurrent('failed') + const retry = mgr.startMarkedTest('flaky') + mgr.endCurrent('passed') + + // Selenium gives each attempt its own suite-node uid… + expect(first.uid).not.toBe(retry.uid) + + // …but the ledger records both attempts under ONE retry-stable uid. + const ledger = mgr.attemptOutcomes.all() + expect(ledger).toHaveLength(2) + expect(ledger[0]).toMatchObject({ attempt: 0, state: 'failed' }) + expect(ledger[1]).toMatchObject({ attempt: 1, state: 'passed' }) + expect(ledger[0].uid).toBe(ledger[1].uid) + }) + + it('exposes outcomes on the ctx so retain-on-failure drops a fail-then-pass but retain-on-first-failure keeps it', () => { + const { mgr, suiteManager } = makeManager() + + mgr.startMarkedTest('flaky') + mgr.endCurrent('failed') + mgr.startMarkedTest('flaky') + mgr.endCurrent('passed') + + const capturer = new SessionCapturer() + try { + const ctx = { + options: { + mode: 'trace', + traceGranularity: 'session', + traceFormat: 'zip' + }, + testManager: mgr, + suiteManager, + actionSnapshots: [], + specRanges: [], + flushedSpecs: new Set<string>(), + traceFlushes: [], + snapshotCaptures: [] + } as unknown as SessionLifecycleCtx + + const traceCtx = buildTraceExportContext( + ctx, + capturer, + 'sess-1', + '/spec.ts' + ) + expect(traceCtx.outcomes).toBe(mgr.attemptOutcomes) + + const outcomes = [...traceCtx.outcomes!.all()] + const retainOnFailure = shouldRetainTrace('retain-on-failure', { + outcomes, + attemptInfoAvailable: true + }) + const retainOnFirstFailure = shouldRetainTrace( + 'retain-on-first-failure', + { + outcomes, + attemptInfoAvailable: true + } + ) + + // Final attempt passed → retain-on-failure drops it (no over-retention). + expect(retainOnFailure.retain).toBe(false) + // Attempt 0 failed → retain-on-first-failure still keeps it. + expect(retainOnFirstFailure.retain).toBe(true) + } finally { + capturer.cleanup() + } + }) +}) From 687bdc8d6d094bbd68709cd49483634ed15a5671 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Tue, 14 Jul 2026 19:12:57 +0530 Subject: [PATCH 063/109] docs: retry-aware retention scope + assert-capture debt sync --- CLAUDE.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 007cc486..59009622 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -235,7 +235,10 @@ Documented divergences from the conventions above. They exist today as debt to b - `replaceCommand` has two semantics — Selenium mutates in place (preserves `_id`/`id` for chained calls); Nightwatch splices and reissues. Both call the same `core/suite-helpers` factories; the storage strategy stays adapter-specific because runner integrations differ. Could be unified by parameterizing the policy if the divergence ever causes a real problem. - `patchNodeAssert` (via `core/assert-patcher`) is now wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`). Framework matcher libraries differ: Service taps expect-webdriverio's `beforeAssertion`/`afterAssertion` hooks so passing+failing matchers render as `expect.*` actions (mechanism in the assert-capture entry below); Nightwatch native `assert`/`verify` and Selenium's `node:assert` also surface passing+failing rows via their reconcile/patch paths. The remaining gap is Selenium's jest-style `expect()` (and chai): jest/vitest expose no pass+fail assertion hook, so only failing matchers surface there. - BiDi is auto-attached in Service and Selenium; Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities. -- Retry-aware trace policies aren't uniform across adapters. Selenium emits one metadata entry per attempt (counter-based `generateStableUid` uid + retry-stable tracker key), so all six policies — including `retain-on-first-failure` (needs the first attempt's outcome) — evaluate correctly. Service and Nightwatch key metadata on the retry-stable uid and overwrite/mutate per attempt, collapsing to the *final* attempt's outcome; the retry-count policies (`retain-on-failure`, `on-first-retry`, `on-all-retries`, `retain-on-failure-and-retries`) are still correct, but `retain-on-first-failure` can't see a failed-then-passed first attempt and under-retains. Proper fix rides with B5 (per-test granularity preserves per-attempt slices); until then all three set `attemptInfoAvailable: true`. +- Retry-aware trace policies share one mechanism: adapters feed a per-attempt **outcome ledger** (`core/attempt-tracker.ts` `TestAttemptTracker.recordStart(uid, specFile)` + `recordOutcome(uid, state, attempt)`) keyed by the **retry-stable** uid, and the finalizer reads the scoped views (`all`/`forSpec`/`forTest`) so `trace-retention.ts` evaluates **group-by-test** — `retain-on-failure` keys on each test's *final* attempt (no over-retaining a fail-then-pass), `retain-on-first-failure` on *attempt 0*. `recordStart` on a second attempt stamps the prior attempt `failed` (a retry only follows a failure), which corrects runners that swallow the intermediate failure — e.g. Mocha via a `--require` plugin never surfaces the retried attempt's failure, so the ledger would otherwise see `[passed, passed]`. An empty scoped view falls back to `testMetadata` (never fail-open-retains). + - **WDIO + Selenium: verified end-to-end** (manual fail-then-pass runs: retained under `retain-on-first-failure`, dropped under `retain-on-failure`). + - **Nightwatch: `retain-on-failure` works; the other retry-aware policies degrade.** Its `--retries` re-runs the testcase *internally* without re-firing the plugin's per-test hooks, and the per-testcase results carry no attempt/retry field (retries live only in undocumented, version-varying Nightwatch internals — `suiteRetries.testRetriesCount` / `reporter.testResults.retryTest`), so the ledger sees only the final attempt for the `describe/it` and exports-object interfaces. Cucumber scenarios expose per-scenario hooks, so the feed captures their attempts. Not cleanly fixable without depending on those internals. + - WDIO `specFileRetries` spawns a fresh worker per retry, so cross-process attempts aren't in the (process-scoped) ledger. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. - Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. From 335ad067fed02e04001dcd3b8244b5fb302aa409 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 15 Jul 2026 02:16:32 +0530 Subject: [PATCH 064/109] feat(core): artifacts manifest + WDIO Allure trace/video attach --- packages/core/src/artifacts-manifest.ts | 81 ++++++++++++++ packages/core/src/index.ts | 1 + packages/core/src/trace-finalizer.ts | 67 +++++++++++- .../core/tests/artifacts-manifest.test.ts | 103 ++++++++++++++++++ packages/core/tests/trace-finalizer.test.ts | 64 +++++++++++ packages/nightwatch-devtools/src/index.ts | 16 ++- .../nightwatch-devtools/src/trace-context.ts | 8 +- .../tests/attemptTracking.test.ts | 4 + packages/selenium-devtools/src/index.ts | 9 +- .../selenium-devtools/src/plugin-internals.ts | 4 +- .../src/session-lifecycle.ts | 8 +- packages/service/package.json | 6 + packages/service/src/allure.ts | 90 +++++++++++++++ packages/service/src/index.ts | 40 +++++-- packages/service/src/trace-slices.ts | 10 +- packages/service/tests/allure.test.ts | 91 ++++++++++++++++ 16 files changed, 578 insertions(+), 24 deletions(-) create mode 100644 packages/core/src/artifacts-manifest.ts create mode 100644 packages/core/tests/artifacts-manifest.test.ts create mode 100644 packages/service/src/allure.ts create mode 100644 packages/service/tests/allure.test.ts diff --git a/packages/core/src/artifacts-manifest.ts b/packages/core/src/artifacts-manifest.ts new file mode 100644 index 00000000..0853e401 --- /dev/null +++ b/packages/core/src/artifacts-manifest.ts @@ -0,0 +1,81 @@ +/** + * The generic artifacts manifest: a single JSON side-file + * (`devtools-artifacts-<sessionId>.json`) written next to the trace/video + * artifacts at end-of-run. It enumerates every artifact a trace-mode session + * produced — including the ones a retention policy decided against + * (`retained: false`) — alongside each test's final state and attempt. Any + * ecosystem reporter (Allure, a CI collector, a custom dashboard) can read this + * one file to discover what to attach and how each test fared, instead of + * re-deriving it from framework internals. The WDIO Allure glue consumes it + * directly; Selenium/Nightwatch document reader recipes against it. + */ + +import fs from 'node:fs/promises' +import path from 'node:path' +import type { + TestMetadataEntry, + TestMetadataMap, + TraceFormat +} from '@wdio/devtools-shared' +import type { TraceArtifact } from './trace-finalizer.js' + +/** One test's outcome as recorded at export time. Field types track + * TestMetadataEntry in shared; adds the keying uid, drops trace-only ancestry. */ +export interface ArtifactManifestTest extends Pick< + TestMetadataEntry, + 'title' | 'specFile' | 'state' | 'attempt' +> { + uid: string +} + +export interface ArtifactsManifest { + sessionId: string + format: TraceFormat + artifacts: TraceArtifact[] + tests: ArtifactManifestTest[] +} + +/** Deterministic manifest filename for a session (used by writers and readers). */ +export function artifactsManifestFilename(sessionId: string): string { + return `devtools-artifacts-${sessionId}.json` +} + +/** Assemble the manifest from the artifacts collected across the run and the + * test-metadata map. Pure — the write is separate so it stays unit-testable. */ +export function buildArtifactsManifest(input: { + sessionId: string + format: TraceFormat + artifacts: readonly TraceArtifact[] + testMetadata: TestMetadataMap +}): ArtifactsManifest { + const tests: ArtifactManifestTest[] = [] + for (const [uid, meta] of input.testMetadata) { + tests.push({ + uid, + title: meta.title, + specFile: meta.specFile, + state: meta.state, + attempt: meta.attempt + }) + } + return { + sessionId: input.sessionId, + format: input.format, + artifacts: [...input.artifacts], + tests + } +} + +/** Write the manifest to `outputDir`, returning its absolute path. */ +export async function writeArtifactsManifest( + outputDir: string, + manifest: ArtifactsManifest +): Promise<string> { + await fs.mkdir(outputDir, { recursive: true }) + const filePath = path.join( + outputDir, + artifactsManifestFilename(manifest.sessionId) + ) + await fs.writeFile(filePath, JSON.stringify(manifest, null, 2), 'utf8') + return filePath +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 89c6c301..9d37bbf0 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,7 @@ export * from './action-mapping.js' export * from './action-snapshot.js' +export * from './artifacts-manifest.js' export * from './attempt-tracker.js' export * from './with-timeout.js' export * from './assert-patcher.js' diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index d69a2898..9cb57af2 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -15,6 +15,10 @@ import type { TraceRetentionPolicy } from '@wdio/devtools-shared' import { errorMessage } from './error.js' +import { + buildArtifactsManifest, + writeArtifactsManifest +} from './artifacts-manifest.js' import { filterTestMetadataBySpec, filterTestMetadataByUid, @@ -72,6 +76,15 @@ export interface TraceExportContext { awaitPending?: Promise<unknown>[] log?: (level: 'info' | 'warn', msg: string) => void onArtifact?: (a: TraceArtifact) => void + /** When true, finalize writes a `devtools-artifacts-<sessionId>.json` manifest + * enumerating every artifact (retained or not) plus per-test states, for + * ecosystem reporters (Allure, CI collectors) to consume. */ + emitManifest?: boolean + /** Every artifact seen via `onArtifact` across the run (including eager + * mid-run test-slice flushes, which the end-of-run fan-out dedupes away). + * Pass the same list the adapter accumulates so the manifest is complete; + * finalize falls back to its own fan-out results when this is omitted. */ + collectedArtifacts?: readonly TraceArtifact[] } const SPEC_WITHOUT_BOUNDARIES_WARNING = @@ -336,10 +349,11 @@ async function flushAllRanges( } /** - * Entry point for the after/end-of-run hook. No-op outside trace mode. Awaits - * any pending snapshot captures, then fans out to per-spec, per-test, or - * session writes. `spec`/`test` granularity with no recorded boundaries warns - * and falls back to a single session-level trace. + * Entry point for the after/end-of-run hook. No-op outside trace mode. Settles + * in-flight captures and eager flushes, then fans out to per-spec, per-test, or + * session writes and finally the artifacts manifest. `spec`/`test` granularity + * with no recorded boundaries warns and falls back to a single session-level + * trace. */ export async function finalizeTraceExport( ctx: TraceExportContext @@ -347,7 +361,22 @@ export async function finalizeTraceExport( if (ctx.mode !== 'trace') { return [] } + // Settle in-flight snapshot captures AND the adapters' tracked fire-and-forget + // eager flushes (Selenium/Nightwatch put both in awaitPending) before writing + // anything: every eager-flushed range is a synchronous dedupe-hit in the + // fan-out below, so this is the one place that awaits those eager-flush + // promises. Without it the last eager write can race teardown and its artifact + // can miss the manifest. A no-op for WDIO (awaits eager flushes inline). await awaitPendingCaptures(ctx) + const artifacts = await fanOutTraceWrites(ctx) + await maybeWriteManifest(ctx, artifacts) + return artifacts +} + +/** Session vs per-slice fan-out (with the no-boundaries fallback). */ +async function fanOutTraceWrites( + ctx: TraceExportContext +): Promise<TraceArtifact[]> { const sliced = ctx.granularity === 'spec' || ctx.granularity === 'test' if (sliced && ctx.ranges.length > 0) { if (ctx.ranges.length > SLICE_COUNT_WARN_THRESHOLD) { @@ -363,3 +392,33 @@ export async function finalizeTraceExport( const artifact = await safely(ctx, () => writeSessionTrace(ctx)) return artifact ? [artifact] : [] } + +/** Write the artifacts manifest when enabled, preferring the adapter's full + * collected list (includes eager slices) over this pass's fan-out results. + * Never throws — a manifest failure must not abort the run. */ +async function maybeWriteManifest( + ctx: TraceExportContext, + fanOutArtifacts: readonly TraceArtifact[] +): Promise<void> { + if (!ctx.emitManifest) { + return + } + const artifacts = ctx.collectedArtifacts ?? fanOutArtifacts + try { + const path = await writeArtifactsManifest( + ctx.resolveOutputDir(), + buildArtifactsManifest({ + sessionId: ctx.sessionId, + format: ctx.format ?? 'zip', + artifacts, + testMetadata: ctx.testMetadata + }) + ) + ctx.log?.('info', `Artifacts manifest written to ${path}`) + } catch (err) { + ctx.log?.( + 'warn', + `Failed to write artifacts manifest: ${errorMessage(err)}` + ) + } +} diff --git a/packages/core/tests/artifacts-manifest.test.ts b/packages/core/tests/artifacts-manifest.test.ts new file mode 100644 index 00000000..0c7e969b --- /dev/null +++ b/packages/core/tests/artifacts-manifest.test.ts @@ -0,0 +1,103 @@ +import { describe, it, expect, afterEach } from 'vitest' +import { rm, readFile, mkdtemp } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { + buildArtifactsManifest, + writeArtifactsManifest, + artifactsManifestFilename, + type ArtifactsManifest +} from '../src/artifacts-manifest.js' +import type { TraceArtifact } from '../src/trace-finalizer.js' +import type { TestMetadataMap } from '@wdio/devtools-shared' + +function metadata(): TestMetadataMap { + return new Map([ + [ + 'u1', + { title: 'passes', specFile: '/a.spec.ts', state: 'passed', attempt: 0 } + ], + [ + 'u2', + { title: 'fails', specFile: '/a.spec.ts', state: 'failed', attempt: 1 } + ] + ]) +} + +const artifacts: TraceArtifact[] = [ + { + kind: 'trace', + path: '/out/u1.zip', + scope: 'test', + key: 'u1', + testUids: ['u1'], + retained: false + }, + { + kind: 'trace', + path: '/out/u2.zip', + scope: 'test', + key: 'u2', + testUids: ['u2'], + retained: true + } +] + +describe('artifacts manifest', () => { + const dirs: string[] = [] + afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) + }) + + it('buildArtifactsManifest carries every artifact (retained + not) and per-test states', () => { + const m = buildArtifactsManifest({ + sessionId: 'sess-1', + format: 'zip', + artifacts, + testMetadata: metadata() + }) + expect(m.sessionId).toBe('sess-1') + expect(m.format).toBe('zip') + expect(m.artifacts).toEqual(artifacts) + expect(m.artifacts).not.toBe(artifacts) // copied, not aliased + expect(m.tests).toEqual([ + { + uid: 'u1', + title: 'passes', + specFile: '/a.spec.ts', + state: 'passed', + attempt: 0 + }, + { + uid: 'u2', + title: 'fails', + specFile: '/a.spec.ts', + state: 'failed', + attempt: 1 + } + ]) + }) + + it('filename is deterministic per session', () => { + expect(artifactsManifestFilename('abc')).toBe('devtools-artifacts-abc.json') + }) + + it('writeArtifactsManifest round-trips the JSON to disk', async () => { + const dir = await mkdtemp(join(tmpdir(), 'manifest-')) + dirs.push(dir) + const manifest = buildArtifactsManifest({ + sessionId: 'sess-2', + format: 'zip', + artifacts, + testMetadata: metadata() + }) + const filePath = await writeArtifactsManifest(dir, manifest) + expect(filePath).toBe(join(dir, 'devtools-artifacts-sess-2.json')) + const parsed = JSON.parse( + await readFile(filePath, 'utf8') + ) as ArtifactsManifest + expect(parsed).toEqual(manifest) + }) +}) diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index d25e30b8..70f655fe 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -6,6 +6,7 @@ import { buildSpecSessionId, buildTestSliceFolder, finalizeTraceExport, + flushRangeLogged, flushRangeTrace, TestAttemptTracker, type SpecRange, @@ -315,6 +316,69 @@ describe('finalizeTraceExport', () => { expect(await exists(path.join(outputDir, 'trace-abcd1234.zip'))).toBe(true) }) + describe('artifacts manifest', () => { + const manifestPath = () => + path.join(outputDir, 'devtools-artifacts-abcd1234.json') + + it('is not written unless emitManifest is set', async () => { + await finalizeTraceExport( + baseCtx({ + testMetadata: meta([['u1', { title: 'T1', specFile: '/a.js' }]]) + }) + ) + expect(await exists(manifestPath())).toBe(false) + }) + + it('enumerates collected artifacts and per-test states when enabled', async () => { + await finalizeTraceExport( + baseCtx({ + emitManifest: true, + collectedArtifacts: artifacts, + testMetadata: meta([ + [ + 'u1', + { title: 'T1', specFile: '/a.js', state: 'passed', attempt: 0 } + ] + ]) + }) + ) + const manifest = JSON.parse(await fs.readFile(manifestPath(), 'utf8')) + expect(manifest.sessionId).toBe('abcd1234') + expect(manifest.format).toBe('zip') + // The session write pushed one artifact through onArtifact into the list. + expect(manifest.artifacts).toHaveLength(1) + expect(manifest.artifacts[0].scope).toBe('session') + expect(manifest.tests).toEqual([ + { + uid: 'u1', + title: 'T1', + specFile: '/a.js', + state: 'passed', + attempt: 0 + } + ]) + }) + + it('includes eager-flushed slices the fan-out deduped away', async () => { + const ctx = baseCtx({ + granularity: 'test', + emitManifest: true, + collectedArtifacts: artifacts, + ranges: [testRange('/a.js', 'u1', 0)], + testMetadata: meta([['u1', { title: 'T1', specFile: '/a.js' }]]) + }) + // Eager mid-run flush: writes the slice and records it via onArtifact. + await flushRangeLogged(ctx, ctx.ranges[0]!) + // Finalize: the range is already flushed, so fan-out returns nothing new, + // but the manifest must still list the eager artifact. + await finalizeTraceExport(ctx) + const manifest = JSON.parse(await fs.readFile(manifestPath(), 'utf8')) + expect(manifest.artifacts).toHaveLength(1) + expect(manifest.artifacts[0].scope).toBe('test') + expect(manifest.artifacts[0].key).toBe('u1') + }) + }) + describe('retention wiring', () => { it("writes everything under the default 'on' policy", async () => { const result = await finalizeTraceExport( diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index a4084321..fad32b4f 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -108,6 +108,14 @@ class NightwatchDevToolsPlugin { /** Set of spec files already flushed to disk. */ #flushedSpecs = new Set<string>() + /** Every trace/video artifact seen this run (retained or not), for the + * end-of-run artifacts manifest. Populated via the context's onArtifact. */ + #artifacts: TraceArtifact[] = [] + + /** In-flight fire-and-forget eager/boundary slice flushes, awaited at finalize + * so the last slice's write + its manifest entry land before teardown. */ + #traceFlushes: Promise<unknown>[] = [] + #getRerunLabel() { return process.env[REUSE_ENV.RERUN_ENTRY_TYPE] === 'test' ? process.env[REUSE_ENV.RERUN_LABEL]?.trim() @@ -575,7 +583,11 @@ class NightwatchDevToolsPlugin { if (!sessionId) { return Promise.resolve(undefined) } - return flushRangeLogged(this.#traceContext(sessionId), range) + // Track the promise (before it's added to awaitPending) so finalize awaits + // this fire-and-forget flush — its context snapshot already excludes it. + const flush = flushRangeLogged(this.#traceContext(sessionId), range) + this.#traceFlushes.push(flush) + return flush } /** Assemble the framework-agnostic trace-export context from plugin state. @@ -592,6 +604,8 @@ class NightwatchDevToolsPlugin { outcomes: this.#attemptTracker, ranges: this.#specRanges, flushed: this.#flushedSpecs, + artifacts: this.#artifacts, + traceFlushes: this.#traceFlushes, configPath: this.#configPath, testFilePath: this.browserProxy?.getCurrentTestFullPath?.() ?? undefined, diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts index bf217fb2..4c4666be 100644 --- a/packages/nightwatch-devtools/src/trace-context.ts +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -11,6 +11,7 @@ import { resolveAdapterOutputDir, type RetryOutcomeView, type SpecRange, + type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' import type { SessionCapturer } from './session.js' @@ -32,6 +33,8 @@ export interface TraceContextInput { outcomes?: RetryOutcomeView ranges: SpecRange[] flushed: Set<string> + artifacts: TraceArtifact[] + traceFlushes: Promise<unknown>[] configPath: string | undefined testFilePath: string | undefined log: (level: 'info' | 'warn', msg: string) => void @@ -58,10 +61,13 @@ export function buildTraceContext( testFilePath: input.testFilePath, configPath: input.configPath }), - awaitPending: input.capturer.snapshotCaptures, + awaitPending: [...input.capturer.snapshotCaptures, ...input.traceFlushes], // Nightwatch feeds real per-test attempt numbers via TestAttemptTracker // (B4), so retry-aware policies use per-test attempts, not the fallback. attemptInfoAvailable: true, + emitManifest: true, + collectedArtifacts: input.artifacts, + onArtifact: (a) => input.artifacts.push(a), log: input.log } } diff --git a/packages/nightwatch-devtools/tests/attemptTracking.test.ts b/packages/nightwatch-devtools/tests/attemptTracking.test.ts index 7d5eacd3..fe49f502 100644 --- a/packages/nightwatch-devtools/tests/attemptTracking.test.ts +++ b/packages/nightwatch-devtools/tests/attemptTracking.test.ts @@ -142,6 +142,8 @@ describe('buildTraceContext', () => { suites: [suite], ranges: [], flushed: new Set(), + artifacts: [], + traceFlushes: [], configPath: undefined, log: () => {} }, @@ -173,6 +175,8 @@ describe('buildTraceContext', () => { outcomes: tracker, ranges: [], flushed: new Set(), + artifacts: [], + traceFlushes: [], configPath: undefined, log: () => {} }, diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 4c4b2406..91af73f9 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -24,7 +24,7 @@ import { recordTraceBoundary, flushCurrentTestTrace } from './session-lifecycle.js' -import type { SpecRange } from '@wdio/devtools-core' +import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' import { startTest as tmStartTest, endTest as tmEndTest, @@ -127,6 +127,10 @@ class SeleniumDevToolsPlugin { /** In-flight per-test eager flushes (test granularity), awaited at finalize. */ #traceFlushes: Promise<unknown>[] = [] + /** Every trace/video artifact seen this run (retained or not), for the + * end-of-run artifacts manifest. Populated via the context's onArtifact. */ + #artifacts: TraceArtifact[] = [] + constructor(options: DevToolsOptions = {}) { this.#options = { port: options.port ?? 3000, @@ -439,6 +443,9 @@ class SeleniumDevToolsPlugin { get traceFlushes() { return self.#traceFlushes }, + get artifacts() { + return self.#artifacts + }, setFinalized: (v) => { self.#finalized = v }, diff --git a/packages/selenium-devtools/src/plugin-internals.ts b/packages/selenium-devtools/src/plugin-internals.ts index a9672e50..36d1f98e 100644 --- a/packages/selenium-devtools/src/plugin-internals.ts +++ b/packages/selenium-devtools/src/plugin-internals.ts @@ -22,7 +22,7 @@ import type { } from './types.js' import type { RetryTracker } from '@wdio/devtools-core' import type { PendingTestAction, PendingScenario } from './test-management.js' -import type { SpecRange } from '@wdio/devtools-core' +import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' export interface PluginInternals { // Config @@ -69,6 +69,8 @@ export interface PluginInternals { readonly flushedSpecs: Set<string> // In-flight per-test eager flushes (test granularity), awaited at finalize. readonly traceFlushes: Promise<unknown>[] + // Every trace/video artifact seen this run, for the end-of-run manifest. + readonly artifacts: TraceArtifact[] // Plugin-side delegates setFinalized(v: boolean): void diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index ca4bab76..fabe3895 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -21,6 +21,7 @@ import { resolveAdapterOutputDir, type SpecBoundaryContext, type SpecRange, + type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' import { TIMING } from './constants.js' @@ -85,6 +86,8 @@ export interface SessionLifecycleCtx { // In-flight per-test eager flushes (test granularity); awaited at finalize // so the last test's write completes before the process exits. readonly traceFlushes: Promise<unknown>[] + // Every trace/video artifact seen this run, for the end-of-run manifest. + readonly artifacts: TraceArtifact[] setFinalized(v: boolean): void ensureBackendStarted(): Promise<void> @@ -327,7 +330,10 @@ export function buildTraceExportContext( testFilePath: range ? range.specFile : testFilePath }), awaitPending: [...ctx.snapshotCaptures, ...ctx.traceFlushes], - log: (level, msg) => log[level](msg) + log: (level, msg) => log[level](msg), + emitManifest: true, + collectedArtifacts: ctx.artifacts, + onArtifact: (a) => ctx.artifacts.push(a) } } diff --git a/packages/service/package.json b/packages/service/package.json index bdf7f03c..c7903e51 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -73,8 +73,14 @@ "vite-plugin-dts": "^5.0.2" }, "peerDependencies": { + "@wdio/allure-reporter": "^9.0.0", "@wdio/protocols": "9.28.0", "devtools": "^8.42.0", "webdriverio": "^9.19.1" + }, + "peerDependenciesMeta": { + "@wdio/allure-reporter": { + "optional": true + } } } diff --git a/packages/service/src/allure.ts b/packages/service/src/allure.ts new file mode 100644 index 00000000..ce0e678d --- /dev/null +++ b/packages/service/src/allure.ts @@ -0,0 +1,90 @@ +// WDIO Allure glue: attach retained trace/video artifacts to the current Allure +// test so a failed run's trace travels with the report. Isolated here so +// index.ts stays free of the optional-dependency dance and the content-type +// convention lives in one place. + +import fs from 'node:fs/promises' +import { basename } from 'node:path' +import logger from '@wdio/logger' +import type { TraceArtifact } from '@wdio/devtools-core' + +const log = logger('@wdio/devtools-service') + +// Attach the trace as a plain zip download — the viewer stays the user's choice +// (our `show-trace`, or any compatible viewer), rather than routing them into a +// third-party viewer Allure would open for a trace-specific content type. Video +// uses video/webm so Allure renders it inline. +const TRACE_CONTENT_TYPE = 'application/zip' +const VIDEO_CONTENT_TYPE = 'video/webm' + +/** The one @wdio/allure-reporter method we use. Typed locally so the optional + * peer dependency never becomes a build-time type dependency. */ +interface AllureReporterModule { + addAttachment(name: string, content: Buffer, type: string): void +} + +// undefined = not yet probed; null = probed and unavailable. +let cachedReporter: AllureReporterModule | null | undefined + +// A non-literal specifier keeps TypeScript and the bundler from resolving this +// optional peer dependency at build time — `import()` of a variable is typed +// `any` and left as a runtime import that no-ops (caught below) when absent. +const ALLURE_REPORTER_SPECIFIER = '@wdio/allure-reporter' + +async function loadAllureReporter(): Promise<AllureReporterModule | null> { + if (cachedReporter !== undefined) { + return cachedReporter + } + try { + const mod = await import(/* @vite-ignore */ ALLURE_REPORTER_SPECIFIER) + const candidate = ( + typeof mod.addAttachment === 'function' ? mod : mod.default + ) as AllureReporterModule | undefined + cachedReporter = + candidate && typeof candidate.addAttachment === 'function' + ? candidate + : null + } catch { + // Optional peer dependency not installed — attaching is a no-op. + cachedReporter = null + } + return cachedReporter +} + +/** + * Attach one retained artifact to the current Allure test. No-op when the + * artifact wasn't retained, has no path yet, or @wdio/allure-reporter isn't + * installed. Must be called from within a per-test hook (afterTest) so Allure + * associates the attachment with the right test. + */ +export async function attachArtifactToAllure( + artifact: TraceArtifact +): Promise<void> { + if (!artifact.retained || !artifact.path) { + return + } + const reporter = await loadAllureReporter() + if (!reporter) { + return + } + try { + // Allure attaches a single file; the ndjson-directory trace format yields a + // directory path, which can't be attached — skip it. + const stat = await fs.stat(artifact.path) + if (!stat.isFile()) { + return + } + const content = await fs.readFile(artifact.path) + const type = + artifact.kind === 'video' ? VIDEO_CONTENT_TYPE : TRACE_CONTENT_TYPE + reporter.addAttachment(basename(artifact.path), content, type) + } catch (err) { + // A missing/unreadable artifact must never reject the test hook. + log.warn(`Allure attach skipped for ${artifact.path}: ${String(err)}`) + } +} + +/** Reset the memoized reporter — test seam only. */ +export function resetAllureReporterCache(): void { + cachedReporter = undefined +} diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index be45c5f3..fd24e32a 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -10,8 +10,10 @@ import { TestAttemptTracker, tracePolicyModeWarning, type SpecRange, + type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' +import { attachArtifactToAllure } from './allure.js' import { wireAssertCapture, type ExpectAssertion } from './assert-capture.js' import { AssertionTracker } from './assertion-tracker.js' import { @@ -123,6 +125,10 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Set of spec files already flushed to disk. */ #flushedSpecs = new Set<string>() + /** Every trace/video artifact seen this run (retained or not), for the + * end-of-run artifacts manifest. Populated via the context's onArtifact. */ + #artifacts: TraceArtifact[] = [] + /** Build the boundary context for recordSliceBoundary — the same shape is * needed in both beforeTest and beforeScenario. */ get #boundaryContext() { @@ -156,15 +162,17 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Eager per-test flush at test end (test granularity only), run after the * outcome is stamped so this attempt's metadata is written before a retry * overwrites it; the end-of-run finalizer then dedupes it via the key set. */ - async #eagerFlushTestSlice(testUid: string): Promise<void> { + async #eagerFlushTestSlice( + testUid: string + ): Promise<TraceArtifact | undefined> { if ( this.#options.traceGranularity !== 'test' || this.#options.mode !== 'trace' || !this.#browser ) { - return + return undefined } - await flushTestSlice( + return flushTestSlice( this.#traceContext(this.#browser), this.#specRanges, testUid @@ -190,7 +198,10 @@ export default class DevToolsHookService implements Services.ServiceInstance { flushed: this.#flushedSpecs, resolveOutputDir: () => this.#outputDir, prepareSnapshots: dedupeSnapshotsByTimestamp, - log: (level, msg) => log[level](msg) + log: (level, msg) => log[level](msg), + emitManifest: true, + collectedArtifacts: this.#artifacts, + onArtifact: (a) => this.#artifacts.push(a) } } @@ -425,10 +436,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#stampOutcome(uid, result) } await this.#finalizePerScenario() - // Flush now so this slice includes the final snapshot and stamped outcome. - if (uid) { - await this.#eagerFlushTestSlice(uid) - } + await this.#eagerFlushAndAttach(uid) } async afterTest( @@ -443,9 +451,19 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#stampOutcome(uid, result) } await this.#finalizePerScenario() - // Flush now so this slice includes the final snapshot and stamped outcome. - if (uid) { - await this.#eagerFlushTestSlice(uid) + await this.#eagerFlushAndAttach(uid) + } + + /** Flush this test's slice (so it captures the final snapshot + stamped + * outcome), then attach the retained artifact to Allure while the per-test + * hook is still open. No-op outside `test`-granularity trace mode. */ + async #eagerFlushAndAttach(uid: string | undefined): Promise<void> { + if (!uid) { + return + } + const artifact = await this.#eagerFlushTestSlice(uid) + if (artifact) { + await attachArtifactToAllure(artifact) } } diff --git a/packages/service/src/trace-slices.ts b/packages/service/src/trace-slices.ts index 5da66806..24533abb 100644 --- a/packages/service/src/trace-slices.ts +++ b/packages/service/src/trace-slices.ts @@ -6,6 +6,7 @@ import { findFlushableRange, flushRangeLogged, type SpecRange, + type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' @@ -21,15 +22,16 @@ export function flushPrevSlice( /** Awaited flush of the just-ended test's slice (test granularity), so this * attempt's just-stamped metadata is written before a retry's beforeTest - * overwrites the entry. No-op when the test recorded no range. */ + * overwrites the entry. Returns the produced artifact (for same-hook Allure + * attach); undefined when the test recorded no range. */ export async function flushTestSlice( ctx: TraceExportContext, ranges: readonly SpecRange[], testUid: string -): Promise<void> { +): Promise<TraceArtifact | undefined> { const range = findFlushableRange(ranges, testUid) if (!range) { - return + return undefined } - await flushRangeLogged(ctx, range) + return flushRangeLogged(ctx, range) } diff --git a/packages/service/tests/allure.test.ts b/packages/service/tests/allure.test.ts new file mode 100644 index 00000000..e8305f6a --- /dev/null +++ b/packages/service/tests/allure.test.ts @@ -0,0 +1,91 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { mkdtemp, writeFile, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import type { TraceArtifact } from '@wdio/devtools-core' + +const addAttachment = vi.fn() +vi.mock('@wdio/allure-reporter', () => ({ + addAttachment, + default: { addAttachment } +})) + +import { + attachArtifactToAllure, + resetAllureReporterCache +} from '../src/allure.js' + +function artifact(over: Partial<TraceArtifact> = {}): TraceArtifact { + return { + kind: 'trace', + path: '', + scope: 'test', + testUids: ['u1'], + retained: true, + ...over + } +} + +describe('attachArtifactToAllure', () => { + const dirs: string[] = [] + beforeEach(() => { + addAttachment.mockReset() + resetAllureReporterCache() + }) + afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) + }) + + async function tempZip(name: string): Promise<string> { + const dir = await mkdtemp(join(tmpdir(), 'allure-')) + dirs.push(dir) + const p = join(dir, name) + await writeFile(p, 'zip-bytes') + return p + } + + it('is a no-op for a non-retained artifact', async () => { + await attachArtifactToAllure(artifact({ retained: false, path: '/x.zip' })) + expect(addAttachment).not.toHaveBeenCalled() + }) + + it('is a no-op for an artifact with no path yet', async () => { + await attachArtifactToAllure(artifact({ path: '' })) + expect(addAttachment).not.toHaveBeenCalled() + }) + + it('attaches a trace zip with the Allure Playwright content type', async () => { + const path = await tempZip('trace-abc.zip') + await attachArtifactToAllure(artifact({ path })) + expect(addAttachment).toHaveBeenCalledOnce() + const [name, content, type] = addAttachment.mock.calls[0]! + expect(name).toBe('trace-abc.zip') + expect(Buffer.isBuffer(content)).toBe(true) + expect(type).toBe('application/zip') + }) + + it('attaches a video artifact as video/webm', async () => { + const path = await tempZip('rec-abc.webm') + await attachArtifactToAllure(artifact({ kind: 'video', path })) + const [, , type] = addAttachment.mock.calls[0]! + expect(type).toBe('video/webm') + }) + + it('skips a directory-format artifact without throwing (ndjson-directory)', async () => { + const dir = await mkdtemp(join(tmpdir(), 'allure-dir-')) + dirs.push(dir) + await expect( + attachArtifactToAllure(artifact({ path: dir })) + ).resolves.toBeUndefined() + expect(addAttachment).not.toHaveBeenCalled() + }) + + it('never rejects when the artifact path is missing', async () => { + await expect( + attachArtifactToAllure(artifact({ path: '/no/such/trace.zip' })) + ).resolves.toBeUndefined() + expect(addAttachment).not.toHaveBeenCalled() + }) +}) From 5a39343afcfff6574c25034e75dbb23dcbc21156 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 15 Jul 2026 17:08:22 +0530 Subject: [PATCH 065/109] feat: per-test screenshot + video options with inline Allure attach --- CLAUDE.md | 1 + examples/nightwatch/nightwatch.conf.cjs | 2 + examples/selenium/mocha-test/test/example.js | 4 +- examples/wdio/cucumber/features/login.feature | 2 +- examples/wdio/cucumber/wdio.conf.ts | 26 +- examples/wdio/mocha/wdio.conf.ts | 5 +- package.json | 1 + packages/core/src/artifact-naming.ts | 10 + packages/core/src/index.ts | 3 + packages/core/src/screenshot-artifact.ts | 53 ++++ packages/core/src/trace-finalizer.ts | 5 +- packages/core/src/video-slice.ts | 69 ++++++ packages/core/tests/output-dir.test.ts | 2 +- .../core/tests/screenshot-artifact.test.ts | 53 ++++ packages/core/tests/video-slice.test.ts | 100 ++++++++ packages/service/README.md | 52 +++- packages/service/src/allure.ts | 10 +- packages/service/src/index.ts | 164 +++++++++++-- packages/service/src/screenshot-capture.ts | 67 +++++ packages/service/src/test-metadata.ts | 8 + packages/service/src/video-capture.ts | 80 ++++++ packages/service/tests/allure.test.ts | 9 +- .../service/tests/screenshot-capture.test.ts | 86 +++++++ packages/service/tests/video-capture.test.ts | 75 ++++++ packages/shared/src/types.ts | 19 ++ pnpm-lock.yaml | 231 +++++++++++++++--- 26 files changed, 1065 insertions(+), 72 deletions(-) create mode 100644 packages/core/src/artifact-naming.ts create mode 100644 packages/core/src/screenshot-artifact.ts create mode 100644 packages/core/src/video-slice.ts create mode 100644 packages/core/tests/screenshot-artifact.test.ts create mode 100644 packages/core/tests/video-slice.test.ts create mode 100644 packages/service/src/screenshot-capture.ts create mode 100644 packages/service/src/video-capture.ts create mode 100644 packages/service/tests/screenshot-capture.test.ts create mode 100644 packages/service/tests/video-capture.test.ts diff --git a/CLAUDE.md b/CLAUDE.md index 59009622..5a2d88ce 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -240,6 +240,7 @@ Documented divergences from the conventions above. They exist today as debt to b - **Nightwatch: `retain-on-failure` works; the other retry-aware policies degrade.** Its `--retries` re-runs the testcase *internally* without re-firing the plugin's per-test hooks, and the per-testcase results carry no attempt/retry field (retries live only in undocumented, version-varying Nightwatch internals — `suiteRetries.testRetriesCount` / `reporter.testResults.retryTest`), so the ledger sees only the final attempt for the `describe/it` and exports-object interfaces. Cucumber scenarios expose per-scenario hooks, so the feed captures their attempts. Not cleanly fixable without depending on those internals. - WDIO `specFileRetries` spawns a fresh worker per retry, so cross-process attempts aren't in the (process-scoped) ledger. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. +- The per-test `screenshot` and `video` options live on `BaseDevToolsOptions` (shared) so all three adapters accept them, but only the **WDIO service** reads them today. The capture/slice/encode logic is framework-agnostic (`core/screenshot-artifact.ts`, `core/video-slice.ts`), so Selenium/Nightwatch adoption is wiring-only (capture the base64 + feed `captureAndAttach*`); pending. Both are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the frame buffer is unbounded for the session (a decimation cap is a noted follow-up), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. - Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. - Service renders expect-webdriverio matchers as single `expect.<matcher>` rows by **folding**, not stack/depth suppression (the old `#assertionDepth`/`#matcherStarted`/self-heal machinery is gone). The matcher's value-read (`toHaveText`→`getText`, `toExist`→`isExisting`, …) is captured as a normal command; `afterAssertion` then coalesces the synthesized `expect.*` row into that read in place — inheriting its callSource, screenshot, and timeline position — and the fold replaces **by timestamp, never a public `id`**: `id` is the per-worker `commandCounter`, which resets per spec, so stamping one lets the app's id-first `replaceCommand` swap a same-id row from another spec (duplicate rows + a fold from another spec vanishing, in multi-spec live mode). `beforeAssertion` arms the pending matcher (depth-counted so aliases like `toBeChecked`→`toBeSelected` fold once); a matcher that **hard-throws** — element never resolves, so expect-webdriverio's `waitUntil` rethrows and `afterAssertion` never fires — is synthesized at `afterTest`/`afterStep` from the throwing read, so a failing assertion renders as `expect.<matcher>` whether or not the element existed. Two limits: its error is then the read's (`Can't call getText on … element wasn't found`), not an assertion-phrased message; and `MATCHER_READ_COMMANDS` is a hand-maintained allowlist, so a matcher whose read isn't listed leaves its raw read visible alongside the `expect.*` row. Plain-value jest matchers (`expect(x).toBe(y)`) don't fire the ewdio hooks, so they aren't captured as rows. diff --git a/examples/nightwatch/nightwatch.conf.cjs b/examples/nightwatch/nightwatch.conf.cjs index 3ec31930..b0d1134d 100644 --- a/examples/nightwatch/nightwatch.conf.cjs +++ b/examples/nightwatch/nightwatch.conf.cjs @@ -53,6 +53,8 @@ module.exports = { // per module (no per-`it` hook), so traceGranularity:'test' collapses to // a single session-scoped slice here. See CLAUDE.md § Known debt. mode: 'trace', + traceGranularity: 'session', + tracePolicy: 'retain-on-first-failure', bidi: true }) } diff --git a/examples/selenium/mocha-test/test/example.js b/examples/selenium/mocha-test/test/example.js index 26360598..25fe5a28 100644 --- a/examples/selenium/mocha-test/test/example.js +++ b/examples/selenium/mocha-test/test/example.js @@ -21,8 +21,8 @@ import { DevTools } from '@wdio/selenium-devtools' // 5 retry: { mode: 'trace', traceGranularity: 'test', tracePolicy: 'on-first-retry' } DevTools.configure({ mode: 'trace', - // traceGranularity: 'test', - // tracePolicy: 'on-first-retry', + traceGranularity: 'session', + tracePolicy: 'retain-on-first-failure', headless: true }) diff --git a/examples/wdio/cucumber/features/login.feature b/examples/wdio/cucumber/features/login.feature index 8b9bcf9a..e6dd0f87 100644 --- a/examples/wdio/cucumber/features/login.feature +++ b/examples/wdio/cucumber/features/login.feature @@ -8,5 +8,5 @@ Feature: The Internet Guinea Pig Website Examples: | username | password | message | - | tomsmith | SuperSecretPassword1! | You logged into a secure area! | + | tomsmith | SuperSecretPassword! | You logged into a secure area! | | foobar | barfoo | Your username is invalid! | diff --git a/examples/wdio/cucumber/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts index e1a82294..75a1f5b9 100644 --- a/examples/wdio/cucumber/wdio.conf.ts +++ b/examples/wdio/cucumber/wdio.conf.ts @@ -69,7 +69,6 @@ export const config: Options.Testrunner = { 'goog:chromeOptions': { args: [ '--headless', - '--disable-gpu', '--remote-allow-origins=*', '--window-size=1600,900' ] @@ -134,7 +133,13 @@ export const config: Options.Testrunner = { 'devtools', { mode: 'trace' as const, - screencast: { enabled: true, pollIntervalMs: 200 } + // tracePolicy: 'retain-on-failure', + traceGranularity: 'test' as const, + // NEW: per-test screenshot + video, attached inline to Allure. + // Both require traceGranularity:'test' (the uniform rule). + screenshot: 'only-on-failure' as const, // 'off' | 'on' | 'only-on-failure' + video: 'on' as const // 'off' | retention policy + // screencast: { enabled: true, pollIntervalMs: 200 } } ] ], @@ -160,7 +165,22 @@ export const config: Options.Testrunner = { // Test reporter for stdout. // The only one supported by default is 'dot' // see also: https://webdriver.io/docs/dot-reporter - reporters: ['spec'], + reporters: [ + 'spec', + [ + 'allure', + { + outputDir: path.resolve(__dirname, 'allure-results'), + // Trace mode issues a takeScreenshot (+ reads) per action to build the + // trace snapshots; @wdio/allure-reporter logs every WebDriver command as + // a step and attaches a screenshot per takeScreenshot, which floods the + // report. Silence both — the trace.zip attachment is unaffected, and the + // gherkin Given/When/Then steps still show. + disableWebdriverStepsReporting: true, + disableWebdriverScreenshotsReporting: true + } + ] + ], // If you are using Cucumber you need to specify the location of your step definitions. cucumberOpts: { diff --git a/examples/wdio/mocha/wdio.conf.ts b/examples/wdio/mocha/wdio.conf.ts index c7680f7d..f6d9e779 100644 --- a/examples/wdio/mocha/wdio.conf.ts +++ b/examples/wdio/mocha/wdio.conf.ts @@ -19,6 +19,7 @@ export const config: Options.Testrunner = { capabilities: [ { browserName: 'chrome', + // browserVersion: '147.0.7727.56', 'goog:chromeOptions': { args: [ '--headless', @@ -45,7 +46,9 @@ export const config: Options.Testrunner = { // 3 per-test: mode: 'trace', traceGranularity: 'test' // 4 fail: mode: 'trace', traceGranularity: 'test', tracePolicy: 'retain-on-failure' // 5 retry: use `pnpm demo:wdio:retry` (adds retries:1 + on-first-retry) - mode: 'live' as const + mode: 'live' as const, + traceGranularity: 'test' as const, + tracePolicy: 'retain-on-failure' as const } ] ], diff --git a/package.json b/package.json index 68471b99..a36f9cb3 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@typescript-eslint/utils": "^8.60.1", "@vitest/browser": "^4.1.8", "@vitest/coverage-v8": "^4.1.8", + "@wdio/allure-reporter": "^9.29.1", "autoprefixer": "^10.5.0", "eslint": "^10.4.1", "eslint-config-prettier": "^10.1.8", diff --git a/packages/core/src/artifact-naming.ts b/packages/core/src/artifact-naming.ts new file mode 100644 index 00000000..dcf597b6 --- /dev/null +++ b/packages/core/src/artifact-naming.ts @@ -0,0 +1,10 @@ +/** + * Filename helpers for per-test artifacts (screenshots, videos). Shared so the + * screenshot and video writers slug a test uid identically. + */ + +/** File-safe slug of a value: keep alphanumerics, `_` and `-`; collapse the + * rest to a single `-`; trim leading/trailing dashes. */ +export function fileSlug(value: string): string { + return value.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-+|-+$/g, '') +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9d37bbf0..e6f4a7ba 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,8 +3,11 @@ export * from './action-mapping.js' export * from './action-snapshot.js' +export * from './artifact-naming.js' export * from './artifacts-manifest.js' export * from './attempt-tracker.js' +export * from './screenshot-artifact.js' +export * from './video-slice.js' export * from './with-timeout.js' export * from './assert-patcher.js' export * from './element-snapshot.js' diff --git a/packages/core/src/screenshot-artifact.ts b/packages/core/src/screenshot-artifact.ts new file mode 100644 index 00000000..881ff6e3 --- /dev/null +++ b/packages/core/src/screenshot-artifact.ts @@ -0,0 +1,53 @@ +/** + * Per-test screenshot artifact: the policy decision and the file write, kept + * framework-agnostic so every adapter feeds it the same way (the adapter only + * supplies the base64 capture from its own driver). Mirrors Playwright's + * `screenshot` option — `on` after every test, `only-on-failure` after a + * failing one — and produces a TraceArtifact the manifest and the Allure glue + * consume like any other artifact. + */ + +import fs from 'node:fs/promises' +import path from 'node:path' +import type { TraceScreenshotPolicy } from '@wdio/devtools-shared' +import { fileSlug } from './artifact-naming.js' +import type { TraceArtifact } from './trace-finalizer.js' + +/** Whether a per-test screenshot should be captured for this outcome. */ +export function shouldCaptureScreenshot( + policy: TraceScreenshotPolicy | undefined, + failed: boolean +): boolean { + if (policy === 'on') { + return true + } + if (policy === 'only-on-failure') { + return failed + } + return false +} + +/** + * Write a base64 PNG (from the driver's screenshot command) next to the trace + * output and return the artifact describing it. Retained is always true — a + * screenshot is only ever written when the policy already decided to capture. + */ +export async function writeScreenshotArtifact(input: { + outputDir: string + testUid: string + sessionId: string + base64: string +}): Promise<TraceArtifact> { + await fs.mkdir(input.outputDir, { recursive: true }) + const filename = `screenshot-${fileSlug(input.testUid)}-${input.sessionId.slice(0, 8)}.png` + const filePath = path.join(input.outputDir, filename) + await fs.writeFile(filePath, Buffer.from(input.base64, 'base64')) + return { + kind: 'screenshot', + path: filePath, + scope: 'test', + key: input.testUid, + testUids: [input.testUid], + retained: true + } +} diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index 9cb57af2..ff2b3b99 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -31,9 +31,10 @@ import type { RetryOutcomeView } from './attempt-tracker.js' import { writeTraceZip, type TraceCapturer } from './trace-exporter.js' /** One artifact produced (or, when `retained` is false, decided-against) by a - * trace-mode finalize pass. */ + * trace-mode run — a trace slice, a screencast video, or a per-test + * screenshot. */ export interface TraceArtifact { - kind: 'trace' | 'video' + kind: 'trace' | 'video' | 'screenshot' path: string scope: 'session' | 'spec' | 'test' /** specFile for spec scope, testUid for test scope. */ diff --git a/packages/core/src/video-slice.ts b/packages/core/src/video-slice.ts new file mode 100644 index 00000000..d20e71bb --- /dev/null +++ b/packages/core/src/video-slice.ts @@ -0,0 +1,69 @@ +/** + * Per-test video: slice the continuous screencast frame buffer to one test's + * wall-clock window and encode that slice to a `.webm`. Framework-agnostic — + * the adapter supplies the recorder's frames and the test's start time; the + * recorder itself (CDP push on Chrome, screenshot polling elsewhere) lives in + * each adapter. Best-effort: too few frames or a missing ffmpeg yields no + * artifact rather than an error, so video never aborts a run. + */ + +import fs from 'node:fs/promises' +import path from 'node:path' +import type { ScreencastFrame } from '@wdio/devtools-shared' +import { fileSlug } from './artifact-naming.js' +import { encodeToVideo } from './video-encoder.js' +import { errorMessage } from './error.js' +import type { TraceArtifact } from './trace-finalizer.js' + +/** Frames captured at or after `startWallTime` (ms) — one test's window, since + * the buffer runs continuously and the next test's frames arrive later. */ +export function sliceFramesFrom( + frames: readonly ScreencastFrame[], + startWallTime: number +): ScreencastFrame[] { + return frames.filter((f) => f.timestamp >= startWallTime) +} + +/** + * Encode a test's frame slice to `<outputDir>/video-<uid>-<session>.webm` and + * return the artifact. Returns undefined when there are too few frames to make + * a video or when encoding fails (e.g. fluent-ffmpeg absent) — video is + * best-effort and must never abort the run. + */ +export async function encodePerTestVideo(input: { + frames: readonly ScreencastFrame[] + outputDir: string + testUid: string + sessionId: string + /** 0-based attempt; a `-retry<n>` suffix for n>0 keeps retries from + * overwriting each other's video (mirrors the trace slice's retry keys). */ + attempt?: number + captureFormat?: 'jpeg' | 'png' + minFrames?: number + onLog?: (level: 'info' | 'warn', message: string) => void +}): Promise<TraceArtifact | undefined> { + const minFrames = input.minFrames ?? 2 + if (input.frames.length < minFrames) { + return undefined + } + await fs.mkdir(input.outputDir, { recursive: true }) + const retrySuffix = input.attempt ? `-retry${input.attempt}` : '' + const filename = `video-${fileSlug(input.testUid)}-${input.sessionId.slice(0, 8)}${retrySuffix}.webm` + const filePath = path.join(input.outputDir, filename) + try { + await encodeToVideo([...input.frames], filePath, { + captureFormat: input.captureFormat + }) + } catch (err) { + input.onLog?.('warn', `Per-test video encode failed: ${errorMessage(err)}`) + return undefined + } + return { + kind: 'video', + path: filePath, + scope: 'test', + key: input.testUid, + testUids: [input.testUid], + retained: true + } +} diff --git a/packages/core/tests/output-dir.test.ts b/packages/core/tests/output-dir.test.ts index f44ba3ef..a3226cfa 100644 --- a/packages/core/tests/output-dir.test.ts +++ b/packages/core/tests/output-dir.test.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { resolveAdapterOutputDir } from '../src/output-dir.js' -/** Every resolved dir is grouped under this subfolder (Playwright-style). */ +/** Every resolved dir is grouped under this subfolder */ const grouped = (base: string) => path.join(base, 'test-results') describe('resolveAdapterOutputDir', () => { diff --git a/packages/core/tests/screenshot-artifact.test.ts b/packages/core/tests/screenshot-artifact.test.ts new file mode 100644 index 00000000..a24a1efe --- /dev/null +++ b/packages/core/tests/screenshot-artifact.test.ts @@ -0,0 +1,53 @@ +import { describe, it, expect, afterEach } from 'vitest' +import { mkdtemp, readFile, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { + shouldCaptureScreenshot, + writeScreenshotArtifact +} from '../src/screenshot-artifact.js' + +describe('shouldCaptureScreenshot', () => { + it('captures for `on` regardless of outcome', () => { + expect(shouldCaptureScreenshot('on', false)).toBe(true) + expect(shouldCaptureScreenshot('on', true)).toBe(true) + }) + + it('captures for `only-on-failure` only when failed', () => { + expect(shouldCaptureScreenshot('only-on-failure', true)).toBe(true) + expect(shouldCaptureScreenshot('only-on-failure', false)).toBe(false) + }) + + it('never captures for `off` or undefined', () => { + expect(shouldCaptureScreenshot('off', true)).toBe(false) + expect(shouldCaptureScreenshot(undefined, true)).toBe(false) + }) +}) + +describe('writeScreenshotArtifact', () => { + const dirs: string[] = [] + afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) + }) + + it('writes the decoded PNG and returns a test-scoped screenshot artifact', async () => { + const dir = await mkdtemp(join(tmpdir(), 'shot-')) + dirs.push(dir) + const base64 = Buffer.from('png-bytes').toString('base64') + const artifact = await writeScreenshotArtifact({ + outputDir: dir, + testUid: 'suite > a test/name', + sessionId: 'abcd1234ef', + base64 + }) + expect(artifact.kind).toBe('screenshot') + expect(artifact.scope).toBe('test') + expect(artifact.key).toBe('suite > a test/name') + expect(artifact.retained).toBe(true) + // Filename is slugged (no spaces/slashes) and session-scoped. + expect(artifact.path).toMatch(/screenshot-suite-a-test-name-abcd1234\.png$/) + expect(await readFile(artifact.path, 'utf8')).toBe('png-bytes') + }) +}) diff --git a/packages/core/tests/video-slice.test.ts b/packages/core/tests/video-slice.test.ts new file mode 100644 index 00000000..c2de429a --- /dev/null +++ b/packages/core/tests/video-slice.test.ts @@ -0,0 +1,100 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import type { ScreencastFrame } from '@wdio/devtools-shared' + +const { encodeToVideo } = vi.hoisted(() => ({ encodeToVideo: vi.fn() })) +vi.mock('../src/video-encoder.js', () => ({ encodeToVideo })) + +import { sliceFramesFrom, encodePerTestVideo } from '../src/video-slice.js' + +const frames = (ts: number[]): ScreencastFrame[] => + ts.map((timestamp) => ({ data: 'AAAA', timestamp })) + +describe('sliceFramesFrom', () => { + it('keeps only frames at or after the window start', () => { + const all = frames([100, 200, 300, 400]) + expect(sliceFramesFrom(all, 250).map((f) => f.timestamp)).toEqual([ + 300, 400 + ]) + }) + + it('returns all frames when start precedes them', () => { + expect(sliceFramesFrom(frames([100, 200]), 0)).toHaveLength(2) + }) +}) + +describe('encodePerTestVideo', () => { + const dirs: string[] = [] + beforeEach(() => encodeToVideo.mockReset()) + afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) + }) + async function dir() { + const d = await mkdtemp(join(tmpdir(), 'vid-')) + dirs.push(d) + return d + } + + it('returns undefined below the min-frames threshold (no encode)', async () => { + const artifact = await encodePerTestVideo({ + frames: frames([1]), + outputDir: await dir(), + testUid: 'u1', + sessionId: 'sess1234' + }) + expect(artifact).toBeUndefined() + expect(encodeToVideo).not.toHaveBeenCalled() + }) + + it('encodes and returns a test-scoped video artifact', async () => { + const d = await dir() + encodeToVideo.mockResolvedValueOnce(undefined) + const artifact = await encodePerTestVideo({ + frames: frames([1, 2, 3]), + outputDir: d, + testUid: 'my/test', + sessionId: 'sess1234ef' + }) + expect(artifact).toBeDefined() + expect(artifact!.kind).toBe('video') + expect(artifact!.scope).toBe('test') + expect(artifact!.key).toBe('my/test') + expect(artifact!.path).toMatch(/video-my-test-sess1234\.webm$/) + expect(encodeToVideo).toHaveBeenCalledOnce() + }) + + it('suffixes the filename with the attempt so retries do not overwrite', async () => { + encodeToVideo.mockResolvedValue(undefined) + const a0 = await encodePerTestVideo({ + frames: frames([1, 2]), + outputDir: await dir(), + testUid: 'u1', + sessionId: 'sess1234', + attempt: 0 + }) + const a1 = await encodePerTestVideo({ + frames: frames([1, 2]), + outputDir: await dir(), + testUid: 'u1', + sessionId: 'sess1234', + attempt: 1 + }) + expect(a0!.path).toMatch(/video-u1-sess1234\.webm$/) + expect(a1!.path).toMatch(/video-u1-sess1234-retry1\.webm$/) + }) + + it('returns undefined (no throw) when the encoder fails', async () => { + encodeToVideo.mockRejectedValueOnce(new Error('ffmpeg missing')) + const artifact = await encodePerTestVideo({ + frames: frames([1, 2, 3]), + outputDir: await dir(), + testUid: 'u1', + sessionId: 'sess1234' + }) + expect(artifact).toBeUndefined() + }) +}) diff --git a/packages/service/README.md b/packages/service/README.md index d5532798..bfd4002f 100644 --- a/packages/service/README.md +++ b/packages/service/README.md @@ -46,8 +46,58 @@ services: [['devtools', options]] | `port` | `number` | random | Port the DevTools UI server listens on | | `hostname` | `string` | `'localhost'` | Hostname the DevTools UI server binds to | | `devtoolsCapabilities` | `Capabilities` | Chrome 1600×1200 | Capabilities used to open the DevTools UI window | -| `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below) | +| `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below; for trace mode use `video`) | | `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | +| `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep — e.g. `'retain-on-failure'`, `'retain-on-first-failure'`. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). | + +## Allure integration + +When `@wdio/allure-reporter` is installed, trace-mode artifacts are attached to +the Allure report automatically: + +- **`traceGranularity: 'test'`** — each test's trace (`application/zip`, a + download that opens in `pnpm show-trace`), screenshot (`image/png`, inline) + and video (`video/webm`, inline) attach to that test's card. This is the mode + to use for a per-test Allure report. +- **`traceGranularity: 'session'` / `'spec'`** — a session/spec-spanning + `trace.zip` is written to disk and enumerated in + `devtools-artifacts-<sessionId>.json` (the artifacts manifest, listing every + artifact + each test's state), but it is **not** attached to individual test + cards. + +### Why session/spec traces aren't attached per test + +The reporter's `addAttachment` targets the **currently-running test**. A +session/spec trace is only finalized **after** all its tests have run — by which +point their Allure cards are already closed — so there is no open test to attach +it to. Per-test attachment therefore requires `traceGranularity: 'test'`, where +each slice is written during its own test hook while the card is still open. + +To surface a session/spec trace in Allure anyway, post-process the manifest in +your **own** `onComplete` hook (copying the `trace.zip` into `allure-results/` +and appending it to the result files). This is deliberately left to userland — +baking it into the adapter would couple it to Allure's on-disk result format. + +### Report noise + +In trace mode the service captures a per-action snapshot (a `takeScreenshot` +WebDriver command) to build the trace timeline; `@wdio/allure-reporter` logs +every WebDriver command as a step and attaches a screenshot per `takeScreenshot`. +Silence that flood with the reporter's own options — the `trace.zip` / +screenshot / video attachments are unaffected: + +```ts +reporters: [ + ['allure', { + outputDir: 'allure-results', + disableWebdriverStepsReporting: true, + disableWebdriverScreenshotsReporting: true + }] +] +``` ## Screencast Recording diff --git a/packages/service/src/allure.ts b/packages/service/src/allure.ts index ce0e678d..ce415529 100644 --- a/packages/service/src/allure.ts +++ b/packages/service/src/allure.ts @@ -16,6 +16,13 @@ const log = logger('@wdio/devtools-service') // uses video/webm so Allure renders it inline. const TRACE_CONTENT_TYPE = 'application/zip' const VIDEO_CONTENT_TYPE = 'video/webm' +const SCREENSHOT_CONTENT_TYPE = 'image/png' + +const CONTENT_TYPE_BY_KIND: Record<TraceArtifact['kind'], string> = { + trace: TRACE_CONTENT_TYPE, + video: VIDEO_CONTENT_TYPE, + screenshot: SCREENSHOT_CONTENT_TYPE +} /** The one @wdio/allure-reporter method we use. Typed locally so the optional * peer dependency never becomes a build-time type dependency. */ @@ -75,8 +82,7 @@ export async function attachArtifactToAllure( return } const content = await fs.readFile(artifact.path) - const type = - artifact.kind === 'video' ? VIDEO_CONTENT_TYPE : TRACE_CONTENT_TYPE + const type = CONTENT_TYPE_BY_KIND[artifact.kind] reporter.addAttachment(basename(artifact.path), content, type) } catch (err) { // A missing/unreadable artifact must never reject the test hook. diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index fd24e32a..dc9cea69 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -14,10 +14,13 @@ import { type TraceExportContext } from '@wdio/devtools-core' import { attachArtifactToAllure } from './allure.js' +import { captureAndAttachScreenshot } from './screenshot-capture.js' +import { captureAndAttachVideo } from './video-capture.js' import { wireAssertCapture, type ExpectAssertion } from './assert-capture.js' import { AssertionTracker } from './assertion-tracker.js' import { cucumberScenarioUid, + isFailedResult, resolveTestAttempt, stampTestState, testMetadataUid, @@ -33,7 +36,11 @@ import { dedupeSnapshotsByTimestamp, upsertRichestSnapshot } from './snapshot-dedupe.js' -import type { ActionSnapshot, TestMetadataMap } from '@wdio/devtools-shared' +import type { + ActionSnapshot, + ScreencastFrame, + TestMetadataMap +} from '@wdio/devtools-shared' import { SevereServiceError } from 'webdriverio' import type { Services, Capabilities, Options, Reporters } from '@wdio/types' import type { WebDriverCommands } from '@wdio/protocols' @@ -95,11 +102,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { log.warn(policyWarning) } if (serviceOptions.mode === 'trace' && serviceOptions.screencast?.enabled) { - log.warn('trace mode: ignoring screencast option (live-mode feature)') - this.#screencastOptions = undefined - } else { - this.#screencastOptions = serviceOptions.screencast + log.warn( + 'trace mode: `screencast.enabled` is ignored — use `video` to record; ' + + 'the tuning fields (quality/interval) still apply' + ) } + // Tuning is kept for both modes; whether we actually record is decided by + // #shouldRecordScreencast (screencast.enabled in live, `video` in trace). + this.#screencastOptions = serviceOptions.screencast } /** @@ -111,6 +121,19 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Current test UID, set in beforeTest(), used by afterCommand() to tag commands. */ #currentTestUid?: string + /** Wall-clock ms at the current test's start, set in beforeTest/beforeScenario; + * the lower bound of that test's video frame window (per-test slicing). */ + #currentTestStartWallTime = 0 + + /** Recorder frames snapshotted in onReload before reloadSession replaces the + * recorder — so the ending test's per-test video can still be sliced in + * afterScenario (which runs AFTER the cucumber After hook's reloadSession). */ + #pendingVideoFrames?: { + testUid: string | undefined + startWallTime: number + frames: ScreencastFrame[] + } + /** Map of testUid → metadata for trace group events and per-spec partitioning. */ #testMetadata: TestMetadataMap = new Map() @@ -159,6 +182,34 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } + /** Base64 of the last rendered action snapshot for the current test, skipping + * the end-of-scenario `__final__` frame — that one is captured post-teardown + * and can come back blank when a reloadSession runs before afterScenario. + * Used as the per-test screenshot so it's the real failure-moment frame, + * reload-immune. Scoped to this test's window (>= its start) so a test that + * captured nothing doesn't borrow the previous test's frame. */ + #lastRenderedScreenshot(): string | undefined { + for (let i = this.#actionSnapshots.length - 1; i >= 0; i--) { + const snap = this.#actionSnapshots[i]! + if (snap.timestamp < this.#currentTestStartWallTime) { + return undefined + } + if (snap.command !== '__final__' && snap.screenshot) { + return snap.screenshot + } + } + return undefined + } + + /** Record a screencast this session? Live mode: `screencast.enabled`. Trace + * mode: a non-`off` `video` policy (frames are sliced per test at flush). */ + #shouldRecordScreencast(): boolean { + if (this.#options.mode === 'trace') { + return !!this.#options.video && this.#options.video !== 'off' + } + return !!this.#screencastOptions?.enabled + } + /** Eager per-test flush at test end (test granularity only), run after the * outcome is stamped so this attempt's metadata is written before a retry * overwrites it; the end-of-run finalizer then dedupes it via the key set. */ @@ -254,12 +305,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { } /** - * Start screencast recording if the user has enabled it. - * Options come from the service constructor (services: [['devtools', { screencast: { enabled: true } }]]). - * Failures are non-fatal — a warning is logged and the session continues. + * Start screencast recording when enabled — `screencast.enabled` in live + * mode, or a non-`off` `video` policy in trace mode (per-test slicing at + * flush time). Failures are non-fatal — logged, session continues. */ - if (this.#screencastOptions?.enabled) { - this.#screencastRecorder = new ScreencastRecorder(this.#screencastOptions) + if (this.#shouldRecordScreencast()) { + this.#screencastRecorder = new ScreencastRecorder( + this.#screencastOptions ?? {} + ) await this.#screencastRecorder.start(browser) } @@ -347,6 +400,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { pickle?: { uri?: string; name?: string; astNodeIds?: readonly string[] } }) { this.resetStack() + this.#currentTestStartWallTime = Date.now() const featureFile = world?.pickle?.uri const scenarioName = world?.pickle?.name @@ -377,6 +431,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Mocha/Jasmine hook: the beforeScenario equivalent for file-based specs. */ beforeTest(test?: { file?: string; title?: string; fullTitle?: string }) { this.resetStack() + this.#currentTestStartWallTime = Date.now() // Track test identity for command tagging. Generate a stable UID // from file + title so commands can be partitioned across reruns. @@ -436,7 +491,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#stampOutcome(uid, result) } await this.#finalizePerScenario() - await this.#eagerFlushAndAttach(uid) + await this.#emitTestArtifacts(uid, isFailedResult(result)) } async afterTest( @@ -451,20 +506,60 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#stampOutcome(uid, result) } await this.#finalizePerScenario() - await this.#eagerFlushAndAttach(uid) + await this.#emitTestArtifacts(uid, isFailedResult(result)) } - /** Flush this test's slice (so it captures the final snapshot + stamped - * outcome), then attach the retained artifact to Allure while the per-test - * hook is still open. No-op outside `test`-granularity trace mode. */ - async #eagerFlushAndAttach(uid: string | undefined): Promise<void> { - if (!uid) { - return - } - const artifact = await this.#eagerFlushTestSlice(uid) - if (artifact) { - await attachArtifactToAllure(artifact) + /** At test end, while the per-test hook is still open: eager-flush this test's + * slice (so it captures the final snapshot + stamped outcome) and attach the + * retained trace to Allure, then capture the per-test screenshot per policy + * and attach it too. Each part no-ops when its feature is off. */ + async #emitTestArtifacts( + uid: string | undefined, + failed: boolean + ): Promise<void> { + if (uid) { + const artifact = await this.#eagerFlushTestSlice(uid) + if (artifact) { + await attachArtifactToAllure(artifact) + } } + await captureAndAttachScreenshot({ + mode: this.#options.mode, + granularity: this.#options.traceGranularity, + policy: this.#options.screenshot, + failed, + screenshotBase64: this.#lastRenderedScreenshot(), + sessionId: this.#browser?.sessionId, + outputDir: this.#outputDir, + testUid: uid, + onArtifact: (a) => this.#artifacts.push(a) + }) + // Authoritative attempt for this test (stamped into metadata by + // #stampOutcome, which ran just before this). Scopes retention + the video + // filename to this attempt so retries don't overwrite each other. + const attempt = uid ? this.#testMetadata.get(uid)?.attempt : undefined + // Prefer frames snapshotted in onReload (reloadSession tears the recorder + // down before this hook); fall back to the live recorder otherwise. + const pending = + this.#pendingVideoFrames?.testUid === uid + ? this.#pendingVideoFrames + : undefined + this.#pendingVideoFrames = undefined + await captureAndAttachVideo({ + mode: this.#options.mode, + granularity: this.#options.traceGranularity, + policy: this.#options.video, + frames: pending?.frames ?? this.#screencastRecorder?.frames, + startWallTime: pending?.startWallTime ?? this.#currentTestStartWallTime, + outcomes: uid ? this.#attemptTracker.forTest(uid, attempt) : [], + attempt, + outputDir: this.#outputDir, + testUid: uid, + sessionId: this.#browser?.sessionId, + captureFormat: this.#screencastOptions?.captureFormat, + onArtifact: (a) => this.#artifacts.push(a), + onLog: (level, msg) => log[level](msg) + }) } /** expect-webdriverio matcher hooks — delegated to the assertion tracker. */ @@ -663,16 +758,30 @@ export default class DevToolsHookService implements Services.ServiceInstance { * on the new session so the second scenario is also covered. */ async onReload(oldSessionId: string, _newSessionId: string) { - if (!this.#screencastOptions?.enabled || !this.#browser) { + if (!this.#shouldRecordScreencast() || !this.#browser) { return } + // Trace mode: the ending test's afterScenario runs AFTER this reload (a + // cucumber `After(() => reloadSession())` is WDIO boilerplate), by which + // point the recorder below has replaced these frames. Snapshot them now, + // keyed to the ending test, so afterScenario can still slice its video. + if (this.#options.mode === 'trace' && this.#screencastRecorder) { + this.#pendingVideoFrames = { + testUid: this.#currentTestUid, + startWallTime: this.#currentTestStartWallTime, + frames: [...this.#screencastRecorder.frames] + } + } + // Finalize the recording from the old session (CDP is already gone, so // stop() will fail gracefully and we encode whatever frames arrived). await this.#finalizeScreencast(oldSessionId) // Start a new recorder for the new session. - this.#screencastRecorder = new ScreencastRecorder(this.#screencastOptions) + this.#screencastRecorder = new ScreencastRecorder( + this.#screencastOptions ?? {} + ) await this.#screencastRecorder.start(this.#browser) } @@ -708,6 +817,13 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (!this.#screencastRecorder) { return } + // Trace mode: the video is emitted per-test (sliced in #emitTestArtifacts), + // and there's no dashboard to receive a session recording — so just stop the + // recorder to release resources; never encode an orphan session-wide webm. + if (this.#options.mode === 'trace') { + await this.#screencastRecorder.stop() + return + } // Skip ghost sessions: browser.reloadSession() creates a new session at // the end of a test run that has no steps — it captures at most a handful // of frames before teardown. Require at least 5 frames so we don't produce diff --git a/packages/service/src/screenshot-capture.ts b/packages/service/src/screenshot-capture.ts new file mode 100644 index 00000000..9aca639c --- /dev/null +++ b/packages/service/src/screenshot-capture.ts @@ -0,0 +1,67 @@ +// Per-test failure/always screenshot for the WDIO adapter: the policy gate and +// the Allure attach. Kept out of index.ts so the god-file stays lean and the +// capture is unit-testable. The policy decision and file write live in core +// (framework-agnostic). +// +// The image is NOT a fresh screenshot taken here — it's the last rendered action +// snapshot the service already captured during the test. A fresh end-of-test +// takeScreenshot() is unreliable: a cucumber `After(() => reloadSession())` hook +// (WDIO boilerplate) runs before the service afterScenario hook and blanks the +// page, so an end-of-test capture comes back empty. The last action snapshot was +// captured mid-command, before any teardown, so it's the real failure-moment +// frame — and reusing it also drops an extra WebDriver command from the report. + +import { + shouldCaptureScreenshot, + writeScreenshotArtifact, + type TraceArtifact +} from '@wdio/devtools-core' +import type { + DevToolsMode, + TraceGranularity, + TraceScreenshotPolicy +} from '@wdio/devtools-shared' +import { attachArtifactToAllure } from './allure.js' + +/** + * Write the per-test screenshot (per the policy) from an already-captured base64 + * frame and attach it to Allure. No-op outside `test`-granularity trace mode, + * without a uid/session/frame, or when the policy declines. Gated to `test` + * granularity so the whole per-test inline story (trace + screenshot + video) is + * one rule; coarser granularities keep their artifacts in the manifest. The + * artifact is handed to `onArtifact` so it lands in the manifest too. + */ +export async function captureAndAttachScreenshot(input: { + mode: DevToolsMode | undefined + granularity: TraceGranularity | undefined + policy: TraceScreenshotPolicy | undefined + failed: boolean + /** Base64 of the last rendered action snapshot (reload-immune, not a fresh + * end-of-test capture). Undefined when the test recorded no snapshot. */ + screenshotBase64: string | undefined + sessionId: string | undefined + outputDir: string + testUid: string | undefined + onArtifact: (artifact: TraceArtifact) => void +}): Promise<void> { + const { mode, granularity, policy, failed, screenshotBase64, sessionId } = + input + if ( + mode !== 'trace' || + granularity !== 'test' || + !screenshotBase64 || + !sessionId || + !input.testUid || + !shouldCaptureScreenshot(policy, failed) + ) { + return + } + const artifact = await writeScreenshotArtifact({ + outputDir: input.outputDir, + testUid: input.testUid, + sessionId, + base64: screenshotBase64 + }) + input.onArtifact(artifact) + await attachArtifactToAllure(artifact) +} diff --git a/packages/service/src/test-metadata.ts b/packages/service/src/test-metadata.ts index dc2babad..5e37ba20 100644 --- a/packages/service/src/test-metadata.ts +++ b/packages/service/src/test-metadata.ts @@ -46,6 +46,14 @@ export function resultToState(result: { return result.passed ? 'passed' : 'failed' } +/** True when a result represents a failed test (not passed, not skipped). + * Absent result → not failed (nothing ran to fail). */ +export function isFailedResult( + result?: Pick<TestOutcomeResult, 'passed' | 'skipped'> +): boolean { + return result ? resultToState(result) === 'failed' : false +} + /** Stamp the final state (and, when known, the 0-based attempt) onto the * metadata entry beforeTest/beforeScenario created, so retention can gate its * trace per attempt. No-op when there's no entry. */ diff --git a/packages/service/src/video-capture.ts b/packages/service/src/video-capture.ts new file mode 100644 index 00000000..ff8b1d06 --- /dev/null +++ b/packages/service/src/video-capture.ts @@ -0,0 +1,80 @@ +// Per-test video for the WDIO adapter: the granularity/policy gate, the +// retention decision, the frame-window slice, the encode, and the Allure +// attach. Kept out of index.ts so the god-file stays lean. The slice + encode +// live in core (framework-agnostic); only the recorder is WDIO-specific. + +import { + encodePerTestVideo, + shouldRetainTrace, + sliceFramesFrom, + type TestOutcome, + type TraceArtifact +} from '@wdio/devtools-core' +import type { + DevToolsMode, + ScreencastFrame, + TraceGranularity, + TraceVideoPolicy +} from '@wdio/devtools-shared' +import { attachArtifactToAllure } from './allure.js' + +/** + * Slice the continuous screencast to this test's window, encode a `.webm`, and + * attach it to Allure — when trace mode + `test` granularity + a non-`off` + * `video` policy that retains this test's outcome. No-op otherwise. The encoded + * artifact is handed to `onArtifact` so it lands in the manifest. + */ +export async function captureAndAttachVideo(input: { + mode: DevToolsMode | undefined + granularity: TraceGranularity | undefined + policy: TraceVideoPolicy | undefined + frames: readonly ScreencastFrame[] | undefined + startWallTime: number + outcomes: TestOutcome[] + attempt: number | undefined + outputDir: string + testUid: string | undefined + sessionId: string | undefined + captureFormat?: 'jpeg' | 'png' + onArtifact: (artifact: TraceArtifact) => void + onLog?: (level: 'info' | 'warn', message: string) => void +}): Promise<void> { + const { mode, granularity, policy, frames, testUid, sessionId } = input + if ( + mode !== 'trace' || + granularity !== 'test' || + !policy || + policy === 'off' || + !frames || + !testUid || + !sessionId || + // No recorded attempt for this uid — the test never started (e.g. a + // skipped/pending test whose afterTest fires without a beforeTest). Skip + // rather than fail-open on empty outcomes, which would slice the PREVIOUS + // test's frames into a video attributed to this one. + input.outcomes.length === 0 + ) { + return + } + const decision = shouldRetainTrace(policy, { + outcomes: input.outcomes, + attemptInfoAvailable: true + }) + if (!decision.retain) { + return + } + const artifact = await encodePerTestVideo({ + frames: sliceFramesFrom(frames, input.startWallTime), + outputDir: input.outputDir, + testUid, + sessionId, + attempt: input.attempt, + captureFormat: input.captureFormat, + onLog: input.onLog + }) + if (!artifact) { + return + } + input.onArtifact(artifact) + await attachArtifactToAllure(artifact) +} diff --git a/packages/service/tests/allure.test.ts b/packages/service/tests/allure.test.ts index e8305f6a..aa269eed 100644 --- a/packages/service/tests/allure.test.ts +++ b/packages/service/tests/allure.test.ts @@ -56,7 +56,7 @@ describe('attachArtifactToAllure', () => { expect(addAttachment).not.toHaveBeenCalled() }) - it('attaches a trace zip with the Allure Playwright content type', async () => { + it('attaches a trace zip as a plain application/zip download', async () => { const path = await tempZip('trace-abc.zip') await attachArtifactToAllure(artifact({ path })) expect(addAttachment).toHaveBeenCalledOnce() @@ -73,6 +73,13 @@ describe('attachArtifactToAllure', () => { expect(type).toBe('video/webm') }) + it('attaches a screenshot artifact as image/png', async () => { + const path = await tempZip('screenshot-u1.png') + await attachArtifactToAllure(artifact({ kind: 'screenshot', path })) + const [, , type] = addAttachment.mock.calls[0]! + expect(type).toBe('image/png') + }) + it('skips a directory-format artifact without throwing (ndjson-directory)', async () => { const dir = await mkdtemp(join(tmpdir(), 'allure-dir-')) dirs.push(dir) diff --git a/packages/service/tests/screenshot-capture.test.ts b/packages/service/tests/screenshot-capture.test.ts new file mode 100644 index 00000000..7c3bdb1d --- /dev/null +++ b/packages/service/tests/screenshot-capture.test.ts @@ -0,0 +1,86 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { mkdtemp, rm, readdir } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import type { TraceArtifact } from '@wdio/devtools-core' + +const addAttachment = vi.fn() +vi.mock('@wdio/allure-reporter', () => ({ + addAttachment, + default: { addAttachment } +})) + +import { captureAndAttachScreenshot } from '../src/screenshot-capture.js' +import { resetAllureReporterCache } from '../src/allure.js' + +const SHOT = Buffer.from('png-bytes').toString('base64') + +describe('captureAndAttachScreenshot', () => { + const dirs: string[] = [] + const collected: TraceArtifact[] = [] + beforeEach(() => { + addAttachment.mockReset() + resetAllureReporterCache() + collected.length = 0 + }) + afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) + }) + + async function run( + over: Partial<Parameters<typeof captureAndAttachScreenshot>[0]> + ) { + const dir = await mkdtemp(join(tmpdir(), 'shot-cap-')) + dirs.push(dir) + await captureAndAttachScreenshot({ + mode: 'trace', + granularity: 'test', + policy: 'only-on-failure', + failed: true, + screenshotBase64: SHOT, + sessionId: 'sess1234', + outputDir: dir, + testUid: 'u1', + onArtifact: (a) => collected.push(a), + ...over + }) + return { dir } + } + + it('writes + attaches the reused snapshot on failure under only-on-failure', async () => { + const { dir } = await run({}) + expect(collected).toHaveLength(1) + expect(collected[0]!.kind).toBe('screenshot') + expect(addAttachment).toHaveBeenCalledOnce() + expect(await readdir(dir)).toHaveLength(1) + }) + + it('does nothing on a passing test under only-on-failure', async () => { + await run({ failed: false }) + expect(collected).toHaveLength(0) + expect(addAttachment).not.toHaveBeenCalled() + }) + + it('does nothing outside trace mode', async () => { + await run({ mode: 'live', policy: 'on' }) + expect(collected).toHaveLength(0) + }) + + it('does nothing outside test granularity (uniform rule)', async () => { + await run({ granularity: 'session', policy: 'on' }) + expect(collected).toHaveLength(0) + }) + + it('does nothing without a captured frame (no snapshot to reuse)', async () => { + await run({ policy: 'on', screenshotBase64: undefined }) + expect(collected).toHaveLength(0) + }) + + it('does nothing without a sessionId or uid', async () => { + await run({ sessionId: undefined }) + await run({ testUid: undefined }) + expect(collected).toHaveLength(0) + }) +}) diff --git a/packages/service/tests/video-capture.test.ts b/packages/service/tests/video-capture.test.ts new file mode 100644 index 00000000..25c1c404 --- /dev/null +++ b/packages/service/tests/video-capture.test.ts @@ -0,0 +1,75 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import type { ScreencastFrame } from '@wdio/devtools-shared' +import type { TraceArtifact, TestOutcome } from '@wdio/devtools-core' + +// Every case here is designed to no-op BEFORE the ffmpeg encode (failed gate or +// non-retaining policy), so no encoder/reporter mock is needed — the real +// (pure) shouldRetainTrace decides retention. The encode path itself is covered +// by core's video-slice.test.ts. +import { captureAndAttachVideo } from '../src/video-capture.js' + +const frames: ScreencastFrame[] = [ + { data: 'AAAA', timestamp: 10 }, + { data: 'AAAA', timestamp: 20 }, + { data: 'AAAA', timestamp: 30 } +] + +const failedOutcome: TestOutcome[] = [ + { uid: 'u1', attempt: 0, state: 'failed' } +] +const passedOutcome: TestOutcome[] = [ + { uid: 'u1', attempt: 0, state: 'passed' } +] + +describe('captureAndAttachVideo gating', () => { + const collected: TraceArtifact[] = [] + beforeEach(() => { + collected.length = 0 + }) + + const base = { + mode: 'trace' as const, + granularity: 'test' as const, + policy: 'retain-on-failure' as const, + frames, + startWallTime: 0, + outcomes: failedOutcome, + attempt: 0, + outputDir: '/tmp/does-not-encode', + testUid: 'u1', + sessionId: 'sess1234', + onArtifact: (a: TraceArtifact) => collected.push(a) + } + + it('no-ops outside test granularity', async () => { + await captureAndAttachVideo({ ...base, granularity: 'session' }) + expect(collected).toHaveLength(0) + }) + + it('no-ops when the test never started (empty outcomes — no fail-open)', async () => { + await captureAndAttachVideo({ ...base, outcomes: [] }) + expect(collected).toHaveLength(0) + }) + + it('no-ops when video policy is off/undefined', async () => { + await captureAndAttachVideo({ ...base, policy: 'off' }) + await captureAndAttachVideo({ ...base, policy: undefined }) + expect(collected).toHaveLength(0) + }) + + it('no-ops when there are no frames', async () => { + await captureAndAttachVideo({ ...base, frames: undefined }) + expect(collected).toHaveLength(0) + }) + + it('no-ops when the policy does not retain this outcome (passing + retain-on-failure)', async () => { + await captureAndAttachVideo({ ...base, outcomes: passedOutcome }) + expect(collected).toHaveLength(0) + }) + + it('no-ops without a sessionId or uid', async () => { + await captureAndAttachVideo({ ...base, sessionId: undefined }) + await captureAndAttachVideo({ ...base, testUid: undefined }) + expect(collected).toHaveLength(0) + }) +}) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 1e2c7033..b360936d 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -49,6 +49,17 @@ export type TraceRetentionPolicy = | 'on-all-retries' | 'retain-on-failure-and-retries' +/** Per-test screenshot capture policy, mirroring Playwright's `screenshot` + * option. `only-on-failure` shoots after a failing test; `on` after every + * test; `off` (default) never. Only applies in trace mode. */ +export type TraceScreenshotPolicy = 'off' | 'on' | 'only-on-failure' + +/** Per-test video capture policy. `off` (default) records nothing; any other + * value records the screencast and keeps each test's video slice per the same + * retention semantics as `tracePolicy`. Only applies in trace mode at + * `traceGranularity: 'test'` (the per-test scope videos attach to). */ +export type TraceVideoPolicy = 'off' | TraceRetentionPolicy + /** One node in a test's ancestor chain, outermost first. */ export interface TestAncestor { uid: string @@ -306,6 +317,14 @@ export interface BaseDevToolsOptions { /** Trace retention policy — gates which traces are kept (e.g. * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ tracePolicy?: TraceRetentionPolicy + /** Per-test screenshot capture, attached to the trace artifacts and to Allure + * inline. `off` (default) | `on` | `only-on-failure`. Only applies in trace + * mode. */ + screenshot?: TraceScreenshotPolicy + /** Per-test video (screencast) capture, retained per the given policy and + * attached to Allure inline. `off` (default) or a retention policy. Only + * applies in trace mode at `traceGranularity: 'test'`. */ + video?: TraceVideoPolicy } /** Minimal Cucumber pickle-step shape — only the fields the adapters read. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1de3557..8f03e235 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@vitest/coverage-v8': specifier: ^4.1.8 version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) + '@wdio/allure-reporter': + specifier: ^9.29.1 + version: 9.29.1 autoprefixer: specifier: ^10.5.0 version: 10.5.0(postcss@8.5.15) @@ -152,7 +155,7 @@ importers: version: 9.28.0 expect-webdriverio: specifier: ^5.6.7 - version: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.18.0)(webdriverio@9.28.0(puppeteer-core@21.11.0)) + version: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.29.1)(webdriverio@9.28.0(puppeteer-core@21.11.0)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@25.9.3)(typescript@6.0.3) @@ -368,7 +371,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.0.16 - version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) packages/nightwatch-devtools: dependencies: @@ -538,6 +541,9 @@ importers: '@types/yazl': specifier: ^2.4.6 version: 2.4.6 + '@wdio/allure-reporter': + specifier: ^9.0.0 + version: 9.29.1 '@wdio/devtools-backend': specifier: workspace:^ version: link:../backend @@ -2711,6 +2717,10 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + '@wdio/allure-reporter@9.29.1': + resolution: {integrity: sha512-NroTqEN+l0WHVbqS6CH7sTrFtd3d0mgxjPFvFcbzCER1+GA0chTzFT/GCwl4WvNrbbX6a/z7QWT+UwWdXJQJvQ==} + engines: {node: '>=18.20.0'} + '@wdio/cli@9.28.0': resolution: {integrity: sha512-jEKYdCvZ9ST8YQ4EvyV9lsEoRxhWenplGJppbiH9SKHiwPqrUapi/EE7f6CBDwkWP7NIlzj2PyTe+JRmkXILLw==} engines: {node: '>=18.20.0'} @@ -2751,6 +2761,10 @@ packages: resolution: {integrity: sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==} engines: {node: '>=18.20.0'} + '@wdio/logger@9.29.1': + resolution: {integrity: sha512-0ZAEIo6PNyMIJPlOGkIgyOJUjcd0pC8/QHlVAAe1c91/IcjZ1X+k0yidXHaboJdN7dq1XPUacmhRdtua0U5EZg==} + engines: {node: '>=18.20.0'} + '@wdio/mocha-framework@9.28.0': resolution: {integrity: sha512-UdkgigdyxJu0Rpx2ZRSNuB8u8B5nmLBeRjn5JHYTXBp8Ubi+wgFR1+EdLg8k2z+CtuYe3bNHBw7vPpBYuQMLZw==} engines: {node: '>=18.20.0'} @@ -2769,6 +2783,10 @@ packages: resolution: {integrity: sha512-q9gG6SXNTn/9cKF6EJ+aa5sGZM5HAVNsDZ3YU5B0IHg9ufdBuJgfT0LiAsnehLiceEuivuzPyz85vbDb0SFiVA==} engines: {node: '>=18.20.0'} + '@wdio/reporter@9.29.1': + resolution: {integrity: sha512-CKAcVy9BGwvufokMcl3H+yNcvD11Klku/1BPz8bKSRv7/KzueXR06s1cPbJH3tv9r9zxPErxgdVMpulN8I0qAg==} + engines: {node: '>=18.20.0'} + '@wdio/runner@9.28.0': resolution: {integrity: sha512-i6Zj9IKvHqNrRAuYoj56dhI6dXy5IkAxvsxuMih4R+EHLEihDoIwDRouJ9wOme1ZyHZ0Wpc6XDy8Igf1KnqWvQ==} engines: {node: '>=18.20.0'} @@ -2788,6 +2806,10 @@ packages: resolution: {integrity: sha512-75JPq39gifkPNqOSn5C4/A5ZSyXwF+dGr5jfsCubFN9Lk9dKBXfjdbWueSQNpJg0jmE6dVrbT7+9mnDNnO0HdQ==} engines: {node: '>=18.20.0'} + '@wdio/types@9.29.1': + resolution: {integrity: sha512-jp8jgMv6TS35G96YzHZxw3PVN0Dz6xQ6tnMAicndAJ8Jt9AIXb0ywIse4TjaFywakO3dLoEhlyA3ZtR26vmt+w==} + engines: {node: '>=18.20.0'} + '@wdio/utils@8.41.0': resolution: {integrity: sha512-0TcTjBiax1VxtJQ/iQA0ZyYOSHjjX2ARVmEI0AMo9+AuIq+xBfnY561+v8k9GqOMPKsiH/HrK3xwjx8xCVS03g==} engines: {node: ^16.13 || >=18} @@ -2875,6 +2897,14 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + allure-js-commons@3.10.2: + resolution: {integrity: sha512-5nAjUF1iNPSQMwKtEsadclSta8C3L705/k/pIzGb9M6P9krgfRaCyaEHt8pkLlCP9NFj5xk3grjtnAhiLeT+Kg==} + peerDependencies: + allure-playwright: 3.10.2 + peerDependenciesMeta: + allure-playwright: + optional: true + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -3310,6 +3340,9 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} @@ -3546,6 +3579,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + css-functions-list@3.3.3: resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} engines: {node: '>=12'} @@ -3576,6 +3612,9 @@ packages: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} + csv-stringify@6.8.1: + resolution: {integrity: sha512-tZ6X6TKQyQgCo5OptXcyAbfN1pwmoxEqELPQ7KFazNErx7kiVsDK8o+VYRXhfMl4N9vvOOLXuioquR2MeP847A==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -4559,6 +4598,9 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4735,6 +4777,9 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} @@ -5431,6 +5476,9 @@ packages: mathml-tag-names@4.0.0: resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -7610,7 +7658,7 @@ snapshots: '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7769,7 +7817,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -8450,7 +8498,7 @@ snapshots: '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -9134,7 +9182,7 @@ snapshots: '@puppeteer/browsers@2.13.2': dependencies: - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 @@ -9552,7 +9600,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) eslint: 10.5.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: @@ -9562,7 +9610,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -9581,7 +9629,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/utils': 8.61.1(eslint@10.5.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) eslint: 10.5.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -9596,7 +9644,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.8.4 tinyglobby: 0.2.17 @@ -9735,6 +9783,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 @@ -9789,6 +9845,18 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@wdio/allure-reporter@9.29.1': + dependencies: + '@types/node': 25.9.3 + '@wdio/reporter': 9.29.1 + '@wdio/types': 9.29.1 + allure-js-commons: 3.10.2 + csv-stringify: 6.8.1 + html-entities: 2.6.0 + strip-ansi: 7.2.0 + transitivePeerDependencies: + - allure-playwright + '@wdio/cli@9.28.0(@types/node@25.9.3)(expect-webdriverio@5.6.8)(puppeteer-core@21.11.0)': dependencies: '@vitest/snapshot': 2.1.9 @@ -9878,7 +9946,7 @@ snapshots: '@wdio/globals@9.28.0(expect-webdriverio@5.6.8)(webdriverio@9.28.0(puppeteer-core@21.11.0))': dependencies: - expect-webdriverio: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.18.0)(webdriverio@9.28.0(puppeteer-core@21.11.0)) + expect-webdriverio: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.29.1)(webdriverio@9.28.0(puppeteer-core@21.11.0)) webdriverio: 9.28.0(puppeteer-core@21.11.0) '@wdio/local-runner@9.28.0(@wdio/globals@9.28.0)(webdriverio@9.28.0(puppeteer-core@21.11.0))': @@ -9918,6 +9986,14 @@ snapshots: safe-regex2: 5.1.1 strip-ansi: 7.2.0 + '@wdio/logger@9.29.1': + dependencies: + chalk: 5.6.2 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + safe-regex2: 5.1.1 + strip-ansi: 7.2.0 + '@wdio/mocha-framework@9.28.0': dependencies: '@types/mocha': 10.0.10 @@ -9948,6 +10024,14 @@ snapshots: diff: 8.0.4 object-inspect: 1.13.4 + '@wdio/reporter@9.29.1': + dependencies: + '@types/node': 25.9.3 + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + diff: 8.0.4 + object-inspect: 1.13.4 + '@wdio/runner@9.28.0(expect-webdriverio@5.6.8)(webdriverio@9.28.0(puppeteer-core@21.11.0))': dependencies: '@types/node': 25.9.3 @@ -9958,7 +10042,7 @@ snapshots: '@wdio/types': 9.28.0 '@wdio/utils': 9.28.0 deepmerge-ts: 7.1.5 - expect-webdriverio: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.18.0)(webdriverio@9.28.0(puppeteer-core@21.11.0)) + expect-webdriverio: 5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.29.1)(webdriverio@9.28.0(puppeteer-core@21.11.0)) webdriver: 9.28.0 webdriverio: 9.28.0(puppeteer-core@21.11.0) transitivePeerDependencies: @@ -9985,6 +10069,10 @@ snapshots: dependencies: '@types/node': 25.9.3 + '@wdio/types@9.29.1': + dependencies: + '@types/node': 25.9.3 + '@wdio/utils@8.41.0': dependencies: '@puppeteer/browsers': 1.9.1 @@ -10058,7 +10146,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -10099,6 +10187,10 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + allure-js-commons@3.10.2: + dependencies: + md5: 2.3.0 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -10593,6 +10685,8 @@ snapshots: chardet@2.1.1: {} + charenc@0.0.2: {} + check-error@1.0.2: {} cheerio-select@2.1.0: @@ -10860,6 +10954,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypt@0.0.2: {} + css-functions-list@3.3.3: {} css-select@5.2.2: @@ -10888,6 +10984,8 @@ snapshots: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 + csv-stringify@6.8.1: {} + data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: {} @@ -11489,7 +11587,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -11591,6 +11689,16 @@ snapshots: jest-matcher-utils: 30.4.1 webdriverio: 9.28.0(puppeteer-core@21.11.0) + expect-webdriverio@5.6.8(@wdio/globals@9.28.0)(@wdio/logger@9.29.1)(webdriverio@9.28.0(puppeteer-core@21.11.0)): + dependencies: + '@vitest/snapshot': 4.1.9 + '@wdio/globals': 9.28.0(expect-webdriverio@5.6.8)(webdriverio@9.28.0(puppeteer-core@21.11.0)) + '@wdio/logger': 9.29.1 + deep-eql: 5.0.2 + expect: 30.4.1 + jest-matcher-utils: 30.4.1 + webdriverio: 9.28.0(puppeteer-core@21.11.0) + expect@30.4.1: dependencies: '@jest/expect-utils': 30.4.1 @@ -11606,7 +11714,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -11937,7 +12045,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -11945,7 +12053,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 8.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -12117,6 +12225,8 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 + html-entities@2.6.0: {} + html-escaper@2.0.2: {} html-tags@5.1.0: {} @@ -12141,35 +12251,35 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color http-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color https-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -12290,6 +12400,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-buffer@1.1.6: {} + is-builtin-module@5.0.0: dependencies: builtin-modules: 5.2.0 @@ -12466,7 +12578,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -12929,7 +13041,7 @@ snapshots: lighthouse-logger@2.0.2: dependencies: - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) marky: 1.3.0 transitivePeerDependencies: - supports-color @@ -13131,6 +13243,12 @@ snapshots: mathml-tag-names@4.0.0: {} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + mdn-data@2.27.1: {} memorystream@0.3.1: {} @@ -13552,7 +13670,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -13564,7 +13682,7 @@ snapshots: pac-proxy-agent@9.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) get-uri: 8.0.0 http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 @@ -13854,7 +13972,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -13867,7 +13985,7 @@ snapshots: proxy-agent@8.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 lru-cache: 7.18.3 @@ -14387,7 +14505,7 @@ snapshots: socks-proxy-agent@10.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14395,7 +14513,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14604,7 +14722,7 @@ snapshots: cosmiconfig: 9.0.2(typescript@6.0.3) css-functions-list: 3.3.3 css-tree: 3.2.1 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 11.1.3 @@ -14867,7 +14985,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) esbuild: 0.27.7 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 @@ -15000,7 +15118,7 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@volar/typescript': 2.4.28 compare-versions: 6.1.1 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) kolorist: 1.8.0 local-pkg: 1.2.1 magic-string: 0.30.21 @@ -15143,6 +15261,21 @@ snapshots: optionalDependencies: rollup: 4.62.0 + vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.9.3 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.22.4 + yaml: 2.9.0 + vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -15158,6 +15291,36 @@ snapshots: tsx: 4.22.4 yaml: 2.9.0 + vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.9.3 + '@vitest/coverage-v8': 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) + happy-dom: 20.10.4 + jsdom: 24.1.3 + transitivePeerDependencies: + - msw + vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 @@ -15200,7 +15363,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color From 0b84dbcd13424e40c997fd828e450425b3bce4f5 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 15 Jul 2026 17:27:41 +0530 Subject: [PATCH 066/109] fix(core): replace polynomial-ReDoS edge-trims with a linear trimChar --- packages/core/src/artifact-naming.ts | 18 +++++++++- packages/core/src/spec-trace-helpers.ts | 20 ++++++----- packages/core/tests/artifact-naming.test.ts | 39 +++++++++++++++++++++ 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 packages/core/tests/artifact-naming.test.ts diff --git a/packages/core/src/artifact-naming.ts b/packages/core/src/artifact-naming.ts index dcf597b6..fdb968d7 100644 --- a/packages/core/src/artifact-naming.ts +++ b/packages/core/src/artifact-naming.ts @@ -3,8 +3,24 @@ * screenshot and video writers slug a test uid identically. */ +/** Strip leading and trailing occurrences of `char` via a linear scan. A regex + * like `/^c+|c+$/` is O(n²) on long runs of `c` (the anchored `+` is retried + * at each position) — flagged by CodeQL's js/polynomial-redos — so this avoids + * regex entirely. `char` must be a single character. */ +export function trimChar(value: string, char: string): string { + let start = 0 + let end = value.length + while (start < end && value[start] === char) { + start++ + } + while (end > start && value[end - 1] === char) { + end-- + } + return value.slice(start, end) +} + /** File-safe slug of a value: keep alphanumerics, `_` and `-`; collapse the * rest to a single `-`; trim leading/trailing dashes. */ export function fileSlug(value: string): string { - return value.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-+|-+$/g, '') + return trimChar(value.replace(/[^a-zA-Z0-9_-]+/g, '-'), '-') } diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index 6de04bf8..4b37fe80 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -16,6 +16,7 @@ import type { import type { TraceCapturer } from './trace-exporter.js' import { writeTraceZip } from './trace-exporter.js' import { deterministicUid } from './uid.js' +import { trimChar } from './artifact-naming.js' // ─── SpecRange ──────────────────────────────────────────────────────────────── @@ -68,13 +69,14 @@ export function findFlushableRange( * Falls back to `'unknown-spec'` when the result is empty. */ export function sanitizeSpecName(specFile: string): string { - return ( + const cleaned = trimChar( specFile .replace(/^.*[/\\]/, '') .replace(/\.[^.]+$/, '') - .replace(/[^a-zA-Z0-9_-]/g, '_') - .replace(/^_+|_+$/g, '') || 'unknown-spec' + .replace(/[^a-zA-Z0-9_-]/g, '_'), + '_' ) + return cleaned || 'unknown-spec' } // ─── Spec session ID ────────────────────────────────────────────────────────── @@ -121,12 +123,12 @@ const MAX_SLUG_LENGTH = 60 /** Lowercase, collapse runs of non-alphanumerics to `-`, trim edge dashes, * and cap length (trimming a dash the cut may leave behind). */ function slugify(text: string): string { - return text - .toLowerCase() - .replace(/[^a-z0-9]+/g, '-') - .replace(/^-+|-+$/g, '') - .slice(0, MAX_SLUG_LENGTH) - .replace(/-+$/g, '') + const collapsed = trimChar( + text.toLowerCase().replace(/[^a-z0-9]+/g, '-'), + '-' + ) + // Trim again after the length cap in case it sliced mid-dash-run. + return trimChar(collapsed.slice(0, MAX_SLUG_LENGTH), '-') } /** diff --git a/packages/core/tests/artifact-naming.test.ts b/packages/core/tests/artifact-naming.test.ts new file mode 100644 index 00000000..a8436f00 --- /dev/null +++ b/packages/core/tests/artifact-naming.test.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest' +import { trimChar, fileSlug } from '../src/artifact-naming.js' + +describe('trimChar', () => { + it('strips leading and trailing occurrences only', () => { + expect(trimChar('--a-b--', '-')).toBe('a-b') + expect(trimChar('__x__', '_')).toBe('x') + }) + + it('returns empty for an all-char string', () => { + expect(trimChar('-----', '-')).toBe('') + }) + + it('is a no-op when there is nothing to trim', () => { + expect(trimChar('abc', '-')).toBe('abc') + expect(trimChar('', '-')).toBe('') + }) + + it('handles long runs without catastrophic backtracking', () => { + const long = '-'.repeat(100000) + 'x' + '-'.repeat(100000) + // A polynomial /^-+|-+$/ would stall here; the linear scan returns fast. + expect(trimChar(long, '-')).toBe('x') + }) +}) + +describe('fileSlug', () => { + it('collapses disallowed runs to a single dash and trims edges', () => { + expect(fileSlug('a/b c!!d')).toBe('a-b-c-d') + expect(fileSlug(' spaced ')).toBe('spaced') + }) + + it('keeps alphanumerics, underscore and dash', () => { + expect(fileSlug('Test_Case-1')).toBe('Test_Case-1') + }) + + it('stays fast + correct on a long disallowed run', () => { + expect(fileSlug('a' + ' '.repeat(100000) + 'b')).toBe('a-b') + }) +}) From bb013fe336d320f533f67a2529abf878687a7b51 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 15 Jul 2026 20:31:16 +0530 Subject: [PATCH 067/109] fix: scope screenshot/video options to the WDIO ServiceOptions --- CLAUDE.md | 2 +- packages/service/src/types.ts | 14 +++++++++++++- packages/shared/src/types.ts | 8 -------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 5a2d88ce..f97151a3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -240,7 +240,7 @@ Documented divergences from the conventions above. They exist today as debt to b - **Nightwatch: `retain-on-failure` works; the other retry-aware policies degrade.** Its `--retries` re-runs the testcase *internally* without re-firing the plugin's per-test hooks, and the per-testcase results carry no attempt/retry field (retries live only in undocumented, version-varying Nightwatch internals — `suiteRetries.testRetriesCount` / `reporter.testResults.retryTest`), so the ledger sees only the final attempt for the `describe/it` and exports-object interfaces. Cucumber scenarios expose per-scenario hooks, so the feed captures their attempts. Not cleanly fixable without depending on those internals. - WDIO `specFileRetries` spawns a fresh worker per retry, so cross-process attempts aren't in the (process-scoped) ledger. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. -- The per-test `screenshot` and `video` options live on `BaseDevToolsOptions` (shared) so all three adapters accept them, but only the **WDIO service** reads them today. The capture/slice/encode logic is framework-agnostic (`core/screenshot-artifact.ts`, `core/video-slice.ts`), so Selenium/Nightwatch adoption is wiring-only (capture the base64 + feed `captureAndAttach*`); pending. Both are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the frame buffer is unbounded for the session (a decimation cap is a noted follow-up), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). +- The per-test `screenshot` and `video` options live on the **WDIO `ServiceOptions` only** — not `BaseDevToolsOptions` — because only the service implements them (an option belongs on an adapter until a second adapter consumes it, mirroring the core-helper rule; putting them on the shared base made them appear available in Selenium/Nightwatch and broke those adapters' `Required<>` option types). The policy *types* (`TraceScreenshotPolicy`/`TraceVideoPolicy`) and the capture/slice/encode logic (`core/screenshot-artifact.ts`, `core/video-slice.ts`) are framework-agnostic, so Selenium/Nightwatch adoption is wiring-only (capture the base64 + feed `captureAndAttach*`) plus adding the option to their own options type; pending. Both are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the frame buffer is unbounded for the session (a decimation cap is a noted follow-up), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. - Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. - Service renders expect-webdriverio matchers as single `expect.<matcher>` rows by **folding**, not stack/depth suppression (the old `#assertionDepth`/`#matcherStarted`/self-heal machinery is gone). The matcher's value-read (`toHaveText`→`getText`, `toExist`→`isExisting`, …) is captured as a normal command; `afterAssertion` then coalesces the synthesized `expect.*` row into that read in place — inheriting its callSource, screenshot, and timeline position — and the fold replaces **by timestamp, never a public `id`**: `id` is the per-worker `commandCounter`, which resets per spec, so stamping one lets the app's id-first `replaceCommand` swap a same-id row from another spec (duplicate rows + a fold from another spec vanishing, in multi-spec live mode). `beforeAssertion` arms the pending matcher (depth-counted so aliases like `toBeChecked`→`toBeSelected` fold once); a matcher that **hard-throws** — element never resolves, so expect-webdriverio's `waitUntil` rethrows and `afterAssertion` never fires — is synthesized at `afterTest`/`afterStep` from the throwing read, so a failing assertion renders as `expect.<matcher>` whether or not the element existed. Two limits: its error is then the read's (`Can't call getText on … element wasn't found`), not an assertion-phrased message; and `MATCHER_READ_COMMANDS` is a hand-maintained allowlist, so a matcher whose read isn't listed leaves its raw read visible alongside the `expect.*` row. Plain-value jest matchers (`expect(x).toBe(y)`) don't fire the ewdio hooks, so they aren't captured as rows. diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index d21dcff3..84ef345f 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -23,7 +23,11 @@ export { type Viewport } from '@wdio/devtools-shared' -import type { BaseDevToolsOptions } from '@wdio/devtools-shared' +import type { + BaseDevToolsOptions, + TraceScreenshotPolicy, + TraceVideoPolicy +} from '@wdio/devtools-shared' // ScreencastFrame, ScreencastOptions hoisted to @wdio/devtools-shared; re-exported // here for backwards compatibility with existing service-internal imports. @@ -41,6 +45,14 @@ export interface ExtendedCapabilities extends WebdriverIO.Capabilities { } export interface ServiceOptions extends BaseDevToolsOptions { + /** Per-test screenshot capture, attached to the trace artifacts and inline to + * Allure. `off` (default) | `on` | `only-on-failure`. Trace mode + + * `traceGranularity: 'test'` only. WDIO-service-specific for now. */ + screenshot?: TraceScreenshotPolicy + /** Per-test video (screencast) capture, retained per the given policy and + * attached inline to Allure. `off` (default) or a retention policy. Trace + * mode + `traceGranularity: 'test'` only. WDIO-service-specific for now. */ + video?: TraceVideoPolicy /** * capabilities used to launch the devtools application * @default diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index b360936d..583ca3e7 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -317,14 +317,6 @@ export interface BaseDevToolsOptions { /** Trace retention policy — gates which traces are kept (e.g. * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ tracePolicy?: TraceRetentionPolicy - /** Per-test screenshot capture, attached to the trace artifacts and to Allure - * inline. `off` (default) | `on` | `only-on-failure`. Only applies in trace - * mode. */ - screenshot?: TraceScreenshotPolicy - /** Per-test video (screencast) capture, retained per the given policy and - * attached to Allure inline. `off` (default) or a retention policy. Only - * applies in trace mode at `traceGranularity: 'test'`. */ - video?: TraceVideoPolicy } /** Minimal Cucumber pickle-step shape — only the fields the adapters read. From 42ff7c9e3971b817c0e7bffa308711039eabde46 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 15 Jul 2026 20:31:38 +0530 Subject: [PATCH 068/109] fix(app): de-duplicate live-mode Errors tab (command + reworded test error) --- .../components/workbench/errors/collect.ts | 49 +++++++++++- packages/app/tests/errors-collect.test.ts | 74 +++++++++++++++++++ 2 files changed, 119 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/workbench/errors/collect.ts b/packages/app/src/components/workbench/errors/collect.ts index f28d8065..27d7d0ec 100644 --- a/packages/app/src/components/workbench/errors/collect.ts +++ b/packages/app/src/components/workbench/errors/collect.ts @@ -212,24 +212,65 @@ function commandErrors(commands: CommandLog[] | undefined): CollectedError[] { .sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0)) } +/** Collapse whitespace and drop a leading `…Error:` name prefix so a failed + * test that only re-reports a command failure compares equal despite framework + * wrapping: `@wdio/cucumber-framework` rebuilds a failed step's error from the + * first line of the error's *stack* (`new Error(stack.split('\n')[0])`), which + * prefixes `Error: `, while the command carries the same headline without it. */ +function normalizeMessage(message: string): string { + return message + .replace(/^[A-Za-z]*Error:\s*/, '') + .replace(/\s+/g, ' ') + .trim() +} + +/** True when a command's assertion diff is echoed inside a failed test's raw + * text. Cucumber keeps the full matcher output (`Expected:`/`Received:`) in the + * step error's stack even when its headline was truncated to the first line, so + * matching on both distinctive values catches the duplicate without depending + * on the headline wording — which diverges from the command's. */ +function isAssertionEcho( + command: CollectedError, + test: { message: string; stack?: string } +): boolean { + if (!command.expected || !command.actual) { + return false + } + const haystack = `${test.message}\n${test.stack ?? ''}` + return ( + haystack.includes(command.expected) && haystack.includes(command.actual) + ) +} + /** * Build the Errors-tab list from the live/player contexts. * * Command failures come first (time-ordered) because they carry the clickable - * action; a failed test that only echoes a command's message is dropped so the + * action; a failed test that only echoes a command's failure is dropped so the * same failure isn't listed twice (e.g. a Cucumber `Then` fails as both the - * assertion command and the scenario). + * assertion command and the step). The echo is detected two ways because the + * frameworks reword the test-level message: a normalized-message match (robust + * to the `Error:` prefix Cucumber adds), and — for assertions — the command's + * expected+actual both appearing in the test error's raw text. */ export function collectErrors( commands: CommandLog[] | undefined, suites: Record<string, SuiteStatsFragment>[] | undefined ): CollectedError[] { const fromCommands = commandErrors(commands) - const seenMessages = new Set(fromCommands.map((e) => e.message)) + const seenMessages = new Set( + fromCommands.map((e) => normalizeMessage(e.message)) + ) const fromTests = collectFailedTests(suites).flatMap((test) => { const read = readError(test.error ?? test.errors?.[0]) - if (!read || seenMessages.has(read.message)) { + if (!read) { + return [] + } + if (seenMessages.has(normalizeMessage(read.message))) { + return [] + } + if (fromCommands.some((command) => isAssertionEcho(command, read))) { return [] } return [ diff --git a/packages/app/tests/errors-collect.test.ts b/packages/app/tests/errors-collect.test.ts index c92e3680..0b482fca 100644 --- a/packages/app/tests/errors-collect.test.ts +++ b/packages/app/tests/errors-collect.test.ts @@ -193,6 +193,80 @@ describe('collectErrors', () => { expect(errors[0].command?.command).toBe('expect') }) + it('dedupes a Cucumber assertion listed as both a command and a reworded test error', () => { + // The matcher failure that expect-webdriverio reports: headline + diff. + const matcherMessage = + 'Expect $(`#flash`) to have text\n\n' + + 'Expected: StringContaining "You logged into a secure area!"\n' + + 'Received: "Your username is invalid!"' + const errors = collectErrors( + [ + command({ + command: 'expect.toHaveText', + title: 'expect.toHaveText', + callSource: 'steps.ts:34:3', + error: { name: 'Error', message: matcherMessage }, + timestamp: 50 + }) + ], + suiteMap({ + uid: 'scenario', + state: 'failed', + tests: [ + failedTest({ + uid: 'step', + title: 'Then I should see a flash message', + callSource: 'steps.ts:31', + // Cucumber rebuilds the failed step's error from the first line of + // the error's stack (so the headline gains an `Error:` prefix and + // loses the diff) but keeps the full matcher output in `.stack`. + error: { + name: 'Error', + message: 'Error: Expect to have text', + stack: `Error: ${matcherMessage}\n at World.<anonymous> (/steps.ts:34:3)` + } as unknown as Error + }) + ] + }) + ) + expect(errors).toHaveLength(1) + expect(errors[0].command?.command).toBe('expect.toHaveText') + expect(errors[0].actual).toBe('"Your username is invalid!"') + expect(errors[0].expected).toBe( + 'StringContaining "You logged into a secure area!"' + ) + }) + + it('dedupes a Cucumber command failure whose test error only adds an Error: prefix', () => { + const errors = collectErrors( + [ + command({ + command: 'click', + error: { + name: 'Error', + message: "Can't call click on element, it wasn't found" + }, + timestamp: 5 + }) + ], + suiteMap({ + uid: 'scenario', + state: 'failed', + tests: [ + failedTest({ + uid: 'step', + error: { + name: 'Error', + message: "Error: Can't call click on element, it wasn't found" + } + }) + ] + }) + ) + expect(errors).toHaveLength(1) + expect(errors[0].command?.command).toBe('click') + }) + it('keeps a distinct test failure alongside command failures', () => { const errors = collectErrors( [ From 96347cfd6ce49251a8bbd91ee3956ab674845d67 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 01:27:03 +0530 Subject: [PATCH 069/109] feat: dense screencast filmstrip in trace mode, and fix per-test slicing --- CLAUDE.md | 1 + packages/core/src/index.ts | 1 + packages/core/src/screencast-trace.ts | 110 ++++++++++++++ packages/core/src/spec-trace-helpers.ts | 65 ++++++++- packages/core/src/trace-exporter.ts | 25 +++- packages/core/src/trace-finalizer.ts | 38 +++-- packages/core/tests/screencast-trace.test.ts | 137 ++++++++++++++++++ .../core/tests/spec-trace-helpers.test.ts | 80 +++++++++- packages/core/tests/trace-exporter.test.ts | 53 +++++++ packages/core/tests/trace-finalizer.test.ts | 13 ++ packages/nightwatch-devtools/src/index.ts | 32 +++- .../nightwatch-devtools/src/trace-context.ts | 3 + packages/selenium-devtools/src/index.ts | 11 +- .../selenium-devtools/src/plugin-internals.ts | 3 + .../src/session-lifecycle.ts | 23 ++- packages/service/README.md | 1 + packages/service/src/index.ts | 41 +++++- packages/service/tests/index.test.ts | 14 ++ packages/shared/src/types.ts | 10 ++ 19 files changed, 622 insertions(+), 39 deletions(-) create mode 100644 packages/core/src/screencast-trace.ts create mode 100644 packages/core/tests/screencast-trace.test.ts diff --git a/CLAUDE.md b/CLAUDE.md index f97151a3..36896d87 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -241,6 +241,7 @@ Documented divergences from the conventions above. They exist today as debt to b - WDIO `specFileRetries` spawns a fresh worker per retry, so cross-process attempts aren't in the (process-scoped) ledger. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. - The per-test `screenshot` and `video` options live on the **WDIO `ServiceOptions` only** — not `BaseDevToolsOptions` — because only the service implements them (an option belongs on an adapter until a second adapter consumes it, mirroring the core-helper rule; putting them on the shared base made them appear available in Selenium/Nightwatch and broke those adapters' `Required<>` option types). The policy *types* (`TraceScreenshotPolicy`/`TraceVideoPolicy`) and the capture/slice/encode logic (`core/screenshot-artifact.ts`, `core/video-slice.ts`) are framework-agnostic, so Selenium/Nightwatch adoption is wiring-only (capture the base64 + feed `captureAndAttach*`) plus adding the option to their own options type; pending. Both are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the frame buffer is unbounded for the session (a decimation cap is a noted follow-up), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). +- The `filmstrip` option (dense screencast into the trace) is on **`BaseDevToolsOptions`** — the counterexample to the screenshot/video entry above — because all three adapters implement it (the "second consumer → base" rule realized). Core owns the work (`core/screencast-trace.ts` `thinScreencastFrames`/`buildDenseScreencast`; slice windowing in `spec-trace-helpers.ts`); adapters only default the option, un-gate the recorder in trace mode when it's set, and feed `recorder.frames` into the finalize context. Each adapter captures frames while the recorder is still alive (service `onReload` → `#filmstripFrames`; Selenium `onDriverEnd` drain before nulling; Nightwatch `#finalizeCurrentScreencast` snapshot before delegating), and each finalize context spreads `[...accumulated, ...(live recorder frames)]` so a **mid-run** per-spec/per-test slice flush (which fires before the recorder is drained) isn't blank. Two known limits: (1) the dense frames are written **alongside** the sparse per-action frames (union), not replacing them — the sparse frames carry the DOM `elements`/`snapshot` refs, so suppressing them (attaching those refs to the nearest dense frame) is a deferred follow-up; near each action the filmstrip therefore shows the action's own frame plus adjacent dense frames. (2) Thinning is applied at **export**, so the raw session frame buffer is unbounded in memory during the run (same decimation-cap follow-up as video). Per-test filmstrip slicing follows the same per-test-hook availability as `traceGranularity:'test'` (works for WDIO mocha/cucumber, Selenium mocha, Nightwatch exports-object/cucumber; Nightwatch BDD `describe/it` degrades to session scope per the entry below), and non-Chrome polling carries the same reporter-noise caveat. - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. - Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. - Service renders expect-webdriverio matchers as single `expect.<matcher>` rows by **folding**, not stack/depth suppression (the old `#assertionDepth`/`#matcherStarted`/self-heal machinery is gone). The matcher's value-read (`toHaveText`→`getText`, `toExist`→`isExisting`, …) is captured as a normal command; `afterAssertion` then coalesces the synthesized `expect.*` row into that read in place — inheriting its callSource, screenshot, and timeline position — and the fold replaces **by timestamp, never a public `id`**: `id` is the per-worker `commandCounter`, which resets per spec, so stamping one lets the app's id-first `replaceCommand` swap a same-id row from another spec (duplicate rows + a fold from another spec vanishing, in multi-spec live mode). `beforeAssertion` arms the pending matcher (depth-counted so aliases like `toBeChecked`→`toBeSelected` fold once); a matcher that **hard-throws** — element never resolves, so expect-webdriverio's `waitUntil` rethrows and `afterAssertion` never fires — is synthesized at `afterTest`/`afterStep` from the throwing read, so a failing assertion renders as `expect.<matcher>` whether or not the element existed. Two limits: its error is then the read's (`Can't call getText on … element wasn't found`), not an assertion-phrased message; and `MATCHER_READ_COMMANDS` is a hand-maintained allowlist, so a matcher whose read isn't listed leaves its raw read visible alongside the `expect.*` row. Plain-value jest matchers (`expect(x).toBe(y)`) don't fire the ewdio hooks, so they aren't captured as rows. diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e6f4a7ba..a73cb7bf 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -36,6 +36,7 @@ export * from './output-dir.js' export * from './performance-capture.js' export * from './retry-tracker.js' export * from './screencast.js' +export * from './screencast-trace.js' export * from './script-loader.js' export * from './session-capturer.js' export * from './spec-trace-helpers.js' diff --git a/packages/core/src/screencast-trace.ts b/packages/core/src/screencast-trace.ts new file mode 100644 index 00000000..c823ef52 --- /dev/null +++ b/packages/core/src/screencast-trace.ts @@ -0,0 +1,110 @@ +/** + * Dense screencast filmstrip for trace mode. Turns the recorder's continuous + * frame buffer into `screencast-frame` events plus content-addressed image + * resources, so the trace player scrubs smooth playback instead of one frame + * per action. + * + * Two independent bounds keep the cost in check: thinning caps the number of + * emitted events (min inter-frame gap + drop consecutive byte-identical frames + * + even downsample to a hard cap), and content-addressing dedupes the image + * bytes (identical frames — a static wait polled repeatedly — collapse to one + * resource). Framework-agnostic: adapters feed `recorder.frames`; the recorder + * itself (CDP push on Chrome, screenshot polling elsewhere) lives per-adapter. + */ + +import { createHash } from 'node:crypto' +import type { ScreencastFrame } from '@wdio/devtools-shared' +import type { TraceZipResource } from './trace-zip-writer.js' +import type { ScreencastFrameEvent } from './trace-snapshots.js' + +export interface DenseScreencastOptions { + /** Hard cap on emitted frame events (default 600). */ + maxFrames?: number + /** Minimum ms between kept frames (default 100 ≈ 10 fps). */ + minFrameIntervalMs?: number +} + +const DEFAULT_MAX_FRAMES = 600 +const DEFAULT_MIN_INTERVAL_MS = 100 + +/** + * Thin a continuous frame buffer down to a bounded event set. Keeps a frame + * only when it is at least `minFrameIntervalMs` after the last kept frame and + * its bytes differ from the last kept frame (a static run collapses to its + * first frame — the player holds it until the next change, which is the big win + * for polling mode where every poll re-shoots an unchanged page). A final even + * downsample enforces the hard cap while always keeping the first and last + * frames so the timeline still spans the full run. + */ +export function thinScreencastFrames( + frames: readonly ScreencastFrame[], + options: DenseScreencastOptions = {} +): ScreencastFrame[] { + const minInterval = options.minFrameIntervalMs ?? DEFAULT_MIN_INTERVAL_MS + const maxFrames = options.maxFrames ?? DEFAULT_MAX_FRAMES + + const kept: ScreencastFrame[] = [] + let lastKeptTs = -Infinity + let lastData: string | undefined + for (const frame of frames) { + if (frame.timestamp - lastKeptTs < minInterval) { + continue + } + if (frame.data === lastData) { + continue + } + kept.push(frame) + lastKeptTs = frame.timestamp + lastData = frame.data + } + + if (kept.length <= maxFrames) { + return kept + } + if (maxFrames <= 1) { + return kept.length ? [kept[0]!] : [] + } + const out: ScreencastFrame[] = [] + const step = (kept.length - 1) / (maxFrames - 1) + for (let i = 0; i < maxFrames; i++) { + out.push(kept[Math.round(i * step)]!) + } + return out +} + +/** + * Build the dense filmstrip: `screencast-frame` events (offsets rebased against + * `wallTime`, matching the sparse filmstrip) and their image resources named by + * content hash so byte-identical frames share a single resource. Adapters that + * don't record frames pass an empty array and get an empty result — byte-stable + * with today's output. + */ +export function buildDenseScreencast( + frames: readonly ScreencastFrame[], + pageId: string, + wallTime: number, + viewport: { width: number; height: number }, + options: DenseScreencastOptions = {} +): { events: ScreencastFrameEvent[]; resources: TraceZipResource[] } { + const events: ScreencastFrameEvent[] = [] + const resources: TraceZipResource[] = [] + const seen = new Set<string>() + for (const frame of thinScreencastFrames(frames, options)) { + const data = Buffer.from(frame.data, 'base64') + const sha1 = createHash('sha1').update(data).digest('hex') + const resourceName = `${sha1}.jpeg` + if (!seen.has(sha1)) { + seen.add(sha1) + resources.push({ resourceName, data }) + } + events.push({ + type: 'screencast-frame', + pageId, + sha1: resourceName, + width: viewport.width, + height: viewport.height, + timestamp: Math.max(0, frame.timestamp - wallTime) + }) + } + return { events, resources } +} diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index 4b37fe80..33d51bc0 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -9,6 +9,8 @@ import path from 'node:path' import type { ActionSnapshot, + CommandLog, + ScreencastFrame, TestMetadataMap, TraceFormat, TraceGranularity @@ -144,13 +146,16 @@ export function buildTestSliceFolder( key: string ): string { const specBase = sanitizeSpecName(path.basename(specFile)) - const titleSlug = - slugify(testTitle ?? '') || - deterministicUid(key).split('-').pop()!.slice(0, 8) + // A short hash of the slice key disambiguates two tests that share a title + // (Scenario Outline examples with a placeholder-free name, or duplicate `it` + // titles) — without it their folders collide and one trace overwrites the + // other. Mirrors buildTestSliceSessionId, which hashes the key for the id. + const keyHash = deterministicUid(key).split('-').pop()!.slice(0, 8) + const titleSlug = slugify(testTitle ?? '') || keyHash const browserSlug = slugify(browser ?? '') || 'browser' const retryMatch = key.match(/-retry(\d+)$/) const retrySuffix = retryMatch ? `-retry${retryMatch[1]}` : '' - return `${specBase}-${titleSlug}-${browserSlug}${retrySuffix}` + return `${specBase}-${titleSlug}-${browserSlug}-${keyHash}${retrySuffix}` } // ─── TraceCapturer slice ───────────────────────────────────────────────────── @@ -343,6 +348,8 @@ export interface WriteSpecTraceInput { /** Shape-compatible with `buildSpecCapturer`'s first parameter. */ capturer: Parameters<typeof buildSpecCapturer>[0] actionSnapshots: ActionSnapshot[] + /** Full session frame buffer; windowed to this slice's wall-clock span. */ + screencastFrames?: readonly ScreencastFrame[] sessionId: string outputDir: string format?: TraceFormat @@ -351,6 +358,24 @@ export interface WriteSpecTraceInput { capabilities?: unknown } +/** Timestamped items inside a slice's wall-clock window `[start, end)`. An + * undefined `start` (a slice with no commands to anchor on) yields nothing; an + * undefined `end` (the last slice) is open-ended, so a trailing assertion-wait + * stays with its test. Used for both action snapshots and screencast frames so + * they partition on the same reliable boundary as the sliced commands. */ +function sliceByWindow<T extends { timestamp: number }>( + items: readonly T[], + start: number | undefined, + end: number | undefined +): T[] { + if (start === undefined) { + return [] + } + return items.filter( + (i) => i.timestamp >= start && (end === undefined || i.timestamp < end) + ) +} + /** Slice the parent capturer/snapshots for one range and write the artifact * under `sliceSessionId` with the pre-filtered `testMetadata`. Shared by the * spec and test write paths so both slice identically. `overrides` lets the @@ -367,10 +392,35 @@ async function writeSliceTrace( input.nextRange ) - const sliceSnapshots = input.actionSnapshots.slice( - input.range.snapshotCount, - input.nextRange?.snapshotCount ?? input.actionSnapshots.length + // Anchor the slice on its own commands, which buildSpecCapturer index-slices + // reliably — parent-array index lookups desync under reloadSession and would + // sweep an earlier test's snapshots/frames in. Snapshots and frames are then + // windowed by that wall-clock span, and the slice is rebased to its own start + // (start === wallTime) so a per-test trace begins at 0, not the session + // offset. `windowEnd` is the next slice's start; open for the last. Anchor on + // the command's `startTime` (invocation), not `timestamp` (completion), so the + // frames captured *during* the first action — e.g. the page load of an opening + // `url()` — fall inside this slice rather than being dropped or bleeding into + // the previous one. + const commandStart = (c: CommandLog | undefined): number | undefined => + c ? (c.startTime ?? c.timestamp) : undefined + const windowStart = commandStart(sliceCapturer.commandsLog[0]) + const windowEnd = input.nextRange + ? commandStart(input.capturer.commandsLog[input.nextRange.commandStartIdx]) + : undefined + + const sliceSnapshots = sliceByWindow( + input.actionSnapshots, + windowStart, + windowEnd ) + const sliceFrames = input.screencastFrames + ? sliceByWindow(input.screencastFrames, windowStart, windowEnd) + : undefined + + if (windowStart !== undefined) { + sliceCapturer.startWallTime = windowStart + } return writeTraceZip(sliceCapturer, { outputDir: overrides.outputDir ?? input.outputDir, @@ -378,6 +428,7 @@ async function writeSliceTrace( fileStem: overrides.fileStem, capabilities: input.capabilities, actionSnapshots: sliceSnapshots.length > 0 ? sliceSnapshots : undefined, + screencastFrames: sliceFrames?.length ? sliceFrames : undefined, format: input.format, testMetadata }) diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index 40079b9a..6a43755e 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -9,6 +9,7 @@ import type { ConsoleLog, Metadata, NetworkRequest, + ScreencastFrame, TestMetadataMap, TraceFormat, TraceLog, @@ -30,6 +31,7 @@ import { buildSnapshotResources, type ScreencastFrameEvent } from './trace-snapshots.js' +import { buildDenseScreencast } from './screencast-trace.js' import { buildImageFrameSnapshots, FrameSnapshotIndex, @@ -320,7 +322,8 @@ function buildEventStream( ctxOptions: ContextOptionsEvent, pageId: string, wallTime: number, - testMetadata?: TestMetadataMap + testMetadata?: TestMetadataMap, + denseFrameEvents: ScreencastFrameEvent[] = [] ): TraceEvent[] { const viewport = trace.metadata.viewport ?? { width: 1280, height: 720 } const snapshots = trace.actionSnapshots ?? [] @@ -328,6 +331,7 @@ function buildEventStream( const events: TraceEvent[] = [ ctxOptions, ...buildFilmstripEvents(snapshots, pageId, wallTime, viewport), + ...denseFrameEvents, ...buildActionEvents( trace.commands, pageId, @@ -363,12 +367,19 @@ function buildTraceBundle( const contextId = `context@${idPrefix}` const pageId = `page@${idPrefix}` const ctxOptions = buildContextOptions(trace, contextId, wallTime) + const dense = buildDenseScreencast( + trace.screencastFrames ?? [], + pageId, + wallTime, + trace.metadata.viewport ?? { width: 1280, height: 720 } + ) const events = buildEventStream( trace, ctxOptions, pageId, wallTime, - opts.testMetadata + opts.testMetadata, + dense.events ) const networkBodies = buildNetworkBodyResources(trace.networkRequests) return { @@ -386,6 +397,7 @@ function buildTraceBundle( ), resources: [ ...buildSnapshotResources(trace.actionSnapshots ?? [], pageId), + ...dense.resources, ...buildSourceResources(trace.sources), ...networkBodies.resources ] @@ -461,6 +473,10 @@ export interface WriteTraceZipOptions { * viewer still renders thumbnails for adapters without an action hook. */ actionSnapshots?: ActionSnapshot[] + /** Dense screencast frames for the filmstrip. Thinned + content-addressed at + * export time; adapters pass the slice's windowed frames (or all, session + * scope). Omitted → no dense filmstrip (byte-stable with today's output). */ + screencastFrames?: readonly ScreencastFrame[] /** Output layout — `zip` (default) writes a single archive, `directory` * unpacks the same files into `trace-<id>/`. */ format?: TraceFormat @@ -496,7 +512,10 @@ export async function writeTraceZip( }, commands: capturer.commandsLog, sources: Object.fromEntries(capturer.sources), - ...(actionSnapshots.length ? { actionSnapshots } : {}) + ...(actionSnapshots.length ? { actionSnapshots } : {}), + ...(opts.screencastFrames?.length + ? { screencastFrames: [...opts.screencastFrames] } + : {}) } await fs.mkdir(opts.outputDir, { recursive: true }) const exportOpts = { diff --git a/packages/core/src/trace-finalizer.ts b/packages/core/src/trace-finalizer.ts index ff2b3b99..1ed8c937 100644 --- a/packages/core/src/trace-finalizer.ts +++ b/packages/core/src/trace-finalizer.ts @@ -9,6 +9,7 @@ import type { ActionSnapshot, DevToolsMode, + ScreencastFrame, TestMetadataMap, TraceFormat, TraceGranularity, @@ -62,6 +63,9 @@ export interface TraceExportContext { format?: TraceFormat capturer: TraceCapturer actionSnapshots?: ActionSnapshot[] + /** Continuous screencast frame buffer for the dense filmstrip (filmstrip + * option on). Session write uses all; slice writes window per test. */ + screencastFrames?: readonly ScreencastFrame[] sessionId: string capabilities?: unknown testMetadata: TestMetadataMap @@ -194,6 +198,22 @@ function attemptFromKey(key: string): number { return match ? Number(match[1]) : 0 } +/** Scope the per-attempt ledger to a slice: a test slice sees only its own + * attempt (so a passing retry isn't retained on first-failure); a spec slice + * sees every attempt of its tests. */ +function sliceOutcomeView( + ctx: TraceExportContext, + range: SpecRange, + isTestSlice: boolean +): TestOutcome[] | undefined { + if (!ctx.outcomes) { + return undefined + } + return isTestSlice + ? ctx.outcomes.forTest(range.testUid!, attemptFromKey(range.key)) + : ctx.outcomes.forSpec(range.specFile) +} + /** * Policy-aware single-range flush: dedupes via `ctx.flushed` on the slice * `key`, applies the retention decision, and delegates the byte-level @@ -206,6 +226,11 @@ export async function flushRangeTrace( range: SpecRange, nextRange?: SpecRange ): Promise<TraceArtifact | undefined> { + // Eager mid-run flushes reach here directly, bypassing finalizeTraceExport's + // gate, so enforce trace-mode here too — a live run must not write slices. + if (ctx.mode !== 'trace') { + return undefined + } if (ctx.flushed.has(range.key)) { return undefined } @@ -215,21 +240,14 @@ export async function flushRangeTrace( const sliceMetadata = isTestSlice ? filterTestMetadataByUid(ctx.testMetadata, range.testUid!) : filterTestMetadataBySpec(ctx.testMetadata, range.specFile) - // Scope the per-attempt ledger to this slice: a test slice sees only its own - // attempt (so a passing retry's slice isn't retained on first-failure), a spec - // slice sees every attempt of its tests. - const sliceOutcomes = ctx.outcomes - ? isTestSlice - ? ctx.outcomes.forTest(range.testUid!, attemptFromKey(range.key)) - : ctx.outcomes.forSpec(range.specFile) - : undefined + const outcomes = sliceOutcomeView(ctx, range, isTestSlice) const artifact: TraceArtifact = { kind: 'trace', path: '', scope: isTestSlice ? 'test' : 'spec', key: range.key, testUids: Array.from(sliceMetadata.keys()), - retained: shouldRetain(ctx, sliceMetadata, sliceOutcomes) + retained: shouldRetain(ctx, sliceMetadata, outcomes) } if (!artifact.retained) { ctx.onArtifact?.(artifact) @@ -242,6 +260,7 @@ export async function flushRangeTrace( nextRange, capturer: ctx.capturer, actionSnapshots: ctx.actionSnapshots ?? [], + screencastFrames: ctx.screencastFrames, sessionId: ctx.sessionId, outputDir: ctx.resolveOutputDir(range), format: ctx.format, @@ -308,6 +327,7 @@ async function writeSessionTrace( sessionId: ctx.sessionId, capabilities: ctx.capabilities, actionSnapshots: snapshots.length ? snapshots : undefined, + screencastFrames: ctx.screencastFrames, format: ctx.format, testMetadata: ctx.testMetadata }) diff --git a/packages/core/tests/screencast-trace.test.ts b/packages/core/tests/screencast-trace.test.ts new file mode 100644 index 00000000..79ef0adb --- /dev/null +++ b/packages/core/tests/screencast-trace.test.ts @@ -0,0 +1,137 @@ +import { describe, it, expect } from 'vitest' +import { createHash } from 'node:crypto' +import type { ScreencastFrame } from '@wdio/devtools-shared' +import { + thinScreencastFrames, + buildDenseScreencast +} from '../src/screencast-trace.js' + +/** base64 of a distinct payload per label, so identical labels are byte-equal. */ +function frame(label: string, timestamp: number): ScreencastFrame { + return { data: Buffer.from(label).toString('base64'), timestamp } +} + +function sha1Name(label: string): string { + const hex = createHash('sha1').update(Buffer.from(label)).digest('hex') + return `${hex}.jpeg` +} + +describe('thinScreencastFrames', () => { + it('keeps frames at least the min interval apart', () => { + const frames = [ + frame('a', 0), + frame('b', 40), + frame('c', 90), + frame('d', 150), + frame('e', 210) + ] + const kept = thinScreencastFrames(frames, { minFrameIntervalMs: 100 }) + // 0 kept; 40,90 dropped (<100 since last kept 0); 150 kept; 210 dropped. + expect(kept.map((f) => f.timestamp)).toEqual([0, 150]) + }) + + it('drops consecutive byte-identical frames (static run collapses)', () => { + const frames = [ + frame('same', 0), + frame('same', 200), + frame('same', 400), + frame('changed', 600) + ] + const kept = thinScreencastFrames(frames, { minFrameIntervalMs: 100 }) + expect(kept.map((f) => f.timestamp)).toEqual([0, 600]) + }) + + it('keeps a repeated frame that is not consecutive (A B A)', () => { + const frames = [frame('a', 0), frame('b', 200), frame('a', 400)] + const kept = thinScreencastFrames(frames, { minFrameIntervalMs: 100 }) + expect(kept.map((f) => f.timestamp)).toEqual([0, 200, 400]) + }) + + it('downsamples to the cap while keeping first and last', () => { + const frames = Array.from({ length: 50 }, (_, i) => frame(`f${i}`, i * 200)) + const kept = thinScreencastFrames(frames, { + maxFrames: 10, + minFrameIntervalMs: 100 + }) + expect(kept).toHaveLength(10) + expect(kept[0]!.timestamp).toBe(0) + expect(kept[kept.length - 1]!.timestamp).toBe(49 * 200) + }) + + it('returns empty for empty input', () => { + expect(thinScreencastFrames([])).toEqual([]) + }) + + it('handles maxFrames<=1 without producing undefined holes', () => { + const frames = [frame('a', 0), frame('b', 200), frame('c', 400)] + const kept = thinScreencastFrames(frames, { + maxFrames: 1, + minFrameIntervalMs: 100 + }) + expect(kept).toEqual([frames[0]]) + // and buildDenseScreencast must not throw on that result + expect(() => + buildDenseScreencast( + frames, + 'page@x', + 0, + { width: 1, height: 1 }, + { + maxFrames: 1, + minFrameIntervalMs: 100 + } + ) + ).not.toThrow() + }) +}) + +describe('buildDenseScreencast', () => { + const viewport = { width: 800, height: 600 } + + it('rebases timestamps against wallTime and never goes negative', () => { + const frames = [frame('a', 1000), frame('b', 1300)] + const { events } = buildDenseScreencast(frames, 'page@x', 1000, viewport, { + minFrameIntervalMs: 100 + }) + expect(events.map((e) => e.timestamp)).toEqual([0, 300]) + expect(events.every((e) => e.type === 'screencast-frame')).toBe(true) + expect(events[0]!.pageId).toBe('page@x') + expect(events[0]!.width).toBe(800) + }) + + it('content-addresses frames and dedupes identical bytes to one resource', () => { + // Two distinct frames plus one that repeats the first's bytes non-adjacently. + const frames = [frame('img-a', 0), frame('img-b', 200), frame('img-a', 400)] + const { events, resources } = buildDenseScreencast( + frames, + 'page@x', + 0, + viewport, + { minFrameIntervalMs: 100 } + ) + // three events, but only two unique resources (img-a shared). + expect(events).toHaveLength(3) + expect(resources).toHaveLength(2) + expect(events[0]!.sha1).toBe(sha1Name('img-a')) + expect(events[2]!.sha1).toBe(sha1Name('img-a')) + expect(events[0]!.sha1).toBe(events[2]!.sha1) + expect(new Set(resources.map((r) => r.resourceName)).size).toBe(2) + }) + + it('returns empty events and resources for no frames (byte-stable)', () => { + expect(buildDenseScreencast([], 'page@x', 0, viewport)).toEqual({ + events: [], + resources: [] + }) + }) + + it('resource bytes decode back to the source frame data', () => { + const { resources } = buildDenseScreencast( + [frame('hello', 0)], + 'page@x', + 0, + viewport + ) + expect(resources[0]!.data.toString()).toBe('hello') + }) +}) diff --git a/packages/core/tests/spec-trace-helpers.test.ts b/packages/core/tests/spec-trace-helpers.test.ts index 27f4f694..a3b8c8d2 100644 --- a/packages/core/tests/spec-trace-helpers.test.ts +++ b/packages/core/tests/spec-trace-helpers.test.ts @@ -206,7 +206,7 @@ describe('recordSliceBoundary (test granularity)', () => { }) describe('buildTestSliceFolder', () => { - it('combines sanitized spec, title slug, and browser slug', () => { + it('combines sanitized spec, title slug, browser slug, and key hash', () => { expect( buildTestSliceFolder( '/tests/login.e2e.js', @@ -214,24 +214,32 @@ describe('buildTestSliceFolder', () => { 'chrome', 'u1' ) - ).toBe('login_e2e-shows-an-error-message-for-an-invalid-username-chrome') + ).toMatch( + /^login_e2e-shows-an-error-message-for-an-invalid-username-chrome-[a-z0-9]{1,8}$/ + ) + }) + + it('gives two same-title tests distinct folders (no collision)', () => { + const a = buildTestSliceFolder('/login.feature', 'As a user', 'chrome', 'A') + const b = buildTestSliceFolder('/login.feature', 'As a user', 'chrome', 'B') + expect(a).not.toBe(b) }) - it('appends a -retry<N> suffix when the key is a retry key', () => { + it('appends a -retry<N> suffix after the key hash on a retry key', () => { expect( buildTestSliceFolder('/a.js', 'My Test', 'chrome', 'u1-retry2') - ).toBe('a-my-test-chrome-retry2') + ).toMatch(/^a-my-test-chrome-[a-z0-9]{1,8}-retry2$/) }) it('defaults the browser slug to "browser" when the browser is absent', () => { - expect(buildTestSliceFolder('/a.js', 'My Test', undefined, 'u1')).toBe( - 'a-my-test-browser' + expect(buildTestSliceFolder('/a.js', 'My Test', undefined, 'u1')).toMatch( + /^a-my-test-browser-[a-z0-9]{1,8}$/ ) }) it('falls back to a stable short hash of the key when the title is empty', () => { const folder = buildTestSliceFolder('/a.js', '', 'chrome', 'u1') - expect(folder).toMatch(/^a-[a-z0-9]+-chrome$/) + expect(folder).toMatch(/^a-[a-z0-9]+-chrome-[a-z0-9]+$/) expect(buildTestSliceFolder('/a.js', undefined, 'chrome', 'u1')).toBe( folder ) @@ -296,11 +304,67 @@ describe('writeTestSliceTrace / writeSpecTrace output layout', () => { 'firefox', 'u1' ) - expect(folder).toBe('login-my-test-firefox') + expect(folder).toMatch(/^login-my-test-firefox-[a-z0-9]{1,8}$/) expect(written).toBe(path.join(outputDir, folder, 'trace.zip')) await expect(fs.access(written)).resolves.toBeUndefined() }) + it('windows a test slice to its own commands and rebases to its start', async () => { + // Two tests in one session; the second's slice must exclude the first's + // frames (the reloadSession-desync bug) and rebase to its own start, not + // the session start (the huge-empty-prefix bug). + const capturer: TraceCapturer = { + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { command: 'url', args: ['a'], timestamp: 1000 }, + { command: 'click', args: [], timestamp: 2000 }, + // B's opening url: invoked at 4800, completes at 5000 — its load frames + // land in [4800, 5000) and must belong to B, not A. + { command: 'url', args: ['b'], timestamp: 5000, startTime: 4800 }, + { command: 'click', args: [], timestamp: 6000 } + ], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + } + const frames = [ + { data: Buffer.from('a1').toString('base64'), timestamp: 1500 }, + { data: Buffer.from('a2').toString('base64'), timestamp: 2500 }, + { data: Buffer.from('bload').toString('base64'), timestamp: 4900 }, + { data: Buffer.from('b1').toString('base64'), timestamp: 5200 }, + { data: Buffer.from('b2').toString('base64'), timestamp: 6200 } + ] + const dir = await writeTestSliceTrace( + input({ + range: range({ + specFile: '/t.js', + key: 'B', + testUid: 'B', + commandStartIdx: 2 + }), + capturer, + screencastFrames: frames, + format: 'ndjson-directory', + testMetadata: new Map([['B', { title: 'Test B', specFile: '/t.js' }]]) + }) + ) + const events = (await fs.readFile(path.join(dir, 'trace.trace'), 'utf8')) + .trim() + .split('\n') + .map((l) => JSON.parse(l) as Record<string, unknown>) + const frameOffsets = events + .filter((e) => e.type === 'screencast-frame') + .map((e) => e.timestamp as number) + .sort((x, y) => x - y) + // Rebased against B's first-command invocation (startTime 4800), and B's + // in-flight load frame is kept: 4900→100, 5200→400, 6200→1400. Test A's + // frames (1500/2500) are excluded, not bled in. + expect(frameOffsets).toEqual([100, 400, 1400]) + }) + it('keeps the spec write flat as trace-<id>.zip (unchanged layout)', async () => { const written = await writeSpecTrace( input({ diff --git a/packages/core/tests/trace-exporter.test.ts b/packages/core/tests/trace-exporter.test.ts index 3dd16c49..537d3c4c 100644 --- a/packages/core/tests/trace-exporter.test.ts +++ b/packages/core/tests/trace-exporter.test.ts @@ -404,3 +404,56 @@ describe('exported trace stream — frame-snapshot events', () => { await fs.rm(outputDir, { recursive: true, force: true }) }) }) + +describe('exported trace stream — dense filmstrip', () => { + it('emits content-addressed screencast-frame events + resources', async () => { + const outputDir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-dense-')) + const capturer: TraceCapturer = { + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { + command: 'url', + args: ['https://example.test'], + timestamp: 1200, + startTime: 1150 + } + ], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + } + const dir = await writeTraceZip(capturer, { + outputDir, + sessionId: 'abc12345', + format: 'ndjson-directory', + screencastFrames: [ + { data: Buffer.from('paint-1').toString('base64'), timestamp: 1000 }, + { data: Buffer.from('paint-1').toString('base64'), timestamp: 1050 }, + { data: Buffer.from('paint-2').toString('base64'), timestamp: 1400 } + ] + }) + const raw = await fs.readFile(path.join(dir, 'trace.trace'), 'utf8') + const frames = raw + .trim() + .split('\n') + .map((l) => JSON.parse(l) as Record<string, unknown>) + .filter((l) => l.type === 'screencast-frame') + + // Two identical bytes 50ms apart collapse to one kept frame; the second + // distinct paint is the other. Both rebased against wallTime 1000. + expect(frames).toHaveLength(2) + expect(frames.map((f) => f.timestamp)).toEqual([0, 400]) + for (const f of frames) { + expect(String(f.sha1)).toMatch(/^[0-9a-f]{40}\.jpeg$/) + } + + const resourceNames = await fs.readdir(path.join(dir, 'resources')) + for (const f of frames) { + expect(resourceNames).toContain(f.sha1) + } + await fs.rm(outputDir, { recursive: true, force: true }) + }) +}) diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index 70f655fe..7510de03 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -611,6 +611,19 @@ describe('flushRangeTrace', () => { ).resolves.toBeUndefined() }) + it('is a no-op in live mode — a granularity set outside trace never writes', async () => { + const flushed = new Set<string>() + const seen: unknown[] = [] + const artifact = await flushRangeTrace( + ctx({ mode: 'live', flushed, onArtifact: (a) => seen.push(a) }), + range('/spec.js', 0) + ) + expect(artifact).toBeUndefined() + expect(seen).toEqual([]) + expect(flushed.size).toBe(0) + await expect(fs.readdir(outputDir)).resolves.toEqual([]) + }) + it('returns undefined for an already-flushed spec', async () => { const flushed = new Set<string>(['/spec.js']) const artifact = await flushRangeTrace( diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index fad32b4f..5f93d23b 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -23,7 +23,8 @@ import { REUSE_ENV, SCREENCAST_DEFAULTS, type CucumberPickle, - type CucumberPickleStep + type CucumberPickleStep, + type ScreencastFrame } from '@wdio/devtools-shared' import logger from '@wdio/logger' import { @@ -125,6 +126,9 @@ class NightwatchDevToolsPlugin { #screencastOptions: ScreencastOptions #screencastRecorder?: ScreencastRecorder #screencastSessionId?: string + + // Snapshotted before each recorder is nulled, so the export isn't blank. + #filmstripFrames: ScreencastFrame[] = [] #bidiEnabled = false #bidiAttachAttempted = false @@ -134,11 +138,17 @@ class NightwatchDevToolsPlugin { constructor(options: DevToolsOptions = {}) { const mode = options.mode ?? 'live' - const ignore = mode === 'trace' && options.screencast?.enabled === true + // Filmstrip drives the recorder in trace mode; bare screencast stays live-only. + const filmstrip = mode === 'trace' && options.filmstrip === true + const ignore = + mode === 'trace' && !filmstrip && options.screencast?.enabled === true if (ignore) { log.warn('trace mode: ignoring screencast option (live-mode feature)') } - const screencast = ignore ? {} : (options.screencast ?? {}) + let screencast = ignore ? {} : (options.screencast ?? {}) + if (filmstrip) { + screencast = { ...(options.screencast ?? {}), enabled: true } + } this.options = { port: options.port ?? 3000, hostname: options.hostname ?? 'localhost', @@ -148,7 +158,8 @@ class NightwatchDevToolsPlugin { mode, traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', - tracePolicy: options.tracePolicy ?? 'on' + tracePolicy: options.tracePolicy ?? 'on', + filmstrip: options.filmstrip ?? false } const policyWarning = tracePolicyModeWarning(options.tracePolicy, mode) if (policyWarning) { @@ -375,6 +386,9 @@ class NightwatchDevToolsPlugin { } async #finalizeCurrentScreencast(): Promise<void> { + if (this.options.filmstrip && this.#screencastRecorder) { + this.#filmstripFrames.push(...this.#screencastRecorder.frames) + } await finalizeCurrentScreencast(this.#getInternals()) } @@ -606,6 +620,16 @@ class NightwatchDevToolsPlugin { flushed: this.#flushedSpecs, artifacts: this.#artifacts, traceFlushes: this.#traceFlushes, + // Accumulated (finalized-session) frames plus the live recorder's — a + // mid-run per-spec/per-test flush fires before the recorder is drained + // into #filmstripFrames, so its frames live only on the recorder still; + // at the final write the recorder is already nulled, so no double-count. + screencastFrames: this.options.filmstrip + ? [ + ...this.#filmstripFrames, + ...(this.#screencastRecorder?.frames ?? []) + ] + : undefined, configPath: this.#configPath, testFilePath: this.browserProxy?.getCurrentTestFullPath?.() ?? undefined, diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts index 4c4666be..cf0a9baf 100644 --- a/packages/nightwatch-devtools/src/trace-context.ts +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -17,6 +17,7 @@ import { import type { SessionCapturer } from './session.js' import type { DevToolsMode, + ScreencastFrame, SuiteStats, TraceFormat, TraceGranularity, @@ -35,6 +36,7 @@ export interface TraceContextInput { flushed: Set<string> artifacts: TraceArtifact[] traceFlushes: Promise<unknown>[] + screencastFrames?: readonly ScreencastFrame[] configPath: string | undefined testFilePath: string | undefined log: (level: 'info' | 'warn', msg: string) => void @@ -56,6 +58,7 @@ export function buildTraceContext( outcomes: input.outcomes, ranges: input.ranges, flushed: input.flushed, + screencastFrames: input.screencastFrames, resolveOutputDir: () => resolveAdapterOutputDir({ testFilePath: input.testFilePath, diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 91af73f9..dcc19fd3 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -61,6 +61,7 @@ import { type CapturedCommand, type DevToolsMode, type DevToolsOptions, + type ScreencastFrame, type ScreencastOptions, type TraceFormat, type TraceGranularity, @@ -131,6 +132,10 @@ class SeleniumDevToolsPlugin { * end-of-run artifacts manifest. Populated via the context's onArtifact. */ #artifacts: TraceArtifact[] = [] + /** Filmstrip frames accumulated across drivers, appended at each driver end + * before the recorder is nulled so the finalize context is never blank. */ + #filmstripFrames: ScreencastFrame[] = [] + constructor(options: DevToolsOptions = {}) { this.#options = { port: options.port ?? 3000, @@ -143,7 +148,8 @@ class SeleniumDevToolsPlugin { mode: options.mode ?? 'live', traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', - tracePolicy: options.tracePolicy ?? 'on' + tracePolicy: options.tracePolicy ?? 'on', + filmstrip: options.filmstrip ?? false } const policyWarning = tracePolicyModeWarning( options.tracePolicy, @@ -446,6 +452,9 @@ class SeleniumDevToolsPlugin { get artifacts() { return self.#artifacts }, + get filmstripFrames() { + return self.#filmstripFrames + }, setFinalized: (v) => { self.#finalized = v }, diff --git a/packages/selenium-devtools/src/plugin-internals.ts b/packages/selenium-devtools/src/plugin-internals.ts index 36d1f98e..2893b0e9 100644 --- a/packages/selenium-devtools/src/plugin-internals.ts +++ b/packages/selenium-devtools/src/plugin-internals.ts @@ -15,6 +15,7 @@ import type { ScreencastRecorder } from './screencast.js' import type { ActionSnapshot, DevToolsMode, + ScreencastFrame, ScreencastOptions, SeleniumDriverLike, TraceFormat, @@ -71,6 +72,8 @@ export interface PluginInternals { readonly traceFlushes: Promise<unknown>[] // Every trace/video artifact seen this run, for the end-of-run manifest. readonly artifacts: TraceArtifact[] + // Dense filmstrip frames accumulated across drivers (filmstrip option only). + readonly filmstripFrames: ScreencastFrame[] // Plugin-side delegates setFinalized(v: boolean): void diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index fabe3895..d00b4030 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -36,6 +36,7 @@ import type { ActionSnapshot, DevToolsMode, Metadata, + ScreencastFrame, ScreencastOptions, SeleniumDriverLike, TraceFormat, @@ -57,6 +58,7 @@ export interface SessionLifecycleCtx { traceFormat?: TraceFormat traceGranularity?: TraceGranularity tracePolicy?: TraceRetentionPolicy + filmstrip?: boolean } readonly screencastOptions: ScreencastOptions readonly runner: string @@ -88,6 +90,8 @@ export interface SessionLifecycleCtx { readonly traceFlushes: Promise<unknown>[] // Every trace/video artifact seen this run, for the end-of-run manifest. readonly artifacts: TraceArtifact[] + // Dense filmstrip frames accumulated across drivers (filmstrip option only). + readonly filmstripFrames: ScreencastFrame[] setFinalized(v: boolean): void ensureBackendStarted(): Promise<void> @@ -183,8 +187,12 @@ async function initPerDriverCapture( ctx.sessionCapturer.sendUpstream('metadata', metadata) } - // Parallel — serial attach misses frames on fast tests. - const screencastPromise = ctx.screencastOptions.enabled + // Parallel — serial attach misses frames on fast tests. Trace-mode filmstrip + // needs the same recorder even though live screencast is off in trace mode. + const wantScreencast = + ctx.screencastOptions.enabled || + (ctx.options.mode === 'trace' && !!ctx.options.filmstrip) + const screencastPromise = wantScreencast ? (async () => { try { ctx.screencast = new ScreencastRecorder(ctx.screencastOptions) @@ -228,6 +236,11 @@ export async function onDriverEnd(ctx: SessionLifecycleCtx): Promise<void> { onLog: (level, message) => log[level](message) }) } + // Drain this driver's frames into the run-wide buffer while the recorder is + // still alive — the finalize context is built after screencast is nulled. + if (ctx.options.filmstrip && ctx.screencast) { + ctx.filmstripFrames.push(...ctx.screencast.frames) + } ctx.driver = undefined ctx.screencast = undefined ctx.scriptInjected = false @@ -313,6 +326,12 @@ export function buildTraceExportContext( format: ctx.options.traceFormat, capturer, actionSnapshots: ctx.actionSnapshots, + // Accumulated (ended-driver) frames plus the live recorder's — a mid-run + // per-spec/per-test flush fires before onDriverEnd drains the recorder, so + // its frames aren't in filmstripFrames yet; the core windows per slice. + screencastFrames: ctx.options.filmstrip + ? [...ctx.filmstripFrames, ...(ctx.screencast?.frames ?? [])] + : undefined, sessionId, testMetadata: collectSuiteTestMetadata(root ? [root] : []), // TestStats.retries carries the per-test attempt (Mocha authoritative, diff --git a/packages/service/README.md b/packages/service/README.md index bfd4002f..c5a28e80 100644 --- a/packages/service/README.md +++ b/packages/service/README.md @@ -52,6 +52,7 @@ services: [['devtools', options]] | `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep — e.g. `'retain-on-failure'`, `'retain-on-first-failure'`. | | `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). | | `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). | +| `filmstrip` | `boolean` | `false` | Trace mode only. Records a dense, continuous screencast filmstrip *into* the trace so the player scrubs smooth playback — dense frames are added alongside the per-action frames (not one frame per action). Frames are thinned (≥100 ms apart, ~600 max) and content-addressed (identical frames — a static wait — collapse to one resource); windowed per slice at any `traceGranularity`. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | ## Allure integration diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index dc9cea69..012382d6 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -134,6 +134,12 @@ export default class DevToolsHookService implements Services.ServiceInstance { frames: ScreencastFrame[] } + /** Filmstrip frames accumulated across reloadSession() boundaries — the + * recorder's buffer resets per session, so this persists earlier sessions' + * frames (like #actionSnapshots) and is concatenated with the live recorder's + * frames at export, then windowed per slice in core. Filmstrip mode only. */ + #filmstripFrames: ScreencastFrame[] = [] + /** Map of testUid → metadata for trace group events and per-spec partitioning. */ #testMetadata: TestMetadataMap = new Map() @@ -202,14 +208,31 @@ export default class DevToolsHookService implements Services.ServiceInstance { } /** Record a screencast this session? Live mode: `screencast.enabled`. Trace - * mode: a non-`off` `video` policy (frames are sliced per test at flush). */ + * mode: a non-`off` `video` policy (frames sliced per test at flush) or + * `filmstrip` (dense frames written into the trace itself). */ #shouldRecordScreencast(): boolean { if (this.#options.mode === 'trace') { - return !!this.#options.video && this.#options.video !== 'off' + return ( + (!!this.#options.video && this.#options.video !== 'off') || + !!this.#options.filmstrip + ) } return !!this.#screencastOptions?.enabled } + /** Whole-run filmstrip frames for the export context: earlier sessions' + * accumulated frames plus the live recorder's, or undefined when filmstrip + * is off (so the trace stays byte-stable with today's output). */ + #filmstripFramesForExport(): ScreencastFrame[] | undefined { + if (!this.#options.filmstrip) { + return undefined + } + return [ + ...this.#filmstripFrames, + ...(this.#screencastRecorder?.frames ?? []) + ] + } + /** Eager per-test flush at test end (test granularity only), run after the * outcome is stamped so this attempt's metadata is written before a retry * overwrites it; the end-of-run finalizer then dedupes it via the key set. */ @@ -240,6 +263,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { format: this.#options.traceFormat, capturer: this.#sessionCapturer, actionSnapshots: this.#actionSnapshots, + screencastFrames: this.#filmstripFramesForExport(), sessionId: browser.sessionId, capabilities: browser.capabilities, testMetadata: this.#testMetadata, @@ -306,8 +330,9 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** * Start screencast recording when enabled — `screencast.enabled` in live - * mode, or a non-`off` `video` policy in trace mode (per-test slicing at - * flush time). Failures are non-fatal — logged, session continues. + * mode, or a non-`off` `video` policy (per-test slicing at flush) or + * `filmstrip` (dense frames into the trace) in trace mode. Failures are + * non-fatal — logged, session continues. */ if (this.#shouldRecordScreencast()) { this.#screencastRecorder = new ScreencastRecorder( @@ -767,10 +792,16 @@ export default class DevToolsHookService implements Services.ServiceInstance { // point the recorder below has replaced these frames. Snapshot them now, // keyed to the ending test, so afterScenario can still slice its video. if (this.#options.mode === 'trace' && this.#screencastRecorder) { + const frames = [...this.#screencastRecorder.frames] this.#pendingVideoFrames = { testUid: this.#currentTestUid, startWallTime: this.#currentTestStartWallTime, - frames: [...this.#screencastRecorder.frames] + frames + } + // Persist for the filmstrip too — the recorder below resets the buffer, + // so a session/spec trace spanning this reload keeps its earlier frames. + if (this.#options.filmstrip) { + this.#filmstripFrames.push(...frames) } } diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index ba881d4a..37fc2c86 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -277,6 +277,20 @@ describe('DevtoolsService - Screencast Integration', () => { // helper itself (covered in core/tests). Service just needs to invoke it. }) + it('trace mode: filmstrip starts the recorder; no filmstrip/video leaves it off', async () => { + // filmstrip on → recorder runs so its frames become the dense trace filmstrip + service = new DevToolsHookService({ mode: 'trace', filmstrip: true }) + await service.before({} as any, [], mockBrowser) + expect(mockScreencastRecorder.start).toHaveBeenCalledWith(mockBrowser) + + vi.clearAllMocks() + + // trace mode, neither filmstrip nor video → no recorder (byte-stable output) + service = new DevToolsHookService({ mode: 'trace' }) + await service.before({} as any, [], mockBrowser) + expect(mockScreencastRecorder.start).not.toHaveBeenCalled() + }) + it('onReload finalizes old session and starts fresh recorder', async () => { const { ScreencastRecorder } = await import('../src/screencast.js') service = new DevToolsHookService({ screencast: { enabled: true } }) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 583ca3e7..793c7b8c 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -317,6 +317,12 @@ export interface BaseDevToolsOptions { /** Trace retention policy — gates which traces are kept (e.g. * `retain-on-failure`). Default `on` (keep all). Only applies in trace mode. */ tracePolicy?: TraceRetentionPolicy + /** Record a dense, continuous screencast filmstrip into the trace for + * scrubbable playback in the trace player — not just one frame per action. + * The dense frames are added alongside the per-action frames (which carry the + * DOM snapshots). Runs the screencast recorder (CDP push on Chrome, polling + * elsewhere). Default false. Only applies in trace mode. */ + filmstrip?: boolean } /** Minimal Cucumber pickle-step shape — only the fields the adapters read. @@ -408,6 +414,10 @@ export interface TraceLog { config?: { configFile?: string } /** Per-action snapshots captured in `mode: 'trace'` for the trace.zip exporter. */ actionSnapshots?: ActionSnapshot[] + /** Dense screencast frames (continuous recorder buffer) for the trace-mode + * filmstrip. Present only when `filmstrip` is enabled; thinned + content- + * addressed at export time. */ + screencastFrames?: ScreencastFrame[] } // ─── Preserve-and-rerun ───────────────────────────────────────────────────── From 4400a4f42f6d99840e1698e672921cb0a78bb399 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 03:14:34 +0530 Subject: [PATCH 070/109] fix(core): window command-less trace slices; drop dead SpecRange.snapshotCount --- packages/core/src/spec-trace-helpers.ts | 24 +++++-- .../core/tests/spec-trace-helpers.test.ts | 70 +++++++++++++++++-- packages/core/tests/trace-finalizer.test.ts | 3 +- .../nightwatch-devtools/src/trace-slices.ts | 3 +- .../src/session-lifecycle.ts | 3 +- packages/service/src/index.ts | 3 +- 6 files changed, 85 insertions(+), 21 deletions(-) diff --git a/packages/core/src/spec-trace-helpers.ts b/packages/core/src/spec-trace-helpers.ts index 33d51bc0..8271d341 100644 --- a/packages/core/src/spec-trace-helpers.ts +++ b/packages/core/src/spec-trace-helpers.ts @@ -36,7 +36,6 @@ export interface SpecRange { networkStartIdx: number mutationStartIdx: number traceLogStartIdx: number - snapshotCount: number } /** @@ -256,7 +255,6 @@ export interface SpecBoundaryContext { mutations: ArrayLike<unknown> traceLogs: ArrayLike<unknown> } - actionSnapshots: ArrayLike<unknown> } /** Push a new slice range and return the previous (unflushed) range to flush. @@ -285,8 +283,7 @@ function pushSliceRange( consoleStartIdx: ctx.capturer.consoleLogs.length, networkStartIdx: ctx.capturer.networkRequests.length, mutationStartIdx: ctx.capturer.mutations.length, - traceLogStartIdx: ctx.capturer.traceLogs.length, - snapshotCount: ctx.actionSnapshots.length + traceLogStartIdx: ctx.capturer.traceLogs.length }) return prevRange @@ -359,7 +356,7 @@ export interface WriteSpecTraceInput { } /** Timestamped items inside a slice's wall-clock window `[start, end)`. An - * undefined `start` (a slice with no commands to anchor on) yields nothing; an + * undefined `start` (a slice with nothing to anchor on) yields nothing; an * undefined `end` (the last slice) is open-ended, so a trailing assertion-wait * stays with its test. Used for both action snapshots and screencast frames so * they partition on the same reliable boundary as the sliced commands. */ @@ -404,7 +401,22 @@ async function writeSliceTrace( // the previous one. const commandStart = (c: CommandLog | undefined): number | undefined => c ? (c.startTime ?? c.timestamp) : undefined - const windowStart = commandStart(sliceCapturer.commandsLog[0]) + // A command-less slice (assertion-only test) has no command to anchor on; fall + // back to the earliest of its own index-sliced console/network timestamps so + // its snapshots/frames still window+rebase rather than drop to the session + // offset. Empty of both keeps today's undefined → no-window behavior. + // Both are epoch ms (Date.now), matching the command anchor and the frame/ + // snapshot clock — NOT NetworkRequest.startTime, which is performance.now + // (relative ms) and would anchor the window ~54,000 years off. + const fallbackStart = (): number | undefined => { + const times = [ + ...sliceCapturer.consoleLogs.map((c) => c.timestamp), + ...sliceCapturer.networkRequests.map((n) => n.timestamp) + ] + return times.length ? Math.min(...times) : undefined + } + const windowStart = + commandStart(sliceCapturer.commandsLog[0]) ?? fallbackStart() const windowEnd = input.nextRange ? commandStart(input.capturer.commandsLog[input.nextRange.commandStartIdx]) : undefined diff --git a/packages/core/tests/spec-trace-helpers.test.ts b/packages/core/tests/spec-trace-helpers.test.ts index a3b8c8d2..c0e4ea91 100644 --- a/packages/core/tests/spec-trace-helpers.test.ts +++ b/packages/core/tests/spec-trace-helpers.test.ts @@ -49,7 +49,6 @@ const range = (over: Partial<SpecRange> = {}): SpecRange => ({ networkStartIdx: 0, mutationStartIdx: 0, traceLogStartIdx: 0, - snapshotCount: 0, ...over }) @@ -66,7 +65,6 @@ function boundaryCtx( mutations: [], traceLogs: [] }, - actionSnapshots: [], ...over } } @@ -162,15 +160,13 @@ describe('recordSliceBoundary (test granularity)', () => { networkRequests: [], mutations: [1, 2, 3], traceLogs: [] - }, - actionSnapshots: [1, 1] + } }) expect(recordSliceBoundary(ctx, 'test', '/a.js', 'u1')).toBeNull() expect(ctx.specRanges).toHaveLength(1) expect(ctx.specRanges[0]!.key).toBe('u1') expect(ctx.specRanges[0]!.testUid).toBe('u1') expect(ctx.specRanges[0]!.commandStartIdx).toBe(2) - expect(ctx.specRanges[0]!.snapshotCount).toBe(2) const prev = recordSliceBoundary(ctx, 'test', '/a.js', 'u2') expect(prev?.key).toBe('u1') @@ -365,6 +361,67 @@ describe('writeTestSliceTrace / writeSpecTrace output layout', () => { expect(frameOffsets).toEqual([100, 400, 1400]) }) + it('windows a command-less slice by its own console/network and rebases', async () => { + // An assertion-only test records no commands, so there is no command to + // anchor the wall-clock window on. The slice must anchor on the earliest of + // its own console/network *epoch* timestamps and rebase to it. The network + // request carries a small performance.now `startTime` (50) alongside its + // epoch `timestamp` (2000) — the fallback MUST use `.timestamp`; using + // `.startTime` would anchor the window at 50 and sweep the pre-window 1500 + // snapshot in with a garbage cross-clock offset. + const capturer: TraceCapturer = { + mutations: [], + traceLogs: [], + consoleLogs: [{ type: 'info', args: ['hi'], timestamp: 2600 }], + networkRequests: [ + { + id: 'r1', + url: 'https://example.test', + method: 'GET', + type: 'fetch', + startTime: 50, + timestamp: 2000 + } + ], + commandsLog: [], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + } + const snapshots = [ + { command: 'assert', timestamp: 1500, screenshot: 'QQ==' }, + { command: 'assert', timestamp: 2200, screenshot: 'QkI=' }, + { command: 'assert', timestamp: 2500, screenshot: 'Q0M=' } + ] + const dir = await writeTestSliceTrace( + input({ + range: range({ specFile: '/t.js', key: 'A', testUid: 'A' }), + capturer, + actionSnapshots: snapshots, + format: 'ndjson-directory', + testMetadata: new Map([['A', { title: 'Test A', specFile: '/t.js' }]]) + }) + ) + const events = (await fs.readFile(path.join(dir, 'trace.trace'), 'utf8')) + .trim() + .split('\n') + .map((l) => JSON.parse(l) as Record<string, unknown>) + // Window anchors on the earliest epoch timestamp (network .timestamp 2000): + // the pre-window 1500 snapshot is excluded; the sparse filmstrip re-anchors + // its first in-window frame (2200) to 0 and 2500 lands at 500. (Using the + // perf.now .startTime of 50 would instead admit 1500 → [0, 2150, 2450].) + const frameOffsets = events + .filter((e) => e.type === 'screencast-frame') + .map((e) => e.timestamp as number) + .sort((x, y) => x - y) + expect(frameOffsets).toEqual([0, 500]) + // Console (2600) rebased to the same window start (2000), not the session offset. + const consoleTimes = events + .filter((e) => e.type === 'console') + .map((e) => e.time as number) + expect(consoleTimes).toEqual([600]) + }) + it('keeps the spec write flat as trace-<id>.zip (unchanged layout)', async () => { const written = await writeSpecTrace( input({ @@ -410,8 +467,7 @@ describe('findFlushableRange', () => { consoleStartIdx: 0, networkStartIdx: 0, mutationStartIdx: 0, - traceLogStartIdx: 0, - snapshotCount: 0 + traceLogStartIdx: 0 }) it('reverse-scans for the given testUid (latest retry attempt wins)', () => { diff --git a/packages/core/tests/trace-finalizer.test.ts b/packages/core/tests/trace-finalizer.test.ts index 7510de03..6fe66b9d 100644 --- a/packages/core/tests/trace-finalizer.test.ts +++ b/packages/core/tests/trace-finalizer.test.ts @@ -59,8 +59,7 @@ function range(specFile: string, startIdx: number): SpecRange { consoleStartIdx: 0, networkStartIdx: 0, mutationStartIdx: 0, - traceLogStartIdx: 0, - snapshotCount: 0 + traceLogStartIdx: 0 } } diff --git a/packages/nightwatch-devtools/src/trace-slices.ts b/packages/nightwatch-devtools/src/trace-slices.ts index c69f8fe7..33111723 100644 --- a/packages/nightwatch-devtools/src/trace-slices.ts +++ b/packages/nightwatch-devtools/src/trace-slices.ts @@ -39,8 +39,7 @@ function boundaryContext(ctx: TestSliceCtx): SpecBoundaryContext { return { specRanges: ctx.specRanges, flushedSpecs: ctx.flushedSpecs, - capturer: ctx.sessionCapturer, - actionSnapshots: ctx.sessionCapturer.actionSnapshots + capturer: ctx.sessionCapturer } } diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index d00b4030..2f203dce 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -364,8 +364,7 @@ function boundaryContext( return { specRanges: ctx.specRanges, flushedSpecs: ctx.flushedSpecs, - capturer, - actionSnapshots: ctx.actionSnapshots + capturer } } diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 012382d6..af6bcf68 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -164,8 +164,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { return { specRanges: this.#specRanges, flushedSpecs: this.#flushedSpecs, - capturer: this.#sessionCapturer, - actionSnapshots: this.#actionSnapshots + capturer: this.#sessionCapturer } } From 3fa3de861363a18b59144470b895d0ad3c9e7fe1 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 03:14:48 +0530 Subject: [PATCH 071/109] fix(core): drop the sparse per-action filmstrip when a dense one is present --- packages/core/src/trace-exporter.ts | 9 ++- packages/core/tests/trace-exporter.test.ts | 66 ++++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index 6a43755e..c8ae443d 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -328,10 +328,15 @@ function buildEventStream( const viewport = trace.metadata.viewport ?? { width: 1280, height: 720 } const snapshots = trace.actionSnapshots ?? [] const snapshotIndex = new FrameSnapshotIndex(snapshots) + // Dense frames supersede the sparse per-action filmstrip; per-action DOM is + // carried by the frame-snapshot events, so sparse frames would only duplicate. + const filmstrip = + denseFrameEvents.length > 0 + ? denseFrameEvents + : buildFilmstripEvents(snapshots, pageId, wallTime, viewport) const events: TraceEvent[] = [ ctxOptions, - ...buildFilmstripEvents(snapshots, pageId, wallTime, viewport), - ...denseFrameEvents, + ...filmstrip, ...buildActionEvents( trace.commands, pageId, diff --git a/packages/core/tests/trace-exporter.test.ts b/packages/core/tests/trace-exporter.test.ts index 537d3c4c..365eb74c 100644 --- a/packages/core/tests/trace-exporter.test.ts +++ b/packages/core/tests/trace-exporter.test.ts @@ -456,4 +456,70 @@ describe('exported trace stream — dense filmstrip', () => { } await fs.rm(outputDir, { recursive: true, force: true }) }) + + it('drops the sparse per-action filmstrip when dense frames are present', async () => { + const outputDir = await fs.mkdtemp( + path.join(os.tmpdir(), 'trace-dense-sparse-') + ) + const capturer: TraceCapturer = { + mutations: [], + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { + command: 'url', + args: ['https://example.test'], + timestamp: 1200, + startTime: 1150 + }, + { command: 'click', args: ['#go'], timestamp: 1500, startTime: 1450 } + ], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + } + const dir = await writeTraceZip(capturer, { + outputDir, + sessionId: 'abc12345', + format: 'ndjson-directory', + // Action snapshots carry the DOM refs the sparse filmstrip used to fold in. + actionSnapshots: [ + { + timestamp: 1200, + command: 'url', + screenshot: 'AAAA', + elements: [{ selector: '#go' }], + snapshotText: '<html></html>' + }, + { timestamp: 1500, command: 'click', screenshot: 'BBBB' } + ], + screencastFrames: [ + { data: Buffer.from('paint-1').toString('base64'), timestamp: 1000 }, + { data: Buffer.from('paint-2').toString('base64'), timestamp: 1400 } + ] + }) + const lines = (await fs.readFile(path.join(dir, 'trace.trace'), 'utf8')) + .trim() + .split('\n') + .map((l) => JSON.parse(l) as Record<string, unknown>) + + // Every filmstrip frame is a content-addressed dense frame; no sparse + // `page@…-<ts>.jpeg` frames survive, so there is no duplication. + const frames = lines.filter((l) => l.type === 'screencast-frame') + expect(frames).toHaveLength(2) + for (const f of frames) { + expect(String(f.sha1)).toMatch(/^[0-9a-f]{40}\.jpeg$/) + } + + // Per-action DOM survives: frame-snapshot events + after-snapshot refs stay. + const frameSnaps = lines.filter((l) => l.type === 'frame-snapshot') + expect(frameSnaps).toHaveLength(2) + const afterSnaps = lines + .filter((l) => l.type === 'after') + .map((l) => l.afterSnapshot) + .filter(Boolean) + expect(afterSnaps).toEqual(['after@call@1', 'after@call@2']) + await fs.rm(outputDir, { recursive: true, force: true }) + }) }) From cb850cc1be65aa4ae823ac334134d67514ce61a1 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 03:15:08 +0530 Subject: [PATCH 072/109] fix(core): cap the screencast frame buffer to bound memory --- packages/core/src/screencast.ts | 41 +++++++++++++-- packages/core/tests/screencast.test.ts | 71 ++++++++++++++++++++++++++ packages/shared/src/types.ts | 5 +- 3 files changed, 113 insertions(+), 4 deletions(-) diff --git a/packages/core/src/screencast.ts b/packages/core/src/screencast.ts index 892d1bcd..e2c8b4ea 100644 --- a/packages/core/src/screencast.ts +++ b/packages/core/src/screencast.ts @@ -130,7 +130,42 @@ export abstract class ScreencastRecorderBase<TDriver = unknown> { typeof timestampSeconds === 'number' ? Math.round(timestampSeconds * 1000) : Date.now() - this.buffer.push({ data, timestamp }) + this.#appendFrame({ data, timestamp }) + } + + /** + * Append a frame, decimating the buffer in place once it exceeds + * `maxBufferFrames` so a long session can't grow it without bound. + */ + #appendFrame(frame: ScreencastFrame): void { + this.buffer.push(frame) + // Decimation always keeps the first and last frame, so 2 is the hard floor; + // clamp so a nonsensical sub-2 cap is honored as 2 rather than never firing. + if (this.buffer.length > Math.max(2, this.options.maxBufferFrames)) { + this.#decimateBuffer() + } + } + + /** + * Halve the buffer by keeping every other frame plus the first and last, so + * memory is bounded while the temporal spread survives (never tail-truncated). + * `#startIndex` is remapped to the count of surviving pre-marker frames, which + * keeps `frames`/`duration` excluding pre-marker frames across decimation. + */ + #decimateBuffer(): void { + const lastIndex = this.buffer.length - 1 + const kept: ScreencastFrame[] = [] + let preMarkerKept = 0 + for (let i = 0; i < this.buffer.length; i++) { + if (i % 2 === 0 || i === lastIndex) { + if (i < this.#startIndex) { + preMarkerKept++ + } + kept.push(this.buffer[i]) + } + } + this.buffer = kept + this.#startIndex = preMarkerKept } /** Whether `setStartMarker` (or `markStartAtLatest`) has fired yet. */ @@ -180,14 +215,14 @@ export abstract class ScreencastRecorderBase<TDriver = unknown> { this.onUnavailable(new Error('first screenshot returned null')) return } - this.buffer.push({ data: first, timestamp: Date.now() }) + this.#appendFrame({ data: first, timestamp: Date.now() }) const intervalMs = this.options.pollIntervalMs this.#pollTimer = setInterval(async () => { try { const data = await this.takeScreenshot() if (data !== null) { - this.buffer.push({ data, timestamp: Date.now() }) + this.#appendFrame({ data, timestamp: Date.now() }) } } catch { // Session ended mid-interval — stop polling gracefully. diff --git a/packages/core/tests/screencast.test.ts b/packages/core/tests/screencast.test.ts index dc57bdb6..d1c1de47 100644 --- a/packages/core/tests/screencast.test.ts +++ b/packages/core/tests/screencast.test.ts @@ -148,3 +148,74 @@ describe('ScreencastRecorderBase — CDP override path', () => { await r.stop() }) }) + +describe('ScreencastRecorderBase — buffer cap / decimation', () => { + class PushRecorder extends ScreencastRecorderBase<{ name: string }> { + protected override async takeScreenshot() { + return null + } + protected override async tryStartCdp() { + return true + } + push(d: string, t: number) { + this.pushCdpFrame(d, t) + } + get len() { + return this.buffer.length + } + } + + it('never lets the buffer exceed maxBufferFrames across many appends', async () => { + const cap = 10 + const r = new PushRecorder({ maxBufferFrames: cap }) + await r.start({ name: 'd' }) + for (let i = 0; i < 1000; i++) { + r.push(`f-${i}`, i) + expect(r.len).toBeLessThanOrEqual(cap) + } + await r.stop() + }) + + it('preserves the first and last frame and the temporal spread (not tail-truncated)', async () => { + const cap = 100 + const total = 350 + const r = new PushRecorder({ maxBufferFrames: cap }) + await r.start({ name: 'd' }) + for (let i = 0; i < total; i++) { + r.push(`f-${i}`, i) // pushCdpFrame stores seconds*1000, so timestamp == i*1000 + } + const frames = r.frames + expect(frames[0].data).toBe('f-0') // first kept — a tail-truncated buffer would drop it + expect(frames[frames.length - 1].data).toBe(`f-${total - 1}`) // last kept + expect(r.duration).toBe((total - 1) * 1000) // spans the whole session + + // Spread survives: frames land in the early, middle, and late thirds of the + // timeline rather than clustering at either end. + const times = frames.map((f) => f.timestamp / 1000) + expect(times.some((t) => t < total / 4)).toBe(true) + expect(times.some((t) => t > total / 4 && t < (total * 3) / 4)).toBe(true) + expect(times.some((t) => t > (total * 3) / 4)).toBe(true) + await r.stop() + }) + + it('keeps setStartMarker semantics and a sane duration across decimation', async () => { + const cap = 10 + const r = new PushRecorder({ maxBufferFrames: cap }) + await r.start({ name: 'd' }) + for (let i = 0; i < 5; i++) { + r.push(`pre-${i}`, i) // ts 0..4, before the marker + } + r.setStartMarker() + for (let i = 0; i < 200; i++) { + r.push(`post-${i}`, 100 + i) // ts 100..299, after the marker — forces many decimations + } + const frames = r.frames + expect(frames.length).toBeGreaterThan(1) + // No pre-marker frame ever leaks into the public getter. + expect(frames.every((f) => f.data.startsWith('post-'))).toBe(true) + // Duration stays within the post-marker time window (ts 100..299 → 199s span in ms). + expect(r.duration).toBeGreaterThan(0) + expect(r.duration).toBeLessThanOrEqual(199 * 1000) + await r.stop() + }) +}) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 793c7b8c..b6d37d30 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -278,6 +278,8 @@ export interface ScreencastOptions { * (default: 200 ms ≈ 5 fps). Lower = smoother, more WebDriver round-trips. */ pollIntervalMs?: number + /** Cap on frames held in memory (default: 2000 ≈ several minutes at ~5 fps); the buffer is decimated in place past this. */ + maxBufferFrames?: number } /** Defaults applied to ScreencastOptions when not specified by the user. */ @@ -287,7 +289,8 @@ export const SCREENCAST_DEFAULTS: Required<ScreencastOptions> = { quality: 70, maxWidth: 1280, maxHeight: 720, - pollIntervalMs: 200 + pollIntervalMs: 200, + maxBufferFrames: 2000 } /** From bd1d37cfd68e10467e6d3cb4e0ebb1a40f710b51 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 19:37:00 +0530 Subject: [PATCH 073/109] fix(core): render node:assert failures as clean Expected/Received --- packages/core/src/assert-patcher.ts | 77 ++++++++++++++++++- packages/core/tests/assert-patcher.test.ts | 48 ++++++++++-- .../tests/assertCapture.test.ts | 2 +- packages/service/tests/assert-capture.test.ts | 2 +- 4 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index c60f21ab..c171c82a 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -1,5 +1,9 @@ import { createRequire } from 'node:module' -import { TRACKED_ASSERT_METHODS, type CommandLog } from '@wdio/devtools-shared' +import { + TRACKED_ASSERT_METHODS, + type CollapsedAssertResult, + type CommandLog +} from '@wdio/devtools-shared' import { getCallSourceFromStack } from './stack.js' import { toError } from './error.js' import { stripAnsi } from './console.js' @@ -21,7 +25,10 @@ export const ASSERT_PATCHED_SYMBOL = Symbol.for( export interface CapturedAssert { command: string args: unknown[] - result: 'passed' | undefined + /** `'passed'` for a passing assert; a `CollapsedAssertResult` for a failing + * node:assert (its clean `actual`/`expected` props), so the trace shows + * labelled rows rather than node's ANSI-stripped char-diff. */ + result: 'passed' | CollapsedAssertResult | undefined error: Error | undefined callSource: string | undefined timestamp: number @@ -52,6 +59,65 @@ export function safeSerializeAssertArg(value: unknown): unknown { return value } +interface NodeAssertionError { + actual?: unknown + expected?: unknown + generatedMessage?: boolean +} + +/** Human-readable rendering of an assert value for the message body. */ +function displayAssertValue(value: unknown): string { + if (typeof value === 'string') { + return `'${value}'` + } + try { + return JSON.stringify(value) ?? String(value) + } catch { + return String(value) + } +} + +/** + * Turn a thrown assert error into the captured shape. node:assert's + * AssertionError carries clean `actual`/`expected` props plus, when it + * auto-generated the message, a per-character COLORED diff whose body becomes + * unreadable noise once ANSI is stripped (`'ExampleThis DIs Nomt...'`). Pull the + * clean values into a CollapsedAssertResult AND rebuild an auto-generated + * message (and its echo in the stack) as a value-bearing `Expected:/Received:` + * block, so every consumer — the trace's Errors tab, the runner console, and + * allure-mocha's error box (which strips the diff's ANSI to mush) — shows + * readable values. A user-supplied message and errors without `actual`/ + * `expected` (e.g. `assert.ok`, a thrown non-assert error) pass through. + */ +function describeAssertFailure(err: unknown): { + result: CollapsedAssertResult | undefined + error: Error +} { + const error = toError(err) + const e = (typeof err === 'object' && err ? err : {}) as NodeAssertionError + if (!('actual' in e) && !('expected' in e)) { + return { result: undefined, error } + } + const rawMessage = stripAnsi(error.message) + const cleanMessage = e.generatedMessage + ? `${rawMessage.split('\n')[0] ?? 'Assertion failed'}\n\n` + + `Expected: ${displayAssertValue(e.expected)}\n` + + `Received: ${displayAssertValue(e.actual)}` + : rawMessage + error.message = cleanMessage + if (error.stack) { + error.stack = stripAnsi(error.stack).replace(rawMessage, cleanMessage) + } + return { + result: { + passed: false, + actual: safeSerializeAssertArg(e.actual), + expected: safeSerializeAssertArg(e.expected) + }, + error + } +} + function makeAssertEmitters( methodName: string, args: unknown[], @@ -65,7 +131,7 @@ function makeAssertEmitters( } const startedAt = Date.now() const sanitizedArgs = args.map(safeSerializeAssertArg) - const emit = (result: 'passed' | undefined, error: Error | undefined) => + const emit = (result: CapturedAssert['result'], error: Error | undefined) => onCommand({ command: `assert.${methodName}`, args: sanitizedArgs, @@ -76,7 +142,10 @@ function makeAssertEmitters( }) return { passed: () => emit('passed', undefined), - failed: (err: unknown) => emit(undefined, toError(err)) + failed: (err: unknown) => { + const { result, error } = describeAssertFailure(err) + emit(result, error) + } } } diff --git a/packages/core/tests/assert-patcher.test.ts b/packages/core/tests/assert-patcher.test.ts index 5eda95da..9fb79d9b 100644 --- a/packages/core/tests/assert-patcher.test.ts +++ b/packages/core/tests/assert-patcher.test.ts @@ -78,17 +78,47 @@ describe('patchNodeAssert', () => { const captured: CapturedAssert[] = [] patchNodeAssert((c) => captured.push(c)) expect(() => assert.equal(1, 2)).toThrow() - expect(captured[0].result).toBeUndefined() + // A failed node:assert carries its clean actual/expected (not node's + // ANSI-stripped char-diff) so the trace renders labelled rows. + expect(captured[0].result).toMatchObject({ + passed: false, + actual: 1, + expected: 2 + }) expect(captured[0].error).toBeInstanceOf(Error) }) + it('carries clean expected/actual and a header-only message for a strict string diff', () => { + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + // strict.equal is what produces node's colored char-diff (the source of the + // 'ExampleThis DIs Nomt…' mush once ANSI is stripped downstream). + expect(() => + assert.strict.equal('Example Domain', 'This Is Not The Heading') + ).toThrow() + // node's clean props, not its char-diff, drive the rows. + expect(captured[0].result).toMatchObject({ + passed: false, + actual: 'Example Domain', + expected: 'This Is Not The Heading' + }) + // The auto-generated diff body is rebuilt as a value-bearing Expected/ + // Received block — never the ANSI-stripped char-diff mush. + const message = captured[0].error?.message ?? '' + expect(message).toContain('Expected values to be strictly equal:') + expect(message).toContain("Expected: 'This Is Not The Heading'") + expect(message).toContain("Received: 'Example Domain'") + expect(message).not.toContain('ExampleThis') + }) + it('handles Promise-returning asserts (rejects/doesNotReject)', async () => { const captured: CapturedAssert[] = [] patchNodeAssert((c) => captured.push(c)) await assert.doesNotReject(async () => 1) await expect(assert.rejects(async () => 1)).rejects.toThrow() const results = captured.map((c) => c.result) - expect(results).toEqual(['passed', undefined]) // first resolved, second rejected + expect(results[0]).toBe('passed') // first resolved + expect(results[1]).not.toBe('passed') // second rejected → failed capture }) // `import { strict as assert }` (and `assert.strict.*`) reference a separate @@ -98,10 +128,12 @@ describe('patchNodeAssert', () => { patchNodeAssert((c) => captured.push(c)) assert.strict.equal(1, 1) expect(() => assert.strict.equal(1, 2)).toThrow() - expect(captured.map((c) => [c.command, c.result])).toEqual([ - ['assert.equal', 'passed'], - ['assert.equal', undefined] + expect(captured.map((c) => c.command)).toEqual([ + 'assert.equal', + 'assert.equal' ]) + expect(captured[0].result).toBe('passed') + expect(captured[1].result).toMatchObject({ passed: false }) }) // Only assertions that originate in user test code should reach the trace. @@ -144,7 +176,7 @@ describe('patchNodeAssert', () => { result: 'passed', callSource: USER_FRAME.callSource }) - expect(captured[1].result).toBeUndefined() + expect(captured[1].result).toMatchObject({ passed: false }) expect(captured[1].error).toBeInstanceOf(Error) }) }) @@ -179,7 +211,7 @@ describe('patchNodeAssert', () => { patchNodeAssert((c) => captured.push(c)) expect(() => assert.match('a', /b/)).toThrow() expect(captured[0].command).toBe('assert.match') - expect(captured[0].result).toBeUndefined() + expect(captured[0].result).toMatchObject({ passed: false }) expect(captured[0].error).toBeInstanceOf(Error) }) @@ -196,7 +228,7 @@ describe('patchNodeAssert', () => { patchNodeAssert((c) => captured.push(c)) expect(() => assert.doesNotMatch('a', /a/)).toThrow() expect(captured[0].command).toBe('assert.doesNotMatch') - expect(captured[0].result).toBeUndefined() + expect(captured[0].result).toMatchObject({ passed: false }) expect(captured[0].error).toBeInstanceOf(Error) }) diff --git a/packages/nightwatch-devtools/tests/assertCapture.test.ts b/packages/nightwatch-devtools/tests/assertCapture.test.ts index 61602964..7c498b0b 100644 --- a/packages/nightwatch-devtools/tests/assertCapture.test.ts +++ b/packages/nightwatch-devtools/tests/assertCapture.test.ts @@ -87,7 +87,7 @@ describe('wireAssertCapture', () => { expect(() => assert.strictEqual('a', 'b')).toThrow() const failed = fake.commandsLog[1] expect(failed.command).toBe('assert.strictEqual') - expect(failed.result).toBeUndefined() + expect(failed.result).toMatchObject({ passed: false }) expect(failed.error).toBeInstanceOf(Error) expect(fake.sendCommand).toHaveBeenCalledTimes(2) }) diff --git a/packages/service/tests/assert-capture.test.ts b/packages/service/tests/assert-capture.test.ts index e88f3dca..58edd9d8 100644 --- a/packages/service/tests/assert-capture.test.ts +++ b/packages/service/tests/assert-capture.test.ts @@ -124,9 +124,9 @@ describe('wireAssertCapture', () => { expect(() => assert.strictEqual('a', 'b')).toThrow() const failed = entries[1] expect(failed.command).toBe('assert.strictEqual') + expect(failed.result).toMatchObject({ passed: false }) expect(failed.testUid).toBe('uid-2') expect(failed.error).toMatchObject({ name: 'AssertionError' }) - expect(failed.result).toBeUndefined() }) it('is a no-op wiring when invoked twice (per-process patch guard)', () => { From b3f07b01bbac103f37003275e0a1f5ccea707c48 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 19:37:44 +0530 Subject: [PATCH 074/109] feat: cross-adapter Allure artifact attachment via pluggable sink --- .gitignore | 11 +- eslint.config.cjs | 8 +- packages/core/src/allure-artifacts.ts | 206 ++++++++++++++++ packages/core/src/index.ts | 1 + packages/core/tests/allure-artifacts.test.ts | 224 ++++++++++++++++++ packages/nightwatch-devtools/README.md | 4 + .../src/cucumber-lifecycle.ts | 7 + packages/nightwatch-devtools/src/index.ts | 75 +++++- .../src/plugin-internals.ts | 4 + .../nightwatch-devtools/src/session-init.ts | 33 ++- .../nightwatch-devtools/src/test-artifacts.ts | 92 +++++++ packages/nightwatch-devtools/src/types.ts | 19 +- .../tests/testArtifacts.test.ts | 134 +++++++++++ packages/selenium-devtools/README.md | 2 + packages/selenium-devtools/package.json | 9 + packages/selenium-devtools/src/allure.ts | 62 +++++ .../src/helpers/testManager.ts | 19 +- packages/selenium-devtools/src/index.ts | 144 ++++++++++- .../src/runnerHooks/cucumber.ts | 12 +- .../selenium-devtools/src/runnerHooks/jest.ts | 6 +- .../src/runnerHooks/mocha.ts | 12 +- .../src/session-lifecycle.ts | 66 ++++-- packages/selenium-devtools/src/types.ts | 27 ++- .../selenium-devtools/tests/allure.test.ts | 52 ++++ packages/service/src/allure.ts | 92 ++----- packages/service/src/index.ts | 40 ++-- packages/service/src/screenshot-capture.ts | 67 ------ packages/service/src/video-capture.ts | 80 ------- packages/service/tests/allure.test.ts | 99 ++------ .../service/tests/screenshot-capture.test.ts | 86 ------- packages/service/tests/video-capture.test.ts | 75 ------ pnpm-lock.yaml | 133 ++++------- 32 files changed, 1263 insertions(+), 638 deletions(-) create mode 100644 packages/core/src/allure-artifacts.ts create mode 100644 packages/core/tests/allure-artifacts.test.ts create mode 100644 packages/nightwatch-devtools/src/test-artifacts.ts create mode 100644 packages/nightwatch-devtools/tests/testArtifacts.test.ts create mode 100644 packages/selenium-devtools/src/allure.ts create mode 100644 packages/selenium-devtools/tests/allure.test.ts delete mode 100644 packages/service/src/screenshot-capture.ts delete mode 100644 packages/service/src/video-capture.ts delete mode 100644 packages/service/tests/screenshot-capture.test.ts delete mode 100644 packages/service/tests/video-capture.test.ts diff --git a/.gitignore b/.gitignore index e8a7a934..4bcee08d 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,7 @@ trace-*.zip examples/**/trace-*/ # test results -examples/**/test-results/ +examples/**/test-results*/ # vitest --coverage output coverage/ @@ -49,3 +49,12 @@ coverage/ /packages/**/*.mjs .claude + +# Local Allure exploration / trace-parity comparison (throwaway — not committed) +examples/**/allure-results*/ +examples/**/allure-report*/ +packages/**/allure-results*/ +packages/**/allure-report*/ +examples/playwright-allure/ +examples/wdio/cucumber/wdio.allure.conf.ts + diff --git a/eslint.config.cjs b/eslint.config.cjs index b7c00ca1..7ef666a2 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -9,7 +9,13 @@ const security = require('eslint-plugin-security') module.exports = [ { - ignores: ['node_modules/**', '**/dist/**', '**/.tsup/**'] + ignores: [ + 'node_modules/**', + '**/dist/**', + '**/.tsup/**', + '**/allure-report/**', + '**/allure-results/**' + ] }, // Base JS config { diff --git a/packages/core/src/allure-artifacts.ts b/packages/core/src/allure-artifacts.ts new file mode 100644 index 00000000..a07d2595 --- /dev/null +++ b/packages/core/src/allure-artifacts.ts @@ -0,0 +1,206 @@ +// Framework-agnostic capture-and-attach of per-test trace artifacts to Allure. +// The *produce* half (screenshot/video write, retention decision) already lives +// in core; this module adds the orchestration + the attach, behind a pluggable +// `AllureAttachSink` so each adapter supplies only its reporter binding: +// - WDIO service → @wdio/allure-reporter's addAttachment +// - Selenium → allure-js-commons' attachment() (runtime-agnostic) +// - Nightwatch → no sink (produce-only; its Allure path is post-hoc, with no +// live attach API), so artifacts land in the manifest only. +// A missing/undefined sink means "produce but don't attach" — never an error. + +import fs from 'node:fs/promises' +import { basename } from 'node:path' +import type { + ActionSnapshot, + DevToolsMode, + ScreencastFrame, + TraceGranularity, + TraceScreenshotPolicy, + TraceVideoPolicy +} from '@wdio/devtools-shared' +import { + shouldCaptureScreenshot, + writeScreenshotArtifact +} from './screenshot-artifact.js' +import { encodePerTestVideo, sliceFramesFrom } from './video-slice.js' +import { shouldRetainTrace, type TestOutcome } from './trace-retention.js' +import type { TraceArtifact } from './trace-finalizer.js' + +/** Adapter-supplied binding to the active Allure reporter. Attaches one file to + * the currently-executing test. Undefined = attach unsupported (produce-only). */ +export type AllureAttachSink = ( + name: string, + content: Buffer, + contentType: string +) => void | Promise<void> + +type LogFn = (level: 'info' | 'warn', message: string) => void + +// Trace stays a plain zip download (the viewer is the user's choice, not a +// third-party viewer Allure would open for a trace-specific content type); +// video/image render inline. +const CONTENT_TYPE_BY_KIND: Record<TraceArtifact['kind'], string> = { + trace: 'application/zip', + video: 'video/webm', + screenshot: 'image/png' +} + +/** + * Read a retained artifact and hand it to the sink for attachment to the current + * Allure test. No-op when the artifact wasn't retained, has no path, the sink is + * absent, or the path is a directory (the ndjson-directory trace format). Never + * throws — a missing/unreadable artifact must not reject the caller's hook. + */ +export async function attachTraceArtifact( + artifact: TraceArtifact, + sink: AllureAttachSink | undefined, + onLog?: LogFn +): Promise<void> { + if (!sink || !artifact.retained || !artifact.path) { + return + } + try { + const stat = await fs.stat(artifact.path) + if (!stat.isFile()) { + return + } + const content = await fs.readFile(artifact.path) + await sink( + basename(artifact.path), + content, + CONTENT_TYPE_BY_KIND[artifact.kind] + ) + } catch (err) { + onLog?.( + 'warn', + `Allure attach skipped for ${artifact.path}: ${String(err)}` + ) + } +} + +/** + * The base64 of the last rendered action snapshot for the current test, skipping + * the end-of-scenario `__final__` frame (captured post-teardown, often blank when + * a reloadSession runs before the after-hook). Scoped to `>= startWallTime` so a + * test that captured nothing doesn't borrow the previous test's frame. Reused as + * the per-test screenshot — reload-immune and one fewer WebDriver command than a + * fresh end-of-test capture. + */ +export function lastRenderedScreenshot( + snapshots: readonly ActionSnapshot[], + startWallTime: number +): string | undefined { + for (let i = snapshots.length - 1; i >= 0; i--) { + const snap = snapshots[i]! + if (snap.timestamp < startWallTime) { + return undefined + } + if (snap.command !== '__final__' && snap.screenshot) { + return snap.screenshot + } + } + return undefined +} + +/** + * Write the per-test screenshot (per policy) from an already-captured base64 + * frame, record it in the manifest, and attach it via the sink. No-op outside + * `test`-granularity trace mode, without a uid/session/frame, or when the policy + * declines. Gated to `test` granularity so the whole per-test inline story + * (trace + screenshot + video) is one rule. + */ +export async function captureAndAttachScreenshot(input: { + mode: DevToolsMode | undefined + granularity: TraceGranularity | undefined + policy: TraceScreenshotPolicy | undefined + failed: boolean + /** Base64 of the last rendered action snapshot (reload-immune). */ + screenshotBase64: string | undefined + sessionId: string | undefined + outputDir: string + testUid: string | undefined + attach: AllureAttachSink | undefined + onArtifact: (artifact: TraceArtifact) => void + onLog?: LogFn +}): Promise<void> { + const { mode, granularity, policy, failed, screenshotBase64, sessionId } = + input + if ( + mode !== 'trace' || + granularity !== 'test' || + !screenshotBase64 || + !sessionId || + !input.testUid || + !shouldCaptureScreenshot(policy, failed) + ) { + return + } + const artifact = await writeScreenshotArtifact({ + outputDir: input.outputDir, + testUid: input.testUid, + sessionId, + base64: screenshotBase64 + }) + input.onArtifact(artifact) + await attachTraceArtifact(artifact, input.attach, input.onLog) +} + +/** + * Slice the continuous screencast to this test's window, encode a `.webm`, + * record it in the manifest, and attach it via the sink — when trace mode + + * `test` granularity + a non-`off` `video` policy retains this test's outcome. + * Empty outcomes (test never started) skip rather than fail-open onto the + * previous test's frames. + */ +export async function captureAndAttachVideo(input: { + mode: DevToolsMode | undefined + granularity: TraceGranularity | undefined + policy: TraceVideoPolicy | undefined + frames: readonly ScreencastFrame[] | undefined + startWallTime: number + outcomes: TestOutcome[] + attempt: number | undefined + outputDir: string + testUid: string | undefined + sessionId: string | undefined + captureFormat?: 'jpeg' | 'png' + attach: AllureAttachSink | undefined + onArtifact: (artifact: TraceArtifact) => void + onLog?: LogFn +}): Promise<void> { + const { mode, granularity, policy, frames, testUid, sessionId } = input + if ( + mode !== 'trace' || + granularity !== 'test' || + !policy || + policy === 'off' || + !frames || + !testUid || + !sessionId || + input.outcomes.length === 0 + ) { + return + } + if ( + !shouldRetainTrace(policy, { + outcomes: input.outcomes, + attemptInfoAvailable: true + }).retain + ) { + return + } + const artifact = await encodePerTestVideo({ + frames: sliceFramesFrom(frames, input.startWallTime), + outputDir: input.outputDir, + testUid, + sessionId, + attempt: input.attempt, + captureFormat: input.captureFormat, + onLog: input.onLog + }) + if (!artifact) { + return + } + input.onArtifact(artifact) + await attachTraceArtifact(artifact, input.attach, input.onLog) +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index a73cb7bf..cee1a38e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,6 +5,7 @@ export * from './action-mapping.js' export * from './action-snapshot.js' export * from './artifact-naming.js' export * from './artifacts-manifest.js' +export * from './allure-artifacts.js' export * from './attempt-tracker.js' export * from './screenshot-artifact.js' export * from './video-slice.js' diff --git a/packages/core/tests/allure-artifacts.test.ts b/packages/core/tests/allure-artifacts.test.ts new file mode 100644 index 00000000..7ce26252 --- /dev/null +++ b/packages/core/tests/allure-artifacts.test.ts @@ -0,0 +1,224 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { mkdtemp, rm, readdir, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import type { ActionSnapshot, ScreencastFrame } from '@wdio/devtools-shared' +import { + attachTraceArtifact, + captureAndAttachScreenshot, + captureAndAttachVideo, + lastRenderedScreenshot, + type AllureAttachSink, + type TestOutcome, + type TraceArtifact +} from '../src/index.js' + +function artifact(over: Partial<TraceArtifact> = {}): TraceArtifact { + return { + kind: 'trace', + path: '', + scope: 'test', + testUids: ['u1'], + retained: true, + ...over + } +} + +const dirs: string[] = [] +afterEach(async () => { + await Promise.all( + dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) + ) +}) +async function tempFile(name: string, bytes = 'bytes'): Promise<string> { + const dir = await mkdtemp(join(tmpdir(), 'allure-art-')) + dirs.push(dir) + const p = join(dir, name) + await writeFile(p, bytes) + return p +} + +describe('attachTraceArtifact', () => { + let sink: ReturnType<typeof vi.fn> + const withSink = (a: TraceArtifact) => + attachTraceArtifact(a, sink as unknown as AllureAttachSink) + beforeEach(() => { + sink = vi.fn() + }) + + it('routes a trace zip to the sink as application/zip', async () => { + const path = await tempFile('trace-abc.zip') + await withSink(artifact({ path })) + expect(sink).toHaveBeenCalledOnce() + const [name, content, type] = sink.mock.calls[0]! + expect(name).toBe('trace-abc.zip') + expect(Buffer.isBuffer(content)).toBe(true) + expect(type).toBe('application/zip') + }) + + it('maps video → video/webm and screenshot → image/png', async () => { + await withSink(artifact({ kind: 'video', path: await tempFile('r.webm') })) + await withSink( + artifact({ kind: 'screenshot', path: await tempFile('s.png') }) + ) + expect(sink.mock.calls[0]![2]).toBe('video/webm') + expect(sink.mock.calls[1]![2]).toBe('image/png') + }) + + it('no-ops for a non-retained artifact, an empty path, or an absent sink', async () => { + await withSink(artifact({ retained: false, path: '/x.zip' })) + await withSink(artifact({ path: '' })) + expect(sink).not.toHaveBeenCalled() + // undefined sink is produce-only, not an error + await expect( + attachTraceArtifact(artifact({ path: '/x.zip' }), undefined) + ).resolves.toBeUndefined() + }) + + it('skips a directory path (ndjson-directory) without throwing', async () => { + const dir = await mkdtemp(join(tmpdir(), 'allure-dir-')) + dirs.push(dir) + await expect(withSink(artifact({ path: dir }))).resolves.toBeUndefined() + expect(sink).not.toHaveBeenCalled() + }) + + it('never rejects when the path is missing', async () => { + await expect( + withSink(artifact({ path: '/no/such/trace.zip' })) + ).resolves.toBeUndefined() + expect(sink).not.toHaveBeenCalled() + }) +}) + +describe('lastRenderedScreenshot', () => { + const snap = ( + command: string, + timestamp: number, + screenshot?: string + ): ActionSnapshot => ({ command, timestamp, screenshot }) as ActionSnapshot + + it('returns the last non-final screenshot at/after the test start', () => { + const snaps = [ + snap('click', 100, 'AA'), + snap('setValue', 200, 'BB'), + snap('__final__', 300, 'CC') + ] + expect(lastRenderedScreenshot(snaps, 100)).toBe('BB') + }) + + it('returns undefined when the only snapshots predate the test start', () => { + expect( + lastRenderedScreenshot([snap('click', 50, 'AA')], 100) + ).toBeUndefined() + }) + + it('returns undefined when there are no snapshots', () => { + expect(lastRenderedScreenshot([], 0)).toBeUndefined() + }) +}) + +describe('captureAndAttachScreenshot', () => { + const collected: TraceArtifact[] = [] + let sink: ReturnType<typeof vi.fn> + beforeEach(() => { + collected.length = 0 + sink = vi.fn() + }) + const SHOT = Buffer.from('png-bytes').toString('base64') + + async function run( + over: Partial<Parameters<typeof captureAndAttachScreenshot>[0]> + ) { + const dir = await mkdtemp(join(tmpdir(), 'shot-cap-')) + dirs.push(dir) + await captureAndAttachScreenshot({ + mode: 'trace', + granularity: 'test', + policy: 'only-on-failure', + failed: true, + screenshotBase64: SHOT, + sessionId: 'sess1234', + outputDir: dir, + testUid: 'u1', + attach: sink as unknown as AllureAttachSink, + onArtifact: (a) => collected.push(a), + ...over + }) + return dir + } + + it('writes + attaches the reused snapshot on failure under only-on-failure', async () => { + const dir = await run({}) + expect(collected).toHaveLength(1) + expect(collected[0]!.kind).toBe('screenshot') + expect(sink).toHaveBeenCalledOnce() + expect(await readdir(dir)).toHaveLength(1) + }) + + it('produces without attaching when the sink is absent', async () => { + await run({ attach: undefined }) + expect(collected).toHaveLength(1) + expect(sink).not.toHaveBeenCalled() + }) + + it('no-ops on a passing test under only-on-failure', async () => { + await run({ failed: false }) + expect(collected).toHaveLength(0) + expect(sink).not.toHaveBeenCalled() + }) + + it('no-ops outside trace mode / test granularity / without frame / without ids', async () => { + await run({ mode: 'live', policy: 'on' }) + await run({ granularity: 'session', policy: 'on' }) + await run({ policy: 'on', screenshotBase64: undefined }) + await run({ sessionId: undefined }) + await run({ testUid: undefined }) + expect(collected).toHaveLength(0) + }) +}) + +describe('captureAndAttachVideo gating', () => { + // Every case no-ops BEFORE the ffmpeg encode (gate or non-retaining policy), + // so no encoder/reporter mock is needed; the encode path is covered by + // video-slice.test.ts. + const collected: TraceArtifact[] = [] + beforeEach(() => { + collected.length = 0 + }) + const frames: ScreencastFrame[] = [ + { data: 'AAAA', timestamp: 10 }, + { data: 'AAAA', timestamp: 20 } + ] + const failedOutcome: TestOutcome[] = [ + { uid: 'u1', attempt: 0, state: 'failed' } + ] + const passedOutcome: TestOutcome[] = [ + { uid: 'u1', attempt: 0, state: 'passed' } + ] + const base = { + mode: 'trace' as const, + granularity: 'test' as const, + policy: 'retain-on-failure' as const, + frames, + startWallTime: 0, + outcomes: failedOutcome, + attempt: 0, + outputDir: '/tmp/does-not-encode', + testUid: 'u1', + sessionId: 'sess1234', + attach: undefined, + onArtifact: (a: TraceArtifact) => collected.push(a) + } + + it('no-ops for granularity/outcomes/policy/frames/ids gates and non-retaining outcome', async () => { + await captureAndAttachVideo({ ...base, granularity: 'session' }) + await captureAndAttachVideo({ ...base, outcomes: [] }) + await captureAndAttachVideo({ ...base, policy: 'off' }) + await captureAndAttachVideo({ ...base, policy: undefined }) + await captureAndAttachVideo({ ...base, frames: undefined }) + await captureAndAttachVideo({ ...base, sessionId: undefined }) + await captureAndAttachVideo({ ...base, testUid: undefined }) + await captureAndAttachVideo({ ...base, outcomes: passedOutcome }) + expect(collected).toHaveLength(0) + }) +}) diff --git a/packages/nightwatch-devtools/README.md b/packages/nightwatch-devtools/README.md index 5f404f5d..59acab32 100644 --- a/packages/nightwatch-devtools/README.md +++ b/packages/nightwatch-devtools/README.md @@ -85,6 +85,10 @@ module.exports = { | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | | `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | | `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` next to your `nightwatch.conf.cjs` at run end. See [Trace mode](../../README.md#-trace-mode-tracezip). | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir and listed in the artifacts manifest; it is NOT attached inline to Allure (see note below). | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir and listed in the manifest; NOT attached inline to Allure. | + +> **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files + manifest) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. ```javascript globals: nightwatchDevtools({ diff --git a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts index 46684570..6ed8f26c 100644 --- a/packages/nightwatch-devtools/src/cucumber-lifecycle.ts +++ b/packages/nightwatch-devtools/src/cucumber-lifecycle.ts @@ -63,6 +63,7 @@ export interface CucumberLifecycleCtx extends TestSliceCtx { setCurrentTest(t: unknown): void recordAttempt(uid: string, specFile?: string): number recordOutcome(uid: string, state: TestStats['state']): void + emitTestArtifacts(uid: string | undefined, failed: boolean): Promise<void> } type MutStep = { @@ -241,6 +242,12 @@ export async function finalizeCucumberScenario( // Flush before the next attempt's attachScenarioToFeature overwrites this // scenario's suite (and thus its outcome) in the tree. flushTestSlice(ctx) + // Produce this scenario's per-test screenshot/video (core-gated to trace + + // `test`). `scenario` is the retry-stable test unit; null-scenario no-ops. + await ctx.emitTestArtifacts( + scenario?.uid, + scenarioState === TEST_STATE.FAILED + ) } catch (err) { log.error(`Failed to finalize Cucumber scenario: ${errorMessage(err)}`) } diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index 5f93d23b..c30f9fc4 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -10,6 +10,7 @@ import { errorMessage, finalizeTraceExport, flushRangeLogged, + resolveAdapterOutputDir, TestAttemptTracker, tracePolicyModeWarning, type SpecRange, @@ -17,6 +18,7 @@ import { type TraceExportContext } from '@wdio/devtools-core' import { buildTraceContext } from './trace-context.js' +import { emitTestArtifacts } from './test-artifacts.js' import { wireAssertCapture } from './helpers/assertCapture.js' import { stop as stopBackend } from '@wdio/devtools-backend' import { @@ -132,21 +134,29 @@ class NightwatchDevToolsPlugin { #bidiEnabled = false #bidiAttachAttempted = false + /** Wall-clock ms at the current test/scenario start — the lower bound of that + * test's action-snapshot and video-frame window (per-test artifact slicing). */ + #currentTestStartWallTime = 0 + // Nightwatch `--retries` and cross-worker reruns may reset this in-process // tracker; only retries that re-enter this process's start hook are counted. #attemptTracker = new TestAttemptTracker() constructor(options: DevToolsOptions = {}) { const mode = options.mode ?? 'live' - // Filmstrip drives the recorder in trace mode; bare screencast stays live-only. - const filmstrip = mode === 'trace' && options.filmstrip === true + // Filmstrip OR a produce-only per-test video drives the recorder in trace + // mode; bare screencast (with neither on) stays a live-only feature. + const wantRecorder = + mode === 'trace' && + (options.filmstrip === true || + (options.video !== undefined && options.video !== 'off')) const ignore = - mode === 'trace' && !filmstrip && options.screencast?.enabled === true + mode === 'trace' && !wantRecorder && options.screencast?.enabled === true if (ignore) { log.warn('trace mode: ignoring screencast option (live-mode feature)') } let screencast = ignore ? {} : (options.screencast ?? {}) - if (filmstrip) { + if (wantRecorder) { screencast = { ...(options.screencast ?? {}), enabled: true } } this.options = { @@ -159,7 +169,9 @@ class NightwatchDevToolsPlugin { traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', tracePolicy: options.tracePolicy ?? 'on', - filmstrip: options.filmstrip ?? false + filmstrip: options.filmstrip ?? false, + screenshot: options.screenshot ?? 'off', + video: options.video ?? 'off' } const policyWarning = tracePolicyModeWarning(options.tracePolicy, mode) if (policyWarning) { @@ -344,7 +356,8 @@ class NightwatchDevToolsPlugin { get flushedSpecs() { return self.#flushedSpecs }, - flushTraceRange: (range) => self.#flushSpecTrace(range) + flushTraceRange: (range) => self.#flushSpecTrace(range), + emitTestArtifacts: (uid, failed) => self.#emitTestArtifacts(uid, failed) } return this.#internals } @@ -386,13 +399,19 @@ class NightwatchDevToolsPlugin { } async #finalizeCurrentScreencast(): Promise<void> { - if (this.options.filmstrip && this.#screencastRecorder) { + // Preserve pre-reload frames for the trace filmstrip AND the produce-only + // per-test video — either can drive the recorder in trace mode now. + if ( + (this.options.filmstrip || this.options.video !== 'off') && + this.#screencastRecorder + ) { this.#filmstripFrames.push(...this.#screencastRecorder.frames) } await finalizeCurrentScreencast(this.#getInternals()) } async cucumberBefore(browser: NightwatchBrowser, pickle: CucumberPickle) { + this.#currentTestStartWallTime = Date.now() await cucumberLifecycleBefore(this.#getInternals(), browser, pickle) } @@ -480,6 +499,7 @@ class NightwatchDevToolsPlugin { if (this.#isCucumberRunner) { return } + this.#currentTestStartWallTime = Date.now() await this.#ensureSessionInitialized(browser) const currentTest = browser.currentTest as NightwatchCurrentTest | undefined @@ -545,6 +565,10 @@ class NightwatchDevToolsPlugin { await this.sessionCapturer.captureTrace(browser) // Flush this test's slice before the next test overwrites its outcome. flushTestSlice(this.#getInternals()) + const results = (browser.currentTest as NightwatchCurrentTest)?.results + const failed = + !!results && ((results.errors ?? 0) > 0 || (results.failed ?? 0) > 0) + await this.#emitTestArtifacts(this.#currentTestUid(), failed) } catch (err) { log.error(`Failed to capture trace: ${errorMessage(err)}`) } @@ -555,6 +579,43 @@ class NightwatchDevToolsPlugin { await closeOutTestcases(this.#getInternals(), browser) } + /** Directory for produced artifacts — next to the test file, else the config, + * else cwd (mirrors #traceContext's resolution). */ + get #outputDir(): string { + return resolveAdapterOutputDir({ + testFilePath: this.browserProxy?.getCurrentTestFullPath?.() ?? undefined, + configPath: this.#configPath + }) + } + + /** Produce (never attach — no live Allure API) this test's per-test screenshot + * and video slice. No-op outside trace mode + `test` granularity (core-gated). + * Shared by the per-test `afterEach` and the cucumber per-scenario finalize. */ + async #emitTestArtifacts( + uid: string | undefined, + failed: boolean + ): Promise<void> { + const attempt = uid ? this.#attemptTracker.attemptFor(uid) : undefined + await emitTestArtifacts({ + mode: this.options.mode, + granularity: this.options.traceGranularity, + screenshotPolicy: this.options.screenshot, + videoPolicy: this.options.video, + failed, + actionSnapshots: this.sessionCapturer.actionSnapshots, + frames: this.#screencastRecorder?.frames ?? this.#filmstripFrames, + startWallTime: this.#currentTestStartWallTime, + outcomes: uid ? this.#attemptTracker.forTest(uid, attempt) : [], + uid, + attempt, + sessionId: this.sessionCapturer?.metadata?.sessionId, + outputDir: this.#outputDir, + captureFormat: this.#screencastOptions.captureFormat, + onArtifact: (a) => this.#artifacts.push(a), + onLog: (level, msg) => log[level](msg) + }) + } + async after(browser?: NightwatchBrowser) { await this.#finalizeCurrentScreencast() try { diff --git a/packages/nightwatch-devtools/src/plugin-internals.ts b/packages/nightwatch-devtools/src/plugin-internals.ts index 4279d360..1d239fb4 100644 --- a/packages/nightwatch-devtools/src/plugin-internals.ts +++ b/packages/nightwatch-devtools/src/plugin-internals.ts @@ -94,4 +94,8 @@ export interface PluginInternals { readonly specRanges: SpecRange[] readonly flushedSpecs: Set<string> flushTraceRange(range: SpecRange): Promise<TraceArtifact | undefined> + + /** Produce (no attach) this test's per-test screenshot + video artifacts. + * Core-gated to trace mode + `test` granularity. */ + emitTestArtifacts(uid: string | undefined, failed: boolean): Promise<void> } diff --git a/packages/nightwatch-devtools/src/session-init.ts b/packages/nightwatch-devtools/src/session-init.ts index 8e485a21..9e5138cd 100644 --- a/packages/nightwatch-devtools/src/session-init.ts +++ b/packages/nightwatch-devtools/src/session-init.ts @@ -277,19 +277,26 @@ export async function finalizeCurrentScreencast( if (!ctx.screencastRecorder || !ctx.screencastSessionId) { return } - await finalizeScreencast({ - recorder: ctx.screencastRecorder, - sessionId: ctx.screencastSessionId, - filenamePrefix: 'nightwatch-video', - outputDir: resolveAdapterOutputDir({ - testFilePath: ctx.browserProxy?.getCurrentTestFullPath?.() ?? undefined, - configPath: ctx.configPath - }), - captureFormat: ctx.screencastOptions.captureFormat, - sendUpstream: (scope, data) => - ctx.sessionCapturer?.sendUpstream(scope, data), - onLog: (level, message) => log[level](message) - }) + if (ctx.mode === 'trace') { + // Trace mode: the per-test video is written by the produce path and the + // filmstrip frames are embedded in the trace itself, so stop the recorder + // without encoding a session .webm nothing references (orphan file). + await ctx.screencastRecorder.stop() + } else { + await finalizeScreencast({ + recorder: ctx.screencastRecorder, + sessionId: ctx.screencastSessionId, + filenamePrefix: 'nightwatch-video', + outputDir: resolveAdapterOutputDir({ + testFilePath: ctx.browserProxy?.getCurrentTestFullPath?.() ?? undefined, + configPath: ctx.configPath + }), + captureFormat: ctx.screencastOptions.captureFormat, + sendUpstream: (scope, data) => + ctx.sessionCapturer?.sendUpstream(scope, data), + onLog: (level, message) => log[level](message) + }) + } ctx.screencastRecorder = undefined ctx.screencastSessionId = undefined } diff --git a/packages/nightwatch-devtools/src/test-artifacts.ts b/packages/nightwatch-devtools/src/test-artifacts.ts new file mode 100644 index 00000000..b81af5e8 --- /dev/null +++ b/packages/nightwatch-devtools/src/test-artifacts.ts @@ -0,0 +1,92 @@ +/** + * Produce-only per-test artifacts (screenshot + video) for the Nightwatch + * plugin. + * + * Nightwatch has no live Allure attach API — its official `nightwatch-allure` + * reporter is post-hoc, and `allure-js-commons`' `attachment()` no-ops in a + * Nightwatch run (nothing wires the global test runtime). So we pass NO sink + * (`attach: undefined`), which the core treats as produce-only: it writes the + * file and records the manifest artifact via `onArtifact`, but skips the attach. + * + * Both the per-test (Mocha/Jasmine `afterEach`) and cucumber (per-scenario + * finalize) paths funnel through here so the two produce calls live once. Core + * gates both to trace mode + `test` granularity, so this no-ops otherwise. + */ + +import { + captureAndAttachScreenshot, + captureAndAttachVideo, + lastRenderedScreenshot, + type TestOutcome, + type TraceArtifact +} from '@wdio/devtools-core' +import type { + ActionSnapshot, + DevToolsMode, + ScreencastFrame, + TraceGranularity, + TraceScreenshotPolicy, + TraceVideoPolicy +} from '@wdio/devtools-shared' + +export interface EmitTestArtifactsInput { + mode: DevToolsMode + granularity: TraceGranularity + screenshotPolicy: TraceScreenshotPolicy + videoPolicy: TraceVideoPolicy + failed: boolean + actionSnapshots: readonly ActionSnapshot[] + frames: readonly ScreencastFrame[] + startWallTime: number + /** This test's attempt slots (already scoped via `forTest`) for retention. */ + outcomes: TestOutcome[] + uid: string | undefined + attempt: number | undefined + sessionId: string | undefined + outputDir: string + captureFormat?: 'jpeg' | 'png' + onArtifact: (artifact: TraceArtifact) => void + onLog?: (level: 'info' | 'warn', message: string) => void +} + +/** + * Produce this test's screenshot then its video slice, both with `attach: + * undefined` (produce-only). Each core call self-gates on mode/granularity/ + * policy, so a non-trace run or a non-`test` granularity is a no-op. + */ +export async function emitTestArtifacts( + input: EmitTestArtifactsInput +): Promise<void> { + await captureAndAttachScreenshot({ + mode: input.mode, + granularity: input.granularity, + policy: input.screenshotPolicy, + failed: input.failed, + screenshotBase64: lastRenderedScreenshot( + input.actionSnapshots, + input.startWallTime + ), + sessionId: input.sessionId, + outputDir: input.outputDir, + testUid: input.uid, + attach: undefined, + onArtifact: input.onArtifact, + onLog: input.onLog + }) + await captureAndAttachVideo({ + mode: input.mode, + granularity: input.granularity, + policy: input.videoPolicy, + frames: input.frames, + startWallTime: input.startWallTime, + outcomes: input.outcomes, + attempt: input.attempt, + outputDir: input.outputDir, + testUid: input.uid, + sessionId: input.sessionId, + captureFormat: input.captureFormat, + attach: undefined, + onArtifact: input.onArtifact, + onLog: input.onLog + }) +} diff --git a/packages/nightwatch-devtools/src/types.ts b/packages/nightwatch-devtools/src/types.ts index d4c3f01e..89b2a9f1 100644 --- a/packages/nightwatch-devtools/src/types.ts +++ b/packages/nightwatch-devtools/src/types.ts @@ -21,10 +21,17 @@ export { type TestMetadataMap, type TraceGranularity, type TraceRetentionPolicy, + type TraceScreenshotPolicy, + type TraceVideoPolicy, type TraceLog } from '@wdio/devtools-shared' -import type { BaseDevToolsOptions, CommandLog } from '@wdio/devtools-shared' +import type { + BaseDevToolsOptions, + CommandLog, + TraceScreenshotPolicy, + TraceVideoPolicy +} from '@wdio/devtools-shared' export interface CommandStackFrame { command: string @@ -105,6 +112,16 @@ export interface DevToolsOptions extends BaseDevToolsOptions { * entries. Defaults to `false` — opt-in. */ bidi?: boolean + /** Per-test screenshot capture, produced to the trace output dir + manifest. + * `off` (default) | `on` | `only-on-failure`. Trace mode + + * `traceGranularity: 'test'` only. Produce-only: Nightwatch has no live + * Allure attach API, so artifacts are not attached inline. */ + screenshot?: TraceScreenshotPolicy + /** Per-test video (screencast slice) capture, produced to the trace output + * dir + manifest per the given retention policy. `off` (default) or a + * retention policy. Trace mode + `traceGranularity: 'test'` only. + * Produce-only (no inline Allure attach). */ + video?: TraceVideoPolicy } export interface NightwatchBrowser { diff --git a/packages/nightwatch-devtools/tests/testArtifacts.test.ts b/packages/nightwatch-devtools/tests/testArtifacts.test.ts new file mode 100644 index 00000000..32703392 --- /dev/null +++ b/packages/nightwatch-devtools/tests/testArtifacts.test.ts @@ -0,0 +1,134 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import type { TraceArtifact } from '@wdio/devtools-core' + +// Mock only the three core entry points the helper touches — we verify the +// produce-only WIRING (attach: undefined, onArtifact collection, gate values +// forwarded), not core internals. +vi.mock('@wdio/devtools-core', () => ({ + lastRenderedScreenshot: vi.fn(() => 'SCREENSHOT_B64'), + captureAndAttachScreenshot: vi.fn( + async (input: { + testUid?: string + onArtifact: (a: TraceArtifact) => void + }) => { + input.onArtifact({ + kind: 'screenshot', + path: '/out/screenshot.png', + scope: 'test', + key: input.testUid ?? '', + testUids: input.testUid ? [input.testUid] : [], + retained: true + }) + } + ), + captureAndAttachVideo: vi.fn( + async (input: { + testUid?: string + onArtifact: (a: TraceArtifact) => void + }) => { + input.onArtifact({ + kind: 'video', + path: '/out/video.webm', + scope: 'test', + key: input.testUid ?? '', + testUids: input.testUid ? [input.testUid] : [], + retained: true + }) + } + ) +})) + +import { + captureAndAttachScreenshot, + captureAndAttachVideo, + lastRenderedScreenshot +} from '@wdio/devtools-core' +import { + emitTestArtifacts, + type EmitTestArtifactsInput +} from '../src/test-artifacts.js' + +function makeInput(overrides: Partial<EmitTestArtifactsInput> = {}): { + input: EmitTestArtifactsInput + artifacts: TraceArtifact[] +} { + const artifacts: TraceArtifact[] = [] + const input: EmitTestArtifactsInput = { + mode: 'trace', + granularity: 'test', + screenshotPolicy: 'on', + videoPolicy: 'on', + failed: false, + actionSnapshots: [], + frames: [], + startWallTime: 1000, + outcomes: [{ uid: 'uid-1', attempt: 0, state: 'passed' }], + uid: 'uid-1', + attempt: 0, + sessionId: 'session-abcdef', + outputDir: '/out', + captureFormat: 'jpeg', + onArtifact: (a) => artifacts.push(a), + ...overrides + } + return { input, artifacts } +} + +describe('emitTestArtifacts — produce-only per-test artifacts', () => { + beforeEach(() => vi.clearAllMocks()) + + it('drives both core produce fns with NO sink (attach: undefined)', async () => { + const { input } = makeInput() + await emitTestArtifacts(input) + + expect(captureAndAttachScreenshot).toHaveBeenCalledTimes(1) + expect(captureAndAttachVideo).toHaveBeenCalledTimes(1) + expect(captureAndAttachScreenshot).toHaveBeenCalledWith( + expect.objectContaining({ attach: undefined }) + ) + expect(captureAndAttachVideo).toHaveBeenCalledWith( + expect.objectContaining({ attach: undefined }) + ) + }) + + it('collects the produced artifacts via onArtifact (manifest path)', async () => { + const { input, artifacts } = makeInput() + await emitTestArtifacts(input) + + expect(artifacts.map((a) => a.kind)).toEqual(['screenshot', 'video']) + expect(artifacts.every((a) => a.scope === 'test')).toBe(true) + expect(artifacts.every((a) => a.key === 'uid-1')).toBe(true) + }) + + it('forwards the gate + policy values and the sliced outcomes', async () => { + const { input } = makeInput({ + screenshotPolicy: 'only-on-failure', + failed: true, + attempt: 1 + }) + await emitTestArtifacts(input) + + expect(lastRenderedScreenshot).toHaveBeenCalledWith([], 1000) + expect(captureAndAttachScreenshot).toHaveBeenCalledWith( + expect.objectContaining({ + mode: 'trace', + granularity: 'test', + policy: 'only-on-failure', + failed: true, + screenshotBase64: 'SCREENSHOT_B64', + sessionId: 'session-abcdef', + outputDir: '/out', + testUid: 'uid-1' + }) + ) + expect(captureAndAttachVideo).toHaveBeenCalledWith( + expect.objectContaining({ + policy: 'on', + outcomes: [{ uid: 'uid-1', attempt: 0, state: 'passed' }], + attempt: 1, + captureFormat: 'jpeg', + testUid: 'uid-1' + }) + ) + }) +}) diff --git a/packages/selenium-devtools/README.md b/packages/selenium-devtools/README.md index 89d099a9..ad8cfd22 100644 --- a/packages/selenium-devtools/README.md +++ b/packages/selenium-devtools/README.md @@ -346,6 +346,8 @@ See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for th | `headless` | `boolean` | `false` | Run the **test** browser headless (injects `--headless=old`). The DevTools UI window is unaffected. | | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Per-session `.webm` video recording. See sub-options below. | | `rerunCommand` | `string` | auto | Command template for per-test rerun. `{{testName}}` is substituted. Auto-derived from runner argv if omitted. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`) via `allure-js-commons` when an Allure runner adapter is active. | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`) via `allure-js-commons` when an Allure runner adapter is active. | `ScreencastOptions`: diff --git a/packages/selenium-devtools/package.json b/packages/selenium-devtools/package.json index 7cc202bc..8de8aae7 100644 --- a/packages/selenium-devtools/package.json +++ b/packages/selenium-devtools/package.json @@ -33,6 +33,7 @@ "prepublishOnly": "pnpm build", "example": "pnpm example:cucumber", "example:mocha": "mocha --require @wdio/selenium-devtools --timeout 60000 ../../examples/selenium/mocha-test/test/example.js", + "example:mocha:allure": "mocha --require @wdio/selenium-devtools --reporter allure-mocha --reporter-options resultsDir=../../examples/selenium/mocha-test/allure-results --timeout 60000 ../../examples/selenium/mocha-test/test/example.js", "example:jest": "NODE_OPTIONS=--experimental-vm-modules jest --config ../../examples/selenium/jest-test/jest.config.json", "example:cucumber": "cucumber-js --config ../../examples/selenium/cucumber-test/cucumber.json" }, @@ -65,6 +66,8 @@ "@types/ws": "^8.18.1", "@wdio/devtools-core": "workspace:^", "@wdio/devtools-shared": "workspace:^", + "allure-js-commons": "^3.0.0", + "allure-mocha": "^3.0.0", "chromedriver": "^150.0.0", "jest": "^30.4.2", "mocha": "^11.7.6", @@ -74,6 +77,12 @@ "vitest": "^4.1.8" }, "peerDependencies": { + "allure-js-commons": "^3.0.0", "selenium-webdriver": ">=4.8.0" + }, + "peerDependenciesMeta": { + "allure-js-commons": { + "optional": true + } } } diff --git a/packages/selenium-devtools/src/allure.ts b/packages/selenium-devtools/src/allure.ts new file mode 100644 index 00000000..92f4ed24 --- /dev/null +++ b/packages/selenium-devtools/src/allure.ts @@ -0,0 +1,62 @@ +// Selenium Allure binding: resolve the optional `allure-js-commons` into a core +// `AllureAttachSink`. The capture/attach orchestration + content-type convention +// live in `@wdio/devtools-core`; this file owns only the runtime-agnostic +// optional-dependency dance and `allure-js-commons`' functional `attachment()`. + +import type { AllureAttachSink } from '@wdio/devtools-core' + +/** The one `allure-js-commons` function we use. Typed locally so the optional + * peer dependency never becomes a build-time type dependency. */ +interface AllureCommonsModule { + attachment( + name: string, + content: Buffer | string, + contentType: string + ): void | Promise<void> +} + +// undefined = unresolved; null = runtime present but allure-js-commons absent. +let cachedSink: AllureAttachSink | null | undefined + +// A non-literal specifier keeps TypeScript and tsup/esbuild from resolving this +// optional peer dependency at build time — `import()` of a variable is typed +// `any` and left as a runtime import that no-ops (caught below) when absent. +const ALLURE_COMMONS_SPECIFIER = 'allure-js-commons' + +/** + * Resolve the Allure attach sink, or undefined when Allure isn't active. Only + * binds a sink when a runner adapter has installed `globalThis.allureTestRuntime`: + * without it `allure-js-commons`' `attachment()` is a noop that logs a warning on + * every call, so a plain (non-Allure) run would be spammed. The resolved sink is + * memoized once found; while the runtime is absent this returns undefined + * WITHOUT caching, so a later call after Allure activates can still resolve. The + * sink must be called from within a per-test hook so Allure attaches to the + * right test. + */ +export async function getAllureSink(): Promise<AllureAttachSink | undefined> { + if (cachedSink !== undefined) { + return cachedSink ?? undefined + } + if (!(globalThis as { allureTestRuntime?: unknown }).allureTestRuntime) { + return undefined + } + try { + const mod = await import(/* @vite-ignore */ ALLURE_COMMONS_SPECIFIER) + const commons = ( + typeof mod.attachment === 'function' ? mod : mod.default + ) as AllureCommonsModule | undefined + cachedSink = + commons && typeof commons.attachment === 'function' + ? (name, content, type) => commons.attachment(name, content, type) + : null + } catch { + // Optional peer dependency not installed — attaching is a no-op. + cachedSink = null + } + return cachedSink ?? undefined +} + +/** Reset the memoized sink — test seam only. */ +export function resetAllureSinkCache(): void { + cachedSink = undefined +} diff --git a/packages/selenium-devtools/src/helpers/testManager.ts b/packages/selenium-devtools/src/helpers/testManager.ts index 09c741c7..08d6e687 100644 --- a/packages/selenium-devtools/src/helpers/testManager.ts +++ b/packages/selenium-devtools/src/helpers/testManager.ts @@ -3,7 +3,8 @@ import { createTestStats, stampTestEnd, TestAttemptTracker, - type RetryOutcomeView + type RetryOutcomeView, + type TestOutcome } from '@wdio/devtools-core' import { DEFAULTS, TEST_STATE } from '../constants.js' import type { SuiteStats, TestStats } from '../types.js' @@ -32,6 +33,10 @@ export class TestManager { // Retry-stable uid of the in-progress marked test, so endCurrent can stamp // this attempt's outcome onto the same ledger entry recordStart opened. #currentRetryStableUid: string | undefined + // Retry-stable uid of the most-recently-started marked test, retained past + // endCurrent so the per-test artifact path (which runs after the test ends) + // can read this test's attempts from the ledger for video retention. + #lastRetryStableUid: string | undefined /** Set true the first time the user calls startMarkedTest. Once true we * never auto-create the synthetic session test — orphan commands attach * to the most-recently-marked test instead. */ @@ -146,6 +151,7 @@ export class TestManager { file ) this.#currentRetryStableUid = retryStableUid + this.#lastRetryStableUid = retryStableUid test.retries = opts.attempt ?? heuristicAttempt log.info( `Started marked test "${name}" (callSource: ${opts.callSource || 'n/a'})` @@ -190,6 +196,17 @@ export class TestManager { return this.#attemptTracker } + /** The just-ended marked test's attempts, keyed by its retry-stable uid (the + * ledger key), for the per-test video retention decision. The artifact + * filename uses the marked uid, but retention groups a test's attempts under + * the retry-stable key — this bridges the two. Empty when no marked test ran. */ + lastTestOutcomes(): TestOutcome[] { + if (this.#lastRetryStableUid === undefined) { + return [] + } + return this.#attemptTracker.forTest(this.#lastRetryStableUid) + } + /** Called when the driver session is closing (process exit / quit). */ finalizeSession(): void { if (this.#currentTest) { diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index dcc19fd3..a622b695 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -24,7 +24,11 @@ import { recordTraceBoundary, flushCurrentTestTrace } from './session-lifecycle.js' -import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' +import type { + AllureAttachSink, + SpecRange, + TraceArtifact +} from '@wdio/devtools-core' import { startTest as tmStartTest, endTest as tmEndTest, @@ -45,9 +49,15 @@ import { import { findFreePort } from './helpers/utils.js' import { RetryTracker, + attachTraceArtifact, + captureAndAttachScreenshot, + captureAndAttachVideo, errorMessage, + lastRenderedScreenshot, + resolveAdapterOutputDir, tracePolicyModeWarning } from '@wdio/devtools-core' +import { getAllureSink } from './allure.js' import { tryRegisterRunnerHooks } from './runnerHooks.js' import { patchNodeAssert } from './assertPatcher.js' import { @@ -66,6 +76,8 @@ import { type TraceFormat, type TraceGranularity, type TraceRetentionPolicy, + type TraceScreenshotPolicy, + type TraceVideoPolicy, type SeleniumDriverLike, type TestStats } from './types.js' @@ -136,6 +148,13 @@ class SeleniumDevToolsPlugin { * before the recorder is nulled so the finalize context is never blank. */ #filmstripFrames: ScreencastFrame[] = [] + /** Wall-clock ms at the current test/scenario start — the lower bound of that + * test's video frame window and screenshot lookup (per-test slicing). */ + #currentTestStartWallTime = Date.now() + + /** Allure attach sink, resolved once lazily at the first per-test end. */ + #allureSinkResolved?: Promise<AllureAttachSink | undefined> + constructor(options: DevToolsOptions = {}) { this.#options = { port: options.port ?? 3000, @@ -149,7 +168,9 @@ class SeleniumDevToolsPlugin { traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', tracePolicy: options.tracePolicy ?? 'on', - filmstrip: options.filmstrip ?? false + filmstrip: options.filmstrip ?? false, + screenshot: options.screenshot ?? 'off', + video: options.video ?? 'off' } const policyWarning = tracePolicyModeWarning( options.tracePolicy, @@ -278,6 +299,9 @@ class SeleniumDevToolsPlugin { return this.#uiReadyPromise } + // Declarative option-application mapper — one guarded assignment per option; + // splitting it purely to satisfy the line rule hurts readability. + // eslint-disable-next-line max-lines-per-function configure( opts: { rerunCommand?: string @@ -289,6 +313,8 @@ class SeleniumDevToolsPlugin { traceFormat?: TraceFormat traceGranularity?: TraceGranularity tracePolicy?: TraceRetentionPolicy + screenshot?: TraceScreenshotPolicy + video?: TraceVideoPolicy } = {} ) { if ('rerunCommand' in opts) { @@ -316,6 +342,12 @@ class SeleniumDevToolsPlugin { if (opts.tracePolicy) { this.#options.tracePolicy = opts.tracePolicy } + if (opts.screenshot) { + this.#options.screenshot = opts.screenshot + } + if (opts.video) { + this.#options.video = opts.video + } if (opts.screencast) { if (this.#options.mode === 'trace' && opts.screencast.enabled) { log.warn('trace mode: ignoring screencast option (live-mode feature)') @@ -478,22 +510,110 @@ class SeleniumDevToolsPlugin { /** Public API: start a marked test. */ startTest(name: string, meta: StartTestMeta = {}) { + this.#currentTestStartWallTime = Date.now() tmStartTest(this.#getInternals(), name, meta) recordTraceBoundary(this.#getInternals(), meta.file) } - endTest(state: TestStats['state'] = 'passed') { + // Async + awaited by the runner's afterEach so the per-test artifact emit + // (trace slice + screenshot + video attach) completes while the test is still + // open; otherwise allure closes the test before attachment() runs. + async endTest(state: TestStats['state'] = 'passed') { + const ended = this.#testManager?.getCurrentTest() ?? null tmEndTest(this.#getInternals(), state) - flushCurrentTestTrace(this.#getInternals()) + const flushed = flushCurrentTestTrace(this.#getInternals()) + await this.#emitTestArtifacts(ended, state === 'failed', flushed) } startScenario(name: string, meta: StartScenarioMeta = {}) { + this.#currentTestStartWallTime = Date.now() tmStartScenario(this.#getInternals(), name, meta) recordTraceBoundary(this.#getInternals(), meta.file) } - endScenario(state: TestStats['state'] = 'passed') { + async endScenario(state: TestStats['state'] = 'passed') { + const ended = this.#testManager?.getCurrentTest() ?? null tmEndScenario(this.#getInternals(), state) + const flushed = flushCurrentTestTrace(this.#getInternals()) + await this.#emitTestArtifacts(ended, state === 'failed', flushed) + } + + /** Lazily resolve the Allure attach sink once (produce-only when Allure is + * inactive), reused across every per-test attach this run. */ + #allureSink(): Promise<AllureAttachSink | undefined> { + return (this.#allureSinkResolved ??= getAllureSink()) + } + + /** Snapshot every per-test capture input synchronously at test end. Selenium's + * runner hooks fire-and-forget the emit, so reading these after an await would + * race the next test overwriting the fields; frames/outcomes are copied + * because their backing arrays keep mutating after this test ends. */ + #perTestArtifactInputs(endedTest: TestStats | null) { + const startWallTime = this.#currentTestStartWallTime + return { + startWallTime, + sessionId: this.#sessionId, + testUid: endedTest?.uid, + attempt: endedTest?.retries, + screenshotBase64: lastRenderedScreenshot( + this.#actionSnapshots, + startWallTime + ), + frames: this.#screencast ? [...this.#screencast.frames] : undefined, + outcomes: (this.#testManager?.lastTestOutcomes() ?? []).map((o) => ({ + ...o + })), + captureFormat: this.#screencastOptions.captureFormat, + outputDir: resolveAdapterOutputDir({ testFilePath: this.#testFilePath }) + } + } + + /** At a test/scenario end, while the runner's per-test hook is still open: + * attach the just-flushed trace slice to Allure, then capture + attach the + * per-test screenshot and video per their policies. Each part no-ops when its + * feature is off (all gate on trace mode + `test` granularity in core). */ + async #emitTestArtifacts( + endedTest: TestStats | null, + failed: boolean, + flushed: Promise<TraceArtifact | undefined> + ): Promise<void> { + const inp = this.#perTestArtifactInputs(endedTest) + const onArtifact = (a: TraceArtifact) => this.#artifacts.push(a) + const onLog = (level: 'info' | 'warn', msg: string) => log[level](msg) + const attach = await this.#allureSink() + const artifact = await flushed + if (artifact) { + await attachTraceArtifact(artifact, attach, onLog) + } + await captureAndAttachScreenshot({ + mode: this.#options.mode, + granularity: this.#options.traceGranularity, + policy: this.#options.screenshot, + failed, + screenshotBase64: inp.screenshotBase64, + sessionId: inp.sessionId, + outputDir: inp.outputDir, + testUid: inp.testUid, + attach, + onArtifact, + onLog + }) + await captureAndAttachVideo({ + mode: this.#options.mode, + granularity: this.#options.traceGranularity, + policy: this.#options.video, + frames: inp.frames, + startWallTime: inp.startWallTime, + outcomes: inp.outcomes, + attempt: inp.attempt, + outputDir: inp.outputDir, + testUid: inp.testUid, + sessionId: inp.sessionId, + captureFormat: inp.captureFormat, + attach, + onArtifact, + onLog + }) } #flushPendingTestActions() { @@ -637,9 +757,9 @@ function registerHooks() { attempt ) ), - onTestEnd: (state) => { - plugin.endTest(state === 'pending' ? 'skipped' : state) - }, + // Return the promise so the runner hook awaits the full attach chain. + onTestEnd: (state) => + plugin.endTest(state === 'pending' ? 'skipped' : state), onScenarioStart: ( name, file, @@ -654,9 +774,8 @@ function registerHooks() { featureCallSource }) }, - onScenarioEnd: (state) => { - plugin.endScenario(state === 'pending' ? 'skipped' : state) - }, + onScenarioEnd: (state) => + plugin.endScenario(state === 'pending' ? 'skipped' : state), onTestRunComplete: () => { void plugin.finalizeTestRun() } @@ -684,6 +803,9 @@ export const DevTools = { mode?: DevToolsMode traceFormat?: TraceFormat traceGranularity?: TraceGranularity + tracePolicy?: TraceRetentionPolicy + screenshot?: TraceScreenshotPolicy + video?: TraceVideoPolicy }) => plugin.configure(opts), startTest: (name: string, meta?: { file?: string }) => plugin.startTest(name, meta), diff --git a/packages/selenium-devtools/src/runnerHooks/cucumber.ts b/packages/selenium-devtools/src/runnerHooks/cucumber.ts index 86f8d3c2..31febfc6 100644 --- a/packages/selenium-devtools/src/runnerHooks/cucumber.ts +++ b/packages/selenium-devtools/src/runnerHooks/cucumber.ts @@ -12,7 +12,7 @@ const log = logger('@wdio/selenium-devtools:runnerHooks:cucumber') type CucumberModule = Record<string, unknown> & { Before?: (fn: (testCase: unknown) => void) => void - After?: (fn: (testCase: unknown) => void) => void + After?: (fn: (testCase: unknown) => void | Promise<void>) => void BeforeAll?: (fn: () => void) => void AfterAll?: (fn: () => void) => void BeforeStep?: (fn: (arg: unknown) => void) => void @@ -309,11 +309,11 @@ function handleScenarioStart( ) } -function handleScenarioEnd( +async function handleScenarioEnd( testCase: CucumberTestCase, counters: RunCounters, callbacks: RunnerHookCallbacks -): void { +): Promise<void> { const state = mapCucumberStatus(String(testCase?.result?.status ?? '')) const scenarioState: ScenarioState = state === 'skipped' ? 'pending' : state const icon = @@ -326,7 +326,7 @@ function handleScenarioEnd( } else { counters.pending++ } - callbacks.onScenarioEnd?.(scenarioState) + await callbacks.onScenarioEnd?.(scenarioState) } function registerScenarioHooks( @@ -347,7 +347,9 @@ function registerScenarioHooks( callbacks ) ) - After((testCase) => + // Async so cucumber awaits the per-scenario artifact emit while the scenario + // is still open — a fire-and-forget attach would land after allure closed it. + After(async (testCase) => handleScenarioEnd(testCase as CucumberTestCase, counters, callbacks) ) } diff --git a/packages/selenium-devtools/src/runnerHooks/jest.ts b/packages/selenium-devtools/src/runnerHooks/jest.ts index 24477e06..8dabd583 100644 --- a/packages/selenium-devtools/src/runnerHooks/jest.ts +++ b/packages/selenium-devtools/src/runnerHooks/jest.ts @@ -225,7 +225,9 @@ function registerJestAfterEach( state: JestState, callbacks: RunnerHookCallbacks ): void { - g.afterEach!(() => { + // Async so jest/vitest awaits the per-test artifact emit while the test is + // still open — a fire-and-forget attach would land after allure closed it. + g.afterEach!(async () => { const expectState = g.expect!.getState!() as { suppressedErrors?: unknown[] currentTestName?: string @@ -258,7 +260,7 @@ function registerJestAfterEach( } else { state.testsFailed++ } - callbacks.onTestEnd(finalState) + await callbacks.onTestEnd(finalState) }) } diff --git a/packages/selenium-devtools/src/runnerHooks/mocha.ts b/packages/selenium-devtools/src/runnerHooks/mocha.ts index e7b8a616..2f90eeca 100644 --- a/packages/selenium-devtools/src/runnerHooks/mocha.ts +++ b/packages/selenium-devtools/src/runnerHooks/mocha.ts @@ -7,7 +7,9 @@ const log = logger('@wdio/selenium-devtools:runnerHooks:mocha') type MochaGlobals = { beforeEach?: (fn: (this: { currentTest?: MochaTestCtx }) => void) => void - afterEach?: (fn: (this: { currentTest?: MochaTestCtx }) => void) => void + afterEach?: ( + fn: (this: { currentTest?: MochaTestCtx }) => void | Promise<void> + ) => void before?: (fn: () => void) => void after?: (fn: () => void) => void } @@ -108,8 +110,10 @@ function resolveMochaState( function makeMochaAfterEach( counters: MochaCounters, callbacks: RunnerHookCallbacks -): (this: { currentTest?: MochaTestCtx }) => void { - return function (this: { currentTest?: MochaTestCtx }) { +): (this: { currentTest?: MochaTestCtx }) => Promise<void> { + // Async so mocha awaits the per-test artifact emit while the test is still + // open — a fire-and-forget attach would land after allure closed the test. + return async function (this: { currentTest?: MochaTestCtx }) { const test = this?.currentTest const state = resolveMochaState(test) const icon = state === 'passed' ? '✓' : state === 'failed' ? '✗' : '○' @@ -123,7 +127,7 @@ function makeMochaAfterEach( } else { counters.pending++ } - callbacks.onTestEnd(state) + await callbacks.onTestEnd(state) } } diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index 2f203dce..c426e687 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -41,7 +41,8 @@ import type { SeleniumDriverLike, TraceFormat, TraceGranularity, - TraceRetentionPolicy + TraceRetentionPolicy, + TraceVideoPolicy } from './types.js' import type { TestManager } from './helpers/testManager.js' @@ -59,6 +60,7 @@ export interface SessionLifecycleCtx { traceGranularity?: TraceGranularity tracePolicy?: TraceRetentionPolicy filmstrip?: boolean + video?: TraceVideoPolicy } readonly screencastOptions: ScreencastOptions readonly runner: string @@ -161,6 +163,19 @@ function ctxPluginRef(ctx: SessionLifecycleCtx): unknown { return (ctx as unknown as Record<symbol, unknown>)[PLUGIN_REF] } +/** Record a screencast this driver? Live mode: `screencast.enabled`. Trace mode: + * a non-`off` per-test `video` policy or `filmstrip` — both feed the recorder + * even though live screencast is off in trace mode (parity with the service). */ +function shouldRecordScreencast(ctx: SessionLifecycleCtx): boolean { + if (ctx.options.mode === 'trace') { + return ( + (!!ctx.options.video && ctx.options.video !== 'off') || + !!ctx.options.filmstrip + ) + } + return !!ctx.screencastOptions.enabled +} + async function initPerDriverCapture( ctx: SessionLifecycleCtx, driver: SeleniumDriverLike, @@ -187,11 +202,8 @@ async function initPerDriverCapture( ctx.sessionCapturer.sendUpstream('metadata', metadata) } - // Parallel — serial attach misses frames on fast tests. Trace-mode filmstrip - // needs the same recorder even though live screencast is off in trace mode. - const wantScreencast = - ctx.screencastOptions.enabled || - (ctx.options.mode === 'trace' && !!ctx.options.filmstrip) + // Parallel — serial attach misses frames on fast tests. + const wantScreencast = shouldRecordScreencast(ctx) const screencastPromise = wantScreencast ? (async () => { try { @@ -223,18 +235,25 @@ async function initPerDriverCapture( export async function onDriverEnd(ctx: SessionLifecycleCtx): Promise<void> { if (ctx.screencast && ctx.sessionId) { - await finalizeScreencast({ - recorder: ctx.screencast, - sessionId: ctx.sessionId, - filenamePrefix: 'selenium-video', - outputDir: resolveAdapterOutputDir({ - testFilePath: ctx.testFilePath - }), - captureFormat: ctx.screencastOptions.captureFormat, - sendUpstream: (scope, data) => - ctx.sessionCapturer?.sendUpstream(scope, data), - onLog: (level, message) => log[level](message) - }) + if (ctx.options.mode === 'trace') { + // Trace mode: the video is emitted per-test (sliced in #emitTestArtifacts) + // and there's no dashboard to receive a session recording — just stop the + // recorder to release resources; never encode an orphan session webm. + await ctx.screencast.stop() + } else { + await finalizeScreencast({ + recorder: ctx.screencast, + sessionId: ctx.sessionId, + filenamePrefix: 'selenium-video', + outputDir: resolveAdapterOutputDir({ + testFilePath: ctx.testFilePath + }), + captureFormat: ctx.screencastOptions.captureFormat, + sendUpstream: (scope, data) => + ctx.sessionCapturer?.sendUpstream(scope, data), + onLog: (level, message) => log[level](message) + }) + } } // Drain this driver's frames into the run-wide buffer while the recorder is // still alive — the finalize context is built after screencast is nulled. @@ -449,15 +468,19 @@ function recordTestBoundary( * endTest has finalized its state so collectSuiteTestMetadata sees the final * outcome. flushRangeTrace dedupes by key, so finalizeTraceExport won't * re-write it; the promise is tracked so finalize awaits the last write. + * Returns the produced artifact so the plugin can attach the retained slice to + * Allure within the still-open per-test hook; undefined when nothing flushed. */ -export function flushCurrentTestTrace(ctx: SessionLifecycleCtx): void { +export function flushCurrentTestTrace( + ctx: SessionLifecycleCtx +): Promise<TraceArtifact | undefined> { if (ctx.options.traceGranularity !== 'test' || !ctx.sessionCapturer) { - return + return Promise.resolve(undefined) } const sessionId = ctx.sessionCapturer.metadata?.sessionId const currentRange = findFlushableRange(ctx.specRanges) if (!sessionId || currentRange?.testUid === undefined) { - return + return Promise.resolve(undefined) } const flush = flushRangeLogged( buildTraceExportContext( @@ -469,6 +492,7 @@ export function flushCurrentTestTrace(ctx: SessionLifecycleCtx): void { currentRange ) ctx.traceFlushes.push(flush) + return flush } async function writeTraceIfNeeded( diff --git a/packages/selenium-devtools/src/types.ts b/packages/selenium-devtools/src/types.ts index e7aceb8f..925ec86b 100644 --- a/packages/selenium-devtools/src/types.ts +++ b/packages/selenium-devtools/src/types.ts @@ -17,7 +17,9 @@ export { type TestMetadataMap, type TraceFormat, type TraceGranularity, - type TraceRetentionPolicy + type TraceRetentionPolicy, + type TraceScreenshotPolicy, + type TraceVideoPolicy } from '@wdio/devtools-shared' export interface DevToolsOptions extends BaseDevToolsOptions { @@ -33,11 +35,24 @@ export interface DevToolsOptions extends BaseDevToolsOptions { * is unaffected. Defaults to false to preserve user-supplied options. */ headless?: boolean + /** Per-test screenshot capture, recorded in the trace artifacts and attached + * inline to Allure. `off` (default) | `on` | `only-on-failure`. Trace mode + + * `traceGranularity: 'test'` only. */ + screenshot?: TraceScreenshotPolicy + /** Per-test video (screencast) capture, retained per the given policy and + * attached inline to Allure. `off` (default) or a retention policy. Trace + * mode + `traceGranularity: 'test'` only. */ + video?: TraceVideoPolicy } // ScreencastFrame, ScreencastOptions hoisted to @wdio/devtools-shared; re-exported // here for backwards compatibility with existing selenium-internal imports. -import type { BaseDevToolsOptions, TestStatus } from '@wdio/devtools-shared' +import type { + BaseDevToolsOptions, + TestStatus, + TraceScreenshotPolicy, + TraceVideoPolicy +} from '@wdio/devtools-shared' export type { ScreencastFrame, ScreencastOptions } from '@wdio/devtools-shared' /** @@ -134,7 +149,9 @@ export interface RunnerHookCallbacks { // `_currentRetry`); undefined leaves the heuristic tracker to decide. attempt?: number ) => void - onTestEnd: (state: Exclude<TestStatus, 'running'>) => void + // Async so the runner's afterEach/After awaits the full per-test artifact + // emit (trace slice + screenshot + video attach) before Allure closes the test. + onTestEnd: (state: Exclude<TestStatus, 'running'>) => void | Promise<void> // Cucumber-only: scenario boundary creates a sub-suite under the feature // rootSuite; subsequent onTestStart/onTestEnd attach as Gherkin steps inside. onScenarioStart?: ( @@ -144,7 +161,9 @@ export interface RunnerHookCallbacks { featureName?: string, featureCallSource?: string ) => void - onScenarioEnd?: (state: Exclude<TestStatus, 'running'>) => void + onScenarioEnd?: ( + state: Exclude<TestStatus, 'running'> + ) => void | Promise<void> // Fires from the runner's after-all hook so the dashboard suite header // updates without waiting for process exit. onTestRunComplete?: (summary: { diff --git a/packages/selenium-devtools/tests/allure.test.ts b/packages/selenium-devtools/tests/allure.test.ts new file mode 100644 index 00000000..f8374e35 --- /dev/null +++ b/packages/selenium-devtools/tests/allure.test.ts @@ -0,0 +1,52 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' + +const attachment = vi.fn() +vi.mock('allure-js-commons', () => ({ + attachment, + default: { attachment } +})) + +import { getAllureSink, resetAllureSinkCache } from '../src/allure.js' + +type GlobalWithRuntime = { allureTestRuntime?: unknown } + +function clearRuntime() { + delete (globalThis as GlobalWithRuntime).allureTestRuntime +} + +describe('getAllureSink (selenium)', () => { + beforeEach(() => { + attachment.mockReset() + resetAllureSinkCache() + clearRuntime() + }) + + afterEach(clearRuntime) + + it('resolves a sink that forwards to allure-js-commons.attachment when Allure is active', async () => { + ;(globalThis as GlobalWithRuntime).allureTestRuntime = {} + const sink = await getAllureSink() + expect(sink).toBeTypeOf('function') + const content = Buffer.from('zip-bytes') + await sink!('trace-abc.zip', content, 'application/zip') + expect(attachment).toHaveBeenCalledOnce() + expect(attachment).toHaveBeenCalledWith( + 'trace-abc.zip', + content, + 'application/zip' + ) + }) + + it('returns undefined (produce-only, no attachment call) when no Allure runtime is active', async () => { + const sink = await getAllureSink() + expect(sink).toBeUndefined() + expect(attachment).not.toHaveBeenCalled() + }) + + it('memoizes the resolved sink across calls', async () => { + ;(globalThis as GlobalWithRuntime).allureTestRuntime = {} + const first = await getAllureSink() + const second = await getAllureSink() + expect(first).toBe(second) + }) +}) diff --git a/packages/service/src/allure.ts b/packages/service/src/allure.ts index ce415529..5fdf32c7 100644 --- a/packages/service/src/allure.ts +++ b/packages/service/src/allure.ts @@ -1,28 +1,9 @@ -// WDIO Allure glue: attach retained trace/video artifacts to the current Allure -// test so a failed run's trace travels with the report. Isolated here so -// index.ts stays free of the optional-dependency dance and the content-type -// convention lives in one place. +// WDIO Allure binding: resolve the optional @wdio/allure-reporter into a core +// `AllureAttachSink`. The capture/attach orchestration + content-type convention +// now live in `@wdio/devtools-core`; this file owns only the WDIO-specific +// optional-dependency dance and the reporter's `addAttachment` shape. -import fs from 'node:fs/promises' -import { basename } from 'node:path' -import logger from '@wdio/logger' -import type { TraceArtifact } from '@wdio/devtools-core' - -const log = logger('@wdio/devtools-service') - -// Attach the trace as a plain zip download — the viewer stays the user's choice -// (our `show-trace`, or any compatible viewer), rather than routing them into a -// third-party viewer Allure would open for a trace-specific content type. Video -// uses video/webm so Allure renders it inline. -const TRACE_CONTENT_TYPE = 'application/zip' -const VIDEO_CONTENT_TYPE = 'video/webm' -const SCREENSHOT_CONTENT_TYPE = 'image/png' - -const CONTENT_TYPE_BY_KIND: Record<TraceArtifact['kind'], string> = { - trace: TRACE_CONTENT_TYPE, - video: VIDEO_CONTENT_TYPE, - screenshot: SCREENSHOT_CONTENT_TYPE -} +import type { AllureAttachSink } from '@wdio/devtools-core' /** The one @wdio/allure-reporter method we use. Typed locally so the optional * peer dependency never becomes a build-time type dependency. */ @@ -31,66 +12,39 @@ interface AllureReporterModule { } // undefined = not yet probed; null = probed and unavailable. -let cachedReporter: AllureReporterModule | null | undefined +let cachedSink: AllureAttachSink | null | undefined // A non-literal specifier keeps TypeScript and the bundler from resolving this // optional peer dependency at build time — `import()` of a variable is typed // `any` and left as a runtime import that no-ops (caught below) when absent. const ALLURE_REPORTER_SPECIFIER = '@wdio/allure-reporter' -async function loadAllureReporter(): Promise<AllureReporterModule | null> { - if (cachedReporter !== undefined) { - return cachedReporter +/** + * Resolve the Allure attach sink, or undefined when @wdio/allure-reporter isn't + * installed. Memoized. The returned sink must be called from within a per-test + * hook so Allure associates the attachment with the right test. + */ +export async function getAllureSink(): Promise<AllureAttachSink | undefined> { + if (cachedSink !== undefined) { + return cachedSink ?? undefined } try { const mod = await import(/* @vite-ignore */ ALLURE_REPORTER_SPECIFIER) - const candidate = ( + const reporter = ( typeof mod.addAttachment === 'function' ? mod : mod.default ) as AllureReporterModule | undefined - cachedReporter = - candidate && typeof candidate.addAttachment === 'function' - ? candidate + cachedSink = + reporter && typeof reporter.addAttachment === 'function' + ? (name, content, type) => reporter.addAttachment(name, content, type) : null } catch { // Optional peer dependency not installed — attaching is a no-op. - cachedReporter = null - } - return cachedReporter -} - -/** - * Attach one retained artifact to the current Allure test. No-op when the - * artifact wasn't retained, has no path yet, or @wdio/allure-reporter isn't - * installed. Must be called from within a per-test hook (afterTest) so Allure - * associates the attachment with the right test. - */ -export async function attachArtifactToAllure( - artifact: TraceArtifact -): Promise<void> { - if (!artifact.retained || !artifact.path) { - return - } - const reporter = await loadAllureReporter() - if (!reporter) { - return - } - try { - // Allure attaches a single file; the ndjson-directory trace format yields a - // directory path, which can't be attached — skip it. - const stat = await fs.stat(artifact.path) - if (!stat.isFile()) { - return - } - const content = await fs.readFile(artifact.path) - const type = CONTENT_TYPE_BY_KIND[artifact.kind] - reporter.addAttachment(basename(artifact.path), content, type) - } catch (err) { - // A missing/unreadable artifact must never reject the test hook. - log.warn(`Allure attach skipped for ${artifact.path}: ${String(err)}`) + cachedSink = null } + return cachedSink ?? undefined } -/** Reset the memoized reporter — test seam only. */ -export function resetAllureReporterCache(): void { - cachedReporter = undefined +/** Reset the memoized sink — test seam only. */ +export function resetAllureSinkCache(): void { + cachedSink = undefined } diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index af6bcf68..ef5320d6 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -1,9 +1,13 @@ /// <reference types="../../script/types.d.ts" /> import logger from '@wdio/logger' import { + attachTraceArtifact, + captureAndAttachScreenshot, + captureAndAttachVideo, errorMessage, finalizeScreencast, finalizeTraceExport, + lastRenderedScreenshot, mapCommandToAction, recordSliceBoundary, resolveAdapterOutputDir, @@ -13,9 +17,7 @@ import { type TraceArtifact, type TraceExportContext } from '@wdio/devtools-core' -import { attachArtifactToAllure } from './allure.js' -import { captureAndAttachScreenshot } from './screenshot-capture.js' -import { captureAndAttachVideo } from './video-capture.js' +import { getAllureSink } from './allure.js' import { wireAssertCapture, type ExpectAssertion } from './assert-capture.js' import { AssertionTracker } from './assertion-tracker.js' import { @@ -187,25 +189,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } - /** Base64 of the last rendered action snapshot for the current test, skipping - * the end-of-scenario `__final__` frame — that one is captured post-teardown - * and can come back blank when a reloadSession runs before afterScenario. - * Used as the per-test screenshot so it's the real failure-moment frame, - * reload-immune. Scoped to this test's window (>= its start) so a test that - * captured nothing doesn't borrow the previous test's frame. */ - #lastRenderedScreenshot(): string | undefined { - for (let i = this.#actionSnapshots.length - 1; i >= 0; i--) { - const snap = this.#actionSnapshots[i]! - if (snap.timestamp < this.#currentTestStartWallTime) { - return undefined - } - if (snap.command !== '__final__' && snap.screenshot) { - return snap.screenshot - } - } - return undefined - } - /** Record a screencast this session? Live mode: `screencast.enabled`. Trace * mode: a non-`off` `video` policy (frames sliced per test at flush) or * `filmstrip` (dense frames written into the trace itself). */ @@ -541,10 +524,12 @@ export default class DevToolsHookService implements Services.ServiceInstance { uid: string | undefined, failed: boolean ): Promise<void> { + const attach = await getAllureSink() + const onLog = (level: 'info' | 'warn', msg: string) => log[level](msg) if (uid) { const artifact = await this.#eagerFlushTestSlice(uid) if (artifact) { - await attachArtifactToAllure(artifact) + await attachTraceArtifact(artifact, attach, onLog) } } await captureAndAttachScreenshot({ @@ -552,10 +537,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { granularity: this.#options.traceGranularity, policy: this.#options.screenshot, failed, - screenshotBase64: this.#lastRenderedScreenshot(), + screenshotBase64: lastRenderedScreenshot( + this.#actionSnapshots, + this.#currentTestStartWallTime + ), sessionId: this.#browser?.sessionId, outputDir: this.#outputDir, testUid: uid, + attach, onArtifact: (a) => this.#artifacts.push(a) }) // Authoritative attempt for this test (stamped into metadata by @@ -581,8 +570,9 @@ export default class DevToolsHookService implements Services.ServiceInstance { testUid: uid, sessionId: this.#browser?.sessionId, captureFormat: this.#screencastOptions?.captureFormat, + attach, onArtifact: (a) => this.#artifacts.push(a), - onLog: (level, msg) => log[level](msg) + onLog }) } diff --git a/packages/service/src/screenshot-capture.ts b/packages/service/src/screenshot-capture.ts deleted file mode 100644 index 9aca639c..00000000 --- a/packages/service/src/screenshot-capture.ts +++ /dev/null @@ -1,67 +0,0 @@ -// Per-test failure/always screenshot for the WDIO adapter: the policy gate and -// the Allure attach. Kept out of index.ts so the god-file stays lean and the -// capture is unit-testable. The policy decision and file write live in core -// (framework-agnostic). -// -// The image is NOT a fresh screenshot taken here — it's the last rendered action -// snapshot the service already captured during the test. A fresh end-of-test -// takeScreenshot() is unreliable: a cucumber `After(() => reloadSession())` hook -// (WDIO boilerplate) runs before the service afterScenario hook and blanks the -// page, so an end-of-test capture comes back empty. The last action snapshot was -// captured mid-command, before any teardown, so it's the real failure-moment -// frame — and reusing it also drops an extra WebDriver command from the report. - -import { - shouldCaptureScreenshot, - writeScreenshotArtifact, - type TraceArtifact -} from '@wdio/devtools-core' -import type { - DevToolsMode, - TraceGranularity, - TraceScreenshotPolicy -} from '@wdio/devtools-shared' -import { attachArtifactToAllure } from './allure.js' - -/** - * Write the per-test screenshot (per the policy) from an already-captured base64 - * frame and attach it to Allure. No-op outside `test`-granularity trace mode, - * without a uid/session/frame, or when the policy declines. Gated to `test` - * granularity so the whole per-test inline story (trace + screenshot + video) is - * one rule; coarser granularities keep their artifacts in the manifest. The - * artifact is handed to `onArtifact` so it lands in the manifest too. - */ -export async function captureAndAttachScreenshot(input: { - mode: DevToolsMode | undefined - granularity: TraceGranularity | undefined - policy: TraceScreenshotPolicy | undefined - failed: boolean - /** Base64 of the last rendered action snapshot (reload-immune, not a fresh - * end-of-test capture). Undefined when the test recorded no snapshot. */ - screenshotBase64: string | undefined - sessionId: string | undefined - outputDir: string - testUid: string | undefined - onArtifact: (artifact: TraceArtifact) => void -}): Promise<void> { - const { mode, granularity, policy, failed, screenshotBase64, sessionId } = - input - if ( - mode !== 'trace' || - granularity !== 'test' || - !screenshotBase64 || - !sessionId || - !input.testUid || - !shouldCaptureScreenshot(policy, failed) - ) { - return - } - const artifact = await writeScreenshotArtifact({ - outputDir: input.outputDir, - testUid: input.testUid, - sessionId, - base64: screenshotBase64 - }) - input.onArtifact(artifact) - await attachArtifactToAllure(artifact) -} diff --git a/packages/service/src/video-capture.ts b/packages/service/src/video-capture.ts deleted file mode 100644 index ff8b1d06..00000000 --- a/packages/service/src/video-capture.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Per-test video for the WDIO adapter: the granularity/policy gate, the -// retention decision, the frame-window slice, the encode, and the Allure -// attach. Kept out of index.ts so the god-file stays lean. The slice + encode -// live in core (framework-agnostic); only the recorder is WDIO-specific. - -import { - encodePerTestVideo, - shouldRetainTrace, - sliceFramesFrom, - type TestOutcome, - type TraceArtifact -} from '@wdio/devtools-core' -import type { - DevToolsMode, - ScreencastFrame, - TraceGranularity, - TraceVideoPolicy -} from '@wdio/devtools-shared' -import { attachArtifactToAllure } from './allure.js' - -/** - * Slice the continuous screencast to this test's window, encode a `.webm`, and - * attach it to Allure — when trace mode + `test` granularity + a non-`off` - * `video` policy that retains this test's outcome. No-op otherwise. The encoded - * artifact is handed to `onArtifact` so it lands in the manifest. - */ -export async function captureAndAttachVideo(input: { - mode: DevToolsMode | undefined - granularity: TraceGranularity | undefined - policy: TraceVideoPolicy | undefined - frames: readonly ScreencastFrame[] | undefined - startWallTime: number - outcomes: TestOutcome[] - attempt: number | undefined - outputDir: string - testUid: string | undefined - sessionId: string | undefined - captureFormat?: 'jpeg' | 'png' - onArtifact: (artifact: TraceArtifact) => void - onLog?: (level: 'info' | 'warn', message: string) => void -}): Promise<void> { - const { mode, granularity, policy, frames, testUid, sessionId } = input - if ( - mode !== 'trace' || - granularity !== 'test' || - !policy || - policy === 'off' || - !frames || - !testUid || - !sessionId || - // No recorded attempt for this uid — the test never started (e.g. a - // skipped/pending test whose afterTest fires without a beforeTest). Skip - // rather than fail-open on empty outcomes, which would slice the PREVIOUS - // test's frames into a video attributed to this one. - input.outcomes.length === 0 - ) { - return - } - const decision = shouldRetainTrace(policy, { - outcomes: input.outcomes, - attemptInfoAvailable: true - }) - if (!decision.retain) { - return - } - const artifact = await encodePerTestVideo({ - frames: sliceFramesFrom(frames, input.startWallTime), - outputDir: input.outputDir, - testUid, - sessionId, - attempt: input.attempt, - captureFormat: input.captureFormat, - onLog: input.onLog - }) - if (!artifact) { - return - } - input.onArtifact(artifact) - await attachArtifactToAllure(artifact) -} diff --git a/packages/service/tests/allure.test.ts b/packages/service/tests/allure.test.ts index aa269eed..498b3d31 100644 --- a/packages/service/tests/allure.test.ts +++ b/packages/service/tests/allure.test.ts @@ -1,8 +1,4 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' -import { mkdtemp, writeFile, rm } from 'node:fs/promises' -import { tmpdir } from 'node:os' -import { join } from 'node:path' -import type { TraceArtifact } from '@wdio/devtools-core' +import { describe, it, expect, vi, beforeEach } from 'vitest' const addAttachment = vi.fn() vi.mock('@wdio/allure-reporter', () => ({ @@ -10,89 +6,30 @@ vi.mock('@wdio/allure-reporter', () => ({ default: { addAttachment } })) -import { - attachArtifactToAllure, - resetAllureReporterCache -} from '../src/allure.js' +import { getAllureSink, resetAllureSinkCache } from '../src/allure.js' -function artifact(over: Partial<TraceArtifact> = {}): TraceArtifact { - return { - kind: 'trace', - path: '', - scope: 'test', - testUids: ['u1'], - retained: true, - ...over - } -} - -describe('attachArtifactToAllure', () => { - const dirs: string[] = [] +describe('getAllureSink', () => { beforeEach(() => { addAttachment.mockReset() - resetAllureReporterCache() - }) - afterEach(async () => { - await Promise.all( - dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) - ) - }) - - async function tempZip(name: string): Promise<string> { - const dir = await mkdtemp(join(tmpdir(), 'allure-')) - dirs.push(dir) - const p = join(dir, name) - await writeFile(p, 'zip-bytes') - return p - } - - it('is a no-op for a non-retained artifact', async () => { - await attachArtifactToAllure(artifact({ retained: false, path: '/x.zip' })) - expect(addAttachment).not.toHaveBeenCalled() - }) - - it('is a no-op for an artifact with no path yet', async () => { - await attachArtifactToAllure(artifact({ path: '' })) - expect(addAttachment).not.toHaveBeenCalled() + resetAllureSinkCache() }) - it('attaches a trace zip as a plain application/zip download', async () => { - const path = await tempZip('trace-abc.zip') - await attachArtifactToAllure(artifact({ path })) + it('resolves a sink that forwards to @wdio/allure-reporter.addAttachment', async () => { + const sink = await getAllureSink() + expect(sink).toBeTypeOf('function') + const content = Buffer.from('zip-bytes') + await sink!('trace-abc.zip', content, 'application/zip') expect(addAttachment).toHaveBeenCalledOnce() - const [name, content, type] = addAttachment.mock.calls[0]! - expect(name).toBe('trace-abc.zip') - expect(Buffer.isBuffer(content)).toBe(true) - expect(type).toBe('application/zip') - }) - - it('attaches a video artifact as video/webm', async () => { - const path = await tempZip('rec-abc.webm') - await attachArtifactToAllure(artifact({ kind: 'video', path })) - const [, , type] = addAttachment.mock.calls[0]! - expect(type).toBe('video/webm') - }) - - it('attaches a screenshot artifact as image/png', async () => { - const path = await tempZip('screenshot-u1.png') - await attachArtifactToAllure(artifact({ kind: 'screenshot', path })) - const [, , type] = addAttachment.mock.calls[0]! - expect(type).toBe('image/png') - }) - - it('skips a directory-format artifact without throwing (ndjson-directory)', async () => { - const dir = await mkdtemp(join(tmpdir(), 'allure-dir-')) - dirs.push(dir) - await expect( - attachArtifactToAllure(artifact({ path: dir })) - ).resolves.toBeUndefined() - expect(addAttachment).not.toHaveBeenCalled() + expect(addAttachment).toHaveBeenCalledWith( + 'trace-abc.zip', + content, + 'application/zip' + ) }) - it('never rejects when the artifact path is missing', async () => { - await expect( - attachArtifactToAllure(artifact({ path: '/no/such/trace.zip' })) - ).resolves.toBeUndefined() - expect(addAttachment).not.toHaveBeenCalled() + it('memoizes the resolved sink across calls (single reporter probe)', async () => { + const first = await getAllureSink() + const second = await getAllureSink() + expect(first).toBe(second) }) }) diff --git a/packages/service/tests/screenshot-capture.test.ts b/packages/service/tests/screenshot-capture.test.ts deleted file mode 100644 index 7c3bdb1d..00000000 --- a/packages/service/tests/screenshot-capture.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' -import { mkdtemp, rm, readdir } from 'node:fs/promises' -import { tmpdir } from 'node:os' -import { join } from 'node:path' -import type { TraceArtifact } from '@wdio/devtools-core' - -const addAttachment = vi.fn() -vi.mock('@wdio/allure-reporter', () => ({ - addAttachment, - default: { addAttachment } -})) - -import { captureAndAttachScreenshot } from '../src/screenshot-capture.js' -import { resetAllureReporterCache } from '../src/allure.js' - -const SHOT = Buffer.from('png-bytes').toString('base64') - -describe('captureAndAttachScreenshot', () => { - const dirs: string[] = [] - const collected: TraceArtifact[] = [] - beforeEach(() => { - addAttachment.mockReset() - resetAllureReporterCache() - collected.length = 0 - }) - afterEach(async () => { - await Promise.all( - dirs.splice(0).map((d) => rm(d, { recursive: true, force: true })) - ) - }) - - async function run( - over: Partial<Parameters<typeof captureAndAttachScreenshot>[0]> - ) { - const dir = await mkdtemp(join(tmpdir(), 'shot-cap-')) - dirs.push(dir) - await captureAndAttachScreenshot({ - mode: 'trace', - granularity: 'test', - policy: 'only-on-failure', - failed: true, - screenshotBase64: SHOT, - sessionId: 'sess1234', - outputDir: dir, - testUid: 'u1', - onArtifact: (a) => collected.push(a), - ...over - }) - return { dir } - } - - it('writes + attaches the reused snapshot on failure under only-on-failure', async () => { - const { dir } = await run({}) - expect(collected).toHaveLength(1) - expect(collected[0]!.kind).toBe('screenshot') - expect(addAttachment).toHaveBeenCalledOnce() - expect(await readdir(dir)).toHaveLength(1) - }) - - it('does nothing on a passing test under only-on-failure', async () => { - await run({ failed: false }) - expect(collected).toHaveLength(0) - expect(addAttachment).not.toHaveBeenCalled() - }) - - it('does nothing outside trace mode', async () => { - await run({ mode: 'live', policy: 'on' }) - expect(collected).toHaveLength(0) - }) - - it('does nothing outside test granularity (uniform rule)', async () => { - await run({ granularity: 'session', policy: 'on' }) - expect(collected).toHaveLength(0) - }) - - it('does nothing without a captured frame (no snapshot to reuse)', async () => { - await run({ policy: 'on', screenshotBase64: undefined }) - expect(collected).toHaveLength(0) - }) - - it('does nothing without a sessionId or uid', async () => { - await run({ sessionId: undefined }) - await run({ testUid: undefined }) - expect(collected).toHaveLength(0) - }) -}) diff --git a/packages/service/tests/video-capture.test.ts b/packages/service/tests/video-capture.test.ts deleted file mode 100644 index 25c1c404..00000000 --- a/packages/service/tests/video-capture.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { describe, it, expect, beforeEach } from 'vitest' -import type { ScreencastFrame } from '@wdio/devtools-shared' -import type { TraceArtifact, TestOutcome } from '@wdio/devtools-core' - -// Every case here is designed to no-op BEFORE the ffmpeg encode (failed gate or -// non-retaining policy), so no encoder/reporter mock is needed — the real -// (pure) shouldRetainTrace decides retention. The encode path itself is covered -// by core's video-slice.test.ts. -import { captureAndAttachVideo } from '../src/video-capture.js' - -const frames: ScreencastFrame[] = [ - { data: 'AAAA', timestamp: 10 }, - { data: 'AAAA', timestamp: 20 }, - { data: 'AAAA', timestamp: 30 } -] - -const failedOutcome: TestOutcome[] = [ - { uid: 'u1', attempt: 0, state: 'failed' } -] -const passedOutcome: TestOutcome[] = [ - { uid: 'u1', attempt: 0, state: 'passed' } -] - -describe('captureAndAttachVideo gating', () => { - const collected: TraceArtifact[] = [] - beforeEach(() => { - collected.length = 0 - }) - - const base = { - mode: 'trace' as const, - granularity: 'test' as const, - policy: 'retain-on-failure' as const, - frames, - startWallTime: 0, - outcomes: failedOutcome, - attempt: 0, - outputDir: '/tmp/does-not-encode', - testUid: 'u1', - sessionId: 'sess1234', - onArtifact: (a: TraceArtifact) => collected.push(a) - } - - it('no-ops outside test granularity', async () => { - await captureAndAttachVideo({ ...base, granularity: 'session' }) - expect(collected).toHaveLength(0) - }) - - it('no-ops when the test never started (empty outcomes — no fail-open)', async () => { - await captureAndAttachVideo({ ...base, outcomes: [] }) - expect(collected).toHaveLength(0) - }) - - it('no-ops when video policy is off/undefined', async () => { - await captureAndAttachVideo({ ...base, policy: 'off' }) - await captureAndAttachVideo({ ...base, policy: undefined }) - expect(collected).toHaveLength(0) - }) - - it('no-ops when there are no frames', async () => { - await captureAndAttachVideo({ ...base, frames: undefined }) - expect(collected).toHaveLength(0) - }) - - it('no-ops when the policy does not retain this outcome (passing + retain-on-failure)', async () => { - await captureAndAttachVideo({ ...base, outcomes: passedOutcome }) - expect(collected).toHaveLength(0) - }) - - it('no-ops without a sessionId or uid', async () => { - await captureAndAttachVideo({ ...base, sessionId: undefined }) - await captureAndAttachVideo({ ...base, testUid: undefined }) - expect(collected).toHaveLength(0) - }) -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f03e235..57b9978d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -371,7 +371,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.0.16 - version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) packages/nightwatch-devtools: dependencies: @@ -501,6 +501,12 @@ importers: '@wdio/devtools-shared': specifier: workspace:^ version: link:../shared + allure-js-commons: + specifier: ^3.0.0 + version: 3.10.2 + allure-mocha: + specifier: ^3.0.0 + version: 3.10.2(mocha@11.7.6) chromedriver: specifier: ^150.0.0 version: 150.0.1 @@ -2905,6 +2911,11 @@ packages: allure-playwright: optional: true + allure-mocha@3.10.2: + resolution: {integrity: sha512-HtqRIhfRRvDQ2xnSTUDxgKPA+rXid3GetRPX4EIC8fDzY4FIlOwNcPcq2lX40NC5ApkPc4XS2Xv18K/oVNhxnA==} + peerDependencies: + mocha: '>=6.2.0' + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -7658,7 +7669,7 @@ snapshots: '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7817,7 +7828,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8498,7 +8509,7 @@ snapshots: '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -9182,7 +9193,7 @@ snapshots: '@puppeteer/browsers@2.13.2': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 @@ -9600,7 +9611,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) eslint: 10.5.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: @@ -9610,7 +9621,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -9629,7 +9640,7 @@ snapshots: '@typescript-eslint/types': 8.61.1 '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) '@typescript-eslint/utils': 8.61.1(eslint@10.5.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) eslint: 10.5.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -9644,7 +9655,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) '@typescript-eslint/types': 8.61.1 '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.5 semver: 7.8.4 tinyglobby: 0.2.17 @@ -9783,14 +9794,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 @@ -10146,7 +10149,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10191,6 +10194,13 @@ snapshots: dependencies: md5: 2.3.0 + allure-mocha@3.10.2(mocha@11.7.6): + dependencies: + allure-js-commons: 3.10.2 + mocha: 11.7.6 + transitivePeerDependencies: + - allure-playwright + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -11587,7 +11597,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -11714,7 +11724,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -12045,7 +12055,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12053,7 +12063,7 @@ snapshots: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 8.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12251,35 +12261,35 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12578,7 +12588,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -13041,7 +13051,7 @@ snapshots: lighthouse-logger@2.0.2: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) marky: 1.3.0 transitivePeerDependencies: - supports-color @@ -13670,7 +13680,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -13682,7 +13692,7 @@ snapshots: pac-proxy-agent@9.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) get-uri: 8.0.0 http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 @@ -13972,7 +13982,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -13985,7 +13995,7 @@ snapshots: proxy-agent@8.0.1: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 9.0.0 https-proxy-agent: 9.0.0 lru-cache: 7.18.3 @@ -14505,7 +14515,7 @@ snapshots: socks-proxy-agent@10.0.0: dependencies: agent-base: 9.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14513,7 +14523,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -14722,7 +14732,7 @@ snapshots: cosmiconfig: 9.0.2(typescript@6.0.3) css-functions-list: 3.3.3 css-tree: 3.2.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 11.1.3 @@ -14985,7 +14995,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) esbuild: 0.27.7 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 @@ -15118,7 +15128,7 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@volar/typescript': 2.4.28 compare-versions: 6.1.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 1.2.1 magic-string: 0.30.21 @@ -15261,21 +15271,6 @@ snapshots: optionalDependencies: rollup: 4.62.0 - vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 - rolldown: 1.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 25.9.3 - esbuild: 0.27.7 - fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.22.4 - yaml: 2.9.0 - vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -15291,36 +15286,6 @@ snapshots: tsx: 4.22.4 yaml: 2.9.0 - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.9.3 - '@vitest/coverage-v8': 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) - happy-dom: 20.10.4 - jsdom: 24.1.3 - transitivePeerDependencies: - - msw - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.4)(jsdom@24.1.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 @@ -15363,7 +15328,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color From faafc58a92ab6cf77e8febcd4c4a9c437d3c6371 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 16 Jul 2026 19:38:00 +0530 Subject: [PATCH 075/109] docs: record Nightwatch BDD per-test artifact limitation as known debt --- CLAUDE.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 36896d87..2cfbe770 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -240,10 +240,13 @@ Documented divergences from the conventions above. They exist today as debt to b - **Nightwatch: `retain-on-failure` works; the other retry-aware policies degrade.** Its `--retries` re-runs the testcase *internally* without re-firing the plugin's per-test hooks, and the per-testcase results carry no attempt/retry field (retries live only in undocumented, version-varying Nightwatch internals — `suiteRetries.testRetriesCount` / `reporter.testResults.retryTest`), so the ledger sees only the final attempt for the `describe/it` and exports-object interfaces. Cucumber scenarios expose per-scenario hooks, so the feed captures their attempts. Not cleanly fixable without depending on those internals. - WDIO `specFileRetries` spawns a fresh worker per retry, so cross-process attempts aren't in the (process-scoped) ledger. - Eager per-test trace slice (Nightwatch + Selenium) can drop an action snapshot whose fire-and-forget capture hasn't resolved by `afterEach` / scenario end — the slice is written from whatever snapshots exist at flush time. The WDIO service is immune because it awaits each snapshot inline before flushing. -- The per-test `screenshot` and `video` options live on the **WDIO `ServiceOptions` only** — not `BaseDevToolsOptions` — because only the service implements them (an option belongs on an adapter until a second adapter consumes it, mirroring the core-helper rule; putting them on the shared base made them appear available in Selenium/Nightwatch and broke those adapters' `Required<>` option types). The policy *types* (`TraceScreenshotPolicy`/`TraceVideoPolicy`) and the capture/slice/encode logic (`core/screenshot-artifact.ts`, `core/video-slice.ts`) are framework-agnostic, so Selenium/Nightwatch adoption is wiring-only (capture the base64 + feed `captureAndAttach*`) plus adding the option to their own options type; pending. Both are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the frame buffer is unbounded for the session (a decimation cap is a noted follow-up), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). -- The `filmstrip` option (dense screencast into the trace) is on **`BaseDevToolsOptions`** — the counterexample to the screenshot/video entry above — because all three adapters implement it (the "second consumer → base" rule realized). Core owns the work (`core/screencast-trace.ts` `thinScreencastFrames`/`buildDenseScreencast`; slice windowing in `spec-trace-helpers.ts`); adapters only default the option, un-gate the recorder in trace mode when it's set, and feed `recorder.frames` into the finalize context. Each adapter captures frames while the recorder is still alive (service `onReload` → `#filmstripFrames`; Selenium `onDriverEnd` drain before nulling; Nightwatch `#finalizeCurrentScreencast` snapshot before delegating), and each finalize context spreads `[...accumulated, ...(live recorder frames)]` so a **mid-run** per-spec/per-test slice flush (which fires before the recorder is drained) isn't blank. Two known limits: (1) the dense frames are written **alongside** the sparse per-action frames (union), not replacing them — the sparse frames carry the DOM `elements`/`snapshot` refs, so suppressing them (attaching those refs to the nearest dense frame) is a deferred follow-up; near each action the filmstrip therefore shows the action's own frame plus adjacent dense frames. (2) Thinning is applied at **export**, so the raw session frame buffer is unbounded in memory during the run (same decimation-cap follow-up as video). Per-test filmstrip slicing follows the same per-test-hook availability as `traceGranularity:'test'` (works for WDIO mocha/cucumber, Selenium mocha, Nightwatch exports-object/cucumber; Nightwatch BDD `describe/it` degrades to session scope per the entry below), and non-Chrome polling carries the same reporter-noise caveat. +- The per-test `screenshot` and `video` options live on the **WDIO `ServiceOptions` only** — not `BaseDevToolsOptions` — because only the service implements them (an option belongs on an adapter until a second adapter consumes it, mirroring the core-helper rule; putting them on the shared base made them appear available in Selenium/Nightwatch and broke those adapters' `Required<>` option types). The policy *types* (`TraceScreenshotPolicy`/`TraceVideoPolicy`) and the capture/slice/encode logic (`core/screenshot-artifact.ts`, `core/video-slice.ts`) are framework-agnostic, so Selenium/Nightwatch adoption was wiring-only — now done (Selenium adds the options on its own `DevToolsOptions` with full inline attach; Nightwatch adds them produce-only — see the Allure-attach entry below). All are gated to `traceGranularity:'test'` (per-test inline Allure); coarser granularities keep artifacts in the manifest. Video records the screencast continuously and slices per-test by wall-time — the session frame buffer is bounded by `maxBufferFrames` (default 2000; decimates keeping first/last), and on non-Chrome the polling recorder issues many `takeScreenshot`s that flood `@wdio/allure-reporter` (pair with `disableWebdriverStepsReporting`). +- The `filmstrip` option (dense screencast into the trace) is on **`BaseDevToolsOptions`** — the counterexample to the screenshot/video entry above — because all three adapters implement it (the "second consumer → base" rule realized). Core owns the work (`core/screencast-trace.ts` `thinScreencastFrames`/`buildDenseScreencast`; slice windowing in `spec-trace-helpers.ts`); adapters only default the option, un-gate the recorder in trace mode when it's set, and feed `recorder.frames` into the finalize context. Each adapter captures frames while the recorder is still alive (service `onReload` → `#filmstripFrames`; Selenium `onDriverEnd` drain before nulling; Nightwatch `#finalizeCurrentScreencast` snapshot before delegating), and each finalize context spreads `[...accumulated, ...(live recorder frames)]` so a **mid-run** per-spec/per-test slice flush (which fires before the recorder is drained) isn't blank. When dense frames are present they **supersede** the sparse per-action filmstrip (the per-action DOM `elements`/`snapshot` are carried independently by the `frame-snapshot` events, so no DOM data is lost); a run without dense frames keeps the sparse filmstrip, byte-stable with before. Thinning is applied at export; the live session frame buffer is bounded by `maxBufferFrames` (default 2000; see the screenshot/video entry above). Per-test filmstrip slicing follows the same per-test-hook availability as `traceGranularity:'test'` (works for WDIO mocha/cucumber, Selenium mocha, Nightwatch exports-object/cucumber; Nightwatch BDD `describe/it` degrades to session scope per the entry below), and non-Chrome polling carries the same reporter-noise caveat. +- Per-test artifact **Allure attachment** is cross-adapter via a pluggable sink in `core/allure-artifacts.ts` (`AllureAttachSink`; `captureAndAttachScreenshot`/`captureAndAttachVideo`/`attachTraceArtifact`/`lastRenderedScreenshot` — moved out of the WDIO service). The service supplies a `@wdio/allure-reporter` sink; **Selenium** supplies an `allure-js-commons` `attachment()` sink (runtime-agnostic — attaches under any allure runner adapter — gated on `globalThis.allureTestRuntime`, dynamic-imported as an optional peer dep). An **undefined sink = produce-only** (write file + manifest, skip attach). Caveats: (a) **Selenium inline-attach needs awaited runner hooks** — its mocha `afterEach`/jest `afterEach`/cucumber `After` are now async + awaited so the async produce+attach lands while the allure adapter still holds the current test open (fire-and-forget attaches to the next test or drops); Gherkin `AfterStep`→`onTestEnd` stays fire-and-forget. (b) **Nightwatch inline-attach is unsupported** — `nightwatch-allure` is post-hoc with no live attach API, and `allure-js-commons` no-ops in a Nightwatch run (nothing calls `setGlobalTestRuntime`); Nightwatch is produce-only. Revisit if an `allure-js-commons`-based Nightwatch runtime adapter appears (then it's a sink swap). (c) **video is standalone** in both adapters (recorder starts for `video != off` OR filmstrip in trace mode; the orphan session-webm encode is trace-gated to stop-only). +- **node:assert error display** (`core/assert-patcher.ts` `describeAssertFailure`): node auto-generates a per-character COLORED diff as the AssertionError message; once any consumer strips the ANSI (allure-mocha, the app console filter, plain terminals) the actual/expected interleave into mush (`'ExampleThis DIs Nomt…'`). The patcher pulls node's clean `.actual`/`.expected` into a `CollapsedAssertResult` AND **rewrites the auto-generated message** (and its echo in the stack) as a value-bearing `Expected: … / Received: …` block. Because `toError` returns the thrown error itself, this rewrite reaches every consumer — the trace's Errors tab, the runner console, and **allure-mocha's error box** (which would otherwise show the ANSI-stripped mush). It only touches node's auto-generated messages; a user-supplied message and errors without `actual`/`expected` (e.g. `assert.ok`) pass through unchanged. This is a deliberate mutation of the thrown assert error — node's auto-message is a display artifact, and the rewrite is strictly more readable and matches `@wdio/allure-reporter`'s `Expected/Received` shape. - Nightwatch native asserts are buffered at call time and emitted in one batch at test-end (Nightwatch exposes no per-assertion execution/outcome hook reachable from the plugin — `client.queue.tree` / `client.reporter` aren't on `browser`). Streaming mid-run would flash every assert green before its outcome is known, so rows are held and reconciled against `results.testcases[*].assertions` at `afterEach` (the flat `results.assertions` only reflects the last testcase). The exporter re-sorts commands by timestamp (`buildActionEvents`) so the batched rows land at their real timeline positions rather than clustering at flush time. `actual` is parsed from the failure message (`but got: …`, failures only) into a collapsed `{passed, expected, actual}` result; `expected` is the assertion arg — the label still mirrors the call args, not the derived values. -- Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. +- Nightwatch's BDD `describe/it` interface fires the plugin's global `beforeEach`/`afterEach` **once per module** (with an empty `currentTest.name`), not per `it` — Nightwatch runs the individual `it`s internally with no per-testcase hook or event reachable from the plugin (the lib emits only transport-level events). So `traceGranularity:'test'` records a single slice boundary (the first test) and collapses to one session-scoped slice; retry-aware/per-test retention (`tracePolicy`) degrades to session scope for this interface. Per-test slicing works for adapters/styles that expose per-test hooks (WDIO mocha/cucumber, Selenium mocha; likely Nightwatch's exports-object style, unverified). Session-granularity trace is unaffected. **No per-test support has been built for this interface** — real per-`it` slicing needs a hook Nightwatch doesn't surface; deferred to a full-picture pass, not attempted yet. + - **Empirically confirmed** (BDD example, `mode:'trace'` + `traceGranularity:'test'` + `tracePolicy:'retain-on-failure'` + `screenshot:'on'` + `video:'retain-on-failure'`): the one collapsed slice is keyed to the **first** test's uid (the artifacts manifest's `tests[]` still carries every testcase with correct `state`, so metadata capture is fine — it's the *slice/artifact* keying that collapses). Consequence: with a passing first test and a failing later test, the screenshot **produces** (policy `'on'` captures regardless of outcome, keyed to the first test) but the **trace zip and video are dropped** — `retain-on-failure` evaluates the first (passing) test's outcome, and the actually-failing test never gets its own slice to retain. The per-test produce-only path itself (screenshot/video write + manifest) is correct; only the BDD slice-keying limits it. - Service renders expect-webdriverio matchers as single `expect.<matcher>` rows by **folding**, not stack/depth suppression (the old `#assertionDepth`/`#matcherStarted`/self-heal machinery is gone). The matcher's value-read (`toHaveText`→`getText`, `toExist`→`isExisting`, …) is captured as a normal command; `afterAssertion` then coalesces the synthesized `expect.*` row into that read in place — inheriting its callSource, screenshot, and timeline position — and the fold replaces **by timestamp, never a public `id`**: `id` is the per-worker `commandCounter`, which resets per spec, so stamping one lets the app's id-first `replaceCommand` swap a same-id row from another spec (duplicate rows + a fold from another spec vanishing, in multi-spec live mode). `beforeAssertion` arms the pending matcher (depth-counted so aliases like `toBeChecked`→`toBeSelected` fold once); a matcher that **hard-throws** — element never resolves, so expect-webdriverio's `waitUntil` rethrows and `afterAssertion` never fires — is synthesized at `afterTest`/`afterStep` from the throwing read, so a failing assertion renders as `expect.<matcher>` whether or not the element existed. Two limits: its error is then the read's (`Can't call getText on … element wasn't found`), not an assertion-phrased message; and `MATCHER_READ_COMMANDS` is a hand-maintained allowlist, so a matcher whose read isn't listed leaves its raw read visible alongside the `expect.*` row. Plain-value jest matchers (`expect(x).toBe(y)`) don't fire the ewdio hooks, so they aren't captured as rows. ### File-size (raw line counts; soft cap is 500 logic lines) From 7dd1c952397882bfa1483c8bb42a8cc4e9577b2b Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 17 Jul 2026 15:06:36 +0530 Subject: [PATCH 076/109] docs: record Nightwatch BDD per-test limitation + Selenium seam extraction as debt --- CLAUDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2cfbe770..24f95abe 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -256,7 +256,7 @@ Most entries below don't trigger the `max-lines` lint rule after `skipBlankLines - `packages/service/src/index.ts` — over the 500-**logic**-line soft cap and ~620 raw (the WDIO plugin god-file: session/screencast/command/assertion/trace-slice wiring in one class). The assertion-capture block (`beforeAssertion`/`afterAssertion`/`#handleAssertionOutcome`/`#finalizePendingAssertion`, plus the `#assertionDepth`/`#pendingAssertion` state) is now the largest self-contained seam and the prime extraction candidate; trace-slice and screencast are the next two. - `packages/nightwatch-devtools/src/index.ts` (~536 raw). Cucumber/test/run-lifecycle, session-init, event-hub modules already extracted; remainder is the `PluginInternals` accessor bag plus per-method delegators plus the factory. Accept-as-is. -- `packages/selenium-devtools/src/index.ts` (~560 raw). Session/test-lifecycle extracted; remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Same situation as nightwatch. +- `packages/selenium-devtools/src/index.ts` (~817 raw). Session/test-lifecycle extracted; remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Grew past ~560 when the per-test-artifact seam (`#allureSink`/`#perTestArtifactInputs`/`#emitTestArtifacts`) landed inline with the cross-adapter Allure work; Nightwatch extracted the twin concern into `test-artifacts.ts`, so the next Selenium change to this seam should mirror that (a `selenium-devtools/src/test-artifacts.ts` threading the sink + flushed-trace promise through an input bag). Prime extraction candidate. - `packages/nightwatch-devtools/src/session.ts` (~468). `captureNetworkFromPerformanceLogs` + `captureBrowserLogs` + `captureTrace` are tightly coupled to NightwatchBrowser state. Coverage at 78% after recent backfill; further extraction would need rewriting the browser-coupling. ### Test coverage gaps (worst-risk-first) From f8bfa5731d268d9e85d6d798913e7df442d39cca Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 17 Jul 2026 18:26:13 +0530 Subject: [PATCH 077/109] feat: DOM time-travel in the trace player (mutations + field state) --- .../app/src/components/browser/snapshot.ts | 62 ++++++++++--- .../backend/src/trace-reader-constants.ts | 3 + packages/backend/src/trace-reader.ts | 58 ++++++++++--- packages/backend/tests/trace-reader.test.ts | 40 +++++++++ packages/core/src/index.ts | 1 + packages/core/src/trace-exporter.ts | 24 ++++- packages/core/src/trace-mutations.ts | 62 +++++++++++++ packages/core/src/trace-zip-writer.ts | 5 ++ packages/core/tests/trace-exporter.test.ts | 67 ++++++++++++++ packages/core/tests/trace-mutations.test.ts | 87 +++++++++++++++++++ packages/script/src/index.ts | 34 ++++++++ packages/shared/src/types.ts | 23 +++++ 12 files changed, 439 insertions(+), 27 deletions(-) create mode 100644 packages/core/src/trace-mutations.ts create mode 100644 packages/core/tests/trace-mutations.test.ts diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index 9fe5f7b4..fe4cef66 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -257,9 +257,36 @@ export class DevtoolsBrowser extends Element { commandPageUrl(command, this.commands ?? [], this.mutations ?? []) ?? this.#activeUrl } - // Switch to snapshot mode so the command screenshot is visible instead of the video. + // Switch to snapshot mode so the command snapshot is visible instead of the video. this.#viewMode = 'snapshot' - this.requestUpdate() + // DOM time-travel: rebuild the iframe DOM as of the selected command's time. + // #renderBrowserState requestUpdates internally, so only request one here + // when there's no mutation stream to replay (screenshot-only fallback). + const target = this.#mutationForCommand(command) + if (target) { + await this.#renderBrowserState(target) + } else { + this.requestUpdate() + } + } + + /** The last mutation captured at or before the command's time — the DOM state + * the command observed. Falls back to the first mutation when every mutation + * is later (command precedes the slice's initial full-DOM snapshot). */ + #mutationForCommand(command?: CommandLog): TraceMutation | undefined { + const mutations = this.mutations + if (!command?.timestamp || !mutations?.length) { + return undefined + } + let best: TraceMutation | undefined + for (const mutation of mutations) { + if (mutation.timestamp <= command.timestamp) { + best = mutation + } else { + break + } + } + return best ?? mutations[0] } // View-mode flips swap the iframe with <img>/<video> and don't fire resize. @@ -328,7 +355,7 @@ export class DevtoolsBrowser extends Element { } #handleAttributeMutation(mutation: TraceMutation) { - if (!mutation.attributeName || !mutation.attributeValue) { + if (!mutation.attributeName) { return } @@ -337,7 +364,16 @@ export class DevtoolsBrowser extends Element { return } - el.setAttribute(mutation.attributeName, mutation.attributeValue || '') + const value = mutation.attributeValue ?? '' + el.setAttribute(mutation.attributeName, value) + // Form-field state lives on the PROPERTY, not just the attribute — mirror it + // so a replayed input shows the captured value / checked state, including a + // field cleared back to empty. + if (mutation.attributeName === 'value' && 'value' in el) { + ;(el as HTMLInputElement).value = value + } else if (mutation.attributeName === 'checked' && 'checked' in el) { + ;(el as HTMLInputElement).checked = value === 'true' + } } #handleChildListMutation(mutation: TraceMutation) { @@ -554,6 +590,17 @@ export class DevtoolsBrowser extends Element { ></wdio-devtools-screencast-player> </div>` } + // DOM replay is the primary snapshot whenever the trace carries mutations: + // #renderBrowserState reconstructs the iframe DOM at the selected command's + // time, so points without a captured frame (assertions, static waits) still + // show the real page instead of a blank/stale screenshot. + if (hasMutations) { + return html`<div class="iframe-wrapper"> + <iframe class="origin-top-left"></iframe> + </div>` + } + // No mutation stream (DOM-less / foreign trace): fall back to the selected + // command's screenshot, then the latest available frame. if (this.#screenshotData) { return html`<div class="iframe-wrapper"> <div @@ -567,12 +614,7 @@ export class DevtoolsBrowser extends Element { </div> </div>` } - if (hasMutations) { - return html`<div class="iframe-wrapper"> - <iframe class="origin-top-left"></iframe> - </div>` - } - const autoScreenshot = hasMutations ? null : this.#latestAutoScreenshot + const autoScreenshot = this.#latestAutoScreenshot if (autoScreenshot) { return html`<div class="iframe-wrapper"> <div diff --git a/packages/backend/src/trace-reader-constants.ts b/packages/backend/src/trace-reader-constants.ts index 3cd37bd4..737f0903 100644 --- a/packages/backend/src/trace-reader-constants.ts +++ b/packages/backend/src/trace-reader-constants.ts @@ -17,6 +17,9 @@ export const NETWORK_STREAM_SUFFIX = '.network' /** Sidecar entries holding call stacks keyed by numeric call id. */ export const STACKS_STREAM_SUFFIX = '.stacks' +/** Every zip entry ending in this suffix is an NDJSON DOM-mutation stream. */ +export const MUTATIONS_STREAM_SUFFIX = '.mutations' + /** Foreign screencast refs may be a bare sha1; probe image extensions too. */ export const FRAME_RESOURCE_SUFFIXES = ['', '.jpeg', '.png'] as const diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 204fd464..3b4f9ef2 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -5,22 +5,26 @@ // is a HAR stream, and `.stacks` sidecars carry call stacks. Commands come // from before/after events, the filmstrip from screencast-frame events + // resources/*, console logs from console/stdio events, sources from stack -// frames + src@ resources. Fields the zip never carried (mutations, suites) -// come back empty. Constants, event types, and pure helpers live in the -// sibling trace-reader-{constants,types,utils}.ts files. +// frames + src@ resources, and DOM mutations from the `.mutations` stream when +// present. Fields the zip never carried (suites) come back empty. Constants, +// event types, and pure helpers live in the sibling +// trace-reader-{constants,types,utils}.ts files. import fs from 'node:fs/promises' import { unzipSync, strFromU8 } from 'fflate' import { + isMutationsTruncationMarker, type CommandLog, type NetworkRequest, type TraceLog, + type TraceMutation, type TracePlayerData, type TracePlayerFrame } from '@wdio/devtools-shared' import { FRAME_RESOURCE_SUFFIXES, + MUTATIONS_STREAM_SUFFIX, NETWORK_STREAM_SUFFIX, REVERSE_ACTION_MAP, STACKS_STREAM_SUFFIX, @@ -270,6 +274,39 @@ function parseNetworkStreams( ) } +function parseMutationStreams( + files: Record<string, Uint8Array>, + names: string[] +): TraceMutation[] { + // The `.mutations` NDJSON is TraceMutation JSON, minus the trailing + // truncation marker; cast at this boundary like the HAR/action parsers. + return names + .flatMap((name) => parseNdjson(strFromU8(files[name]))) + .filter( + (entry) => !isMutationsTruncationMarker(entry) + ) as unknown as TraceMutation[] +} + +/** Categorize + rebase every `.trace` action stream, merge them, and fold in + * any `.stacks` sidecars — the event-stream prelude for `parseTraceZip`. */ +function parseAndMergeEventStreams( + files: Record<string, Uint8Array>, + names: string[] +): MergedEvents { + const streams = names + .filter((name) => name.endsWith(TRACE_STREAM_SUFFIX)) + .map((name) => { + const stream = categorizeEvents(parseNdjson(strFromU8(files[name]))) + rebaseToEpoch(stream) + return stream + }) + const merged = mergeStreams(streams) + for (const name of names.filter((n) => n.endsWith(STACKS_STREAM_SUFFIX))) { + attachSidecarStacks(merged.befores, strFromU8(files[name])) + } + return merged +} + function earliestWallTime(ctxs: ContextOptionsEvent[]): number { const wallTimes = ctxs .map((ctx) => ctx.wallTime) @@ -283,15 +320,7 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { const names = Object.keys(files).sort() const entriesWith = (suffix: string) => names.filter((name) => name.endsWith(suffix)) - const streams = entriesWith(TRACE_STREAM_SUFFIX).map((name) => { - const stream = categorizeEvents(parseNdjson(strFromU8(files[name]))) - rebaseToEpoch(stream) - return stream - }) - const merged = mergeStreams(streams) - for (const name of entriesWith(STACKS_STREAM_SUFFIX)) { - attachSidecarStacks(merged.befores, strFromU8(files[name])) - } + const merged = parseAndMergeEventStreams(files, names) const { frames, maxTime: frameMax } = buildFrames(files, merged.frameEvents) const { commands, @@ -306,7 +335,10 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { ) const startTime = earliestWallTime(merged.ctxs) const trace: TraceLog = { - mutations: [], + mutations: parseMutationStreams( + files, + entriesWith(MUTATIONS_STREAM_SUFFIX) + ), logs: [], consoleLogs: buildConsoleLogs(merged.consoleEvents), networkRequests: parseNetworkStreams( diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 25f9a2f9..2dfc7a7b 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -212,6 +212,46 @@ describe('parseTraceZip', () => { expect(trace.suites).toEqual([]) }) + it('restores DOM mutations from a trace.mutations stream, dropping the marker', () => { + const mutations = [ + { + type: 'childList', + addedNodes: [{ tag: 'html' }], + removedNodes: [], + timestamp: 1000 + }, + { + type: 'attributes', + target: 'body', + attributeName: 'class', + addedNodes: [], + removedNodes: [], + timestamp: 1100 + } + ] + const zip = zipSync({ + 'trace.trace': toNdjson([ + { + type: 'context-options', + wallTime: WALL_TIME, + browserName: 'chrome', + contextId: 'context@abcd1234', + options: { viewport: { width: 1024, height: 768 } } + } + ]), + 'trace.mutations': toNdjson([ + ...mutations, + { __truncated__: true, dropped: 7 } + ]) + }) + const { trace } = parseTraceZip(zip) + // Two mutations from three NDJSON lines proves the trailing truncation + // marker was dropped rather than surfaced as a mutation. + expect(trace.mutations).toHaveLength(2) + expect(trace.mutations[0]).toMatchObject({ type: 'childList' }) + expect(trace.mutations[1]).toMatchObject({ target: 'body' }) + }) + it('restores callSource and sources from stack frames + src resources', () => { const { trace } = parseTraceZip(fixtureZip()) const click = trace.commands.find((c) => c.command === 'click') diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index cee1a38e..ee4126a0 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -23,6 +23,7 @@ export * from './trace-frame-snapshots.js' export * from './trace-retention.js' export * from './trace-sources.js' export * from './trace-har.js' +export * from './trace-mutations.js' export * from './trace-snapshots.js' export * from './trace-zip-writer.js' export * from './bidi.js' diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index c8ae443d..31299af6 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -41,6 +41,7 @@ import { buildActionEvents, type ActionEvent } from './trace-action-events.js' import { buildSourceResources } from './trace-sources.js' import { networkRequestToHar } from './trace-har.js' import { buildTraceZip, type TraceZipResource } from './trace-zip-writer.js' +import { buildMutationsNdjson } from './trace-mutations.js' import { sha1Hex } from './sha1.js' const TRACE_VERSION = 8 @@ -127,6 +128,14 @@ function shortId(sessionId?: string): string { return (sessionId ?? Math.random().toString(36).slice(2, 10)).slice(0, 8) } +function allocateTraceIds(sessionId?: string): { + contextId: string + pageId: string +} { + const idPrefix = shortId(sessionId) + return { contextId: `context@${idPrefix}`, pageId: `page@${idPrefix}` } +} + function resolveContextNaming(caps: Record<string, unknown> | undefined): { browserName: string title: string @@ -314,6 +323,7 @@ interface TraceBundle { traceNdjson: string networkNdjson: Buffer transcriptMd: string + mutationsNdjson: Buffer resources: TraceZipResource[] } @@ -368,9 +378,7 @@ function buildTraceBundle( // subsequent actions render at positive deltas in the trace viewer. const firstCommandTs = trace.commands[0]?.timestamp const wallTime = opts.wallTimeOverride ?? firstCommandTs ?? Date.now() - const idPrefix = shortId(opts.sessionId) - const contextId = `context@${idPrefix}` - const pageId = `page@${idPrefix}` + const { contextId, pageId } = allocateTraceIds(opts.sessionId) const ctxOptions = buildContextOptions(trace, contextId, wallTime) const dense = buildDenseScreencast( trace.screencastFrames ?? [], @@ -400,6 +408,7 @@ function buildTraceBundle( wallTime, ctxOptions.title ), + mutationsNdjson: buildMutationsNdjson(trace.mutations ?? []).ndjson, resources: [ ...buildSnapshotResources(trace.actionSnapshots ?? [], pageId), ...dense.resources, @@ -422,7 +431,8 @@ export async function exportTraceZip( traceNdjson: bundle.traceNdjson, networkNdjson: bundle.networkNdjson, resources: bundle.resources, - transcriptMd: bundle.transcriptMd + transcriptMd: bundle.transcriptMd, + mutationsNdjson: bundle.mutationsNdjson }) } @@ -450,6 +460,12 @@ async function exportTraceDirectory( bundle.networkNdjson ) : Promise.resolve(), + bundle.mutationsNdjson.length + ? fs.writeFile( + path.join(targetDir, 'trace.mutations'), + bundle.mutationsNdjson + ) + : Promise.resolve(), ...bundle.resources.map((r) => fs.writeFile(path.join(targetDir, 'resources', r.resourceName), r.data) ) diff --git a/packages/core/src/trace-mutations.ts b/packages/core/src/trace-mutations.ts new file mode 100644 index 00000000..d63ce094 --- /dev/null +++ b/packages/core/src/trace-mutations.ts @@ -0,0 +1,62 @@ +// Serialize the captured DOM mutation stream into the trace zip's +// `trace.mutations` NDJSON entry so the offline player can replay DOM +// time-travel. Standard trace viewers ignore the unknown entry, so it's +// compat-safe. Keep-earliest under the byte cap — the initial full-DOM +// childList and early diffs survive so replay-from-start stays intact; only +// late mutations drop, and a trailing sentinel records how many. + +import type { + MutationsTruncationMarker, + TraceMutation +} from '@wdio/devtools-shared' + +/** Ceiling on the serialized `trace.mutations` payload — keeps archives bounded + * on mutation-heavy SPAs. Late mutations drop first (replay-from-start holds). */ +export const MAX_MUTATIONS_NDJSON_BYTES = 50 * 1024 * 1024 + +export interface MutationsNdjsonResult { + /** NDJSON payload (one mutation per line, optional trailing marker). Empty + * buffer when there are no mutations. */ + ndjson: Buffer + truncated: boolean + /** Count actually written (excludes the dropped tail and the marker line). */ + written: number +} + +/** + * Serialize mutations to NDJSON under `cap` bytes, keeping the earliest. The + * first mutation is always emitted (even if it alone exceeds the cap) so the + * initial full-DOM snapshot is never lost; when any are dropped a + * `MutationsTruncationMarker` line is appended. + */ +export function buildMutationsNdjson( + mutations: readonly TraceMutation[], + cap: number = MAX_MUTATIONS_NDJSON_BYTES +): MutationsNdjsonResult { + if (!mutations.length) { + return { ndjson: Buffer.alloc(0), truncated: false, written: 0 } + } + const lines: string[] = [] + let bytes = 0 + for (const mutation of mutations) { + const line = JSON.stringify(mutation) + // +1 for the '\n' that will join this line to the previous one. + const add = Buffer.byteLength(line, 'utf8') + (lines.length ? 1 : 0) + if (lines.length > 0 && bytes + add > cap) { + break + } + lines.push(line) + bytes += add + } + const written = lines.length + const dropped = mutations.length - written + if (dropped > 0) { + const marker: MutationsTruncationMarker = { __truncated__: true, dropped } + lines.push(JSON.stringify(marker)) + } + return { + ndjson: Buffer.from(lines.join('\n'), 'utf8'), + truncated: dropped > 0, + written + } +} diff --git a/packages/core/src/trace-zip-writer.ts b/packages/core/src/trace-zip-writer.ts index 13849f13..8e3e524e 100644 --- a/packages/core/src/trace-zip-writer.ts +++ b/packages/core/src/trace-zip-writer.ts @@ -16,6 +16,8 @@ export interface TraceZipInputs { networkNdjson: Buffer /** Human/LLM-readable Markdown transcript. */ transcriptMd?: string + /** NDJSON DOM mutation stream (one mutation per line). Omitted/empty → no entry. */ + mutationsNdjson?: Buffer /** Files written under `resources/` — typically screenshots + element snapshots. */ resources: TraceZipResource[] } @@ -31,6 +33,9 @@ export function buildTraceZip(inputs: TraceZipInputs): Promise<Buffer> { 'transcript.md' ) } + if (inputs.mutationsNdjson?.length) { + zipFile.addBuffer(inputs.mutationsNdjson, 'trace.mutations') + } for (const resource of inputs.resources) { zipFile.addBuffer(resource.data, `resources/${resource.resourceName}`) } diff --git a/packages/core/tests/trace-exporter.test.ts b/packages/core/tests/trace-exporter.test.ts index 365eb74c..a6a36503 100644 --- a/packages/core/tests/trace-exporter.test.ts +++ b/packages/core/tests/trace-exporter.test.ts @@ -523,3 +523,70 @@ describe('exported trace stream — dense filmstrip', () => { await fs.rm(outputDir, { recursive: true, force: true }) }) }) + +describe('exported trace stream — DOM mutations', () => { + const baseCapturer = ( + mutations: TraceCapturer['mutations'] + ): TraceCapturer => ({ + mutations, + traceLogs: [], + consoleLogs: [], + networkRequests: [], + commandsLog: [ + { + command: 'url', + args: ['https://example.test'], + timestamp: 1200, + startTime: 1150 + } + ], + sources: new Map(), + metadata: { type: TraceType.Standalone }, + startWallTime: 1000 + }) + + it('writes captured mutations to a trace.mutations entry, one per line', async () => { + const outputDir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-mut-')) + const dir = await writeTraceZip( + baseCapturer([ + { + type: 'childList', + addedNodes: [{ tag: 'html' }], + removedNodes: [], + timestamp: 1000 + }, + { + type: 'attributes', + target: 'body', + attributeName: 'class', + attributeValue: 'ready', + addedNodes: [], + removedNodes: [], + timestamp: 1100 + } + ]), + { outputDir, sessionId: 'abc12345', format: 'ndjson-directory' } + ) + const lines = (await fs.readFile(path.join(dir, 'trace.mutations'), 'utf8')) + .trim() + .split('\n') + .map((l) => JSON.parse(l) as Record<string, unknown>) + expect(lines).toHaveLength(2) + expect(lines[0]!.type).toBe('childList') + expect(lines[1]!.target).toBe('body') + await fs.rm(outputDir, { recursive: true, force: true }) + }) + + it('writes no trace.mutations entry when there are none', async () => { + const outputDir = await fs.mkdtemp( + path.join(os.tmpdir(), 'trace-mut-none-') + ) + const dir = await writeTraceZip(baseCapturer([]), { + outputDir, + sessionId: 'abc12345', + format: 'ndjson-directory' + }) + await expect(fs.access(path.join(dir, 'trace.mutations'))).rejects.toThrow() + await fs.rm(outputDir, { recursive: true, force: true }) + }) +}) diff --git a/packages/core/tests/trace-mutations.test.ts b/packages/core/tests/trace-mutations.test.ts new file mode 100644 index 00000000..9dfd5bdd --- /dev/null +++ b/packages/core/tests/trace-mutations.test.ts @@ -0,0 +1,87 @@ +import { describe, it, expect } from 'vitest' +import { buildMutationsNdjson } from '@wdio/devtools-core' +import { + isMutationsTruncationMarker, + type TraceMutation +} from '@wdio/devtools-shared' + +function mutation(overrides: Partial<TraceMutation> = {}): TraceMutation { + return { + type: 'childList', + addedNodes: [], + removedNodes: [], + timestamp: 1000, + ...overrides + } +} + +describe('buildMutationsNdjson', () => { + it('returns an empty buffer for no mutations', () => { + const result = buildMutationsNdjson([]) + expect(result.ndjson.byteLength).toBe(0) + expect(result.truncated).toBe(false) + expect(result.written).toBe(0) + }) + + it('serializes one JSON mutation per line with no marker under the cap', () => { + const mutations = [ + mutation({ type: 'childList', addedNodes: [{ tag: 'html' }] }), + mutation({ type: 'attributes', target: 'body', timestamp: 1100 }) + ] + const result = buildMutationsNdjson(mutations) + const lines = result.ndjson.toString('utf8').split('\n') + expect(lines).toHaveLength(2) + expect(result.written).toBe(2) + expect(result.truncated).toBe(false) + expect(lines.some((l) => l.includes('__truncated__'))).toBe(false) + expect((JSON.parse(lines[0]!) as TraceMutation).addedNodes).toEqual([ + { tag: 'html' } + ]) + }) + + it('keeps the earliest under the cap and appends a truncation marker', () => { + const mutations = Array.from({ length: 5 }, (_, i) => + mutation({ timestamp: 1000 + i, target: `n${i}` }) + ) + // Cap sized to fit exactly the first two mutation lines. + const cap = buildMutationsNdjson(mutations.slice(0, 2)).ndjson.byteLength + const result = buildMutationsNdjson(mutations, cap) + const lines = result.ndjson.toString('utf8').split('\n') + expect(result.written).toBe(2) + expect(result.truncated).toBe(true) + expect(JSON.parse(lines.at(-1)!)).toEqual({ + __truncated__: true, + dropped: 3 + }) + // Earliest retained, latest dropped. + expect(result.ndjson.toString('utf8')).toContain('"n0"') + expect(result.ndjson.toString('utf8')).not.toContain('"n4"') + }) + + it('always emits the first mutation even when it alone exceeds the cap', () => { + const big = mutation({ addedNodes: [{ html: 'x'.repeat(200) }] }) + const result = buildMutationsNdjson( + [big, mutation({ timestamp: 2000 })], + 10 + ) + const lines = result.ndjson.toString('utf8').split('\n') + expect(result.written).toBe(1) + expect(result.truncated).toBe(true) + expect(JSON.parse(lines.at(-1)!)).toEqual({ + __truncated__: true, + dropped: 1 + }) + }) +}) + +describe('isMutationsTruncationMarker', () => { + it('recognizes the sentinel and rejects mutations / non-objects', () => { + expect( + isMutationsTruncationMarker({ __truncated__: true, dropped: 3 }) + ).toBe(true) + expect(isMutationsTruncationMarker(mutation())).toBe(false) + expect(isMutationsTruncationMarker({ __truncated__: false })).toBe(false) + expect(isMutationsTruncationMarker(null)).toBe(false) + expect(isMutationsTruncationMarker('x')).toBe(false) + }) +}) diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index e1a0bc2a..82b2bae9 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -79,6 +79,40 @@ try { } }) observer.observe(document.body, config) + + // Form-field state (value / checked) lives on element PROPERTIES, which the + // MutationObserver never reports — so a replayed page shows empty inputs even + // after a fill. Capture input/change and emit a synthetic attribute mutation + // carrying the live value so the replay shows what was typed or selected. + const captureFieldState = (target: EventTarget | null) => { + if (!(target instanceof Element)) { + return + } + const tag = target.tagName + if (tag !== 'INPUT' && tag !== 'TEXTAREA' && tag !== 'SELECT') { + return + } + const ref = getRef(target) + if (!ref) { + return + } + const el = target as HTMLInputElement + const checkable = + tag === 'INPUT' && (el.type === 'checkbox' || el.type === 'radio') + collector.captureMutation([ + { + type: 'attributes', + target: ref, + attributeName: checkable ? 'checked' : 'value', + attributeValue: checkable ? String(el.checked) : String(el.value), + addedNodes: [], + removedNodes: [], + timestamp: Date.now() + } as TraceMutation + ]) + } + document.addEventListener('input', (e) => captureFieldState(e.target), true) + document.addEventListener('change', (e) => captureFieldState(e.target), true) } catch (err) { collector.captureError(err as Error) } diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index b6d37d30..8598cb04 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -390,6 +390,29 @@ export interface TraceMutation { url?: string } +/** + * Trailing sentinel line in a `trace.mutations` NDJSON stream, marking that + * `dropped` late mutations were discarded under the size cap. A distinct shape + * (not a `TraceMutation.type`) so it never collides with a real mutation. This + * is the writer↔reader contract shared by core's exporter and the backend + * reader, so both agree on the key. + */ +export interface MutationsTruncationMarker { + __truncated__: true + dropped: number +} + +/** True when an NDJSON entry is the truncation sentinel, not a mutation. */ +export function isMutationsTruncationMarker( + entry: unknown +): entry is MutationsTruncationMarker { + return ( + typeof entry === 'object' && + entry !== null && + (entry as { __truncated__?: unknown }).__truncated__ === true + ) +} + /** * Captured at each user-facing action boundary in `trace` mode. Feeds the * downstream trace.zip exporter (Phase 4). `screenshot` is base64-encoded JPEG. From 8317f9eaef07d78bd7888021d7b527e789e75d3e Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 17 Jul 2026 18:26:40 +0530 Subject: [PATCH 078/109] fix(service): re-capture DOM across reloadSession and before navigation --- packages/service/src/index.ts | 23 ++++++++++++++++- packages/service/src/session.ts | 17 +++++++++++-- packages/service/tests/index.test.ts | 1 + packages/service/tests/session.test.ts | 35 ++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index ef5320d6..3161e4f2 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -59,7 +59,11 @@ import { type ServiceOptions, TraceType } from './types.js' -import { CONTEXT_CHANGE_COMMANDS, INTERNAL_COMMANDS } from './constants.js' +import { + CONTEXT_CHANGE_COMMANDS, + INTERNAL_COMMANDS, + PAGE_TRANSITION_COMMANDS +} from './constants.js' import { isNativeMobile } from './mobile.js' import { detectInvocationConfigPath } from './standalone.js' @@ -654,6 +658,15 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#screencastRecorder?.setStartMarker() this.#sessionCapturer.sendUpstream('metadata', { url: args[0] }) } + // Flush the outgoing page's buffered mutations (e.g. field edits from prior + // fills — value/checked changes fire no page transition) BEFORE a navigating + // command discards its collector, else the replay shows empty inputs. + if ( + this.#options.mode === 'trace' && + PAGE_TRANSITION_COMMANDS.includes(command) + ) { + await this.#sessionCapturer.captureTrace(this.#browser) + } // Smart stack filtering to detect top-level user commands. Error.stackTraceLimit = 20 const stack = parse(new Error('')).reverse() @@ -772,6 +785,14 @@ export default class DevToolsHookService implements Services.ServiceInstance { * on the new session so the second scenario is also covered. */ async onReload(oldSessionId: string, _newSessionId: string) { + // reloadSession starts a fresh session with no preload script (BiDi preload + // scripts are per-session), so DOM-mutation capture would silently stop + // after the first session — every post-reload scenario would replay the + // prior session's last DOM. Re-arm capture for the new session here, + // independent of screencast, so it runs before the early-return below. + this.#sessionCapturer.resetScriptInjection() + await this.#ensureInjected('reloadSession') + if (!this.#shouldRecordScreencast() || !this.#browser) { return } diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index 6e8b2b9a..51632586 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -203,7 +203,7 @@ export class SessionCapturer extends SessionCapturerBase { ) { await Promise.all([ this.#capturePerformance(browser, commandLogEntry, args), - this.#captureTrace(browser) + this.captureTrace(browser) ]) } } @@ -357,7 +357,20 @@ export class SessionCapturer extends SessionCapturerBase { log.info('✓ Script injected successfully') } - async #captureTrace(browser: WebdriverIO.Browser) { + /** Clear the per-session injection guard so the next `injectScript` re-adds + * the preload script. BiDi preload scripts are scoped to one session, so + * after `reloadSession()` the new session has none — without this, DOM + * capture silently stops after the first session. The guard itself still + * prevents double-adding within a single session. */ + resetScriptInjection() { + this.#isScriptInjected = false + } + + /** Drain the current page's buffered trace data (mutations/console/network) + * into the capturer. Public so the plugin can flush BEFORE a navigating + * command, capturing the outgoing page's field edits (value/checked + * mutations fire no page transition) before its collector is discarded. */ + async captureTrace(browser: WebdriverIO.Browser) { if (!this.#isScriptInjected) { log.warn('Script not injected, skipping trace capture') return diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index 37fc2c86..99ba04da 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -27,6 +27,7 @@ const mockSessionCapturerInstance = { afterCommand: vi.fn(), sendUpstream: vi.fn(), injectScript: vi.fn().mockResolvedValue(undefined), + resetScriptInjection: vi.fn(), captureSource: vi.fn(), captureAssertCommand: vi.fn(), cleanup: vi.fn(), diff --git a/packages/service/tests/session.test.ts b/packages/service/tests/session.test.ts index 1f1185f2..e3a28bba 100644 --- a/packages/service/tests/session.test.ts +++ b/packages/service/tests/session.test.ts @@ -387,6 +387,41 @@ describe('SessionCapturer', () => { }) }) + describe('resetScriptInjection', () => { + // node:fs/promises is auto-mocked at module scope, so stub the preload-file + // read injectScript performs (otherwise readFile → undefined → throws). + beforeEach(() => { + vi.mocked(fs.readFile).mockResolvedValue( + '// preload' as unknown as Buffer + ) + }) + + // Minimal BiDi browser stub — injectScript only needs isBidi + the preload + // hook; the script body comes from the mocked readFile above. + const bidiBrowser = () => + ({ + isBidi: true, + scriptAddPreloadScript: vi.fn().mockResolvedValue(undefined) + }) as unknown as WebdriverIO.Browser + + it('guards against double preload injection within one session', async () => { + const capturer = new SessionCapturer() + const browser = bidiBrowser() + await capturer.injectScript(browser) + await capturer.injectScript(browser) + expect(browser.scriptAddPreloadScript).toHaveBeenCalledTimes(1) + }) + + it('re-adds the preload script for the new session after a reload reset', async () => { + const capturer = new SessionCapturer() + const browser = bidiBrowser() + await capturer.injectScript(browser) + capturer.resetScriptInjection() + await capturer.injectScript(browser) + expect(browser.scriptAddPreloadScript).toHaveBeenCalledTimes(2) + }) + }) + describe('integration', () => { it('should handle complete session capture workflow', async () => { const capturer = new SessionCapturer() From 394f47b48bc747846ec9b906e4202f928c89b5a6 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 17 Jul 2026 18:27:44 +0530 Subject: [PATCH 079/109] fix(core): only capture asserts fired directly by user code --- packages/core/src/assert-patcher.ts | 25 +++++++---- packages/core/src/stack.ts | 31 +++++++++++--- packages/core/tests/assert-patcher.test.ts | 23 +++++++++-- packages/core/tests/stack.test.ts | 48 ++++++++++++++++++++++ 4 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 packages/core/tests/stack.test.ts diff --git a/packages/core/src/assert-patcher.ts b/packages/core/src/assert-patcher.ts index c171c82a..0c6b2753 100644 --- a/packages/core/src/assert-patcher.ts +++ b/packages/core/src/assert-patcher.ts @@ -4,7 +4,7 @@ import { type CollapsedAssertResult, type CommandLog } from '@wdio/devtools-shared' -import { getCallSourceFromStack } from './stack.js' +import { getCallSourceFromStack, isAssertFromUserCode } from './stack.js' import { toError } from './error.js' import { stripAnsi } from './console.js' @@ -121,12 +121,15 @@ function describeAssertFailure(err: unknown): { function makeAssertEmitters( methodName: string, args: unknown[], - onCommand: (cmd: CapturedAssert) => void + onCommand: (cmd: CapturedAssert) => void, + callerStack: string | undefined ): { passed: () => void; failed: (err: unknown) => void } { - const callInfo = getCallSourceFromStack() - // No user-code frame means the assert came from a dependency or framework - // internal, not the user's test — drop it so it never reaches the trace. - if (callInfo.filePath === undefined) { + const callInfo = getCallSourceFromStack(callerStack) + // Drop asserts the user's test didn't fire directly: either no user-code frame + // on the stack at all, or the assert's immediate caller is a dependency (a + // framework/library assert firing during a user operation) — both are noise. + // callerStack is captured in patchedAssert so the frame offsets line up. + if (callInfo.filePath === undefined || !isAssertFromUserCode(callerStack)) { return { passed: () => {}, failed: () => {} } } const startedAt = Date.now() @@ -156,7 +159,15 @@ function makePatchedAssertMethod( onCommand: (cmd: CapturedAssert) => void ): (...args: unknown[]) => unknown { return function patchedAssert(this: unknown, ...args: unknown[]) { - const { passed, failed } = makeAssertEmitters(methodName, args, onCommand) + // Captured HERE so frames[0] is this wrapper and frames[1] is the assert's + // caller — a fixed offset isAssertFromUserCode reads (minification-robust). + const callerStack = new Error().stack + const { passed, failed } = makeAssertEmitters( + methodName, + args, + onCommand, + callerStack + ) let result: unknown // Node's internalMatch dispatches on `fn === assert.match` (Node ≤20), so // a wrapper installed on that property silently inverts `match` into diff --git a/packages/core/src/stack.ts b/packages/core/src/stack.ts index b414d27c..9813a5fb 100644 --- a/packages/core/src/stack.ts +++ b/packages/core/src/stack.ts @@ -33,17 +33,38 @@ export function normalizeFilePath(filePath: string): string { } } +/** + * True when a tracked assert was called DIRECTLY by user code. `stack` MUST be + * captured inside the `patchedAssert` wrapper (`new Error().stack` on its first + * line), so frames[0] is the wrapper and frames[1] is whoever called the + * assert. A non-user immediate caller means a framework/dependency assert fired + * *during* a user operation (which `getCallSourceFromStack` would otherwise + * mis-attribute to the far-off user frame and surface as a noisy row) — drop it. + * Uses the fixed frame offset rather than the wrapper's name, so it survives a + * bundler minifying/renaming the wrapper. No stack → keep (never lose a real + * assert to an absent stack). + */ +export function isAssertFromUserCode(stack: string | undefined): boolean { + if (!stack) { + return true + } + const caller = parseStackTrace(stack)[1] + return !!caller && isUserCodeFrame(caller) +} + /** * Capture `{ filePath, callSource }` for the first user-code frame on the - * current stack. `callSource` is `<file>:<line>` for the UI's source-location - * displays; returns `'unknown:0'` (and `undefined` filePath) when no user - * frame can be found. + * stack. `callSource` is `<file>:<line>` for the UI's source-location displays; + * returns `'unknown:0'` (and `undefined` filePath) when no user frame can be + * found. `stack` defaults to the live stack; callers with a pre-captured stack + * (e.g. the assert wrapper) pass it so the frame offsets line up. */ -export function getCallSourceFromStack(): { +export function getCallSourceFromStack( + stack: string | undefined = new Error().stack +): { filePath: string | undefined callSource: string } { - const stack = new Error().stack if (!stack) { return { filePath: undefined, callSource: 'unknown:0' } } diff --git a/packages/core/tests/assert-patcher.test.ts b/packages/core/tests/assert-patcher.test.ts index 9fb79d9b..5eccc4c7 100644 --- a/packages/core/tests/assert-patcher.test.ts +++ b/packages/core/tests/assert-patcher.test.ts @@ -9,12 +9,14 @@ import { safeSerializeAssertArg, type CapturedAssert } from '../src/assert-patcher.js' -import { getCallSourceFromStack } from '../src/stack.js' +import { getCallSourceFromStack, isAssertFromUserCode } from '../src/stack.js' -// Stub the call-source resolver so tests choose whether an assert looks like -// it originated in user code (a frame) or a dependency/internal (no frame). +// Stub the stack resolvers so tests choose whether an assert looks like it +// originated in user code (a frame + a direct user caller) or a +// dependency/internal (no frame, or an indirect framework caller). vi.mock('../src/stack.js', () => ({ - getCallSourceFromStack: vi.fn() + getCallSourceFromStack: vi.fn(), + isAssertFromUserCode: vi.fn() })) const USER_FRAME = { @@ -44,6 +46,7 @@ beforeEach(() => { } // Default: every assert looks like it came from user code so captures fire. vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) + vi.mocked(isAssertFromUserCode).mockReturnValue(true) }) describe('safeSerializeAssertArg', () => { @@ -165,6 +168,18 @@ describe('patchNodeAssert', () => { expect(captured).toHaveLength(0) }) + it('drops a framework assert whose immediate caller is a dependency', () => { + // A user frame exists deep in the stack, but the assert was fired by a + // dependency during a user operation — isAssertFromUserCode says no. + vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) + vi.mocked(isAssertFromUserCode).mockReturnValue(false) + const captured: CapturedAssert[] = [] + patchNodeAssert((c) => captured.push(c)) + assert.equal(1, 1) + expect(() => assert.equal(1, 2)).toThrow() + expect(captured).toHaveLength(0) + }) + it('keeps a user-origin assert and carries its callSource through', () => { vi.mocked(getCallSourceFromStack).mockReturnValue(USER_FRAME) const captured: CapturedAssert[] = [] diff --git a/packages/core/tests/stack.test.ts b/packages/core/tests/stack.test.ts new file mode 100644 index 00000000..b13d8185 --- /dev/null +++ b/packages/core/tests/stack.test.ts @@ -0,0 +1,48 @@ +import { describe, it, expect } from 'vitest' +import { isAssertFromUserCode } from '@wdio/devtools-core' + +// Synthetic V8 stacks as captured INSIDE patchedAssert: frames[0] is the +// wrapper (any name — may be minified), frames[1] is whoever called the assert. +const stackWithCaller = (callerFile: string, wrapperName = 'patchedAssert') => + [ + 'Error', + ` at ${wrapperName} (/repo/packages/core/src/assert-patcher.ts:158:30)`, + ` at Object.<anonymous> (${callerFile}:5:10)`, + ' at Module._compile (node:internal/modules/cjs/loader:1234:14)' + ].join('\n') + +describe('isAssertFromUserCode', () => { + it('keeps an assert whose immediate caller is user code', () => { + expect( + isAssertFromUserCode(stackWithCaller('/repo/tests/login.spec.ts')) + ).toBe(true) + }) + + it('drops an assert fired by a dependency during a user operation', () => { + expect( + isAssertFromUserCode( + stackWithCaller('/repo/node_modules/webdriverio/build/session.js') + ) + ).toBe(false) + }) + + it('drops one whose immediate caller is bundled dist output', () => { + expect( + isAssertFromUserCode(stackWithCaller('/repo/packages/core/dist/x.js')) + ).toBe(false) + }) + + it('works regardless of the wrapper frame name (minified bundle)', () => { + // The wrapper is renamed by the bundler; the fixed frame offset still holds. + expect( + isAssertFromUserCode(stackWithCaller('/repo/tests/login.spec.ts', 'n2')) + ).toBe(true) + expect( + isAssertFromUserCode(stackWithCaller('/repo/node_modules/x/i.js', 'n2')) + ).toBe(false) + }) + + it('returns true when there is no stack', () => { + expect(isAssertFromUserCode(undefined)).toBe(true) + }) +}) From 62f7c19679b08a2e3219d99dbe3c16a6ac9fe13d Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 17 Jul 2026 19:01:39 +0530 Subject: [PATCH 080/109] feat(app): trace player Transcript tab + Copy-for-LLM --- packages/app/src/components/workbench.ts | 6 + .../src/components/workbench/transcript.ts | 138 ++++++++++++++++++ packages/app/src/controller/DataManager.ts | 6 +- packages/app/src/controller/context.ts | 6 + packages/backend/src/trace-reader.ts | 6 +- packages/backend/tests/trace-reader.test.ts | 20 +++ packages/shared/src/trace-player.ts | 2 + 7 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 packages/app/src/components/workbench/transcript.ts diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index a97b20c9..c3f43bc0 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -33,6 +33,7 @@ import './workbench/console.js' import './workbench/metadata.js' import './workbench/network.js' import './workbench/errors.js' +import './workbench/transcript.js' import './workbench/compare.js' import './browser/snapshot.js' import './browser/trace-timeline.js' @@ -368,6 +369,11 @@ export class DevtoolsWorkbench extends Element { > <wdio-devtools-errors></wdio-devtools-errors> </wdio-devtools-tab> + ${this.playerMode + ? html`<wdio-devtools-tab label="Transcript"> + <wdio-devtools-transcript></wdio-devtools-transcript> + </wdio-devtools-tab>` + : nothing} ${this.#renderCompareTabIfAvailable()} ` } diff --git a/packages/app/src/components/workbench/transcript.ts b/packages/app/src/components/workbench/transcript.ts new file mode 100644 index 00000000..61227814 --- /dev/null +++ b/packages/app/src/components/workbench/transcript.ts @@ -0,0 +1,138 @@ +import { Element } from '@core/element' +import { html, css, nothing } from 'lit' +import { customElement, state } from 'lit/decorators.js' +import { consume } from '@lit/context' + +import type { CommandLog } from '@wdio/devtools-shared' +import { transcriptContext, commandContext } from '../../controller/context.js' + +import '../placeholder.js' + +const COMPONENT = 'wdio-devtools-transcript' + +/** Player-only panel: renders the run's `transcript.md` and offers a one-click + * "Copy prompt" that bundles the transcript with any failing-command errors — + * paste-ready context for an LLM. */ +@customElement(COMPONENT) +export class DevtoolsTranscript extends Element { + @consume({ context: transcriptContext, subscribe: true }) + transcript: string | undefined = undefined + + @consume({ context: commandContext, subscribe: true }) + commands: CommandLog[] = [] + + @state() + private copied = false + + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + overflow: hidden; + } + .bar { + display: flex; + justify-content: flex-end; + padding: 8px 12px; + border-bottom: 1px solid var(--vscode-panel-border); + } + button { + font-family: inherit; + font-size: 11px; + padding: 5px 12px; + border: 1px solid var(--vscode-panel-border); + border-radius: 8px; + background: var(--vscode-input-background); + color: var(--vscode-foreground); + cursor: pointer; + line-height: 1; + } + button:hover { + border-color: var(--accent); + } + button.copied { + color: var(--vscode-charts-green); + border-color: var(--vscode-charts-green); + } + pre { + margin: 0; + padding: 14px; + flex: 1; + overflow: auto; + font-family: var(--vscode-editor-font-family); + font-size: 12px; + line-height: 1.6; + color: var(--vscode-foreground); + white-space: pre-wrap; + word-break: break-word; + } + ` + ] + + #errorMessage(command: CommandLog): string { + const err = command.error + if (err && typeof err === 'object' && 'message' in err) { + return String((err as { message: unknown }).message) + } + return String(err) + } + + /** transcript + a Failures section built from commands carrying an error. */ + #buildPrompt(): string { + const parts: string[] = [] + if (this.transcript) { + parts.push(this.transcript.trim()) + } + const failures = (this.commands ?? []).filter((c) => c.error) + if (failures.length) { + parts.push( + '## Failures\n' + + failures + .map((f) => `- ${f.title ?? f.command}: ${this.#errorMessage(f)}`) + .join('\n') + ) + } + return parts.join('\n\n') + } + + async #copy() { + try { + await navigator.clipboard.writeText(this.#buildPrompt()) + this.copied = true + setTimeout(() => { + this.copied = false + }, 1500) + } catch { + /* clipboard blocked (no user gesture / permissions) — no-op */ + } + } + + render() { + if (!this.transcript) { + return html`<wdio-devtools-placeholder></wdio-devtools-placeholder>` + } + return html` + <div class="bar"> + <button + class=${this.copied ? 'copied' : ''} + @click=${() => this.#copy()} + title="Copy the transcript + failures as an LLM prompt" + > + ${this.copied ? 'Copied' : 'Copy prompt'} + </button> + </div> + <pre>${this.transcript}</pre> + ${nothing} + ` + } +} + +declare global { + interface HTMLElementTagNameMap { + [COMPONENT]: DevtoolsTranscript + } +} diff --git a/packages/app/src/controller/DataManager.ts b/packages/app/src/controller/DataManager.ts index 2af04a25..e5e40972 100644 --- a/packages/app/src/controller/DataManager.ts +++ b/packages/app/src/controller/DataManager.ts @@ -22,7 +22,8 @@ import { baselineContext, selectedTestUidContext, framesContext, - actionGroupsContext + actionGroupsContext, + transcriptContext } from './context.js' import { BASELINE_WS_SCOPE, TRACE_API, WS_SCOPE } from '@wdio/devtools-shared' import { CACHE_ID } from './constants.js' @@ -66,6 +67,7 @@ export class DataManagerController implements ReactiveController { selectedTestUidContextProvider: ContextProvider<typeof selectedTestUidContext> framesContextProvider: ContextProvider<typeof framesContext> actionGroupsContextProvider: ContextProvider<typeof actionGroupsContext> + transcriptContextProvider: ContextProvider<typeof transcriptContext> #playerMode = false @@ -100,6 +102,7 @@ export class DataManagerController implements ReactiveController { actionGroupsContext, undefined ) + this.transcriptContextProvider = this.#provide(transcriptContext, undefined) } #provide<T extends Context<unknown, unknown>>( @@ -216,6 +219,7 @@ export class DataManagerController implements ReactiveController { this.#playerMode = true this.framesContextProvider.setValue(data.frames) this.actionGroupsContextProvider.setValue(data.groups) + this.transcriptContextProvider.setValue(data.transcript) this.loadTraceFile(data.trace) this.hasConnectionProvider.setValue(true) this.#host.requestUpdate() diff --git a/packages/app/src/controller/context.ts b/packages/app/src/controller/context.ts index 151822ea..91fe35de 100644 --- a/packages/app/src/controller/context.ts +++ b/packages/app/src/controller/context.ts @@ -58,3 +58,9 @@ export const framesContext = createContext<TracePlayerFrame[]>( export const actionGroupsContext = createContext< TraceActionChild[] | undefined >(Symbol('actionGroupsContext')) + +/** Markdown run transcript from a loaded trace (`transcript.md`); undefined in + * live mode or when the zip carried none. */ +export const transcriptContext = createContext<string | undefined>( + Symbol('transcriptContext') +) diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 3b4f9ef2..439bc779 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -334,6 +334,9 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { indexByCallId ) const startTime = earliestWallTime(merged.ctxs) + const transcript = files['transcript.md'] + ? strFromU8(files['transcript.md']) + : undefined const trace: TraceLog = { mutations: parseMutationStreams( files, @@ -357,7 +360,8 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { frames, startTime, duration: Math.max(0, Math.max(frameMax, cmdMax) - startTime), - ...(groups ? { groups } : {}) + ...(groups ? { groups } : {}), + ...(transcript ? { transcript } : {}) } } diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 2dfc7a7b..858f56a6 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -252,6 +252,26 @@ describe('parseTraceZip', () => { expect(trace.mutations[1]).toMatchObject({ target: 'body' }) }) + it('reads transcript.md into the player payload when present', () => { + const zip = zipSync({ + 'trace.trace': toNdjson([ + { + type: 'context-options', + wallTime: WALL_TIME, + browserName: 'chrome', + contextId: 'context@abcd1234', + options: { viewport: { width: 1024, height: 768 } } + } + ]), + 'transcript.md': strToU8('# Session\n\n1. Page.navigate("https://x")') + }) + expect(parseTraceZip(zip).transcript).toContain('Page.navigate') + }) + + it('leaves transcript undefined when the zip carries none', () => { + expect(parseTraceZip(fixtureZip()).transcript).toBeUndefined() + }) + it('restores callSource and sources from stack frames + src resources', () => { const { trace } = parseTraceZip(fixtureZip()) const click = trace.commands.find((c) => c.command === 'click') diff --git a/packages/shared/src/trace-player.ts b/packages/shared/src/trace-player.ts index ef0eaafc..ec02fd29 100644 --- a/packages/shared/src/trace-player.ts +++ b/packages/shared/src/trace-player.ts @@ -49,4 +49,6 @@ export interface TracePlayerData { /** Root children of the action tree, chronological. Absent when the zip * carried no structural steps — the player then renders the flat list. */ groups?: TraceActionChild[] + /** Markdown run transcript (`transcript.md`), when the zip carried one. */ + transcript?: string } From 5908b6f2adee5ba61286972624b9e492b235ea2a Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 00:55:26 +0530 Subject: [PATCH 081/109] feat(app): trace player A11y tab + element overlay (pick-locator) --- examples/wdio/cucumber/wdio.conf.ts | 1 + .../src/components/browser/element-overlay.ts | 64 ++++++ .../app/src/components/browser/snapshot.ts | 137 ++++++++++-- packages/app/src/components/workbench.ts | 10 +- .../app/src/components/workbench/a11y-tree.ts | 207 ++++++++++++++++++ packages/backend/src/trace-reader-types.ts | 10 + packages/backend/src/trace-reader.ts | 51 ++++- packages/backend/tests/trace-reader.test.ts | 33 +++ packages/shared/src/types.ts | 4 + 9 files changed, 493 insertions(+), 24 deletions(-) create mode 100644 packages/app/src/components/browser/element-overlay.ts create mode 100644 packages/app/src/components/workbench/a11y-tree.ts diff --git a/examples/wdio/cucumber/wdio.conf.ts b/examples/wdio/cucumber/wdio.conf.ts index 75a1f5b9..814d0b03 100644 --- a/examples/wdio/cucumber/wdio.conf.ts +++ b/examples/wdio/cucumber/wdio.conf.ts @@ -133,6 +133,7 @@ export const config: Options.Testrunner = { 'devtools', { mode: 'trace' as const, + filmstrip: true, // tracePolicy: 'retain-on-failure', traceGranularity: 'test' as const, // NEW: per-test screenshot + video, attached inline to Allure. diff --git a/packages/app/src/components/browser/element-overlay.ts b/packages/app/src/components/browser/element-overlay.ts new file mode 100644 index 00000000..3ce1129e --- /dev/null +++ b/packages/app/src/components/browser/element-overlay.ts @@ -0,0 +1,64 @@ +// Draws the "element overlay" — a labeled, click-to-copy box over each locator +// the test interacted with — INSIDE the replayed iframe's document, so the +// boxes inherit the iframe's scale transform (no manual coordinate math). Kept +// out of snapshot.ts so that file stays focused on capture/replay. + +const OVERLAY_CLASS = '__wdio-el-overlay__' + +export function clearElementOverlay( + iframe: HTMLIFrameElement | null | undefined +): void { + iframe?.contentDocument + ?.querySelectorAll(`.${OVERLAY_CLASS}`) + .forEach((node) => node.remove()) +} + +/** + * Outline each selector that resolves in the replayed iframe, labelled with the + * locator and copying it on click. Selectors that querySelector can't parse + * (WDIO-style, e.g. `button*=Login`) are skipped rather than throwing. + */ +export function drawElementOverlay( + iframe: HTMLIFrameElement | null | undefined, + selectors: string[], + onPick: (selector: string) => void +): void { + const docEl = iframe?.contentDocument + if (!docEl?.body) { + return + } + clearElementOverlay(iframe) + const scrollY = iframe?.contentWindow?.scrollY || 0 + const scrollX = iframe?.contentWindow?.scrollX || 0 + for (const selector of selectors) { + let el: Element | null = null + try { + el = docEl.querySelector(selector) + } catch { + continue // non-CSS (WDIO) locator — can't resolve in the DOM + } + if (!el) { + continue + } + const rect = el.getBoundingClientRect() + const box = docEl.createElement('div') + box.className = OVERLAY_CLASS + box.setAttribute( + 'style', + `position:absolute;box-sizing:border-box;top:${scrollY + rect.top}px;left:${scrollX + rect.left}px;width:${rect.width}px;height:${rect.height}px;outline:1.5px solid #38bdf8;background:rgba(56,189,248,0.12);z-index:9999;cursor:pointer;` + ) + box.title = `Copy locator: ${selector}` + const label = docEl.createElement('div') + label.textContent = selector + label.setAttribute( + 'style', + 'position:absolute;top:-15px;left:-1px;font:10px/1.4 ui-monospace,monospace;background:#38bdf8;color:#06222e;padding:0 4px;white-space:nowrap;border-radius:3px 3px 0 0;' + ) + box.appendChild(label) + box.addEventListener('click', (e) => { + e.stopPropagation() + onPick(selector) + }) + docEl.body.appendChild(box) + } +} diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index fe4cef66..35d88a51 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -3,6 +3,7 @@ import { html, nothing } from 'lit' import { consume } from '@lit/context' import { snapshotStyles } from './snapshot-styles.js' import { renderBrowserChrome } from './browser-chrome.js' +import { drawElementOverlay, clearElementOverlay } from './element-overlay.js' import { commandPageUrl } from './url-at-timestamp.js' import { imageMime } from './trace-timeline-utils.js' @@ -22,6 +23,7 @@ import type { Metadata, MetadataBySession } from '@wdio/devtools-shared' import '../placeholder.js' import './screencast-player.js' +import '~icons/mdi/cursor-default-click-outline.js' const MUTATION_SELECTOR = '__mutation-highlight__' @@ -62,6 +64,9 @@ export class DevtoolsBrowser extends Element { * 'snapshot' — show DOM mutations replay and per-command screenshots */ #viewMode: 'snapshot' | 'video' = 'snapshot' + /** When on, outline the elements the test interacted with (their command + * target selectors) on the replayed page; click a box to copy its locator. */ + #overlayOn = false @consume({ context: metadataContext, subscribe: true }) metadata: Metadata | undefined = undefined @@ -97,6 +102,7 @@ export class DevtoolsBrowser extends Element { window.addEventListener('app-mutation-select', (ev) => this.#renderBrowserState(ev.detail) ) + window.addEventListener('a11y-highlight', this.#highlightBySelector) window.addEventListener( 'show-command', this.#handleShowCommand as EventListener @@ -186,6 +192,9 @@ export class DevtoolsBrowser extends Element { this.iframe.style.left = `${Math.max(0, (availW - viewportWidth * scale) / 2)}px` this.iframe.style.top = '0px' } + // Layout is now settled — the one moment element rects are reliable, so + // the overlay boxes track the replayed DOM after every step and resize. + this.#redrawOverlay() }) } @@ -421,24 +430,18 @@ export class DevtoolsBrowser extends Element { return rootElement.querySelector(`*[data-wdio-ref="${ref}"]`) as HTMLElement } - #highlightMutation(ev: CustomEvent<TraceMutation | null>) { - if (!ev.detail) { - this.iframe?.contentDocument - ?.querySelector(`.${MUTATION_SELECTOR}`) - ?.remove() - return - } + #clearHighlight() { + this.iframe?.contentDocument + ?.querySelector(`.${MUTATION_SELECTOR}`) + ?.remove() + } - const mutation = ev.detail + /** Draw the outline box over an element in the replayed iframe. */ + #outline(el: HTMLElement) { const docEl = this.iframe?.contentDocument - if (!docEl || !mutation.target) { - return - } - const el = this.#queryElement(mutation.target) - if (!el) { + if (!docEl) { return } - el.scrollIntoView({ block: 'center', inline: 'center' }) const rect = el.getBoundingClientRect() const scrollY = this.iframe?.contentWindow?.scrollY || 0 @@ -450,10 +453,83 @@ export class DevtoolsBrowser extends Element { 'style', `position: absolute; background: #38bdf8; outline: 2px dotted red; opacity: .2; top: ${scrollY + rect.top}px; left: ${scrollX + rect.left}px; width: ${rect.width}px; height: ${rect.height}px; z-index: 10000;` ) - docEl.querySelector(`.${MUTATION_SELECTOR}`)?.remove() + this.#clearHighlight() docEl.body.appendChild(highlight) } + #highlightMutation(ev: CustomEvent<TraceMutation | null>) { + if (!ev.detail) { + this.#clearHighlight() + return + } + const el = ev.detail.target + ? this.#queryElement(ev.detail.target) + : undefined + if (el) { + this.#outline(el) + } + } + + /** Outline the element for an a11y-tree locator (CSS selectors only; WDIO + * locators like `button*=Login` can't resolve via querySelector → no-op). */ + #highlightBySelector = (ev: Event) => { + const detail = (ev as CustomEvent<{ selector?: string } | null>).detail + const docEl = this.iframe?.contentDocument + if (!docEl) { + return + } + this.#clearHighlight() + if (!detail?.selector) { + return + } + let el: HTMLElement | null = null + try { + el = docEl.querySelector(detail.selector) + } catch { + return + } + if (el) { + this.#outline(el) + } + } + + /** Distinct target selectors the test interacted with (each command's first + * arg), in order. querySelector filters non-element args (URLs, matcher + * strings) at draw time, so this stays permissive. */ + #testSelectors(): string[] { + const seen = new Set<string>() + for (const command of this.commands ?? []) { + const arg = command.args?.[0] + if (typeof arg === 'string' && arg) { + seen.add(arg) + } + } + return [...seen] + } + + // Draws immediately — call only once the iframe has laid out (the sizing rAF + // in #sizeSnapshotToViewport is the one point that holds for both a replay and + // a resize; reading element rects any earlier yields pre-layout positions). + #redrawOverlay() { + if (!this.#overlayOn) { + clearElementOverlay(this.iframe) + return + } + drawElementOverlay(this.iframe, this.#testSelectors(), (selector) => + this.#copyLocator(selector) + ) + } + + #toggleOverlay() { + this.#overlayOn = !this.#overlayOn + this.#redrawOverlay() + this.requestUpdate() + } + + #copyLocator(selector: string) { + navigator.clipboard?.writeText(selector).catch(() => {}) + } + async #renderBrowserState(mutationEntry?: TraceMutation) { const mutations = this.mutations if (!mutations || !mutations.length) { @@ -499,6 +575,8 @@ export class DevtoolsBrowser extends Element { } } + // The replay wiped any overlay boxes; the requestUpdate below runs updated() + // → #sizeSnapshotToViewport, whose settled rAF redraws them post-layout. this.requestUpdate() } @@ -535,6 +613,28 @@ export class DevtoolsBrowser extends Element { return null } + /** Compact "element overlay" toggle in the browser chrome. Shown only when + * the DOM is replayable; boxes the elements the test interacted with. */ + #renderOverlayToggle(hasMutations: number | null) { + if (!hasMutations) { + return nothing + } + const on = this.#overlayOn + return html`<button + title="Element overlay — outline what the test interacted with" + @click=${() => this.#toggleOverlay()} + style="display:inline-grid;place-items:center;width:24px;height:24px;margin:0 8px;flex:none;border-radius:6px;cursor:pointer;border:1px solid var(--vscode-panel-border, #2a2a31);background:${on + ? 'var(--accent, #ff6a3d)' + : 'transparent'};color:${on + ? '#1a0d06' + : 'var(--vscode-descriptionForeground, #8b8b96)'};" + > + <icon-mdi-cursor-default-click-outline + style="width:14px;height:14px;" + ></icon-mdi-cursor-default-click-outline> + </button>` + } + #renderViewToggle() { if (this.#videos.length === 0) { return nothing @@ -643,7 +743,12 @@ export class DevtoolsBrowser extends Element { <section class="w-full h-full bg-sideBarBackground rounded-[14px] border-2 border-panelBorder" > - ${renderBrowserChrome(this.#displayUrl, this.#renderViewToggle())} + ${renderBrowserChrome( + this.#displayUrl, + html`${this.#renderOverlayToggle( + hasMutations + )}${this.#renderViewToggle()}` + )} ${this.#renderViewport(hasMutations)} </section> ` diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index c3f43bc0..c4fdad53 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -33,6 +33,7 @@ import './workbench/console.js' import './workbench/metadata.js' import './workbench/network.js' import './workbench/errors.js' +import './workbench/a11y-tree.js' import './workbench/transcript.js' import './workbench/compare.js' import './browser/snapshot.js' @@ -370,9 +371,12 @@ export class DevtoolsWorkbench extends Element { <wdio-devtools-errors></wdio-devtools-errors> </wdio-devtools-tab> ${this.playerMode - ? html`<wdio-devtools-tab label="Transcript"> - <wdio-devtools-transcript></wdio-devtools-transcript> - </wdio-devtools-tab>` + ? html`<wdio-devtools-tab label="A11y"> + <wdio-devtools-a11y></wdio-devtools-a11y> + </wdio-devtools-tab> + <wdio-devtools-tab label="Transcript"> + <wdio-devtools-transcript></wdio-devtools-transcript> + </wdio-devtools-tab>` : nothing} ${this.#renderCompareTabIfAvailable()} ` diff --git a/packages/app/src/components/workbench/a11y-tree.ts b/packages/app/src/components/workbench/a11y-tree.ts new file mode 100644 index 00000000..e3fd0458 --- /dev/null +++ b/packages/app/src/components/workbench/a11y-tree.ts @@ -0,0 +1,207 @@ +import { Element } from '@core/element' +import { html, css, nothing, type TemplateResult } from 'lit' +import { customElement, state } from 'lit/decorators.js' + +import type { CommandLog } from '@wdio/devtools-shared' + +import '../placeholder.js' + +const COMPONENT = 'wdio-devtools-a11y' +const NAME_MAX = 64 + +interface A11yNode { + depth: number + role: string + name: string + /** Captured locator (from the serialized `→ …` suffix), when the node is an + * element — hovering highlights it in the snapshot; clicking copies it. */ + selector?: string +} + +/** Player dock tab: the accessibility tree (roles + accessible names) captured + * for the selected command — the semantic view a screen reader sees, distinct + * from the raw DOM the snapshot pane replays. Follows the active command via + * the same `show-command` event the browser pane listens to. */ +@customElement(COMPONENT) +export class DevtoolsA11yTree extends Element { + @state() + private active?: CommandLog + + /** Locator just copied — the row shows a brief "copied" flash. */ + @state() + private copiedSel?: string + + #onShow = (e: Event) => { + this.active = (e as CustomEvent<{ command?: CommandLog }>).detail?.command + } + + connectedCallback() { + super.connectedCallback() + window.addEventListener('show-command', this.#onShow as EventListener) + } + disconnectedCallback() { + window.removeEventListener('show-command', this.#onShow as EventListener) + this.#highlight(undefined) + super.disconnectedCallback() + } + + /** Ask the snapshot pane to outline (or clear) the element for this locator. */ + #highlight(selector?: string) { + window.dispatchEvent( + new CustomEvent('a11y-highlight', { + detail: selector ? { selector } : null + }) + ) + } + + async #copy(selector?: string) { + if (!selector) { + return + } + try { + await navigator.clipboard.writeText(selector) + this.copiedSel = selector + setTimeout(() => { + this.copiedSel = undefined + }, 1200) + } catch { + /* clipboard blocked — no-op */ + } + } + + static styles = [ + ...Element.styles, + css` + :host { + display: block; + width: 100%; + height: 100%; + overflow: auto; + } + .tree { + font-family: var(--vscode-editor-font-family, monospace); + font-size: 12px; + padding: 10px 12px; + } + .hdr { + color: var(--vscode-descriptionForeground); + font-size: 11px; + margin: 0 0 8px 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .node { + display: flex; + align-items: baseline; + gap: 7px; + padding: 2px 6px; + border-radius: 6px; + line-height: 1.35; + white-space: nowrap; + } + .node:hover { + background: var( + --vscode-list-hoverBackground, + rgba(255, 255, 255, 0.05) + ); + } + .twig { + color: var(--vscode-descriptionForeground); + opacity: 0.5; + flex: none; + } + .role { + color: var(--accent, #ff6a3d); + flex: none; + } + .nm { + color: var(--vscode-charts-green, #46c96a); + overflow: hidden; + text-overflow: ellipsis; + } + .node.pick { + cursor: pointer; + } + .sel { + margin-left: auto; + padding-left: 12px; + color: var(--pick, #38bdf8); + opacity: 0; + font-size: 11px; + flex: none; + } + .node.pick:hover .sel { + opacity: 0.85; + } + ` + ] + + #trunc(name: string): string { + return name.length > NAME_MAX ? name.slice(0, NAME_MAX - 1) + '…' : name + } + + /** Parse one serialized line — `<indent>role[level] "name" [∈ …] [→ …]` — into + * a node, dropping the purpose/selector suffixes for a clean tree. Header and + * blank lines return null. */ + #parse(line: string): A11yNode | null { + const trimmed = line.trimStart() + if (!trimmed || trimmed.startsWith('[Page')) { + return null + } + const indent = line.length - trimmed.length + const depth = Math.max(0, Math.floor(indent / 2) - 1) + const role = /^\S+/.exec(trimmed)?.[0] ?? trimmed + const name = /"([^"]*)"/.exec(trimmed)?.[1] ?? '' + // The `→ <locator>` suffix (last one wins; skips any `∈ "purpose"` before it). + const selector = trimmed.includes('→') + ? trimmed.split('→').pop()?.trim() || undefined + : undefined + return { depth, role, name, selector } + } + + #row(node: A11yNode): TemplateResult { + const sel = node.selector + return html`<div + class="node ${sel ? 'pick' : ''}" + style="padding-left:${8 + node.depth * 16}px" + @mouseenter=${() => this.#highlight(sel)} + @mouseleave=${() => this.#highlight(undefined)} + @click=${() => this.#copy(sel)} + title=${sel ? `Click to copy locator: ${sel}` : nothing} + > + <span class="twig">•</span> + <span class="role">${node.role}</span> + ${node.name + ? html`<span class="nm">"${this.#trunc(node.name)}"</span>` + : nothing} + ${sel + ? html`<span class="sel" + >${this.copiedSel === sel ? 'copied ✓' : sel}</span + >` + : nothing} + </div>` + } + + render() { + const text = this.active?.snapshotText + if (!text) { + return html`<wdio-devtools-placeholder></wdio-devtools-placeholder>` + } + const lines = text.split('\n') + const header = lines[0]?.startsWith('[Page') ? lines[0] : undefined + const nodes = lines + .map((l) => this.#parse(l)) + .filter((n): n is A11yNode => n !== null) + return html`<div class="tree"> + ${header ? html`<div class="hdr">${header}</div>` : nothing} + ${nodes.map((n) => this.#row(n))} + </div>` + } +} + +declare global { + interface HTMLElementTagNameMap { + [COMPONENT]: DevtoolsA11yTree + } +} diff --git a/packages/backend/src/trace-reader-types.ts b/packages/backend/src/trace-reader-types.ts index 0afc3a9b..098b43b6 100644 --- a/packages/backend/src/trace-reader-types.ts +++ b/packages/backend/src/trace-reader-types.ts @@ -32,6 +32,15 @@ export interface ScreencastFrameEvent { timestamp: number } +/** Per-action DOM snapshot event. Always emitted (independent of the sparse/ + * dense filmstrip), so it's the reliable anchor for per-command data: `callId` + * maps to the command and `wallTime` (the original snapshot ts) names the + * `-snapshot.txt` / `-elements.json` resources. */ +export interface FrameSnapshotEvent { + type: 'frame-snapshot' + snapshot: { callId: string; pageId: string; wallTime: number } +} + export interface ConsoleEvent { type: 'console' time: number @@ -97,6 +106,7 @@ export interface CategorizedEvents { befores: Map<string, BeforeEvent> afters: Map<string, AfterEvent> frameEvents: ScreencastFrameEvent[] + frameSnapshots: FrameSnapshotEvent[] consoleEvents: (ConsoleEvent | StdioEvent)[] } diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 439bc779..4cb987a5 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -36,6 +36,7 @@ import type { CategorizedEvents, ConsoleEvent, ContextOptionsEvent, + FrameSnapshotEvent, HarSnapshot, MergedEvents, ScreencastFrameEvent, @@ -65,6 +66,7 @@ function categorizeEvents( const befores = new Map<string, BeforeEvent>() const afters = new Map<string, AfterEvent>() const frameEvents: ScreencastFrameEvent[] = [] + const frameSnapshots: FrameSnapshotEvent[] = [] const consoleEvents: (ConsoleEvent | StdioEvent)[] = [] let ctx: ContextOptionsEvent | undefined for (const event of events) { @@ -85,6 +87,9 @@ function categorizeEvents( case 'screencast-frame': frameEvents.push(event as unknown as ScreencastFrameEvent) break + case 'frame-snapshot': + frameSnapshots.push(event as unknown as FrameSnapshotEvent) + break case 'console': case 'stdout': case 'stderr': @@ -92,7 +97,7 @@ function categorizeEvents( break } } - return { ctx, befores, afters, frameEvents, consoleEvents } + return { ctx, befores, afters, frameEvents, frameSnapshots, consoleEvents } } // Anchors both encodings: our offsets (monotonicTime 0 → anchor = wallTime) @@ -127,6 +132,7 @@ function mergeStreams(streams: CategorizedEvents[]): MergedEvents { befores: new Map(), afters: new Map(), frameEvents: [], + frameSnapshots: [], consoleEvents: [] } for (const stream of streams) { @@ -140,6 +146,7 @@ function mergeStreams(streams: CategorizedEvents[]): MergedEvents { merged.afters.set(callId, after) } merged.frameEvents.push(...stream.frameEvents) + merged.frameSnapshots.push(...stream.frameSnapshots) merged.consoleEvents.push(...stream.consoleEvents) } return merged @@ -200,7 +207,8 @@ function reconstructCommand( before: BeforeEvent, after: AfterEvent | undefined, afters: Map<string, AfterEvent>, - frames: TracePlayerFrame[] + frames: TracePlayerFrame[], + snapshotText?: string ): CommandLog { const endTime = after?.endTime ?? before.startTime const command: CommandLog = { @@ -229,12 +237,35 @@ function reconstructCommand( if (frame) { command.screenshot = frame.screenshot } + if (snapshotText) { + command.snapshotText = snapshotText + } return command } +/** Resolve each per-action `-snapshot.txt` (a11y tree) resource, keyed by the + * command's callId. The frame-snapshot event names the resource via its pageId + * + original timestamp (wallTime), so this works regardless of whether the zip + * used the sparse or dense filmstrip. */ +function buildSnapshotTextByCallId( + files: Record<string, Uint8Array>, + frameSnapshots: FrameSnapshotEvent[] +): Map<string, string> { + const byCallId = new Map<string, string>() + for (const { snapshot } of frameSnapshots) { + const data = + files[`resources/${snapshot.pageId}-${snapshot.wallTime}-snapshot.txt`] + if (data) { + byCallId.set(snapshot.callId, strFromU8(data)) + } + } + return byCallId +} + function buildCommands( events: MergedEvents, - frames: TracePlayerFrame[] + frames: TracePlayerFrame[], + files: Record<string, Uint8Array> ): { commands: CommandLog[] maxTime: number @@ -242,6 +273,10 @@ function buildCommands( } { const entries: { callId: string; command: CommandLog }[] = [] const structural = collectStructuralIds(events.befores) + const snapshotByCallId = buildSnapshotTextByCallId( + files, + events.frameSnapshots + ) let maxTime = 0 for (const [callId, before] of events.befores) { // Group markers are structure, not actions — as command rows their end @@ -250,7 +285,13 @@ function buildCommands( continue } const after = events.afters.get(callId) - const command = reconstructCommand(before, after, events.afters, frames) + const command = reconstructCommand( + before, + after, + events.afters, + frames, + snapshotByCallId.get(callId) + ) maxTime = Math.max(maxTime, command.timestamp) entries.push({ callId, command }) } @@ -326,7 +367,7 @@ export function parseTraceZip(zip: Uint8Array): TracePlayerData { commands, maxTime: cmdMax, indexByCallId - } = buildCommands(merged, frames) + } = buildCommands(merged, frames, files) const groups = buildActionTree( merged.befores, merged.afters, diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 858f56a6..0f34c23c 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -272,6 +272,39 @@ describe('parseTraceZip', () => { expect(parseTraceZip(fixtureZip()).transcript).toBeUndefined() }) + it('attaches per-command a11y snapshotText via the frame-snapshot resource', () => { + const zip = zipSync({ + 'trace.trace': toNdjson([ + { + type: 'context-options', + wallTime: WALL_TIME, + browserName: 'chrome', + contextId: 'context@abcd1234', + options: { viewport: { width: 1024, height: 768 } } + }, + { + type: 'before', + callId: 'call@1', + startTime: 0, + class: 'Element', + method: 'fill', + params: { selector: '#username', value: 'tom' } + }, + { type: 'after', callId: 'call@1', endTime: 50 }, + // wallTime here names the resource, independent of the filmstrip mode. + { + type: 'frame-snapshot', + snapshot: { callId: 'call@1', pageId: 'page@abcd1234', wallTime: 999 } + } + ]), + 'resources/page@abcd1234-999-snapshot.txt': strToU8( + '[Page: Login]\n textbox "Username"\n button "Login"' + ) + }) + const { trace } = parseTraceZip(zip) + expect(trace.commands[0]?.snapshotText).toContain('textbox "Username"') + }) + it('restores callSource and sources from stack frames + src resources', () => { const { trace } = parseTraceZip(fixtureZip()) const click = trace.commands.find((c) => c.command === 'click') diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 8598cb04..40cd45b7 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -173,6 +173,10 @@ export interface CommandLog { cookies?: string documentInfo?: DocumentInfo id?: number + /** Depth-indented accessibility-tree text for the page state at this command + * (from the per-action `-snapshot.txt` resource). Reconstructed by the trace + * reader; drives the player's A11y tab. */ + snapshotText?: string } /** From 86140ae03a55c53dae8b4283de23c6828cfaeffd Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 00:59:19 +0530 Subject: [PATCH 082/109] polish(app): float the transcript copy control as an in-corner icon --- .../src/components/workbench/transcript.ts | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/app/src/components/workbench/transcript.ts b/packages/app/src/components/workbench/transcript.ts index 61227814..4b0805d8 100644 --- a/packages/app/src/components/workbench/transcript.ts +++ b/packages/app/src/components/workbench/transcript.ts @@ -7,6 +7,8 @@ import type { CommandLog } from '@wdio/devtools-shared' import { transcriptContext, commandContext } from '../../controller/context.js' import '../placeholder.js' +import '~icons/mdi/content-copy.js' +import '~icons/mdi/check.js' const COMPONENT = 'wdio-devtools-transcript' @@ -28,31 +30,32 @@ export class DevtoolsTranscript extends Element { ...Element.styles, css` :host { - display: flex; - flex-direction: column; + display: block; + position: relative; width: 100%; height: 100%; - overflow: hidden; - } - .bar { - display: flex; - justify-content: flex-end; - padding: 8px 12px; - border-bottom: 1px solid var(--vscode-panel-border); + overflow: auto; } button { - font-family: inherit; - font-size: 11px; - padding: 5px 12px; + position: absolute; + top: 10px; + right: 14px; + z-index: 2; + display: inline-grid; + place-items: center; + width: 28px; + height: 28px; + padding: 0; border: 1px solid var(--vscode-panel-border); border-radius: 8px; background: var(--vscode-input-background); - color: var(--vscode-foreground); + color: var(--vscode-descriptionForeground); cursor: pointer; - line-height: 1; + font-size: 14px; } button:hover { border-color: var(--accent); + color: var(--vscode-foreground); } button.copied { color: var(--vscode-charts-green); @@ -60,9 +63,7 @@ export class DevtoolsTranscript extends Element { } pre { margin: 0; - padding: 14px; - flex: 1; - overflow: auto; + padding: 14px 52px 14px 14px; font-family: var(--vscode-editor-font-family); font-size: 12px; line-height: 1.6; @@ -116,15 +117,15 @@ export class DevtoolsTranscript extends Element { return html`<wdio-devtools-placeholder></wdio-devtools-placeholder>` } return html` - <div class="bar"> - <button - class=${this.copied ? 'copied' : ''} - @click=${() => this.#copy()} - title="Copy the transcript + failures as an LLM prompt" - > - ${this.copied ? 'Copied' : 'Copy prompt'} - </button> - </div> + <button + class=${this.copied ? 'copied' : ''} + @click=${() => this.#copy()} + title="Copy the transcript + failures as an LLM prompt" + > + ${this.copied + ? html`<icon-mdi-check></icon-mdi-check>` + : html`<icon-mdi-content-copy></icon-mdi-content-copy>`} + </button> <pre>${this.transcript}</pre> ${nothing} ` From 0f00332f1e66c61d4c034432586213142b4dc4c2 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 13:44:07 +0530 Subject: [PATCH 083/109] =?UTF-8?q?feat(app):=20bidirectional=20element-ov?= =?UTF-8?q?erlay=20=E2=86=94=20A11y-tree=20linking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + .../src/components/browser/element-overlay.ts | 31 +++++++- .../app/src/components/browser/snapshot.ts | 26 ++++++- packages/app/src/components/tabs.ts | 14 ++++ .../app/src/components/workbench/a11y-tree.ts | 75 ++++++++++++++++++- 5 files changed, 142 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a36f9cb3..a2d08b44 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "build": "pnpm -r build", + "show-trace": "node packages/backend/dist/show-trace.js", "demo:wdio": "wdio run ./examples/wdio/cucumber/wdio.conf.ts", "demo:wdio:mocha": "wdio run ./examples/wdio/mocha/wdio.conf.ts", "demo:wdio:retry": "wdio run ./examples/wdio/mocha/wdio.retry.conf.ts", diff --git a/packages/app/src/components/browser/element-overlay.ts b/packages/app/src/components/browser/element-overlay.ts index 3ce1129e..c83cb0db 100644 --- a/packages/app/src/components/browser/element-overlay.ts +++ b/packages/app/src/components/browser/element-overlay.ts @@ -5,6 +5,16 @@ const OVERLAY_CLASS = '__wdio-el-overlay__' +export interface OverlayHandlers { + /** Click a box — copy its locator + jump to the A11y row (selector + name). */ + onPick: (selector: string, label: string) => void + /** Hover a box — reveal the matching a11y-tree row (by selector, else by the + * element's accessible name for locators the serializer captured a different + * way, e.g. the test's `button[type=submit]` vs the tree's `button*=Login`). */ + onHover?: (selector: string, label: string) => void + onLeave?: () => void +} + export function clearElementOverlay( iframe: HTMLIFrameElement | null | undefined ): void { @@ -13,6 +23,20 @@ export function clearElementOverlay( .forEach((node) => node.remove()) } +/** Cheap accessible-name approximation for cross-referencing the a11y tree — + * the visible label a screen reader would announce, not the raw value. */ +function elementLabel(el: Element): string { + const aria = el.getAttribute('aria-label')?.trim() + if (aria) { + return aria + } + const text = el.textContent?.trim() + if (text) { + return text + } + return el.getAttribute('placeholder')?.trim() ?? '' +} + /** * Outline each selector that resolves in the replayed iframe, labelled with the * locator and copying it on click. Selectors that querySelector can't parse @@ -21,7 +45,7 @@ export function clearElementOverlay( export function drawElementOverlay( iframe: HTMLIFrameElement | null | undefined, selectors: string[], - onPick: (selector: string) => void + handlers: OverlayHandlers ): void { const docEl = iframe?.contentDocument if (!docEl?.body) { @@ -40,6 +64,7 @@ export function drawElementOverlay( if (!el) { continue } + const name = elementLabel(el) const rect = el.getBoundingClientRect() const box = docEl.createElement('div') box.className = OVERLAY_CLASS @@ -57,8 +82,10 @@ export function drawElementOverlay( box.appendChild(label) box.addEventListener('click', (e) => { e.stopPropagation() - onPick(selector) + handlers.onPick(selector, name) }) + box.addEventListener('mouseenter', () => handlers.onHover?.(selector, name)) + box.addEventListener('mouseleave', () => handlers.onLeave?.()) docEl.body.appendChild(box) } } diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index 35d88a51..c647fdad 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -515,8 +515,30 @@ export class DevtoolsBrowser extends Element { clearElementOverlay(this.iframe) return } - drawElementOverlay(this.iframe, this.#testSelectors(), (selector) => - this.#copyLocator(selector) + drawElementOverlay(this.iframe, this.#testSelectors(), { + onPick: (selector, label) => this.#pickElement(selector, label), + onHover: (selector, label) => this.#revealA11yRow(selector, label), + onLeave: () => this.#revealA11yRow() + }) + } + + /** Clicking a box: copy the locator, open the A11y tab, and pin its row. */ + #pickElement(selector: string, label: string) { + this.#copyLocator(selector) + window.dispatchEvent( + new CustomEvent('open-dock-tab', { detail: { label: 'A11y' } }) + ) + this.#revealA11yRow(selector, label, true) + } + + /** Reverse link: ask the A11y tab to highlight the matching row — by selector, + * falling back to the element's accessible name. `pin` keeps it highlighted + * (click) rather than clearing on mouse-out (hover). */ + #revealA11yRow(selector?: string, label?: string, pin = false) { + window.dispatchEvent( + new CustomEvent('a11y-reveal', { + detail: selector ? { selector, label, pin } : null + }) ) } diff --git a/packages/app/src/components/tabs.ts b/packages/app/src/components/tabs.ts index 316c6bb8..9b4d2249 100644 --- a/packages/app/src/components/tabs.ts +++ b/packages/app/src/components/tabs.ts @@ -12,6 +12,15 @@ export class DevtoolsTabs extends Element { #tabList: string[] = [] #badgeCheckInterval?: number + // Programmatic tab open (e.g. clicking an element overlay box jumps to A11y). + // Guarded by activateTab, so only the tabs instance that owns the label reacts. + #onOpenTab = (e: Event) => { + const label = (e as CustomEvent<{ label?: string }>).detail?.label + if (label) { + this.activateTab(label) + } + } + @property({ type: String }) cacheId?: string @@ -142,6 +151,7 @@ export class DevtoolsTabs extends Element { connectedCallback() { super.connectedCallback() + window.addEventListener('open-dock-tab', this.#onOpenTab as EventListener) setTimeout(() => { // wait till innerHTML is parsed this.#refreshTabList() @@ -188,6 +198,10 @@ export class DevtoolsTabs extends Element { disconnectedCallback() { super.disconnectedCallback() + window.removeEventListener( + 'open-dock-tab', + this.#onOpenTab as EventListener + ) if (this.#badgeCheckInterval) { clearInterval(this.#badgeCheckInterval) } diff --git a/packages/app/src/components/workbench/a11y-tree.ts b/packages/app/src/components/workbench/a11y-tree.ts index e3fd0458..cdbd8f31 100644 --- a/packages/app/src/components/workbench/a11y-tree.ts +++ b/packages/app/src/components/workbench/a11y-tree.ts @@ -31,20 +31,85 @@ export class DevtoolsA11yTree extends Element { @state() private copiedSel?: string + /** Reverse of #highlight — the row the snapshot pane points at. `revealed` is + * transient (overlay-box hover); `pinned` persists (box click, which also + * opens this tab). Both matched by selector then accessible name. */ + @state() + private revealed?: { selector?: string; label?: string } + + @state() + private pinned?: { selector?: string; label?: string } + #onShow = (e: Event) => { this.active = (e as CustomEvent<{ command?: CommandLog }>).detail?.command + // A pin belongs to one page state; drop it when the command changes. + this.pinned = undefined + this.revealed = undefined + } + + #onReveal = (e: Event) => { + const detail = ( + e as CustomEvent<{ + selector?: string + label?: string + pin?: boolean + } | null> + ).detail + if (detail?.pin) { + this.pinned = { selector: detail.selector, label: detail.label } + } else { + this.revealed = detail ?? undefined + } } connectedCallback() { super.connectedCallback() window.addEventListener('show-command', this.#onShow as EventListener) + window.addEventListener('a11y-reveal', this.#onReveal as EventListener) } disconnectedCallback() { window.removeEventListener('show-command', this.#onShow as EventListener) + window.removeEventListener('a11y-reveal', this.#onReveal as EventListener) this.#highlight(undefined) super.disconnectedCallback() } + /** Scroll the highlighted row into view when the snapshot pane points at it. */ + updated() { + if (this.revealed || this.pinned) { + this.renderRoot + ?.querySelector('.node.hot') + ?.scrollIntoView({ block: 'nearest' }) + } + } + + /** A node matches a reveal target by exact selector, else by accessible name + * (covers locators the serializer captured differently, e.g. the test's + * `button[type=submit]` vs `button*=Login`). */ + #matches(node: A11yNode, target?: { selector?: string; label?: string }) { + if (!target) { + return false + } + if ( + target.selector && + node.selector && + node.selector.trim() === target.selector.trim() + ) { + return true + } + return !!( + target.label && + node.name && + node.name.trim() === target.label.trim() + ) + } + + #isRevealed(node: A11yNode): boolean { + return ( + this.#matches(node, this.revealed) || this.#matches(node, this.pinned) + ) + } + /** Ask the snapshot pane to outline (or clear) the element for this locator. */ #highlight(selector?: string) { window.dispatchEvent( @@ -134,6 +199,13 @@ export class DevtoolsA11yTree extends Element { .node.pick:hover .sel { opacity: 0.85; } + .node.hot { + background: color-mix(in srgb, var(--pick, #38bdf8) 22%, transparent); + box-shadow: inset 0 0 0 1px var(--pick, #38bdf8); + } + .node.hot .sel { + opacity: 0.85; + } ` ] @@ -162,8 +234,9 @@ export class DevtoolsA11yTree extends Element { #row(node: A11yNode): TemplateResult { const sel = node.selector + const hot = this.#isRevealed(node) return html`<div - class="node ${sel ? 'pick' : ''}" + class="node ${sel ? 'pick' : ''} ${hot ? 'hot' : ''}" style="padding-left:${8 + node.depth * 16}px" @mouseenter=${() => this.#highlight(sel)} @mouseleave=${() => this.#highlight(undefined)} From ed0af0a45e1f926f2f87ae23e0e98ed2c4ce6af3 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 14:29:12 +0530 Subject: [PATCH 084/109] refactor(shared): single-source the a11y snapshot-text format tokens --- .../app/src/components/workbench/a11y-tree.ts | 20 +++++++--- packages/core/src/element-snapshot.ts | 38 +++++++++++++------ packages/shared/src/index.ts | 1 + packages/shared/src/snapshot-format.ts | 17 +++++++++ 4 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 packages/shared/src/snapshot-format.ts diff --git a/packages/app/src/components/workbench/a11y-tree.ts b/packages/app/src/components/workbench/a11y-tree.ts index cdbd8f31..32ee0252 100644 --- a/packages/app/src/components/workbench/a11y-tree.ts +++ b/packages/app/src/components/workbench/a11y-tree.ts @@ -2,6 +2,11 @@ import { Element } from '@core/element' import { html, css, nothing, type TemplateResult } from 'lit' import { customElement, state } from 'lit/decorators.js' +import { + SNAPSHOT_INDENT_UNIT, + SNAPSHOT_PAGE_HEADER, + SNAPSHOT_LOCATOR_DELIM +} from '@wdio/devtools-shared' import type { CommandLog } from '@wdio/devtools-shared' import '../placeholder.js' @@ -218,16 +223,19 @@ export class DevtoolsA11yTree extends Element { * blank lines return null. */ #parse(line: string): A11yNode | null { const trimmed = line.trimStart() - if (!trimmed || trimmed.startsWith('[Page')) { + if (!trimmed || trimmed.startsWith(SNAPSHOT_PAGE_HEADER)) { return null } const indent = line.length - trimmed.length - const depth = Math.max(0, Math.floor(indent / 2) - 1) + const depth = Math.max( + 0, + Math.floor(indent / SNAPSHOT_INDENT_UNIT.length) - 1 + ) const role = /^\S+/.exec(trimmed)?.[0] ?? trimmed const name = /"([^"]*)"/.exec(trimmed)?.[1] ?? '' // The `→ <locator>` suffix (last one wins; skips any `∈ "purpose"` before it). - const selector = trimmed.includes('→') - ? trimmed.split('→').pop()?.trim() || undefined + const selector = trimmed.includes(SNAPSHOT_LOCATOR_DELIM) + ? trimmed.split(SNAPSHOT_LOCATOR_DELIM).pop()?.trim() || undefined : undefined return { depth, role, name, selector } } @@ -262,7 +270,9 @@ export class DevtoolsA11yTree extends Element { return html`<wdio-devtools-placeholder></wdio-devtools-placeholder>` } const lines = text.split('\n') - const header = lines[0]?.startsWith('[Page') ? lines[0] : undefined + const header = lines[0]?.startsWith(SNAPSHOT_PAGE_HEADER) + ? lines[0] + : undefined const nodes = lines .map((l) => this.#parse(l)) .filter((n): n is A11yNode => n !== null) diff --git a/packages/core/src/element-snapshot.ts b/packages/core/src/element-snapshot.ts index 40cdcf02..c792bed2 100644 --- a/packages/core/src/element-snapshot.ts +++ b/packages/core/src/element-snapshot.ts @@ -11,6 +11,14 @@ import type { SnapshotElement, SnapshotResult } from './element-types.js' + +import { + SNAPSHOT_INDENT_UNIT, + SNAPSHOT_PAGE_HEADER, + SNAPSHOT_LOCATOR_DELIM, + SNAPSHOT_PURPOSE_TOKEN +} from '@wdio/devtools-shared' + import type { JSONElement } from './locators/types.js' import { parseAndroidBounds, parseIOSBounds } from './locators/xml-parsing.js' import { @@ -81,7 +89,7 @@ export function serializeWebSnapshot( ): string { const { inViewportOnly = true } = options - let header = '[Page' + let header = SNAPSHOT_PAGE_HEADER if (context?.title) { header += `: ${context.title}` } @@ -103,7 +111,7 @@ export function serializeWebSnapshot( continue } - const indent = ' '.repeat(node.depth + 1) // +1 indents everything under the header + const indent = SNAPSHOT_INDENT_UNIT.repeat(node.depth + 1) // +1 indents everything under the header const isInteractive = INTERACTIVE_ROLES.has(node.role) if (isStatictextEchoedByParent(nodes, i)) { @@ -127,13 +135,17 @@ export function serializeWebSnapshot( // duplicate selectors like six "Add to Wishlist" buttons. lines.push( purpose - ? `${indent}${roleLabel} "${node.name}" ∈ "${purpose}" → ${node.selector}` - : `${indent}${roleLabel} "${node.name}" → ${node.selector}` + ? `${indent}${roleLabel} "${node.name}" ${SNAPSHOT_PURPOSE_TOKEN} "${purpose}" ${SNAPSHOT_LOCATOR_DELIM} ${node.selector}` + : `${indent}${roleLabel} "${node.name}" ${SNAPSHOT_LOCATOR_DELIM} ${node.selector}` ) } else if (purpose) { - lines.push(`${indent}${roleLabel} ∈ "${purpose}" → ${node.selector}`) + lines.push( + `${indent}${roleLabel} ${SNAPSHOT_PURPOSE_TOKEN} "${purpose}" ${SNAPSHOT_LOCATOR_DELIM} ${node.selector}` + ) } else { - lines.push(`${indent}${roleLabel} → ${node.selector}`) + lines.push( + `${indent}${roleLabel} ${SNAPSHOT_LOCATOR_DELIM} ${node.selector}` + ) } } else { // Container / structural: show role + name when present, no selector @@ -672,7 +684,7 @@ function renderMobileNodes(nodes: MobileFlatNode[]): string[] { for (let i = 0; i < nodes.length; i++) { const node = nodes[i] - const indent = ' '.repeat(node.depth + 1) + const indent = SNAPSHOT_INDENT_UNIT.repeat(node.depth + 1) // Collapse anonymous layout containers at depth ≥ 2. // Keep depth 0-1 structural chrome and any named container. @@ -725,13 +737,17 @@ function renderMobileNodes(nodes: MobileFlatNode[]): string[] { if (node.name) { lines.push( purpose - ? `${indent}${node.role} "${node.name}" ∈ "${purpose}" → ${selector}` - : `${indent}${node.role} "${node.name}" → ${selector}` + ? `${indent}${node.role} "${node.name}" ${SNAPSHOT_PURPOSE_TOKEN} "${purpose}" ${SNAPSHOT_LOCATOR_DELIM} ${selector}` + : `${indent}${node.role} "${node.name}" ${SNAPSHOT_LOCATOR_DELIM} ${selector}` ) } else if (purpose) { - lines.push(`${indent}${node.role} ∈ "${purpose}" → ${selector}`) + lines.push( + `${indent}${node.role} ${SNAPSHOT_PURPOSE_TOKEN} "${purpose}" ${SNAPSHOT_LOCATOR_DELIM} ${selector}` + ) } else { - lines.push(`${indent}${node.role} → ${selector}`) + lines.push( + `${indent}${node.role} ${SNAPSHOT_LOCATOR_DELIM} ${selector}` + ) } } else { // Container / structural / non-locatable diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index c0320b2a..e2071680 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -5,6 +5,7 @@ export * from './baseline.js' export * from './files.js' export * from './routes.js' export * from './runner.js' +export * from './snapshot-format.js' export * from './timing.js' export * from './trace-actions.js' export * from './trace-player.js' diff --git a/packages/shared/src/snapshot-format.ts b/packages/shared/src/snapshot-format.ts new file mode 100644 index 00000000..534cc420 --- /dev/null +++ b/packages/shared/src/snapshot-format.ts @@ -0,0 +1,17 @@ +// Single source of truth for the accessibility-snapshot text format (the +// `-snapshot.txt` trace resource). The producer (core's element-snapshot +// serializers) and the consumer (the app's A11y-tree parser) both reference +// these, so the written and parsed grammar can't drift. Keep one canonical form +// per concept — see CLAUDE.md § "One source of truth per concept". + +/** Indent step per tree depth (the header sits at one unit; nodes at depth+1). */ +export const SNAPSHOT_INDENT_UNIT = ' ' + +/** Prefix of the web page-header line (`[Page: <title> — <url>]`). */ +export const SNAPSHOT_PAGE_HEADER = '[Page' + +/** Separator between a node and its captured locator (rendered space-padded). */ +export const SNAPSHOT_LOCATOR_DELIM = '→' + +/** Marks an inferred purpose before the locator (`<role> ∈ "<purpose>"`). */ +export const SNAPSHOT_PURPOSE_TOKEN = '∈' From 3784eedd4ed1e6272541ee87c74aba099a474e6c Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 15:11:49 +0530 Subject: [PATCH 085/109] refactor(selenium): extract per-test artifact emit into test-artifacts.ts --- CLAUDE.md | 2 +- packages/selenium-devtools/src/index.ts | 103 ++++----------- .../selenium-devtools/src/test-artifacts.ts | 117 ++++++++++++++++++ 3 files changed, 140 insertions(+), 82 deletions(-) create mode 100644 packages/selenium-devtools/src/test-artifacts.ts diff --git a/CLAUDE.md b/CLAUDE.md index 24f95abe..8750159a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -256,7 +256,7 @@ Most entries below don't trigger the `max-lines` lint rule after `skipBlankLines - `packages/service/src/index.ts` — over the 500-**logic**-line soft cap and ~620 raw (the WDIO plugin god-file: session/screencast/command/assertion/trace-slice wiring in one class). The assertion-capture block (`beforeAssertion`/`afterAssertion`/`#handleAssertionOutcome`/`#finalizePendingAssertion`, plus the `#assertionDepth`/`#pendingAssertion` state) is now the largest self-contained seam and the prime extraction candidate; trace-slice and screencast are the next two. - `packages/nightwatch-devtools/src/index.ts` (~536 raw). Cucumber/test/run-lifecycle, session-init, event-hub modules already extracted; remainder is the `PluginInternals` accessor bag plus per-method delegators plus the factory. Accept-as-is. -- `packages/selenium-devtools/src/index.ts` (~817 raw). Session/test-lifecycle extracted; remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Grew past ~560 when the per-test-artifact seam (`#allureSink`/`#perTestArtifactInputs`/`#emitTestArtifacts`) landed inline with the cross-adapter Allure work; Nightwatch extracted the twin concern into `test-artifacts.ts`, so the next Selenium change to this seam should mirror that (a `selenium-devtools/src/test-artifacts.ts` threading the sink + flushed-trace promise through an input bag). Prime extraction candidate. +- `packages/selenium-devtools/src/index.ts` (~758 raw). Session/test-lifecycle **and** the per-test-artifact seam are now extracted: the sink cache + input snapshot + produce/attach flow live in `selenium-devtools/src/test-artifacts.ts` as `SeleniumTestArtifacts` (mirrors Nightwatch's twin — a typed input bag threading the Allure sink + flushed-trace promise), and the plugin keeps only a thin bag-building delegator. Remainder is the `PluginInternals` accessor bag plus onCommand/onDriverCreated wiring. Still over the 500 **raw** soft cap (under the logic-line cap after `skipBlankLines`/`skipComments`); the accessor bag / command wiring is the next extraction candidate if it grows. - `packages/nightwatch-devtools/src/session.ts` (~468). `captureNetworkFromPerformanceLogs` + `captureBrowserLogs` + `captureTrace` are tightly coupled to NightwatchBrowser state. Coverage at 78% after recent backfill; further extraction would need rewriting the browser-coupling. ### Test coverage gaps (worst-risk-first) diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index a622b695..6bd8298e 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -24,11 +24,7 @@ import { recordTraceBoundary, flushCurrentTestTrace } from './session-lifecycle.js' -import type { - AllureAttachSink, - SpecRange, - TraceArtifact -} from '@wdio/devtools-core' +import type { SpecRange, TraceArtifact } from '@wdio/devtools-core' import { startTest as tmStartTest, endTest as tmEndTest, @@ -49,15 +45,10 @@ import { import { findFreePort } from './helpers/utils.js' import { RetryTracker, - attachTraceArtifact, - captureAndAttachScreenshot, - captureAndAttachVideo, errorMessage, - lastRenderedScreenshot, - resolveAdapterOutputDir, tracePolicyModeWarning } from '@wdio/devtools-core' -import { getAllureSink } from './allure.js' +import { SeleniumTestArtifacts } from './test-artifacts.js' import { tryRegisterRunnerHooks } from './runnerHooks.js' import { patchNodeAssert } from './assertPatcher.js' import { @@ -152,8 +143,9 @@ class SeleniumDevToolsPlugin { * test's video frame window and screenshot lookup (per-test slicing). */ #currentTestStartWallTime = Date.now() - /** Allure attach sink, resolved once lazily at the first per-test end. */ - #allureSinkResolved?: Promise<AllureAttachSink | undefined> + /** Per-test artifact emit (trace-slice attach + screenshot + video); owns its + * own lazily-resolved Allure attach sink. */ + #testArtifacts = new SeleniumTestArtifacts() constructor(options: DevToolsOptions = {}) { this.#options = { @@ -538,81 +530,30 @@ class SeleniumDevToolsPlugin { await this.#emitTestArtifacts(ended, state === 'failed', flushed) } - /** Lazily resolve the Allure attach sink once (produce-only when Allure is - * inactive), reused across every per-test attach this run. */ - #allureSink(): Promise<AllureAttachSink | undefined> { - return (this.#allureSinkResolved ??= getAllureSink()) - } - - /** Snapshot every per-test capture input synchronously at test end. Selenium's - * runner hooks fire-and-forget the emit, so reading these after an await would - * race the next test overwriting the fields; frames/outcomes are copied - * because their backing arrays keep mutating after this test ends. */ - #perTestArtifactInputs(endedTest: TestStats | null) { - const startWallTime = this.#currentTestStartWallTime - return { - startWallTime, - sessionId: this.#sessionId, - testUid: endedTest?.uid, - attempt: endedTest?.retries, - screenshotBase64: lastRenderedScreenshot( - this.#actionSnapshots, - startWallTime - ), - frames: this.#screencast ? [...this.#screencast.frames] : undefined, - outcomes: (this.#testManager?.lastTestOutcomes() ?? []).map((o) => ({ - ...o - })), - captureFormat: this.#screencastOptions.captureFormat, - outputDir: resolveAdapterOutputDir({ testFilePath: this.#testFilePath }) - } - } - - /** At a test/scenario end, while the runner's per-test hook is still open: - * attach the just-flushed trace slice to Allure, then capture + attach the - * per-test screenshot and video per their policies. Each part no-ops when its - * feature is off (all gate on trace mode + `test` granularity in core). */ - async #emitTestArtifacts( + /** Build the per-test artifact bag from live plugin state and delegate to the + * emitter (which copies the mutable inputs synchronously before awaiting). */ + #emitTestArtifacts( endedTest: TestStats | null, failed: boolean, flushed: Promise<TraceArtifact | undefined> ): Promise<void> { - const inp = this.#perTestArtifactInputs(endedTest) - const onArtifact = (a: TraceArtifact) => this.#artifacts.push(a) - const onLog = (level: 'info' | 'warn', msg: string) => log[level](msg) - const attach = await this.#allureSink() - const artifact = await flushed - if (artifact) { - await attachTraceArtifact(artifact, attach, onLog) - } - await captureAndAttachScreenshot({ + return this.#testArtifacts.emit({ mode: this.#options.mode, granularity: this.#options.traceGranularity, - policy: this.#options.screenshot, + screenshotPolicy: this.#options.screenshot, + videoPolicy: this.#options.video, failed, - screenshotBase64: inp.screenshotBase64, - sessionId: inp.sessionId, - outputDir: inp.outputDir, - testUid: inp.testUid, - attach, - onArtifact, - onLog - }) - await captureAndAttachVideo({ - mode: this.#options.mode, - granularity: this.#options.traceGranularity, - policy: this.#options.video, - frames: inp.frames, - startWallTime: inp.startWallTime, - outcomes: inp.outcomes, - attempt: inp.attempt, - outputDir: inp.outputDir, - testUid: inp.testUid, - sessionId: inp.sessionId, - captureFormat: inp.captureFormat, - attach, - onArtifact, - onLog + flushed, + startWallTime: this.#currentTestStartWallTime, + sessionId: this.#sessionId, + endedTest, + actionSnapshots: this.#actionSnapshots, + frames: this.#screencast?.frames, + outcomes: this.#testManager?.lastTestOutcomes() ?? [], + captureFormat: this.#screencastOptions.captureFormat, + testFilePath: this.#testFilePath, + onArtifact: (a) => this.#artifacts.push(a), + onLog: (level, msg) => log[level](msg) }) } diff --git a/packages/selenium-devtools/src/test-artifacts.ts b/packages/selenium-devtools/src/test-artifacts.ts new file mode 100644 index 00000000..04a69585 --- /dev/null +++ b/packages/selenium-devtools/src/test-artifacts.ts @@ -0,0 +1,117 @@ +// Per-test artifact emit (trace-slice attach + screenshot + video) for the +// Selenium plugin. Mirrors nightwatch's `test-artifacts.ts`, plus the two +// Selenium-only concerns: a live Allure attach sink (nightwatch is produce-only) +// and the just-flushed trace slice threaded through the input bag. +// +// Selenium's runner hooks fire-and-forget some emits (Gherkin `AfterStep`), so +// the mutable capture arrays are copied synchronously before the first await — +// the next test would otherwise overwrite their backing arrays mid-flight. Each +// core call self-gates on mode + `test` granularity + policy, so a non-trace run +// or a coarser granularity is a no-op. + +import { + attachTraceArtifact, + captureAndAttachScreenshot, + captureAndAttachVideo, + lastRenderedScreenshot, + resolveAdapterOutputDir, + type AllureAttachSink, + type TestOutcome, + type TraceArtifact +} from '@wdio/devtools-core' +import { getAllureSink } from './allure.js' +import type { + ActionSnapshot, + DevToolsMode, + ScreencastFrame, + TestStats, + TraceGranularity, + TraceScreenshotPolicy, + TraceVideoPolicy +} from './types.js' + +export interface EmitTestArtifactsInput { + mode: DevToolsMode + granularity: TraceGranularity + screenshotPolicy: TraceScreenshotPolicy + videoPolicy: TraceVideoPolicy + failed: boolean + /** The just-flushed per-test trace slice, attached to Allure when present. */ + flushed: Promise<TraceArtifact | undefined> + startWallTime: number + sessionId: string | undefined + /** Ended test — its `uid`/`retries` key the artifact and retry attempt. */ + endedTest: TestStats | null + actionSnapshots: readonly ActionSnapshot[] + frames: readonly ScreencastFrame[] | undefined + /** This test's attempt slots (already scoped via `lastTestOutcomes`). */ + outcomes: readonly TestOutcome[] + captureFormat?: 'jpeg' | 'png' + testFilePath: string | undefined + onArtifact: (artifact: TraceArtifact) => void + onLog?: (level: 'info' | 'warn', message: string) => void +} + +export class SeleniumTestArtifacts { + /** Allure attach sink, resolved once lazily at the first per-test end + * (produce-only when Allure is inactive), reused across every attach. */ + #sinkResolved?: Promise<AllureAttachSink | undefined> + + #sink(): Promise<AllureAttachSink | undefined> { + return (this.#sinkResolved ??= getAllureSink()) + } + + /** At a test/scenario end, while the runner's per-test hook is still open: + * attach the just-flushed trace slice to Allure, then capture + attach the + * per-test screenshot and video per their policies. */ + async emit(input: EmitTestArtifactsInput): Promise<void> { + // Snapshot the mutable capture inputs synchronously before any await — see + // the file header on Selenium's fire-and-forget hooks. + const frames = input.frames ? [...input.frames] : undefined + const outcomes = input.outcomes.map((o) => ({ ...o })) + const screenshotBase64 = lastRenderedScreenshot( + input.actionSnapshots, + input.startWallTime + ) + const outputDir = resolveAdapterOutputDir({ + testFilePath: input.testFilePath + }) + const testUid = input.endedTest?.uid + const { onArtifact, onLog } = input + + const attach = await this.#sink() + const artifact = await input.flushed + if (artifact) { + await attachTraceArtifact(artifact, attach, onLog) + } + await captureAndAttachScreenshot({ + mode: input.mode, + granularity: input.granularity, + policy: input.screenshotPolicy, + failed: input.failed, + screenshotBase64, + sessionId: input.sessionId, + outputDir, + testUid, + attach, + onArtifact, + onLog + }) + await captureAndAttachVideo({ + mode: input.mode, + granularity: input.granularity, + policy: input.videoPolicy, + frames, + startWallTime: input.startWallTime, + outcomes, + attempt: input.endedTest?.retries, + outputDir, + testUid, + sessionId: input.sessionId, + captureFormat: input.captureFormat, + attach, + onArtifact, + onLog + }) + } +} From daa891738d58af0fde731e45fcab8f61b55bc0d6 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 17:36:25 +0530 Subject: [PATCH 086/109] feat(trace): input markers + Cucumber step nesting --- .../src/components/browser/trace-timeline.ts | 18 ++- packages/backend/src/trace-reader-types.ts | 2 + packages/backend/src/trace-reader.ts | 3 + packages/backend/tests/trace-reader.test.ts | 30 ++++ packages/core/src/action-snapshot.ts | 3 +- packages/core/src/index.ts | 1 + packages/core/src/trace-action-events.ts | 139 +++++++++++++----- packages/core/src/trace-frame-snapshots.ts | 14 ++ packages/core/src/trace-hierarchy.ts | 30 ++++ .../core/tests/trace-frame-snapshots.test.ts | 68 ++++++++- packages/core/tests/trace-hierarchy.test.ts | 63 ++++++++ packages/service/src/assertion-tracker.ts | 7 +- packages/service/src/index.ts | 31 +++- packages/service/src/session.ts | 6 +- packages/shared/src/trace-actions.ts | 31 ++++ packages/shared/src/types.ts | 7 + 16 files changed, 404 insertions(+), 49 deletions(-) create mode 100644 packages/core/src/trace-hierarchy.ts create mode 100644 packages/core/tests/trace-hierarchy.test.ts diff --git a/packages/app/src/components/browser/trace-timeline.ts b/packages/app/src/components/browser/trace-timeline.ts index 07cb81a1..1eb7e351 100644 --- a/packages/app/src/components/browser/trace-timeline.ts +++ b/packages/app/src/components/browser/trace-timeline.ts @@ -3,6 +3,7 @@ import { html, type TemplateResult } from 'lit' import { customElement, state, query } from 'lit/decorators.js' import { consume } from '@lit/context' import type { CommandLog, TracePlayerFrame } from '@wdio/devtools-shared' +import { isKeyboardCommand } from '@wdio/devtools-shared' import { commandContext, framesContext } from '../../controller/context.js' import { activeSpanAt } from '../workbench/active-entry.js' @@ -347,7 +348,9 @@ export class TraceTimeline extends Element { const active = frame.timestamp === activeFrame return html`<button class="absolute top-0.5 bottom-0.5 aspect-video border rounded overflow-hidden hover:border-chartsBlue hover:z-10 ${active - ? 'border-chartsBlue ring-1 ring-chartsBlue z-10' + ? `border-chartsBlue ring-1 ring-chartsBlue${ + this.playing ? '' : ' z-10' + }` : 'border-panelBorder'}" style="left:${fraction * 100}%; transform:translateX(-${fraction * 100}%);" @@ -375,10 +378,17 @@ export class TraceTimeline extends Element { class="absolute left-0 right-0 top-1/2 -translate-y-1/2 h-0.5 bg-chartsBlue/50 rounded" ></div> ${this.#sortedCommands.map((command) => { - const tickFraction = this.#fraction(command.timestamp ?? 0) + const pct = this.#fraction(command.timestamp ?? 0) * 100 + // Keyboard = green mark; pointer (has a hit point) = blue dot; else a + // plain white tick. Glyphs are illegible at this scale, so shape+colour. + const mark = isKeyboardCommand(command.command) + ? 'width:6px;height:10px;border-radius:2px;background:#46c96a;' + : command.point + ? 'width:8px;height:8px;border-radius:50%;background:#38bdf8;box-shadow:0 0 0 1px rgba(255,255,255,0.5);' + : 'width:1px;height:10px;background:rgba(255,255,255,0.8);' return html`<div - class="absolute top-1/2 -translate-y-1/2 h-2.5 w-px bg-white/80" - style="left:${tickFraction * 100}%;" + class="absolute top-1/2 -translate-y-1/2" + style="left:${pct}%;${mark}" title="${command.title ?? command.command}" ></div>` })} diff --git a/packages/backend/src/trace-reader-types.ts b/packages/backend/src/trace-reader-types.ts index 098b43b6..237b37f0 100644 --- a/packages/backend/src/trace-reader-types.ts +++ b/packages/backend/src/trace-reader-types.ts @@ -24,6 +24,8 @@ export interface AfterEvent { error?: { message: string } /** Command return value, restored onto CommandLog.result. */ result?: unknown + /** Pointer hit point, restored onto CommandLog.point (A8 input marker). */ + point?: { x: number; y: number } } export interface ScreencastFrameEvent { diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 4cb987a5..163004f3 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -240,6 +240,9 @@ function reconstructCommand( if (snapshotText) { command.snapshotText = snapshotText } + if (after?.point) { + command.point = after.point + } return command } diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 0f34c23c..4244c261 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -305,6 +305,36 @@ describe('parseTraceZip', () => { expect(trace.commands[0]?.snapshotText).toContain('textbox "Username"') }) + it('restores the pointer hit point from after.point (A8)', () => { + const zip = zipSync({ + 'trace.trace': toNdjson([ + { + type: 'context-options', + wallTime: WALL_TIME, + browserName: 'chrome', + contextId: 'context@abcd1234', + options: { viewport: { width: 1024, height: 768 } } + }, + { + type: 'before', + callId: 'call@1', + startTime: 0, + class: 'Element', + method: 'click', + params: { selector: '#go' } + }, + { + type: 'after', + callId: 'call@1', + endTime: 50, + point: { x: 30, y: 25 } + } + ]) + }) + const { trace } = parseTraceZip(zip) + expect(trace.commands[0]?.point).toEqual({ x: 30, y: 25 }) + }) + it('restores callSource and sources from stack frames + src resources', () => { const { trace } = parseTraceZip(fixtureZip()) const click = trace.commands.find((c) => c.command === 'click') diff --git a/packages/core/src/action-snapshot.ts b/packages/core/src/action-snapshot.ts index 19060f46..e589f743 100644 --- a/packages/core/src/action-snapshot.ts +++ b/packages/core/src/action-snapshot.ts @@ -68,7 +68,8 @@ export async function captureActionSnapshot( ), runWith<BrowserElementInfo[]>( input.runScript, - elementsScript(false, true), + // includeBounds: the per-action element rects drive A8 input points. + elementsScript(true, true), [] ) ]) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ee4126a0..758625cb 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -17,6 +17,7 @@ export * from './element-types.js' export * from './sha1.js' export * from './trace-action-events.js' export * from './trace-console.js' +export * from './trace-hierarchy.js' export * from './trace-exporter.js' export * from './trace-finalizer.js' export * from './trace-frame-snapshots.js' diff --git a/packages/core/src/trace-action-events.ts b/packages/core/src/trace-action-events.ts index 114233d7..c6f9c712 100644 --- a/packages/core/src/trace-action-events.ts +++ b/packages/core/src/trace-action-events.ts @@ -6,6 +6,7 @@ import type { CommandLog, TestMetadataMap } from '@wdio/devtools-shared' +import { POINTABLE_METHODS } from '@wdio/devtools-shared' import { ASSERT_ACTION_CLASS, formatActionTitle, @@ -15,6 +16,7 @@ import { } from './action-mapping.js' import { callSourceToStack, type StackFrame } from './trace-sources.js' import type { FrameSnapshotIndex } from './trace-frame-snapshots.js' +import { buildGroupPath } from './trace-hierarchy.js' export interface BeforeEvent { type: 'before' @@ -46,6 +48,9 @@ export interface AfterEvent { parentId?: string /** Frame-snapshot name rendered as the action's after state. */ afterSnapshot?: string + /** Page-coordinate hit point (centre of the matched element) for pointer + * actions — drives the player's click marker + timeline pointer glyph. */ + point?: { x: number; y: number } } // Serialized command results over this size are dropped from the trace — a @@ -75,8 +80,9 @@ interface ActionStream { events: ActionEvent[] prevEndMs: number callCounter: number - lastTestUid?: string - groupCallId?: string + /** Currently-open tracingGroup path, outermost first (feature→scenario→step). + * Actions nest under the innermost entry. */ + openGroups: { uid: string; callId: string }[] } // An adapter may attach a normalized CollapsedAssertResult (see shared) to an @@ -139,49 +145,64 @@ function buildActionParams( return Object.fromEntries(rawArgs.map((a, i) => [String(i), a])) } -function closeGroup(stream: ActionStream): void { - if (!stream.lastTestUid || !stream.groupCallId) { - return +function closeGroupsFrom(stream: ActionStream, from: number): void { + // Innermost-first so nested after events stay balanced. + for (let i = stream.openGroups.length - 1; i >= from; i--) { + stream.events.push({ + type: 'after', + callId: stream.openGroups[i].callId, + endTime: stream.prevEndMs + }) } - stream.callCounter++ - stream.events.push({ - type: 'after', - callId: stream.groupCallId, - endTime: stream.prevEndMs - }) + stream.openGroups.length = Math.max(0, from) } -// When the testUid changes, close the previous Tracing.tracingGroup and open -// a new one; child actions reference it via parentId to render as spans. -function handleTestBoundary( +// Diff the command's desired group path (feature→scenario→step, or just the +// test) against the open stack: close the diverged tail, then open the new tail +// with parentId chaining so the reader nests them. Actions then reference the +// innermost open group. A path of length ≤1 with no ancestry/step reproduces +// the previous single-group-per-test output. +function syncGroups( stream: ActionStream, cmd: CommandLog, pageId: string, wallTime: number, testMetadata?: TestMetadataMap ): void { - if (!cmd.testUid || cmd.testUid === stream.lastTestUid) { - return + const desired = buildGroupPath(cmd, testMetadata) + let common = 0 + while ( + common < stream.openGroups.length && + common < desired.length && + stream.openGroups[common].uid === desired[common].uid + ) { + common++ + } + closeGroupsFrom(stream, common) + for (let i = common; i < desired.length; i++) { + stream.callCounter++ + const callId = `call@${stream.callCounter}` + const parentId = stream.openGroups[i - 1]?.callId + const groupBefore: BeforeEvent = { + type: 'before', + callId, + startTime: Math.max( + stream.prevEndMs, + (cmd.startTime ?? cmd.timestamp) - wallTime + ), + class: 'Tracing', + method: 'tracingGroup', + pageId, + params: { name: desired[i].title }, + title: desired[i].title, + apiName: 'tracing.tracingGroup' + } + if (parentId) { + groupBefore.parentId = parentId + } + stream.events.push(groupBefore) + stream.openGroups.push({ uid: desired[i].uid, callId }) } - closeGroup(stream) - stream.callCounter++ - stream.groupCallId = `call@${stream.callCounter}` - const groupName = testMetadata?.get(cmd.testUid)?.title ?? cmd.testUid - stream.events.push({ - type: 'before', - callId: stream.groupCallId, - startTime: Math.max( - stream.prevEndMs, - (cmd.startTime ?? cmd.timestamp) - wallTime - ), - class: 'Tracing', - method: 'tracingGroup', - pageId, - params: { name: groupName }, - title: groupName, - apiName: 'tracing.tracingGroup' - }) - stream.lastTestUid = cmd.testUid } function buildParamsAndTitle( @@ -221,6 +242,37 @@ function actionError( return undefined } +/** Centre of the element a pointer action matched, from the captured element + * rects at the command's completion. Undefined for non-pointer actions, a + * non-string selector, or a selector absent from the captured elements (e.g. a + * WDIO text/xpath locator `getSelector` didn't reproduce). */ +function resolveActionPoint( + action: TraceAction, + cmd: CommandLog, + snapshotIndex?: FrameSnapshotIndex +): { x: number; y: number } | undefined { + if (action.class !== 'Element' || !POINTABLE_METHODS.has(action.method)) { + return undefined + } + const selector = cmd.args?.[0] + if (typeof selector !== 'string') { + return undefined + } + const elements = snapshotIndex?.elementsAt(cmd.timestamp) + for (const el of elements ?? []) { + // Narrow the unknown element record at the boundary (element-scripts shape). + const e = el as { + selector?: string + boundingBox?: { x: number; y: number; width: number; height: number } + } + if (e.selector === selector && e.boundingBox) { + const bb = e.boundingBox + return { x: bb.x + bb.width / 2, y: bb.y + bb.height / 2 } + } + } + return undefined +} + function buildAfterEvent( cmd: CommandLog, action: TraceAction, @@ -241,6 +293,10 @@ function buildAfterEvent( if (afterName) { afterEvent.afterSnapshot = afterName } + const point = resolveActionPoint(action, cmd, snapshotIndex) + if (point) { + afterEvent.point = point + } return afterEvent } @@ -272,7 +328,7 @@ function pushActionPair( params, title, apiName: `${action.class.toLowerCase()}.${action.method}`, - parentId: stream.groupCallId + parentId: stream.openGroups[stream.openGroups.length - 1]?.callId } const stack = callSourceToStack(cmd.callSource) if (stack) { @@ -294,7 +350,12 @@ export function buildActionEvents( testMetadata?: TestMetadataMap, snapshotIndex?: FrameSnapshotIndex ): ActionEvent[] { - const stream: ActionStream = { events: [], prevEndMs: 0, callCounter: 0 } + const stream: ActionStream = { + events: [], + prevEndMs: 0, + callCounter: 0, + openGroups: [] + } // Process in chronological order, not insertion order. Deferred rows (e.g. // Nightwatch native asserts, finalized in one batch at test-end) are appended // late but carry their real call-time `startTime`; since pushActionPair floors @@ -311,9 +372,9 @@ export function buildActionEvents( if (!action) { continue } - handleTestBoundary(stream, cmd, pageId, wallTime, testMetadata) + syncGroups(stream, cmd, pageId, wallTime, testMetadata) pushActionPair(stream, cmd, action, pageId, wallTime, snapshotIndex) } - closeGroup(stream) + closeGroupsFrom(stream, 0) return stream.events } diff --git a/packages/core/src/trace-frame-snapshots.ts b/packages/core/src/trace-frame-snapshots.ts index 618b612a..4f91f208 100644 --- a/packages/core/src/trace-frame-snapshots.ts +++ b/packages/core/src/trace-frame-snapshots.ts @@ -50,11 +50,20 @@ export interface FrameSnapshotRef { /** Correlates captured screenshots to callIds as the exporter assigns them. */ export class FrameSnapshotIndex { #byTimestamp = new Map<number, ActionSnapshot>() + // Element rects by timestamp, indexed independently of the screenshot gate so + // A8 input points resolve even when the frame carries no screenshot. + #elementsByTimestamp = new Map<number, unknown[]>() #refs: FrameSnapshotRef[] = [] #lastName?: string constructor(snapshots: ActionSnapshot[]) { for (const snap of snapshots) { + if (snap.elements) { + const currentEls = this.#elementsByTimestamp.get(snap.timestamp) + if (!currentEls || snap.elements.length > currentEls.length) { + this.#elementsByTimestamp.set(snap.timestamp, snap.elements) + } + } if (!snap.screenshot) { continue } @@ -69,6 +78,11 @@ export class FrameSnapshotIndex { } } + /** Captured element rects at a command's completion timestamp, if any. */ + elementsAt(timestamp: number): unknown[] | undefined { + return this.#elementsByTimestamp.get(timestamp) + } + /** Snapshot name representing the page state before the next action. */ beforeName(): string | undefined { return this.#lastName diff --git a/packages/core/src/trace-hierarchy.ts b/packages/core/src/trace-hierarchy.ts new file mode 100644 index 00000000..9ed4188c --- /dev/null +++ b/packages/core/src/trace-hierarchy.ts @@ -0,0 +1,30 @@ +// The ordered open-group path for a command — outermost first — that the action +// exporter's group stack turns into balanced nested Tracing.tracingGroup +// markers. The path is the test's ancestry (feature/scenario/suite, from the +// suite-metadata walk) + the test itself + its step, when a stepUid is set. + +import type { CommandLog, TestMetadataMap } from '@wdio/devtools-shared' + +export interface GroupNode { + uid: string + title: string +} + +export function buildGroupPath( + cmd: CommandLog, + testMetadata?: TestMetadataMap +): GroupNode[] { + const path: GroupNode[] = [] + if (cmd.testUid) { + const entry = testMetadata?.get(cmd.testUid) + for (const ancestor of entry?.ancestry ?? []) { + path.push({ uid: ancestor.uid, title: ancestor.title }) + } + path.push({ uid: cmd.testUid, title: entry?.title ?? cmd.testUid }) + } + if (cmd.stepUid) { + const stepEntry = testMetadata?.get(cmd.stepUid) + path.push({ uid: cmd.stepUid, title: stepEntry?.title ?? cmd.stepUid }) + } + return path +} diff --git a/packages/core/tests/trace-frame-snapshots.test.ts b/packages/core/tests/trace-frame-snapshots.test.ts index 81bdfebd..6d23cd05 100644 --- a/packages/core/tests/trace-frame-snapshots.test.ts +++ b/packages/core/tests/trace-frame-snapshots.test.ts @@ -1,10 +1,12 @@ import { describe, it, expect } from 'vitest' import { + buildActionEvents, buildImageFrameSnapshots, FrameSnapshotIndex, + type AfterEvent, type FrameSnapshotRef } from '@wdio/devtools-core' -import type { ActionSnapshot } from '@wdio/devtools-shared' +import type { ActionSnapshot, CommandLog } from '@wdio/devtools-shared' function snap(overrides: Partial<ActionSnapshot> = {}): ActionSnapshot { return { timestamp: 2000, command: 'click', screenshot: 'AAAA', ...overrides } @@ -57,6 +59,70 @@ describe('FrameSnapshotIndex', () => { index.claimAfter(3000, 'call@3') expect(index.beforeName()).toBe('after@call@3') }) + + it('exposes element rects by timestamp regardless of screenshot', () => { + const index = new FrameSnapshotIndex([ + snap({ screenshot: undefined, elements: [{ selector: '#go' }] }) + ]) + expect(index.elementsAt(2000)).toEqual([{ selector: '#go' }]) + expect(index.elementsAt(9999)).toBeUndefined() + }) + + it('keeps the richest element set for duplicate timestamps', () => { + const index = new FrameSnapshotIndex([ + snap({ elements: [{ selector: 'a' }] }), + snap({ elements: [{ selector: 'a' }, { selector: 'b' }] }) + ]) + expect(index.elementsAt(2000)).toHaveLength(2) + }) +}) + +describe('input point synthesis (A8)', () => { + const wallTime = 1000 + const box = { x: 10, y: 20, width: 40, height: 10 } + + function pointOf(commands: CommandLog[], snaps: ActionSnapshot[]) { + const events = buildActionEvents( + commands, + 'page@abc', + wallTime, + undefined, + new FrameSnapshotIndex(snaps) + ) + const after = events.find((e) => e.type === 'after') as + | AfterEvent + | undefined + return after?.point + } + + it('sets after.point to the matched element rect centre for a pointer action', () => { + const point = pointOf( + [{ command: 'click', args: ['#go'], timestamp: 2000, startTime: 1950 }], + [snap({ elements: [{ selector: '#go', boundingBox: box }] })] + ) + expect(point).toEqual({ x: 30, y: 25 }) + }) + + it('omits the point when the selector is absent from captured elements', () => { + const point = pointOf( + [{ command: 'click', args: ['#go'], timestamp: 2000, startTime: 1950 }], + [snap({ elements: [{ selector: '#other', boundingBox: box }] })] + ) + expect(point).toBeUndefined() + }) + + it('omits the point for non-pointer commands', () => { + const point = pointOf( + [{ command: 'getText', args: ['#go'], timestamp: 2000, startTime: 1950 }], + [ + snap({ + command: 'getText', + elements: [{ selector: '#go', boundingBox: box }] + }) + ] + ) + expect(point).toBeUndefined() + }) }) describe('buildImageFrameSnapshots', () => { diff --git a/packages/core/tests/trace-hierarchy.test.ts b/packages/core/tests/trace-hierarchy.test.ts new file mode 100644 index 00000000..fc10cd3f --- /dev/null +++ b/packages/core/tests/trace-hierarchy.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from 'vitest' +import { buildGroupPath } from '@wdio/devtools-core' +import type { CommandLog, TestMetadataMap } from '@wdio/devtools-shared' + +function cmd(overrides: Partial<CommandLog> = {}): CommandLog { + return { command: 'click', args: ['#go'], timestamp: 1, ...overrides } +} + +describe('buildGroupPath', () => { + it('is empty when the command has no testUid', () => { + expect(buildGroupPath(cmd())).toEqual([]) + }) + + it('is a single node (the test) when there is no ancestry or step', () => { + const meta: TestMetadataMap = new Map([ + ['t1', { title: 'logs in', specFile: 'a.js' }] + ]) + expect(buildGroupPath(cmd({ testUid: 't1' }), meta)).toEqual([ + { uid: 't1', title: 'logs in' } + ]) + }) + + it('prepends the ancestry chain outermost-first', () => { + const meta: TestMetadataMap = new Map([ + [ + 't1', + { + title: 'valid login', + specFile: 'login.feature', + ancestry: [ + { uid: 'f1', title: 'Feature: Login', kind: 'feature' }, + { uid: 's1', title: 'Scenario: valid', kind: 'scenario' } + ] + } + ] + ]) + expect(buildGroupPath(cmd({ testUid: 't1' }), meta)).toEqual([ + { uid: 'f1', title: 'Feature: Login' }, + { uid: 's1', title: 'Scenario: valid' }, + { uid: 't1', title: 'valid login' } + ]) + }) + + it('appends the step below the test when stepUid is set', () => { + const meta: TestMetadataMap = new Map([ + ['sc1', { title: 'Scenario', specFile: 'x.feature' }], + ['st1', { title: 'When I log in', specFile: 'x.feature' }] + ]) + expect( + buildGroupPath(cmd({ testUid: 'sc1', stepUid: 'st1' }), meta) + ).toEqual([ + { uid: 'sc1', title: 'Scenario' }, + { uid: 'st1', title: 'When I log in' } + ]) + }) + + it('falls back to the raw uid when a title is missing', () => { + expect(buildGroupPath(cmd({ testUid: 'sc1', stepUid: 'st1' }))).toEqual([ + { uid: 'sc1', title: 'sc1' }, + { uid: 'st1', title: 'st1' } + ]) + }) +}) diff --git a/packages/service/src/assertion-tracker.ts b/packages/service/src/assertion-tracker.ts index b0ab2f3d..416d6e5d 100644 --- a/packages/service/src/assertion-tracker.ts +++ b/packages/service/src/assertion-tracker.ts @@ -24,6 +24,7 @@ export interface AssertionTrackerContext { getCapturer: () => SessionCapturer getBrowser: () => WebdriverIO.Browser | undefined getTestUid: () => string | undefined + getStepUid: () => string | undefined options: ServiceOptions actionSnapshots: ActionSnapshot[] } @@ -32,6 +33,7 @@ interface PendingAssertion { matcherName: string expectedValue?: unknown testUid?: string + stepUid?: string } export class AssertionTracker { @@ -76,7 +78,8 @@ export class AssertionTracker { this.#pendingAssertion = { matcherName: params.matcherName, expectedValue: params.expectedValue, - testUid: this.#ctx.getTestUid() + testUid: this.#ctx.getTestUid(), + stepUid: this.#ctx.getStepUid() } } this.#assertionDepth++ @@ -105,6 +108,7 @@ export class AssertionTracker { this.#pendingAssertion = undefined const capturer = this.#ctx.getCapturer() const entry = expectAssertionToCommandLog(params, this.#ctx.getTestUid()) + entry.stepUid = this.#ctx.getStepUid() if (capturer.coalesceAssertionIntoLastRead(entry, isMatcherReadCommand)) { return } @@ -176,6 +180,7 @@ export class AssertionTracker { }, pending.testUid ) + entry.stepUid = pending.stepUid const capturer = this.#ctx.getCapturer() if ( capturer.coalesceAssertionIntoLastRead(entry, isMatcherReadCommand, true) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 3161e4f2..739f8f5b 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -97,6 +97,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { getCapturer: () => this.#sessionCapturer, getBrowser: () => this.#browser, getTestUid: () => this.#currentTestUid, + getStepUid: () => this.#currentStepUid, options: this.#options, actionSnapshots: this.#actionSnapshots }) @@ -126,6 +127,11 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Current test UID, set in beforeTest(), used by afterCommand() to tag commands. */ #currentTestUid?: string + /** Current Cucumber step UID, set in beforeStep(), used by afterCommand() to + * nest commands under the step in the trace group tree (C2). */ + #currentStepUid?: string + /** Per-scenario step counter for stable, collision-free step uids. */ + #currentStepIndex = 0 /** Wall-clock ms at the current test's start, set in beforeTest/beforeScenario; * the lower bound of that test's video frame window (per-test slicing). */ @@ -412,6 +418,8 @@ export default class DevToolsHookService implements Services.ServiceInstance { }) { this.resetStack() this.#currentTestStartWallTime = Date.now() + this.#currentStepIndex = 0 + this.#currentStepUid = undefined const featureFile = world?.pickle?.uri const scenarioName = world?.pickle?.name @@ -464,6 +472,25 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } + // Tag the scenario's commands with a stable per-step uid so the trace nests + // them under the step (Feature→Scenario→Step). The uid combines the scenario + // uid with a per-scenario counter, so repeated step text can't collide. + beforeStep(step?: { text?: string; keyword?: string }) { + if (!this.#currentTestUid) { + return + } + this.#currentStepIndex += 1 + const uid = `${this.#currentTestUid}:step:${this.#currentStepIndex}` + const title = + [step?.keyword, step?.text].filter(Boolean).join('').trim() || + `Step ${this.#currentStepIndex}` + this.#currentStepUid = uid + this.#testMetadata.set(uid, { + title, + specFile: this.#testMetadata.get(this.#currentTestUid)?.specFile ?? '' + }) + } + // afterStep fires right after each step, so the failing assertion lands next // to the step's actions rather than after reloadSession at scenario end. afterStep( @@ -471,6 +498,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { _scenario?: unknown, result?: { error?: unknown } ) { + this.#currentStepUid = undefined this.#assertionTracker.handleOutcome(result?.error) } @@ -737,7 +765,8 @@ export default class DevToolsHookService implements Services.ServiceInstance { error, frame.callSource, frame.startTimestamp, - this.#currentTestUid + this.#currentTestUid, + this.#currentStepUid ) if (this.#options.mode === 'trace') { await captureActionResult( diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index 51632586..d679e105 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -112,7 +112,8 @@ export class SessionCapturer extends SessionCapturerBase { error: Error | undefined, callSource?: string, commandStartTime?: number, - testUid?: string + testUid?: string, + stepUid?: string ) { const { sourceFileLocation, absolutePath } = this.#resolveUserStackFrame() const sourceFilePath = absolutePath.split(':')[0] @@ -127,7 +128,8 @@ export class SessionCapturer extends SessionCapturerBase { timestamp: Date.now(), startTime: commandStartTime, callSource: callSource ?? absolutePath, - testUid + testUid, + stepUid } if (!isNativeMobile(browser)) { try { diff --git a/packages/shared/src/trace-actions.ts b/packages/shared/src/trace-actions.ts index c3bd7462..75eebeb2 100644 --- a/packages/shared/src/trace-actions.ts +++ b/packages/shared/src/trace-actions.ts @@ -105,3 +105,34 @@ export const ACTION_MAP: Record<string, TraceAction> = { getRect: { class: 'Element', method: 'getRect' }, getCurrentUrl: { class: 'Page', method: 'getUrl' } } + +/** Trace methods (ACTION_MAP values) that act at a point on the page — the + * exporter emits a hit `point` for these so the player can mark where the + * action landed. `fill` is included (typing focuses the element first). */ +export const POINTABLE_METHODS: ReadonlySet<string> = new Set([ + 'click', + 'dblclick', + 'hover', + 'tap', + 'dragTo', + 'scrollIntoViewIfNeeded', + 'selectOption', + 'fill' +]) + +/** Runner command names (native or trace method) that type into an element — + * drives the timeline's keyboard glyph vs the pointer glyph. */ +const KEYBOARD_COMMANDS: ReadonlySet<string> = new Set([ + 'setValue', + 'sendKeys', + 'addValue', + 'clearValue', + 'clear', + 'keys', + 'fill', + 'press' +]) + +export function isKeyboardCommand(command: string): boolean { + return KEYBOARD_COMMANDS.has(command) +} diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 40cd45b7..98dc2604 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -173,10 +173,17 @@ export interface CommandLog { cookies?: string documentInfo?: DocumentInfo id?: number + /** Cucumber step this command ran under — nests below testUid in the trace's + * group tree (Feature → Scenario → Step). Set by the adapter step hooks. */ + stepUid?: string /** Depth-indented accessibility-tree text for the page state at this command * (from the per-action `-snapshot.txt` resource). Reconstructed by the trace * reader; drives the player's A11y tab. */ snapshotText?: string + /** Page-coordinate hit point for pointer actions — the centre of the matched + * element at capture time. Synthesized in the exporter; drives the snapshot + * click marker and the timeline pointer glyph. */ + point?: { x: number; y: number } } /** From cfe28a1b1b16564a66907424c8a580e3cffc2f13 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 17:36:41 +0530 Subject: [PATCH 087/109] fix(trace): drop replayed comment nodes + settle layout before overlay measure --- packages/app/src/components/browser/element-overlay.ts | 6 ++++++ packages/script/src/utils.ts | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/browser/element-overlay.ts b/packages/app/src/components/browser/element-overlay.ts index c83cb0db..dbf00d42 100644 --- a/packages/app/src/components/browser/element-overlay.ts +++ b/packages/app/src/components/browser/element-overlay.ts @@ -52,6 +52,12 @@ export function drawElementOverlay( return } clearElementOverlay(iframe) + // Force a synchronous layout flush before measuring. #sizeSnapshotToViewport + // strips + restores the iframe's inline size in the same frame that draws the + // overlay, so the content reflow to full width is still pending — reading + // rects now would capture the transient narrow-breakpoint layout (boxes end up + // low + oversized). Reading offsetHeight settles layout first. + void docEl.documentElement.offsetHeight const scrollY = iframe?.contentWindow?.scrollY || 0 const scrollX = iframe?.contentWindow?.scrollX || 0 for (const selector of selectors) { diff --git a/packages/script/src/utils.ts b/packages/script/src/utils.ts index 258b1358..c6d86cd0 100644 --- a/packages/script/src/utils.ts +++ b/packages/script/src/utils.ts @@ -25,7 +25,10 @@ export function parseNode( const props: Record<string, unknown> = {} if (fragment.nodeName === '#comment') { - return (fragment as vComment).data + // Drop comment content — returning its data rendered the comment as visible + // text on replay (e.g. an IE conditional comment's `<![endif]` showed as + // text and added a line box that shifted the whole page layout down). + return '' } if (fragment.nodeName === '#text') { return (fragment as vText).value From c0ed4925de2af5f57f608b297e3b080d7f133723 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 18:13:19 +0530 Subject: [PATCH 088/109] =?UTF-8?q?fix(trace):=20correct=20replay=20fideli?= =?UTF-8?q?ty=20=E2=80=94=20comments,=20overlay=20alignment,=20zoom=20flic?= =?UTF-8?q?ker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/components/browser/snapshot.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index c647fdad..3193057d 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -148,9 +148,12 @@ export class DevtoolsBrowser extends Element { return } - this.iframe?.removeAttribute('style') - // Defer to next frame so we read post-reflow dimensions on resize events. + // NB: we deliberately do NOT clear the iframe's inline style first — the rAF + // below overwrites every property it sets, so the iframe keeps its prior + // (correct) transform until then. Clearing synchronously here made it paint + // one frame un-scaled → a zoom flicker on every replayed frame during + // playback, and let the overlay measure a collapsed/narrow layout. requestAnimationFrame(() => { if (!this.section || !this.header) { return From bc81058fb3f7425cd4bd8deca6ea1e7615c2619a Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 18:15:10 +0530 Subject: [PATCH 089/109] fix(service): Gate the devtools-artifacts manifest behind an emitArtifactsManifest option (default off) --- packages/service/src/index.ts | 13 ++++++++++++- packages/service/src/types.ts | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 739f8f5b..d9946b33 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -132,6 +132,10 @@ export default class DevToolsHookService implements Services.ServiceInstance { #currentStepUid?: string /** Per-scenario step counter for stable, collision-free step uids. */ #currentStepIndex = 0 + /** True when @wdio/allure-reporter is in the WDIO config (detected in + * beforeSession) — auto-enables the artifacts manifest even if the option + * isn't set, since session/spec-scoped Allure attach reads it. */ + #allureReporterConfigured = false /** Wall-clock ms at the current test's start, set in beforeTest/beforeScenario; * the lower bound of that test's video frame window (per-test slicing). */ @@ -266,7 +270,8 @@ export default class DevToolsHookService implements Services.ServiceInstance { resolveOutputDir: () => this.#outputDir, prepareSnapshots: dedupeSnapshotsByTimestamp, log: (level, msg) => log[level](msg), - emitManifest: true, + emitManifest: + this.#options.emitArtifactsManifest ?? this.#allureReporterConfigured, collectedArtifacts: this.#artifacts, onArtifact: (a) => this.#artifacts.push(a) } @@ -389,6 +394,12 @@ export default class DevToolsHookService implements Services.ServiceInstance { } if ('reporters' in config) { + // Detect the Allure reporter (before we append our own) so the artifacts + // manifest auto-enables for session/spec-scoped Allure attach. + this.#allureReporterConfigured = (config.reporters || []).some((r) => { + const name = Array.isArray(r) ? r[0] : r + return typeof name === 'string' && name.includes('allure') + }) const self = this config.reporters = [ ...(config.reporters || []), diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index 84ef345f..695eafa8 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -53,6 +53,12 @@ export interface ServiceOptions extends BaseDevToolsOptions { * attached inline to Allure. `off` (default) or a retention policy. Trace * mode + `traceGranularity: 'test'` only. WDIO-service-specific for now. */ video?: TraceVideoPolicy + /** Write the `devtools-artifacts-<sessionId>.json` manifest next to the trace + * — the generic index reporters/CI consume to discover produced artifacts. + * Off by default (WDIO auto-attaches per-test traces to Allure directly); + * auto-enabled when `@wdio/allure-reporter` is in the config, since + * session/spec-scoped Allure attach reads the manifest. */ + emitArtifactsManifest?: boolean /** * capabilities used to launch the devtools application * @default From fe21f45e2b501d2e2ce10f6b601cd8dcbc74bf53 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 19:57:18 +0530 Subject: [PATCH 090/109] test(service): add addCommand to browser mocks for main's getSnapshot hook --- packages/service/tests/assertion-rows.test.ts | 3 ++- packages/service/tests/trace-granularity.test.ts | 1 + packages/service/tests/trace-metadata.test.ts | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/service/tests/assertion-rows.test.ts b/packages/service/tests/assertion-rows.test.ts index ddd216b2..9f045f8a 100644 --- a/packages/service/tests/assertion-rows.test.ts +++ b/packages/service/tests/assertion-rows.test.ts @@ -49,7 +49,8 @@ const mockBrowser = { .fn() .mockResolvedValue({ width: 1, height: 1, offsetLeft: 0, offsetTop: 0 }), on: vi.fn(), - emit: vi.fn() + emit: vi.fn(), + addCommand: vi.fn() } as unknown as WebdriverIO.Browser // before() wires node:assert capture; restore the real methods afterwards. diff --git a/packages/service/tests/trace-granularity.test.ts b/packages/service/tests/trace-granularity.test.ts index 66a3b971..537c0281 100644 --- a/packages/service/tests/trace-granularity.test.ts +++ b/packages/service/tests/trace-granularity.test.ts @@ -98,6 +98,7 @@ describe('DevtoolsService - trace granularity slicing', () => { .mockResolvedValue({ width: 1, height: 1, offsetLeft: 0, offsetTop: 0 }), on: vi.fn(), emit: vi.fn(), + addCommand: vi.fn(), options: { rootDir: '/proj' }, capabilities: { browserName: 'chrome' } } as never diff --git a/packages/service/tests/trace-metadata.test.ts b/packages/service/tests/trace-metadata.test.ts index 9b2ee653..e34527f0 100644 --- a/packages/service/tests/trace-metadata.test.ts +++ b/packages/service/tests/trace-metadata.test.ts @@ -99,6 +99,7 @@ describe('DevtoolsService - afterTest state stamping', () => { .mockResolvedValue({ width: 1, height: 1, offsetLeft: 0, offsetTop: 0 }), on: vi.fn(), emit: vi.fn(), + addCommand: vi.fn(), options: { rootDir: '/proj' }, capabilities: { browserName: 'chrome' } } as never From f22d912b7316499176b0fe5983576f6661c8a916 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Mon, 20 Jul 2026 19:57:29 +0530 Subject: [PATCH 091/109] fix: green the branch after integrating main --- packages/service/src/index.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index d9946b33..ab3dce36 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -362,15 +362,18 @@ export default class DevToolsHookService implements Services.ServiceInstance { * * Returns { text, elements } — see @wdio/elements SnapshotResult. */ - browser.addCommand('getSnapshot', async (options?: { inViewportOnly?: boolean }) => { - try { - const { getSnapshot } = await import('@wdio/elements') - return await getSnapshot(browser, options ?? { inViewportOnly: true }) - } catch (err) { - log.warn(`getSnapshot failed: ${errorMessage(err)}`) - return { text: '[Snapshot unavailable]', elements: {} } + browser.addCommand( + 'getSnapshot', + async (options?: { inViewportOnly?: boolean }) => { + try { + const { getSnapshot } = await import('@wdio/elements') + return await getSnapshot(browser, options ?? { inViewportOnly: true }) + } catch (err) { + log.warn(`getSnapshot failed: ${errorMessage(err)}`) + return { text: '[Snapshot unavailable]', elements: {} } + } } - }) + ) } // The method signature is corrected to use W3CCapabilities From b752c251b13b0818001a40070a1d3d89807d81eb Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 22 Jul 2026 18:05:06 +0530 Subject: [PATCH 092/109] feat(trace): Selenium DOM-mutation capture + gate the artifacts manifest --- packages/nightwatch-devtools/README.md | 7 ++- packages/nightwatch-devtools/src/index.ts | 6 +- .../nightwatch-devtools/src/trace-context.ts | 5 +- .../tests/attemptTracking.test.ts | 51 ++++++++++++++++ packages/selenium-devtools/README.md | 1 + .../src/helpers/commandPostActions.ts | 44 ++++++++++++-- packages/selenium-devtools/src/index.ts | 13 ++++- .../src/session-lifecycle.ts | 14 ++++- .../tests/attempt-capture.test.ts | 58 +++++++++++++++++++ packages/service/src/types.ts | 6 -- packages/shared/src/types.ts | 7 +++ 11 files changed, 192 insertions(+), 20 deletions(-) diff --git a/packages/nightwatch-devtools/README.md b/packages/nightwatch-devtools/README.md index 59acab32..81ecbbe2 100644 --- a/packages/nightwatch-devtools/README.md +++ b/packages/nightwatch-devtools/README.md @@ -85,10 +85,11 @@ module.exports = { | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | | `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | | `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` next to your `nightwatch.conf.cjs` at run end. See [Trace mode](../../README.md#-trace-mode-tracezip). | -| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir and listed in the artifacts manifest; it is NOT attached inline to Allure (see note below). | -| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir and listed in the manifest; NOT attached inline to Allure. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir (and listed in the artifacts manifest when `emitArtifactsManifest: true`); it is NOT attached inline to Allure (see note below). | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir (and listed in the manifest when `emitArtifactsManifest: true`); NOT attached inline to Allure. | +| `emitArtifactsManifest` | `boolean` | `false` | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. **Opt-in for Nightwatch**: it has no live Allure signal to auto-detect against (`nightwatch-allure` is post-hoc), so unlike WDIO/Selenium it never auto-enables. Trace mode only. | -> **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files + manifest) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. +> **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files, plus the artifacts manifest when `emitArtifactsManifest: true`) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. ```javascript globals: nightwatchDevtools({ diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index c30f9fc4..4231e472 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -171,7 +171,10 @@ class NightwatchDevToolsPlugin { tracePolicy: options.tracePolicy ?? 'on', filmstrip: options.filmstrip ?? false, screenshot: options.screenshot ?? 'off', - video: options.video ?? 'off' + video: options.video ?? 'off', + // No live Allure signal in Nightwatch (produce-only), so no auto-detect: + // off by default, opt-in via the option. + emitArtifactsManifest: options.emitArtifactsManifest ?? false } const policyWarning = tracePolicyModeWarning(options.tracePolicy, mode) if (policyWarning) { @@ -681,6 +684,7 @@ class NightwatchDevToolsPlugin { flushed: this.#flushedSpecs, artifacts: this.#artifacts, traceFlushes: this.#traceFlushes, + emitArtifactsManifest: this.options.emitArtifactsManifest, // Accumulated (finalized-session) frames plus the live recorder's — a // mid-run per-spec/per-test flush fires before the recorder is drained // into #filmstripFrames, so its frames live only on the recorder still; diff --git a/packages/nightwatch-devtools/src/trace-context.ts b/packages/nightwatch-devtools/src/trace-context.ts index cf0a9baf..712e7e83 100644 --- a/packages/nightwatch-devtools/src/trace-context.ts +++ b/packages/nightwatch-devtools/src/trace-context.ts @@ -39,6 +39,7 @@ export interface TraceContextInput { screencastFrames?: readonly ScreencastFrame[] configPath: string | undefined testFilePath: string | undefined + emitArtifactsManifest?: boolean log: (level: 'info' | 'warn', msg: string) => void } @@ -68,7 +69,9 @@ export function buildTraceContext( // Nightwatch feeds real per-test attempt numbers via TestAttemptTracker // (B4), so retry-aware policies use per-test attempts, not the fallback. attemptInfoAvailable: true, - emitManifest: true, + // Off by default; opt-in only — Nightwatch has no live Allure signal to + // auto-detect against (produce-only Allure), unlike WDIO/Selenium. + emitManifest: input.emitArtifactsManifest ?? false, collectedArtifacts: input.artifacts, onArtifact: (a) => input.artifacts.push(a), log: input.log diff --git a/packages/nightwatch-devtools/tests/attemptTracking.test.ts b/packages/nightwatch-devtools/tests/attemptTracking.test.ts index fe49f502..4572694e 100644 --- a/packages/nightwatch-devtools/tests/attemptTracking.test.ts +++ b/packages/nightwatch-devtools/tests/attemptTracking.test.ts @@ -188,4 +188,55 @@ describe('buildTraceContext', () => { { uid: 't1', attempt: 0, state: 'failed' } ]) }) + + it('does not emit the artifacts manifest by default', () => { + const capturer = { + actionSnapshots: [], + snapshotCaptures: [] + } as unknown as SessionCapturer + const ctx = buildTraceContext( + { + mode: 'trace', + policy: 'on', + granularity: 'session', + format: 'zip', + capturer, + suites: [], + ranges: [], + flushed: new Set(), + artifacts: [], + traceFlushes: [], + configPath: undefined, + log: () => {} + }, + 'session-1' + ) + expect(ctx.emitManifest).toBe(false) + }) + + it('emits the manifest only when emitArtifactsManifest is opted in', () => { + const capturer = { + actionSnapshots: [], + snapshotCaptures: [] + } as unknown as SessionCapturer + const ctx = buildTraceContext( + { + mode: 'trace', + policy: 'on', + granularity: 'session', + format: 'zip', + capturer, + suites: [], + ranges: [], + flushed: new Set(), + artifacts: [], + traceFlushes: [], + configPath: undefined, + emitArtifactsManifest: true, + log: () => {} + }, + 'session-1' + ) + expect(ctx.emitManifest).toBe(true) + }) }) diff --git a/packages/selenium-devtools/README.md b/packages/selenium-devtools/README.md index ad8cfd22..cb2f71c2 100644 --- a/packages/selenium-devtools/README.md +++ b/packages/selenium-devtools/README.md @@ -348,6 +348,7 @@ See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for th | `rerunCommand` | `string` | auto | Command template for per-test rerun. `{{testName}}` is substituted. Auto-derived from runner argv if omitted. | | `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`) via `allure-js-commons` when an Allure runner adapter is active. | | `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`) via `allure-js-commons` when an Allure runner adapter is active. | +| `emitArtifactsManifest` | `boolean` | auto | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. Off by default; **auto-enables** when an `allure-js-commons` runtime is active (the same signal the inline Allure attach uses). Set explicitly to force on/off. Trace mode only. | `ScreencastOptions`: diff --git a/packages/selenium-devtools/src/helpers/commandPostActions.ts b/packages/selenium-devtools/src/helpers/commandPostActions.ts index ad90666c..22ebf0b5 100644 --- a/packages/selenium-devtools/src/helpers/commandPostActions.ts +++ b/packages/selenium-devtools/src/helpers/commandPostActions.ts @@ -23,6 +23,16 @@ import type { const log = logger('@wdio/selenium-devtools:commandPostActions') +/** Element commands that edit the current document (field values, form state). + * After these we drain the collector so the edits land in the mutation stream + * before a navigation (e.g. a submit click) discards the page. */ +const DOM_MUTATING_ELEMENT_COMMANDS = new Set([ + 'click', + 'sendKeys', + 'clear', + 'submit' +]) + /** * Helpers that run AFTER an `onCommand` capture/replace has fired. Kept out * of the plugin class so the hot path stays readable and these are easier to @@ -81,7 +91,6 @@ export async function enrichFindResult( */ export function captureNavigationTrace( capturer: SessionCapturer, - alreadyInjected: boolean, onInjected: () => void, isFinalized: () => boolean, entry?: CommandLog, @@ -90,10 +99,12 @@ export function captureNavigationTrace( ): void { void (async () => { try { - if (!alreadyInjected) { - onInjected() - await capturer.injectScript() - } + // A navigation replaced the document, so the previous page's collector is + // gone — (re)inject on every navigation so each visited page's DOM (and + // field edits) is captured, not just the first. onInjected keeps the + // first-injection flag other capture paths read. + onInjected() + await capturer.injectScript() if (entry && driver) { await capturePerformance(capturer, driver, entry, args) } @@ -173,6 +184,27 @@ function attachScreenshotAsync( .catch(() => {}) } +/** + * After a DOM-mutating element command (type/click/clear/submit), drain the + * collector so the page's field edits (value/checked) land in the mutation + * stream before a later navigation discards the page. Fire-and-forget; trace + * mode only. + */ +function maybeDrainAfterDomCommand( + ctx: OnCommandCtx, + capturer: SessionCapturer, + cmd: CapturedCommand +): void { + if ( + ctx.options.mode === 'trace' && + cmd.fromElement && + DOM_MUTATING_ELEMENT_COMMANDS.has(cmd.command) && + !ctx.finalized + ) { + void capturer.captureTrace().catch(() => {}) + } +} + /** * Plugin-side handler for a single command capture event. Pulled out of the * plugin class so the hot path stays readable and the post-capture branches @@ -212,7 +244,6 @@ export async function handleOnCommand( if (capturer.isNavigationCommand(cmd.command) && !cmd.fromElement) { captureNavigationTrace( capturer, - ctx.scriptInjected, () => ctx.setScriptInjected(true), () => ctx.finalized, entry, @@ -220,6 +251,7 @@ export async function handleOnCommand( ctx.driver ) } + maybeDrainAfterDomCommand(ctx, capturer, cmd) if ( ctx.options.mode === 'trace' && !error && diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 6bd8298e..743253a3 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -85,9 +85,17 @@ log.info(`Detected runner: ${RUNNER}`) log.info(`Detected selenium-webdriver: v${SELENIUM_VERSION}`) class SeleniumDevToolsPlugin { - #options: Required<Omit<DevToolsOptions, 'rerunCommand' | 'screencast'>> & { + #options: Required< + Omit< + DevToolsOptions, + 'rerunCommand' | 'screencast' | 'emitArtifactsManifest' + > + > & { rerunCommand?: string headless: boolean + // Optional (not defaulted): undefined defers to Allure auto-detection at + // finalize time (globalThis.allureTestRuntime), matching WDIO's tristate. + emitArtifactsManifest?: boolean } #sessionCapturer?: SessionCapturer #testReporter?: TestReporter @@ -162,7 +170,8 @@ class SeleniumDevToolsPlugin { tracePolicy: options.tracePolicy ?? 'on', filmstrip: options.filmstrip ?? false, screenshot: options.screenshot ?? 'off', - video: options.video ?? 'off' + video: options.video ?? 'off', + emitArtifactsManifest: options.emitArtifactsManifest } const policyWarning = tracePolicyModeWarning( options.tracePolicy, diff --git a/packages/selenium-devtools/src/session-lifecycle.ts b/packages/selenium-devtools/src/session-lifecycle.ts index c426e687..9007738c 100644 --- a/packages/selenium-devtools/src/session-lifecycle.ts +++ b/packages/selenium-devtools/src/session-lifecycle.ts @@ -61,6 +61,7 @@ export interface SessionLifecycleCtx { tracePolicy?: TraceRetentionPolicy filmstrip?: boolean video?: TraceVideoPolicy + emitArtifactsManifest?: boolean } readonly screencastOptions: ScreencastOptions readonly runner: string @@ -234,6 +235,13 @@ async function initPerDriverCapture( } export async function onDriverEnd(ctx: SessionLifecycleCtx): Promise<void> { + // Drain the live page's mutations before the driver quits — onDriverEnd runs + // (via onBeforeQuit) while the session is still alive, so the final page's + // DOM + field edits reach capturer.mutations before the trace is written. + // Gated on ctx.driver so the post-quit onDriverEnd call skips a dead session. + if (ctx.options.mode === 'trace' && ctx.driver) { + await ctx.sessionCapturer?.captureTrace() + } if (ctx.screencast && ctx.sessionId) { if (ctx.options.mode === 'trace') { // Trace mode: the video is emitted per-test (sliced in #emitTestArtifacts) @@ -369,7 +377,11 @@ export function buildTraceExportContext( }), awaitPending: [...ctx.snapshotCaptures, ...ctx.traceFlushes], log: (level, msg) => log[level](msg), - emitManifest: true, + // Off by default; explicit option wins, else auto-enable when an + // allure-js-commons runtime is active (the same signal the Allure sink uses). + emitManifest: + ctx.options.emitArtifactsManifest ?? + !!(globalThis as { allureTestRuntime?: unknown }).allureTestRuntime, collectedArtifacts: ctx.artifacts, onArtifact: (a) => ctx.artifacts.push(a) } diff --git a/packages/selenium-devtools/tests/attempt-capture.test.ts b/packages/selenium-devtools/tests/attempt-capture.test.ts index 173acfc8..8f4484bd 100644 --- a/packages/selenium-devtools/tests/attempt-capture.test.ts +++ b/packages/selenium-devtools/tests/attempt-capture.test.ts @@ -98,6 +98,64 @@ describe('retry/attempt capture', () => { }) }) +describe('artifacts manifest gating', () => { + function traceCtxWith(options: Record<string, unknown>) { + const { suiteManager } = makeManager() + const capturer = new SessionCapturer() + try { + const ctx = { + options: { + mode: 'trace', + traceGranularity: 'session', + traceFormat: 'zip', + ...options + }, + suiteManager, + actionSnapshots: [], + specRanges: [], + flushedSpecs: new Set<string>(), + traceFlushes: [], + snapshotCaptures: [] + } as unknown as SessionLifecycleCtx + return buildTraceExportContext(ctx, capturer, 'sess-1', '/spec.ts') + } finally { + capturer.cleanup() + } + } + + it('does not emit the manifest by default (no option, no Allure runtime)', () => { + expect(traceCtxWith({}).emitManifest).toBe(false) + }) + + it('emits the manifest when explicitly enabled', () => { + expect(traceCtxWith({ emitArtifactsManifest: true }).emitManifest).toBe( + true + ) + }) + + it('auto-enables when an allure-js-commons runtime is active', () => { + const g = globalThis as { allureTestRuntime?: unknown } + g.allureTestRuntime = () => ({}) + try { + expect(traceCtxWith({}).emitManifest).toBe(true) + } finally { + delete g.allureTestRuntime + } + }) + + it('an explicit false wins over an active Allure runtime', () => { + const g = globalThis as { allureTestRuntime?: unknown } + g.allureTestRuntime = () => ({}) + try { + expect(traceCtxWith({ emitArtifactsManifest: false }).emitManifest).toBe( + false + ) + } finally { + delete g.allureTestRuntime + } + }) +}) + describe('retry outcome ledger feeds retry-aware retention', () => { it('groups a fail-then-pass retry under one retry-stable uid', () => { const { mgr } = makeManager() diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index 695eafa8..84ef345f 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -53,12 +53,6 @@ export interface ServiceOptions extends BaseDevToolsOptions { * attached inline to Allure. `off` (default) or a retention policy. Trace * mode + `traceGranularity: 'test'` only. WDIO-service-specific for now. */ video?: TraceVideoPolicy - /** Write the `devtools-artifacts-<sessionId>.json` manifest next to the trace - * — the generic index reporters/CI consume to discover produced artifacts. - * Off by default (WDIO auto-attaches per-test traces to Allure directly); - * auto-enabled when `@wdio/allure-reporter` is in the config, since - * session/spec-scoped Allure attach reads the manifest. */ - emitArtifactsManifest?: boolean /** * capabilities used to launch the devtools application * @default diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 98dc2604..bee81233 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -337,6 +337,13 @@ export interface BaseDevToolsOptions { * DOM snapshots). Runs the screencast recorder (CDP push on Chrome, polling * elsewhere). Default false. Only applies in trace mode. */ filmstrip?: boolean + /** Write the `devtools-artifacts-<sessionId>.json` manifest next to the trace + * — the generic index reporters/CI consume to discover produced artifacts. + * Off by default; auto-enabled when an Allure reporter is detected (WDIO: + * `@wdio/allure-reporter` in config; Selenium: an active `allure-js-commons` + * runtime). Nightwatch has no live Allure signal, so it stays opt-in there. + * Only applies in trace mode. */ + emitArtifactsManifest?: boolean } /** Minimal Cucumber pickle-step shape — only the fields the adapters read. From 562840201296a050ae68ffa0b5c6bce0a6596430 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 22 Jul 2026 18:30:57 +0530 Subject: [PATCH 093/109] fix(core): order the trace transcript by invocation time --- examples/nightwatch/nightwatch.conf.cjs | 2 +- packages/core/src/trace-exporter.ts | 13 +++++++++++-- packages/core/tests/trace-exporter.test.ts | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/examples/nightwatch/nightwatch.conf.cjs b/examples/nightwatch/nightwatch.conf.cjs index b0d1134d..63f13171 100644 --- a/examples/nightwatch/nightwatch.conf.cjs +++ b/examples/nightwatch/nightwatch.conf.cjs @@ -54,7 +54,7 @@ module.exports = { // a single session-scoped slice here. See CLAUDE.md § Known debt. mode: 'trace', traceGranularity: 'session', - tracePolicy: 'retain-on-first-failure', + // tracePolicy: 'retain-on-first-failure', bidi: true }) } diff --git a/packages/core/src/trace-exporter.ts b/packages/core/src/trace-exporter.ts index 31299af6..d7fa1b8f 100644 --- a/packages/core/src/trace-exporter.ts +++ b/packages/core/src/trace-exporter.ts @@ -276,7 +276,7 @@ function compareEvents(a: TraceEvent, b: TraceEvent): number { /** * Generate a human/LLM-readable Markdown transcript from captured commands. */ -function generateTranscript( +export function generateTranscript( commands: CommandLog[], startWallTime: number, title?: string @@ -284,8 +284,17 @@ function generateTranscript( const wallTimeISO = new Date(startWallTime).toISOString() const lines: string[] = [`# ${title ?? 'Session'} — ${wallTimeISO}`, ''] + // Sort by invocation time so batched commands land at their real timeline + // positions — Nightwatch buffers native asserts and emits them at test-end, + // so raw order clusters all asserts after the navigations. The Actions tree + // stays correct because buildActionEvents applies the same sort; mirror it + // here so the transcript matches execution order. Stable + a no-op for + // already-ordered WDIO/Selenium command logs. + const ordered = [...commands].sort( + (a, b) => (a.startTime ?? a.timestamp) - (b.startTime ?? b.timestamp) + ) const captured: { entry: CommandLog; action: TraceAction }[] = [] - for (const c of commands) { + for (const c of ordered) { const action = mapCommandToAction(String(c.command)) if (action) { captured.push({ entry: c, action }) diff --git a/packages/core/tests/trace-exporter.test.ts b/packages/core/tests/trace-exporter.test.ts index a6a36503..9fb5b6ff 100644 --- a/packages/core/tests/trace-exporter.test.ts +++ b/packages/core/tests/trace-exporter.test.ts @@ -9,6 +9,7 @@ import { type TraceCapturer } from '@wdio/devtools-core' import { TraceType, type CommandLog } from '@wdio/devtools-shared' +import { generateTranscript } from '../src/trace-exporter.js' function cmd(command: string, overrides: Partial<CommandLog> = {}): CommandLog { const base = (overrides.timestamp ?? 1000) + 100 @@ -21,6 +22,24 @@ function cmd(command: string, overrides: Partial<CommandLog> = {}): CommandLog { } } +describe('generateTranscript', () => { + it('orders commands by invocation time when captured out of order (Nightwatch batches asserts to test-end)', () => { + // Array order puts a later navigation before an earlier-timestamped click, + // mimicking Nightwatch buffering native asserts until test-end. + const commands = [ + cmd('url', { timestamp: 1100, startTime: 1050 }), + cmd('url', { timestamp: 1300, startTime: 1250 }), + cmd('click', { timestamp: 1200, startTime: 1150 }) + ] + const lines = generateTranscript(commands, 1000, 'Test') + .split('\n') + .filter((l) => /^\d+\./.test(l)) + expect(lines).toHaveLength(3) + // Sorted by startTime: url(1050) → click(1150) → url(1250) — click is #2. + expect(lines[1]).toMatch(/click/i) + }) +}) + describe('buildActionEvents', () => { const pageId = 'page@abc123' const wallTime = 1000 From 49bd1c0c219ac5c29b69351b58be751d9cf6e80a Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 22 Jul 2026 22:52:45 +0530 Subject: [PATCH 094/109] feat(trace): default filmstrip to on in trace mode --- packages/nightwatch-devtools/src/index.ts | 2 +- packages/selenium-devtools/src/index.ts | 2 +- packages/service/src/index.ts | 9 +++++++-- packages/service/tests/index.test.ts | 11 ++++++----- packages/shared/src/types.ts | 3 ++- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/nightwatch-devtools/src/index.ts b/packages/nightwatch-devtools/src/index.ts index 4231e472..5d150198 100644 --- a/packages/nightwatch-devtools/src/index.ts +++ b/packages/nightwatch-devtools/src/index.ts @@ -169,7 +169,7 @@ class NightwatchDevToolsPlugin { traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', tracePolicy: options.tracePolicy ?? 'on', - filmstrip: options.filmstrip ?? false, + filmstrip: options.filmstrip ?? true, screenshot: options.screenshot ?? 'off', video: options.video ?? 'off', // No live Allure signal in Nightwatch (produce-only), so no auto-detect: diff --git a/packages/selenium-devtools/src/index.ts b/packages/selenium-devtools/src/index.ts index 743253a3..d0e073dc 100644 --- a/packages/selenium-devtools/src/index.ts +++ b/packages/selenium-devtools/src/index.ts @@ -168,7 +168,7 @@ class SeleniumDevToolsPlugin { traceFormat: options.traceFormat ?? 'zip', traceGranularity: options.traceGranularity ?? 'session', tracePolicy: options.tracePolicy ?? 'on', - filmstrip: options.filmstrip ?? false, + filmstrip: options.filmstrip ?? true, screenshot: options.screenshot ?? 'off', video: options.video ?? 'off', emitArtifactsManifest: options.emitArtifactsManifest diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index ab3dce36..df1cdb5e 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -206,11 +206,16 @@ export default class DevToolsHookService implements Services.ServiceInstance { /** Record a screencast this session? Live mode: `screencast.enabled`. Trace * mode: a non-`off` `video` policy (frames sliced per test at flush) or * `filmstrip` (dense frames written into the trace itself). */ + /** Filmstrip defaults ON in trace mode; explicit `filmstrip: false` opts out. */ + #filmstripOn(): boolean { + return this.#options.filmstrip ?? true + } + #shouldRecordScreencast(): boolean { if (this.#options.mode === 'trace') { return ( (!!this.#options.video && this.#options.video !== 'off') || - !!this.#options.filmstrip + this.#filmstripOn() ) } return !!this.#screencastOptions?.enabled @@ -220,7 +225,7 @@ export default class DevToolsHookService implements Services.ServiceInstance { * accumulated frames plus the live recorder's, or undefined when filmstrip * is off (so the trace stays byte-stable with today's output). */ #filmstripFramesForExport(): ScreencastFrame[] | undefined { - if (!this.#options.filmstrip) { + if (!this.#filmstripOn()) { return undefined } return [ diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index 99ba04da..bec3b873 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -278,16 +278,17 @@ describe('DevtoolsService - Screencast Integration', () => { // helper itself (covered in core/tests). Service just needs to invoke it. }) - it('trace mode: filmstrip starts the recorder; no filmstrip/video leaves it off', async () => { - // filmstrip on → recorder runs so its frames become the dense trace filmstrip - service = new DevToolsHookService({ mode: 'trace', filmstrip: true }) + it('trace mode: filmstrip defaults on and starts the recorder; filmstrip:false + no video leaves it off', async () => { + // filmstrip defaults ON in trace mode → recorder runs (its frames become the + // dense trace filmstrip) even with no explicit option. + service = new DevToolsHookService({ mode: 'trace' }) await service.before({} as any, [], mockBrowser) expect(mockScreencastRecorder.start).toHaveBeenCalledWith(mockBrowser) vi.clearAllMocks() - // trace mode, neither filmstrip nor video → no recorder (byte-stable output) - service = new DevToolsHookService({ mode: 'trace' }) + // explicit filmstrip:false and no video → no recorder (one frame per action) + service = new DevToolsHookService({ mode: 'trace', filmstrip: false }) await service.before({} as any, [], mockBrowser) expect(mockScreencastRecorder.start).not.toHaveBeenCalled() }) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index bee81233..5f8751c0 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -335,7 +335,8 @@ export interface BaseDevToolsOptions { * scrubbable playback in the trace player — not just one frame per action. * The dense frames are added alongside the per-action frames (which carry the * DOM snapshots). Runs the screencast recorder (CDP push on Chrome, polling - * elsewhere). Default false. Only applies in trace mode. */ + * elsewhere). Default true. Set `false` to record only one frame per action + * (smaller trace, no continuous recorder). Only applies in trace mode. */ filmstrip?: boolean /** Write the `devtools-artifacts-<sessionId>.json` manifest next to the trace * — the generic index reporters/CI consume to discover produced artifacts. From 32ce8d71ade288c4d4dd4064b9b7b9d18d4d7dd0 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Wed, 22 Jul 2026 22:52:53 +0530 Subject: [PATCH 095/109] docs: trace mode, player features, and per-adapter support matrix --- README.md | 29 +++++++++++- packages/backend/README.md | 24 ++++++++++ packages/elements/README.md | 28 +++++++++++- packages/nightwatch-devtools/README.md | 37 ++++++++++++++- packages/selenium-devtools/README.md | 63 +++++++++++++++++++++++++- packages/service/README.md | 56 ++++++++++++++++++++--- 6 files changed, 226 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 09f93c2e..b474433b 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,16 @@ When BiDi is active in Selenium or Nightwatch, the per-command Chrome performanc ### 📦 Trace mode (trace.zip) -Headless capture path — no DevTools UI window opens. At session end the adapter writes trace artifacts into a `test-results/` folder (created next to the resolved spec/config directory), suitable for offline replay, AI-agent diffing, or any consumer that prefers a portable artifact over a live UI. +The dashboard runs in one of **two modes**, set per adapter via the shared `mode` option: + +- **`live`** (default) — the interactive DevTools UI window described above. +- **`trace`** — a headless capture path that writes a portable trace archive, opened later in the **trace player**. + +All three adapters (`@wdio/devtools-service`, `@wdio/selenium-devtools`, `@wdio/nightwatch-devtools`) emit the **same normalized trace** through the shared `@wdio/devtools-core` capture library, so one archive format and one player serve every framework. + +The trace **format and the player are identical** across the three adapters, but **capture completeness varies** — WebdriverIO is the most complete; Selenium and Nightwatch cover the core flow with some gaps (e.g. inline-Allure per-test artifacts, retry-aware retention, Cucumber step nesting, auto BiDi). Each adapter's README lists its specifics. + +In trace mode no DevTools UI window opens. At session end the adapter writes trace artifacts into a `test-results/` folder (created next to the resolved spec/config directory), suitable for offline replay, AI-agent diffing, or any consumer that prefers a portable artifact over a live UI. | Adapter | How to enable | |---|---| @@ -101,9 +110,19 @@ npx show-trace path/to/trace.zip # in a project that installs an adapter `show-trace` reconstructs the trace and serves the same DevTools UI in a dedicated **player** mode: the action list on the left, the page snapshot in the browser pane, and a bottom timeline with a filmstrip, action/network tracks, a draggable playhead, and playback controls (play/step/speed). Click a **Network** bar to open its request detail; press **`?`** for keyboard shortcuts (`Space` play/pause, `←`/`→` step, `Home`/`End`, `,`/`.` speed). +The player exposes everything captured in the archive: + +- **DOM time-travel** — the browser pane replays the page from the captured DOM **mutation stream**, so scrubbing the playhead reconstructs the live DOM at any point, not just a screenshot. +- **A11y tab** — the accessibility tree (roles + accessible names) captured for the selected command; hover a row to outline the element in the snapshot, click to copy its locator. +- **Element overlay (pick-locator)** — labelled, click-to-copy boxes drawn over every element the test interacted with, cross-linked to the A11y rows. +- **Transcript tab + Copy-for-LLM** — the run's Markdown transcript with a one-click "copy prompt" that bundles it with any failing-command errors, paste-ready for an LLM. +- **Cucumber Feature → Scenario → Step nesting** — tests render as labelled `tracingGroup` spans wrapping their commands, with Cucumber steps nested under their scenario. +- **Dense filmstrip** — with `filmstrip` enabled, the timeline scrubs a continuous screencast for smooth playback rather than one frame per action. +- **Timeline input markers** — keyboard actions and pointer hits (commands with a captured hit point) get distinct glyphs on the timeline. + The `show-trace` bin is exposed by each adapter (`@wdio/devtools-service`, `@wdio/nightwatch-devtools`, `@wdio/selenium-devtools`), so `pnpm show-trace <zip>` / `npx show-trace <zip>` work in any project that installs one — no extra dependency. -**Other viewers.** The trace uses a portable NDJSON schema, so the same `.zip` also opens in other compatible trace viewers that read the format. This is the same format [`@wdio/mcp`](https://webdriver.io/docs/mcp) uses for AI-driven session recording. +**Other viewers.** The trace uses a portable NDJSON schema, so the same `.zip` also opens in other compatible standalone trace viewers that read the format, and — because it shares that on-disk format — is what an Allure report's **embedded trace viewer** (Allure ≥ 2.35) reads. See the [backend README](./packages/backend/README.md#trace-serving--show-trace) for the reader details. #### Options @@ -114,6 +133,12 @@ The `show-trace` bin is exposed by each adapter (`@wdio/devtools-service`, `@wdi | `traceGranularity` | `'session'` \| `'spec'` \| `'test'` | `'session'` | `'session'` writes one trace per worker; `'spec'` one per spec file; `'test'` one per test into its own `<spec>-<title>-<browser>[-retryN]/trace.zip` folder — the smallest, most navigable artifacts, and the best pairing for a retention policy. | | `tracePolicy` | `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. `'on'` keeps every trace; the rest keep only failing/retried tests — pairs well with `traceGranularity: 'test'`. | | `captureAssertions` | `boolean` | `true` | Capture assertions as action rows: `node:assert` (all adapters), WebdriverIO `expect(...)` matchers, and Nightwatch `browser.assert`/`verify`. Set `false` to opt out. | +| `filmstrip` | `boolean` | `true` | Record a dense, continuous screencast *into* the trace for smooth scrubbing in the player (not just one frame per action). Dense frames sit alongside the per-action frames; thinned + content-addressed at export. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | +| `emitArtifactsManifest` | `boolean` | auto | Write `devtools-artifacts-<sessionId>.json` next to the trace — the index reporters/CI read to discover produced artifacts. Off by default; auto-enabled when an Allure reporter is detected (Nightwatch stays opt-in). | + +The per-test **`screenshot`** and **`video`** artifact options live on the WebdriverIO and Selenium adapters (not the shared base), are gated to `traceGranularity: 'test'`, and attach inline to Allure — see the [WebdriverIO](./packages/service/README.md#allure-integration) and [Selenium](./packages/selenium-devtools/README.md) READMEs for the full per-adapter option tables. + +**Allure integration.** When an Allure reporter is present, per-test traces, screenshots, and videos attach to each test's card (`traceGranularity: 'test'`); coarser granularities write the artifacts to disk and list them in the manifest. Details and the report-noise settings are in the [WebdriverIO adapter README](./packages/service/README.md#allure-integration). WDIO config example: diff --git a/packages/backend/README.md b/packages/backend/README.md index 6686cc78..ef3110a4 100644 --- a/packages/backend/README.md +++ b/packages/backend/README.md @@ -9,11 +9,35 @@ The server that the three adapter packages connect to and the dashboard UI talks - **Baseline store** (in-memory) — captures a snapshot of a failing test attempt, plus per-uid metadata, so the "Preserve & Rerun" flow can show a side-by-side diff. - **Rerun spawner** (`runner.ts`) — spawns the user's `wdio` / `nightwatch` / `selenium` binary with rerun filters built from the dashboard's payload. - **Worker-message handler** — dispatches messages from spawned workers (config path, session id, video path, ...). +- **Trace serving** (`show-trace.ts`, `trace-reader.ts`) — reconstructs a recorded `trace.zip` and boots the server in a read-only **trace-serve** mode that backs the DevTools UI's trace player. No worker connects in this mode. ## Framework awareness Lives only in `runner.ts` and `framework-filters.ts`. Both branch on a typed `TestRunnerId` from `@wdio/devtools-shared` (never a magic string). `framework-filters.ts` uses an explicit `switch` over the runner id rather than a Map/object lookup so CodeQL's `unvalidated-dynamic-method-call` query trusts the dispatch. +## Trace serving / `show-trace` + +Trace mode (see the [root README](../../README.md#-trace-mode-tracezip)) writes a portable `trace.zip`; the backend is what opens it back up. + +- **CLI** (`src/show-trace.ts`) — `runShowTraceCli` resolves the argument, reads the archive with `readTraceZip`, calls `start({ trace })` in trace-serve mode, prints the URL, and opens the default browser. Run it from this repo with the root script: + + ```sh + pnpm show-trace path/to/trace.zip + ``` + + The same entry is shipped as a `show-trace` **bin** by the backend (`./dist/show-trace.js`) and by each adapter (`@wdio/devtools-service`, `@wdio/selenium-devtools`, `@wdio/nightwatch-devtools` each ship a thin `bin/show-trace.mjs`), so `npx show-trace <trace.zip>` works in any project that installs an adapter — backend need only be a transitive dependency. In trace-serve mode `start({ trace })` exposes the reconstructed payload at `TRACE_API.get` and skips the worker/rerun machinery. + +- **Reader** (`src/trace-reader.ts`, with sibling `trace-reader-{constants,types,utils,groups}.ts`) — `parseTraceZip` / `readTraceZip` reconstruct a `TracePlayerData` payload from the archive. It accepts this repo's own exporter output **and foreign zips** written by other tools (every `.trace` entry is an action-event stream, every `.network` a HAR stream, `.stacks` sidecars carry call stacks). It rebuilds: + - **commands** — from `before`/`after` action events, with call source, result, error, nearest screenshot frame, and pointer hit point; + - **DOM mutations** — from the `.mutations` NDJSON stream (drives the player's DOM time-travel); + - **network** — HAR entries from `.network` streams; + - **console** — from `console`/`stdout`/`stderr` events; + - **a11y snapshots** — the per-action `-snapshot.txt` accessibility tree, keyed onto each command's `snapshotText` (drives the A11y tab); + - **transcript** — `transcript.md`, surfaced verbatim in the player's Transcript tab; + - plus the filmstrip frames, sources, and the `tracingGroup` action tree (Feature → Scenario → Step nesting). + +Because the archive uses that portable, standard trace-viewer format, the same `.zip` also opens in compatible standalone trace viewers, and its on-disk format is what an Allure report's **embedded trace viewer** reads (Allure ≥ 2.35). + ## Public API The backend is consumed only by other workspace packages. Adapter launchers call `start({ port, hostname })` and receive the bound port. The dashboard accesses it via the documented HTTP routes (`packages/shared/src/baseline.ts`, `packages/shared/src/runner.ts`) and WS scopes (`packages/shared/src/ws.ts`, `packages/shared/src/routes.ts`). diff --git a/packages/elements/README.md b/packages/elements/README.md index c1534289..fa9762f0 100644 --- a/packages/elements/README.md +++ b/packages/elements/README.md @@ -21,6 +21,22 @@ const result = await getElements(browser, { limit: 50, inViewportOnly: true }) // { total, showing, hasMore, elements, tree? } ``` +### Accessibility snapshot (`getSnapshot`) + +A single call for web and mobile that returns an AI-readable accessibility/DOM snapshot as a `SnapshotResult` — a text tree with `e1`, `e2`, … virtual element IDs baked in, plus an `elements` map that resolves each ID to a real selector. No post-processing required. + +```ts +import { getSnapshot } from '@wdio/elements' + +const { text, elements } = await getSnapshot(browser, { inViewportOnly: true }) +// text: '[Page: Login — https://…]\n button "Log in" → button*=Log in\n …' +// elements: { e1: { selector, qualifiedSelector?, tagName, role, text }, … } +``` + +It auto-detects platform: web sessions walk the browser accessibility tree, mobile sessions parse the page-source XML. `@wdio/devtools-service` also registers a `browser.getSnapshot()` runtime accessor that calls this directly. + +This is the snapshot the DevTools **trace player** consumes: the per-action accessibility tree feeds the player's **A11y tab** (roles + accessible names, hover to highlight, click to copy a locator), and the resolved `elements` back the player's **element overlay / pick-locator** (click-to-copy boxes drawn over each interacted element, cross-linked to the A11y rows). + ### Browser ```ts @@ -92,6 +108,14 @@ Auto-detects platform and returns a unified result. | `limit` | `number` | `0` | Max elements (0 = no limit) | | `offset` | `number` | `0` | Pagination offset | +### `getSnapshot(browser, options)` + +Auto-detects platform and returns a `SnapshotResult` — `{ text, elements }` — where `text` is the rendered accessibility tree with embedded `e1`, `e2`, … IDs and `elements` maps each ID to a `SnapshotElement` (`selector`, optional `qualifiedSelector` for `.instance(N)` disambiguation, `tagName`, `role`, `text`). + +| Param | Type | Default | Description | +|---|---|---|---| +| `inViewportOnly` | `boolean` | `true` | Only include elements whose bounds intersect the viewport | + ### `getInteractableBrowserElements(browser, options)` Single `querySelectorAll` walk — returns flat list of interactable elements. @@ -132,7 +156,9 @@ export type { MobileElementInfo, GetMobileElementsOptions, AccessibilityNode, VisibleElementsResult, - WebSnapshotOptions, MobileSnapshotOptions + WebSnapshotOptions, MobileSnapshotOptions, + GetSnapshotOptions, + SnapshotResult, SnapshotElement } from '@wdio/elements' // From @wdio/elements/locators: diff --git a/packages/nightwatch-devtools/README.md b/packages/nightwatch-devtools/README.md index 81ecbbe2..2f110124 100644 --- a/packages/nightwatch-devtools/README.md +++ b/packages/nightwatch-devtools/README.md @@ -84,10 +84,15 @@ module.exports = { | `hostname` | `string` | `'localhost'` | Hostname the backend server binds to. | | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | | `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | -| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` next to your `nightwatch.conf.cjs` at run end. See [Trace mode](../../README.md#-trace-mode-tracezip). | +| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` (or directory) next to your `nightwatch.conf.cjs` at run end. See [Trace mode](#trace-mode). | +| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace artifact layout — `zip` writes a single archive, `ndjson-directory` unpacks the same files into `trace-<sessionId>/`. Only applies when `mode: 'trace'`. | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | One trace per session / spec file / test. `'test'` is what the per-test `screenshot` / `video` artifacts attach to. Only applies when `mode: 'trace'`. **Caveat:** the BDD `describe/it` interface collapses to a single session-scoped slice (see [Per-test slicing](#per-test-slicing--the-bdd-describeit-caveat)). | +| `tracePolicy` | `'on' \| 'retain-on-failure' \| 'retain-on-first-failure' \| 'on-first-retry' \| 'on-all-retries' \| 'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. Pairs with `traceGranularity: 'test'`. Only applies when `mode: 'trace'`. | +| `filmstrip` | `boolean` | `true` | Record a dense, continuous screencast filmstrip into the trace for scrubbable playback in the trace player — not just one frame per action. Runs the screencast recorder (polling mode on Nightwatch) for the session. Only applies when `mode: 'trace'`. | | `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir (and listed in the artifacts manifest when `emitArtifactsManifest: true`); it is NOT attached inline to Allure (see note below). | | `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir (and listed in the manifest when `emitArtifactsManifest: true`); NOT attached inline to Allure. | | `emitArtifactsManifest` | `boolean` | `false` | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. **Opt-in for Nightwatch**: it has no live Allure signal to auto-detect against (`nightwatch-allure` is post-hoc), so unlike WDIO/Selenium it never auto-enables. Trace mode only. | +| `captureAssertions` | `boolean` | `true` | Capture assertions as trace action rows — `node:assert` plus native `browser.assert.*` / `browser.verify.*`, including negated `.not.*` matchers. Passing assertions render green, failing ones red with the error. Set `false` to opt out. | > **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files, plus the artifacts manifest when `emitArtifactsManifest: true`) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. @@ -135,6 +140,34 @@ The encoded video is sent to the DevTools dashboard via the `screencast` WS scop --- +## Trace mode + +Set `mode: 'trace'` to skip the DevTools UI window and instead write a portable, self-contained trace artifact at run end — for offline replay, CI artifact collection, or AI-agent diffing. The backend port-bind, the UI window, and the live-only `screencast` option are all skipped in trace mode. + +```javascript +globals: nightwatchDevtools({ + mode: 'trace', + traceFormat: 'ndjson-directory' // optional; default 'zip' +}) +``` + +Nightwatch emits the **same normalized trace** as the WebdriverIO and Selenium adapters (all three share `@wdio/devtools-core`), so the archive format and the `show-trace` player are identical no matter which adapter produced it. A Nightwatch trace carries the full per-action capture — a screenshot, the depth-indented accessibility-tree snapshot, the interactable-element list, and the Markdown transcript — so it opens in the player with DOM/snapshot time-travel, the **A11y** and **Transcript** tabs, the pick-locator element overlay, and (for Cucumber) **Feature → Scenario → Step** nesting. + +Open a trace with the `show-trace` bin, shipped with this package (no extra dependency): + +```bash +npx show-trace test-results/trace-<sessionId>.zip # in a project that installs this adapter +pnpm show-trace test-results/trace-<sessionId>.zip # from the devtools monorepo +``` + +For the full artifact contents, the `traceGranularity` / `tracePolicy` reference, and the player walkthrough, see [Trace mode](../../README.md#-trace-mode-tracezip) and [Viewing traces](../../README.md#viewing-traces) in the root README. + +### Per-test slicing & the BDD `describe/it` caveat + +The per-test options — `traceGranularity: 'test'`, and the `tracePolicy`, `screenshot`, and `video` options that pair with it — need a per-test hook to cut each test's slice. The **exports-object (mocha-style)** interface and **Cucumber** (per-scenario hooks) expose one, so they get real per-test slicing. The **BDD `describe/it`** interface — the style used by this package's bundled example — is the exception: Nightwatch runs each `it()` internally and fires the plugin's per-test hook only once per module, so `traceGranularity: 'test'` collapses to a single **session-scoped** slice keyed to the first test. The artifacts manifest still lists every testcase with its correct state; only the per-test slice/artifact keying collapses. Session- and spec-granularity traces are unaffected. + +--- + ## Examples Working examples are included in this package: @@ -164,6 +197,8 @@ Nightwatch does not provide the same depth of framework hooks as WebdriverIO, so | Limited test context | `browser.currentTest` provides less metadata than the WDIO runner context; test names and file paths require additional heuristics. | | Flat suite nesting | Nightwatch does not natively support multiply-nested `describe` blocks; the plugin reports a maximum of two levels. | | Delayed result availability | Test results are only finalised in `afterEach`, not available mid-test. | +| Per-test trace slicing (BDD `describe/it`) | The BDD interface fires the plugin's per-test hook once per module, so `traceGranularity: 'test'` collapses to one session-scoped slice. The exports-object (mocha-style) and Cucumber interfaces get real per-test slicing. See [Per-test slicing](#per-test-slicing--the-bdd-describeit-caveat). | +| Produce-only trace artifacts | Per-test `screenshot` / `video` files are written to the trace output dir (and the manifest when `emitArtifactsManifest: true`) but not attached inline to Allure — Nightwatch has no live Allure attach API. | Overall feature parity with the WebdriverIO DevTools service is approximately **80–90%**. diff --git a/packages/selenium-devtools/README.md b/packages/selenium-devtools/README.md index cb2f71c2..d974a5bb 100644 --- a/packages/selenium-devtools/README.md +++ b/packages/selenium-devtools/README.md @@ -318,7 +318,36 @@ DevTools.configure({ rerunCommand: 'npm test -- --grep "{{testName}}"' }) DevTools.configure({ mode: 'trace' }) ``` -See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for the trace.zip layout and consumer notes. +#### `traceGranularity` — one trace per session, spec, or test +**Default:** `'session'`. `'spec'` writes one trace per spec file; `'test'` writes one per test into `test-results/<spec>-<title>-<browser>[-retryN]/trace.zip` — the smallest, most navigable artifacts and the best pairing with `tracePolicy`. Trace mode only. + +```javascript +DevTools.configure({ mode: 'trace', traceGranularity: 'test' }) +``` + +#### `tracePolicy` — which traces to keep +**Default:** `'on'` (keep every trace). Pairs with `traceGranularity: 'test'`. The other values keep only failing / retried tests: `'retain-on-failure'`, `'retain-on-first-failure'`, `'on-first-retry'`, `'on-all-retries'`, `'retain-on-failure-and-retries'`. Trace mode only. + +#### `traceFormat` — zip vs. unpacked directory +**Default:** `'zip'` (a single `trace-<sessionId>.zip`). `'ndjson-directory'` writes the same `trace.trace` + `trace.network` + `resources/` layout unpacked into `trace-<id>/`, skipping the unzip step for scripted / agentic consumers. Trace mode only. + +#### `filmstrip` — dense scrubbable screencast in the trace +**Default:** `false`. Records a continuous screencast (CDP push on Chrome, screenshot polling elsewhere) into the trace so the player timeline scrubs frame-by-frame, not just one frame per action. Trace mode only. + +```javascript +DevTools.configure({ mode: 'trace', filmstrip: true }) +``` + +#### `screenshot` and `video` — per-test artifacts +**Default:** `'off'` for both. Trace mode + `traceGranularity: 'test'`. `screenshot` (`'on'` / `'only-on-failure'`) captures a per-test PNG; `video` (a retention policy) slices a per-test `.webm`. When an `allure-js-commons` runner adapter is active they're attached inline to the Allure report; otherwise they're written to `test-results/` and recorded in the manifest. + +#### `emitArtifactsManifest` — machine-readable artifact index +**Default:** off, **auto-enabled** when an `allure-js-commons` runtime is active. Writes `devtools-artifacts-<sessionId>.json` next to the trace so reporters / CI can discover the produced artifacts. Set explicitly to force on/off. Trace mode only. + +#### `captureAssertions` — record assertions as action rows +**Default:** `true`. Captures `node:assert` assertions (both passing and failing) as first-class rows in the trace's Actions / Errors view. Set `false` to opt out. + +See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for the trace.zip layout and consumer notes, and [Viewing traces](#viewing-traces) below for the player. --- @@ -335,6 +364,30 @@ See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for th --- +## Viewing traces + +Open any trace `.zip` in the first-party player — the same DevTools UI in a dedicated **player** mode: + +```bash +pnpm show-trace path/to/trace.zip # from this repo +npx show-trace path/to/trace.zip # in a project that installs the adapter +``` + +The `show-trace` bin ships with `@wdio/selenium-devtools`, so `npx show-trace <zip>` works in any project that installs it — no extra dependency. + +Because the Selenium adapter captures the page's **DOM mutation stream** and a per-command element / accessibility snapshot alongside each screenshot, a Selenium trace drives the player's full feature set: + +- **DOM time-travel** — the browser pane rebuilds the live page DOM as of the selected command (reconstructed per navigation from the captured mutations), not just a static screenshot. +- **A11y tab + element overlay** — inspect the accessibility tree for the selected action; hover the snapshot to outline elements and click a box to copy its locator ("pick locator"). +- **Transcript tab + Copy-for-LLM** — a Markdown rendering of the run (actions, selectors, values) ready to paste into an agent or LLM. +- **Cucumber Feature → Scenario → Step nesting** — Gherkin steps render as a collapsible tree. +- **Timeline** — a dense filmstrip (with `filmstrip: true`), input markers, and Actions / Network / Console tracks with a draggable playhead and playback controls. +- **Errors, Console, Network, and Source** panels per action. + +The trace uses a portable NDJSON schema, so the same `.zip` (or `ndjson-directory`) also opens in other compatible trace viewers, and — when an `allure-js-commons` runner adapter is active — per-test traces / screenshots / videos attach inline to the Allure report. + +--- + ## Reference — all options | Option | Type | Default | Description | @@ -346,9 +399,15 @@ See [Trace mode](../../README.md#-trace-mode-tracezip) in the root README for th | `headless` | `boolean` | `false` | Run the **test** browser headless (injects `--headless=old`). The DevTools UI window is unaffected. | | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Per-session `.webm` video recording. See sub-options below. | | `rerunCommand` | `string` | auto | Command template for per-test rerun. `{{testName}}` is substituted. Auto-derived from runner argv if omitted. | +| `mode` | `'live' \| 'trace'` | `'live'` | `live` opens the DevTools UI; `trace` skips it and writes a portable trace artifact instead. Overrides `openUi`. | +| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace artifact layout — a single `.zip` or an unpacked directory. Trace mode only. | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | One trace per session / spec file / test. `'test'` writes each to `test-results/<spec>-<title>-<browser>[-retryN]/trace.zip`. Trace mode only. | +| `tracePolicy` | `'on' \| 'retain-on-failure' \| 'retain-on-first-failure' \| 'on-first-retry' \| 'on-all-retries' \| 'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. Pairs with `traceGranularity: 'test'`. Trace mode only. | +| `filmstrip` | `boolean` | `true` | Record a dense, continuous screencast into the trace for frame-by-frame scrubbing in the player. Trace mode only. | | `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`) via `allure-js-commons` when an Allure runner adapter is active. | | `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`) via `allure-js-commons` when an Allure runner adapter is active. | | `emitArtifactsManifest` | `boolean` | auto | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. Off by default; **auto-enables** when an `allure-js-commons` runtime is active (the same signal the inline Allure attach uses). Set explicitly to force on/off. Trace mode only. | +| `captureAssertions` | `boolean` | `true` | Capture `node:assert` assertions (both passing and failing) as trace action rows. Set `false` to opt out. | `ScreencastOptions`: @@ -406,6 +465,8 @@ The plugin patches `selenium-webdriver`'s `Builder`, `WebDriver`, and `WebElemen When BiDi is available (Chrome ≥114), console logs, JavaScript exceptions, and network events stream directly via the Selenium BiDi handlers. Otherwise the plugin falls back to an injected browser-side collector script. +The same injected collector also records the page's **DOM mutation stream** and a per-command element / accessibility snapshot, so a trace carries enough to rebuild the live DOM at each step (per-navigation mapping) — that's what powers the player's DOM time-travel and A11y tab rather than a screenshot-only replay. + > The BiDi attach + inspector wiring lives in [`@wdio/devtools-core`'s `bidi.ts`](../core/src/bidi.ts) (`loadSeleniumSubmodule`, `attachBidiHandlers`, `arrayHeadersToObject`) — the same helpers nightwatch-devtools uses when its `bidi: true` opt-in is enabled. This adapter's `bidi.ts` keeps only the selenium-specific Builder-cap helpers (`ensureBidiCapability`, `ensureHeadlessChrome`) and the `buildBidiSinks` wrapper. ### Performance API capture diff --git a/packages/service/README.md b/packages/service/README.md index c5a28e80..1d9d91c7 100644 --- a/packages/service/README.md +++ b/packages/service/README.md @@ -48,16 +48,60 @@ services: [['devtools', options]] | `devtoolsCapabilities` | `Capabilities` | Chrome 1600×1200 | Capabilities used to open the DevTools UI window | | `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below; for trace mode use `video`) | | `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | -| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | -| `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep — e.g. `'retain-on-failure'`, `'retain-on-first-failure'`. | -| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). | -| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). | -| `filmstrip` | `boolean` | `false` | Trace mode only. Records a dense, continuous screencast filmstrip *into* the trace so the player scrubs smooth playback — dense frames are added alongside the per-action frames (not one frame per action). Frames are thinned (≥100 ms apart, ~600 max) and content-addressed (identical frames — a static wait — collapse to one resource); windowed per slice at any `traceGranularity`. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | +| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace mode only. Output layout — `'zip'` writes a single archive; `'ndjson-directory'` unpacks the same files into `trace-<id>/` (one less unzip step for scripted/agentic consumers). Both open in `show-trace` and other compatible viewers. | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned — one per worker session / spec file / test. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | +| `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep: `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'`. The retry-aware policies pair best with `traceGranularity: 'test'`. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). WDIO-service-specific. | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). WDIO-service-specific. | +| `filmstrip` | `boolean` | `true` | Trace mode only. Records a dense, continuous screencast filmstrip *into* the trace so the player scrubs smooth playback — dense frames are added alongside the per-action frames (not one frame per action). Frames are thinned (≥100 ms apart, ~600 max) and content-addressed (identical frames — a static wait — collapse to one resource); windowed per slice at any `traceGranularity`. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | +| `emitArtifactsManifest` | `boolean` | `false` | Trace mode only. Writes `devtools-artifacts-<sessionId>.json` next to the trace — a generic index of every produced artifact (trace/screenshot/video) plus each test's state, for reporters/CI to consume. Off by default; **auto-enabled when `@wdio/allure-reporter` is in the config**. | +| `captureAssertions` | `boolean` | `true` | Capture assertions as command/action rows — `node:assert` plus passing *and* failing expect-webdriverio matchers, folded into single `expect.<matcher>` rows (e.g. `toHaveText`, `toExist`). Set `false` to opt out. | + +## Viewing traces — `show-trace` + +In trace mode the adapter writes a portable `trace.zip` (or, with +`traceFormat: 'ndjson-directory'`, an unpacked directory). Open it in the +first-party player: + +```sh +pnpm show-trace path/to/trace.zip # from this repo +npx show-trace path/to/trace.zip # in a project that installs an adapter +``` + +The `show-trace` bin ships with this service (and with the Selenium/Nightwatch +adapters), so it's available wherever one is installed — no extra dependency. It +boots the DevTools UI in a dedicated **player** mode: + +- **DOM time-travel** — the page pane rebuilds the real DOM as of the selected + action from the captured mutation stream (not just a screenshot), replaying + form-field state (typed values, checked/selected) so each step shows the page + exactly as it was at that moment. +- **A11y tab** — the accessibility tree (roles + accessible names) captured for + the selected action; the semantic view a screen reader sees, distinct from the + raw DOM in the snapshot pane. +- **Element overlay ("pick locator")** — every locator the test interacted with + is outlined on the replayed page. Hover a box to highlight the matching A11y + row; click to copy a resilient locator to the clipboard. Hovering an A11y row + highlights the element back — the two views are linked bidirectionally. +- **Transcript tab + Copy-for-LLM** — the run's `transcript.md` rendered + in-panel, with a one-click **Copy prompt** that bundles the transcript and any + failing-command errors into paste-ready LLM context. +- **Timeline** — categorized action markers (navigation / input / assertion / + query / …), a dense filmstrip when `filmstrip` is enabled, Network and Console + tracks, a draggable playhead, and playback controls (play/pause, step, speed). + Cucumber runs nest as Feature → Scenario → Step. +- **Errors, Console, Network, and Source tabs** — the same workbench tabs as + live mode. + +The same `trace.zip` also opens in other compatible standalone trace viewers, +and its on-disk format is what an Allure report's embedded trace viewer reads +(Allure ≥ 2.35). ## Allure integration When `@wdio/allure-reporter` is installed, trace-mode artifacts are attached to -the Allure report automatically: +the Allure report automatically (and `emitArtifactsManifest` is auto-enabled, so +the run also writes the `devtools-artifacts-<sessionId>.json` index): - **`traceGranularity: 'test'`** — each test's trace (`application/zip`, a download that opens in `pnpm show-trace`), screenshot (`image/png`, inline) From 5f081065b83d58aea284d69026430eeb21527645 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 23 Jul 2026 13:23:01 +0530 Subject: [PATCH 096/109] fix(service): warn on Chrome 150 headless input regression; attach BiDi listeners at session start --- packages/service/src/bidi-listeners.ts | 17 +------ packages/service/src/index.ts | 30 ++++++++--- packages/service/src/types.ts | 2 - packages/service/src/utils.ts | 37 ++++++++++++++ packages/service/tests/utils.test.ts | 69 ++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 24 deletions(-) diff --git a/packages/service/src/bidi-listeners.ts b/packages/service/src/bidi-listeners.ts index fce6ad5a..9ef8f79f 100644 --- a/packages/service/src/bidi-listeners.ts +++ b/packages/service/src/bidi-listeners.ts @@ -1,5 +1,4 @@ import logger from '@wdio/logger' -import { errorMessage } from '@wdio/devtools-core' import type { SessionCapturer } from './session.js' const log = logger('@wdio/devtools-service:bidi-listeners') @@ -11,9 +10,8 @@ const log = logger('@wdio/devtools-service:bidi-listeners') * should gate it (e.g. with a one-shot flag); this function will register a * fresh listener on each call. * - * Returns nothing. Errors during the optional `sessionSubscribe(log)` call - * are logged but non-fatal — WDIO auto-subscribes to network events; only - * log events need the explicit subscribe. + * Registration only — WDIO subscribes both the network and log events itself, + * so no session.subscribe is issued here. */ export function attachBidiListeners( browser: WebdriverIO.Browser, @@ -42,22 +40,11 @@ export function attachBidiListeners( ) }) browser.on('network.fetchError', (event) => { - log.info( - `>>> BiDi fetchError - keys: ${Object.keys(event as object).join(', ')}` - ) capturer.handleNetworkFetchError(event as unknown as BidiFetchError) }) browser.on('log.entryAdded', (event) => { capturer.handleLogEntryAdded(event as unknown as BidiLogEntry) }) - // WDIO auto-subscribes to network events but not log events. - try { - // sessionSubscribe is augmented onto WebdriverIO.Browser in types.ts. - browser.sessionSubscribe?.({ events: ['log.entryAdded'] }) - } catch (err) { - log.warn(`Could not subscribe to log.entryAdded: ${errorMessage(err)}`) - } - log.info('✓ BiDi network + log event listeners registered') } diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index df1cdb5e..34186b88 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -50,7 +50,11 @@ import type { WebDriverCommands } from '@wdio/protocols' import { SessionCapturer } from './session.js' import { TestReporter } from './reporter.js' import { DevToolsAppLauncher } from './launcher.js' -import { getBrowserObject, isUserSpecFile } from './utils.js' +import { + chrome150InputRegressionWarning, + getBrowserObject, + isUserSpecFile +} from './utils.js' import { ScreencastRecorder } from './screencast.js' import { attachBidiListeners } from './bidi-listeners.js' import { parse } from 'stack-trace' @@ -84,7 +88,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { #testReporters: TestReporter[] = [] #sessionCapturer = new SessionCapturer() #browser?: WebdriverIO.Browser - #bidiListenersSetup = false #screencastRecorder?: ScreencastRecorder #screencastOptions?: ScreencastOptions #options: ServiceOptions @@ -298,6 +301,11 @@ export default class DevToolsHookService implements Services.ServiceInstance { ) { this.#browser = browser + const versionWarning = chrome150InputRegressionWarning(browser.capabilities) + if (versionWarning) { + log.warn(versionWarning) + } + /** * create a new session capturer instance with the devtools options */ @@ -330,6 +338,12 @@ export default class DevToolsHookService implements Services.ServiceInstance { } } + // WDIO has already subscribed the BiDi events by now, so attaching here + // issues no mid-run protocol traffic and misses no early events. + if (browser.isBidi) { + attachBidiListeners(browser, this.#sessionCapturer) + } + /** * Start screencast recording when enabled — `screencast.enabled` in live * mode, or a non-`off` `video` policy (per-test slicing at flush) or @@ -643,6 +657,13 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (this.#options.mode !== 'trace' || !this.#browser) { return } + // Drain the collector one final time while the session is still alive, so the + // DOM the LAST command produced is recorded — a closing navigation (e.g. a + // logout landing back on the login page) fires no subsequent beforeCommand, + // which is where every other drain happens, so its destination DOM would + // otherwise never be captured before teardown. forceAnchor: the destination's + // async initial anchor may not have run yet, so anchor it synchronously here. + await this.#sessionCapturer.captureTrace(this.#browser, true) const stamp = this.#lastActionTimestamp() const snap = await captureActionSnapshot(this.#browser, '__final__') if (snap) { @@ -693,11 +714,6 @@ export default class DevToolsHookService implements Services.ServiceInstance { if (!this.#browser) { return } - // BiDi listeners attach on the first command (before any execute). - if (!this.#bidiListenersSetup && this.#browser.isBidi) { - this.#bidiListenersSetup = true - attachBidiListeners(this.#browser, this.#sessionCapturer) - } // On first URL navigation, mark the start of meaningful recording so // leading blank frames (pre-test pauses, etc.) are trimmed from the video. // Fires regardless of runner (Mocha, Jasmine, Cucumber, standalone). diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index 84ef345f..1263df01 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -75,8 +75,6 @@ declare namespace WebdriverIO { // omitted from WDIO's public Browser type. Returns Puppeteer's top-level // browser object — see screencast.ts for the local shape we use. getPuppeteer?: () => Promise<unknown> - // BiDi-specific WDIO method, present at runtime when BiDi is active. - sessionSubscribe?: (opts: { events: string[] }) => Promise<unknown> // Runtime DOM snapshot for agent auto-healing. Added by // @wdio/devtools-service in the before hook. getSnapshot(options?: { inViewportOnly?: boolean }): Promise<SnapshotResult> diff --git a/packages/service/src/utils.ts b/packages/service/src/utils.ts index ebb7c94a..0649ac83 100644 --- a/packages/service/src/utils.ts +++ b/packages/service/src/utils.ts @@ -63,3 +63,40 @@ export function getBrowserObject( ? getBrowserObject(elemObject.parent) : (elem as WebdriverIO.Browser) } + +/** Chrome 150's headless mode silently drops trusted input (clicks, keys) + * once automation traffic like the devtools capture runs on a page reached + * via click navigation — clicks then report success without navigating. + * ≤149, ≥151, and headed 150 are unaffected. Returns a warning to log when + * the session is (or may be) affected, else undefined. */ +export function chrome150InputRegressionWarning( + capabilities: + | { + browserName?: string + browserVersion?: string + 'goog:chromeOptions'?: { args?: string[] } + } + | undefined +): string | undefined { + if ( + capabilities?.browserName?.toLowerCase() !== 'chrome' || + !capabilities.browserVersion?.startsWith('150.') + ) { + return undefined + } + // The regression is headless-only; skip the warning when the args prove the + // session is headed. Absent/unknown args → warn (headless is WDIO's common + // CI default and the false-positive cost is one log line). + const args = capabilities['goog:chromeOptions']?.args + const headed = + Array.isArray(args) && !args.some((a) => a.includes('headless')) + if (headed) { + return undefined + } + return ( + `Chrome ${capabilities.browserVersion} headless has a known input regression: ` + + 'element clicks may silently stop navigating while DevTools capture is active. ' + + "Pin capabilities browserVersion: '149' (or '151' once stable) or run headed. " + + 'Fixed in Chrome 151.' + ) +} diff --git a/packages/service/tests/utils.test.ts b/packages/service/tests/utils.test.ts index 2583e2cb..2bb44d94 100644 --- a/packages/service/tests/utils.test.ts +++ b/packages/service/tests/utils.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import { fileURLToPath } from 'node:url' import { + chrome150InputRegressionWarning, getBrowserObject, isUserSpecFile, setCurrentSpecFile @@ -99,4 +100,72 @@ describe('service utils', () => { expect(isUserSpecFile(`file://${selfDir}session.js`)).toBe(false) }) }) + + describe('chrome150InputRegressionWarning', () => { + it('warns only for Chrome 150.x', () => { + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '150.0.7871.130' + }) + ).toContain('input regression') + // Case-insensitive browser name (grids report "Chrome"). + expect( + chrome150InputRegressionWarning({ + browserName: 'Chrome', + browserVersion: '150.0.1' + }) + ).toBeDefined() + }) + + it('is silent for unaffected versions and browsers', () => { + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '149.0.7827.155' + }) + ).toBeUndefined() + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '151.0.7922.47' + }) + ).toBeUndefined() + expect( + chrome150InputRegressionWarning({ + browserName: 'firefox', + browserVersion: '150.0' + }) + ).toBeUndefined() + expect(chrome150InputRegressionWarning({})).toBeUndefined() + expect(chrome150InputRegressionWarning(undefined)).toBeUndefined() + }) + + it('is silent for headed Chrome 150 (args prove no headless)', () => { + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '150.0.7871.130', + 'goog:chromeOptions': { args: ['--window-size=1600,900'] } + }) + ).toBeUndefined() + }) + + it('warns for headless Chrome 150 and when args are unknown', () => { + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '150.0.7871.130', + 'goog:chromeOptions': { args: ['--headless', '--disable-gpu'] } + }) + ).toContain('input regression') + // No args → can't prove headed, so warn (CI headless is the common case). + expect( + chrome150InputRegressionWarning({ + browserName: 'chrome', + browserVersion: '150.0.7871.130' + }) + ).toBeDefined() + }) + }) }) From 4e4ff89d4e9a857d8ddd4d21a4e4596fdcb4367d Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 23 Jul 2026 13:23:19 +0530 Subject: [PATCH 097/109] fix(selenium): re-inject collector after click navigations; exact-match navigation commands --- packages/core/src/script-loader.ts | 6 ++ .../src/helpers/commandPostActions.ts | 21 +++---- packages/selenium-devtools/src/session.ts | 60 +++++++++++++------ .../selenium-devtools/tests/index.test.ts | 12 +++- 4 files changed, 70 insertions(+), 29 deletions(-) diff --git a/packages/core/src/script-loader.ts b/packages/core/src/script-loader.ts index a17a472a..7cf1681d 100644 --- a/packages/core/src/script-loader.ts +++ b/packages/core/src/script-loader.ts @@ -4,6 +4,12 @@ import { createRequire } from 'node:module' const require = createRequire(import.meta.url) +/** Browser-side expression that is true once the injected collector has + * initialised. Shared by the adapters' readiness polls and re-injection + * checks so the collector's global name lives in one place. */ +export const COLLECTOR_READY_EXPRESSION = + 'typeof window.wdioTraceCollector !== "undefined"' + /** * Load the `@wdio/devtools-script` browser preload, wrapped in an async IIFE * so its top-level `await` works inside a regular `<script>` element body. diff --git a/packages/selenium-devtools/src/helpers/commandPostActions.ts b/packages/selenium-devtools/src/helpers/commandPostActions.ts index 22ebf0b5..486a76f8 100644 --- a/packages/selenium-devtools/src/helpers/commandPostActions.ts +++ b/packages/selenium-devtools/src/helpers/commandPostActions.ts @@ -3,6 +3,7 @@ import { CAPTURE_PERFORMANCE_SCRIPT, applyPerformanceData, errorMessage, + isSessionGoneError, mapCommandToAction, toError, type CapturedPerformancePayload, @@ -144,11 +145,7 @@ async function capturePerformance( const msg = errorMessage(err) // Session torn down between the navigation command and the deferred // perf-script execution — expected during teardown of the last test. - if ( - msg.includes('ECONNREFUSED') || - msg.includes('no such session') || - msg.includes('invalid session id') - ) { + if (isSessionGoneError(msg)) { return } log.warn(`Performance capture failed: ${msg}`) @@ -185,10 +182,11 @@ function attachScreenshotAsync( } /** - * After a DOM-mutating element command (type/click/clear/submit), drain the - * collector so the page's field edits (value/checked) land in the mutation - * stream before a later navigation discards the page. Fire-and-forget; trace - * mode only. + * After a DOM-mutating element command (type/click/clear/submit): drain the + * collector so the page's field edits land before the page is discarded, then — + * if the command navigated (a submit click) — re-inject on the destination so + * its DOM is captured too (the previous page's `<script>` collector didn't + * survive the navigation). Fire-and-forget; trace mode only. */ function maybeDrainAfterDomCommand( ctx: OnCommandCtx, @@ -201,7 +199,10 @@ function maybeDrainAfterDomCommand( DOM_MUTATING_ELEMENT_COMMANDS.has(cmd.command) && !ctx.finalized ) { - void capturer.captureTrace().catch(() => {}) + void (async () => { + await capturer.captureTrace() + await capturer.reinjectIfNavigated() + })().catch(() => {}) } } diff --git a/packages/selenium-devtools/src/session.ts b/packages/selenium-devtools/src/session.ts index 5bb749a9..76e91767 100644 --- a/packages/selenium-devtools/src/session.ts +++ b/packages/selenium-devtools/src/session.ts @@ -1,7 +1,9 @@ import logger from '@wdio/logger' import { + COLLECTOR_READY_EXPRESSION, SessionCapturerBase, errorMessage, + isSessionGoneError, loadInjectableScript, mapChromeBrowserLogs, pollUntilReady, @@ -208,10 +210,7 @@ export class SessionCapturer extends SessionCapturerBase { scriptContent ) const ready = await pollUntilReady(async () => { - const r = await exec( - driver, - 'return typeof window.wdioTraceCollector !== "undefined";' - ) + const r = await exec(driver, `return ${COLLECTOR_READY_EXPRESSION};`) return r === true }) if (ready) { @@ -222,11 +221,7 @@ export class SessionCapturer extends SessionCapturerBase { } catch (err) { // Driver torn down between navigation and deferred trace work. const msg = errorMessage(err) - if ( - msg.includes('ECONNREFUSED') || - msg.includes('no such session') || - msg.includes('invalid session id') - ) { + if (isSessionGoneError(msg)) { return } log.error(`Failed to inject script: ${msg}`) @@ -246,7 +241,7 @@ export class SessionCapturer extends SessionCapturerBase { // "Cannot read properties of undefined (reading 'getTraceData')" errors. const traceData = await exec( driver, - 'return typeof window.wdioTraceCollector !== "undefined" ? window.wdioTraceCollector.getTraceData() : null;' + `return ${COLLECTOR_READY_EXPRESSION} ? window.wdioTraceCollector.getTraceData() : null;` ) if (!traceData) { return @@ -257,11 +252,7 @@ export class SessionCapturer extends SessionCapturerBase { }) } catch (err) { const msg = errorMessage(err) - if ( - msg.includes('ECONNREFUSED') || - msg.includes('no such session') || - msg.includes('invalid session id') - ) { + if (isSessionGoneError(msg)) { return } log.error(`Failed to capture trace from injected script: ${msg}`) @@ -302,9 +293,42 @@ export class SessionCapturer extends SessionCapturerBase { } } + /** + * After a click/submit that may have navigated, the previous page's injected + * `<script>` collector is gone (unlike WDIO's BiDi preload, it doesn't survive + * navigation). If the current document has no collector, the page was + * replaced — re-inject on it and drain so the destination DOM lands in the + * trace. No-op for a same-document click (the collector is still present). + * Relies on the default `normal` page-load strategy, so a navigating click + * has finished loading by the time this runs. + */ + async reinjectIfNavigated(): Promise<void> { + const driver = this.#driver + const exec = getDriverOriginals().executeScript + if (!driver || !exec) { + return + } + try { + const hasCollector = await exec( + driver, + `return ${COLLECTOR_READY_EXPRESSION};` + ) + if (hasCollector === true) { + return + } + await this.injectScript() + await this.captureTrace() + } catch (err) { + const msg = errorMessage(err) + if (isSessionGoneError(msg)) { + return + } + log.warn(`Re-inject after navigation failed: ${msg}`) + } + } + isNavigationCommand(command: string): boolean { - return NAVIGATION_COMMANDS.some((c) => - command.toLowerCase().includes(c.toLowerCase()) - ) + const target = command.toLowerCase() + return NAVIGATION_COMMANDS.some((c) => target === c.toLowerCase()) } } diff --git a/packages/selenium-devtools/tests/index.test.ts b/packages/selenium-devtools/tests/index.test.ts index 93bcc6f2..c6dd32a2 100644 --- a/packages/selenium-devtools/tests/index.test.ts +++ b/packages/selenium-devtools/tests/index.test.ts @@ -348,7 +348,17 @@ describe('SessionCapturer', () => { ]) { expect(capturer.isNavigationCommand(cmd)).toBe(true) } - for (const cmd of ['click', 'sendKeys', 'isDisplayed']) { + // `get*` readers and other non-navigating commands must not trigger + // navigation re-capture — matching is exact, not a substring test. + for (const cmd of [ + 'click', + 'sendKeys', + 'isDisplayed', + 'getCurrentUrl', + 'getTitle', + 'getText', + 'getAttribute' + ]) { expect(capturer.isNavigationCommand(cmd)).toBe(false) } } finally { From 3f4fea30aa6bb5d4ba9161dd44e2a5967599ed7d Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 23 Jul 2026 13:23:51 +0530 Subject: [PATCH 098/109] fix(core,script,service): re-anchor DOM capture across navigations and scenario ends; dedupe session-gone detection --- packages/core/src/error.ts | 13 ++++++++++ packages/script/src/collector.ts | 24 ++++++++++++++++++ packages/script/src/index.ts | 20 +++------------ packages/script/src/utils.ts | 16 +++++++++--- packages/service/src/session.ts | 25 +++++++++++-------- packages/service/tests/assertion-rows.test.ts | 1 + packages/service/tests/index.test.ts | 1 + .../service/tests/trace-granularity.test.ts | 1 + packages/service/tests/trace-metadata.test.ts | 1 + 9 files changed, 71 insertions(+), 31 deletions(-) diff --git a/packages/core/src/error.ts b/packages/core/src/error.ts index 7422fb84..b528bce8 100644 --- a/packages/core/src/error.ts +++ b/packages/core/src/error.ts @@ -61,6 +61,19 @@ export function errorMessage(value: unknown): string { } } +/** + * True when an error message signals the WebDriver session is gone or + * unreachable — expected when deferred/async capture work races session + * teardown. Adapters use it to swallow post-quit errors instead of logging noise. + */ +export function isSessionGoneError(message: string): boolean { + return ( + message.includes('ECONNREFUSED') || + message.includes('no such session') || + message.includes('invalid session id') + ) +} + /** * Normalize an Error to a plain object so its fields survive `JSON.stringify` * over the WS bridge. Error instances have `message`/`name`/`stack` as diff --git a/packages/script/src/collector.ts b/packages/script/src/collector.ts index 972811b4..ecd9ad3d 100644 --- a/packages/script/src/collector.ts +++ b/packages/script/src/collector.ts @@ -1,6 +1,7 @@ import { getLogs, clearLogs } from './logger.js' import { ConsoleLogCollector } from './collectors/consoleLogs.js' import { NetworkRequestCollector } from './collectors/networkRequests.js' +import { assignRef, hasRef, parseDocument } from './utils.js' class DataCollector { #metadata = { @@ -29,6 +30,29 @@ class DataCollector { this.#mutations.push(...mutations) } + /** Force a full-DOM anchor of the CURRENT document, unless it was already + * anchored. The initial anchor runs asynchronously (after `waitForBody`), so + * the destination of a closing navigation — e.g. a logout landing back on the + * login page as the last action — may not be anchored yet when the final + * drain fires at teardown. Skipped when the root already carries a ref (the + * async anchor won the race): re-running assignRef would renumber descendants + * and desync every prior mutation. */ + captureCurrentDom() { + if (hasRef(document.documentElement)) { + return + } + assignRef(document.documentElement) + this.captureMutation([ + { + type: 'childList', + url: window.location.href, + timestamp: Date.now(), + addedNodes: [parseDocument(document.documentElement)], + removedNodes: [] + } + ]) + } + reset() { this.#errors = [] this.#mutations = [] diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index 82b2bae9..a2f33a3a 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -1,9 +1,9 @@ import { waitForBody, parseFragment, - parseDocument, getRef, - assignRef + assignRef, + REF_ATTR } from './utils.js' import { log } from './logger.js' import { collector } from './collector.js' @@ -50,25 +50,13 @@ try { await waitForBody() log('body rendered') - assignRef(document.documentElement) - log('applied wdio ref ids') - - const timestamp = Date.now() - collector.captureMutation([ - { - type: 'childList', - url: document.location.href, - timestamp, - addedNodes: [parseDocument(document.documentElement)], - removedNodes: [] - } - ]) + collector.captureCurrentDom() log('added initial page structure') const config = { attributes: true, childList: true, subtree: true } const observer = new MutationObserver((ml) => { const timestamp = Date.now() - const mutationList = ml.filter((m) => m.attributeName !== 'data-wdio-ref') + const mutationList = ml.filter((m) => m.attributeName !== REF_ATTR) log(`observed ${mutationList.length} mutations`) try { collector.captureMutation( diff --git a/packages/script/src/utils.ts b/packages/script/src/utils.ts index c6d86cd0..cf38dc42 100644 --- a/packages/script/src/utils.ts +++ b/packages/script/src/utils.ts @@ -98,6 +98,10 @@ export async function waitForBody() { clearTimeout(waitForTimeout) } +/** Attribute stamped on every captured element to correlate it across the + * mutation stream. Owned here; consumers use REF_ATTR / hasRef / getRef. */ +export const REF_ATTR = 'data-wdio-ref' + let refId = 0 /** * assign a uid to each element so we can reference it later in the vdom @@ -111,18 +115,22 @@ export function assignRef(elem: Element) { return } - if (!elem.hasAttribute('data-wdio-ref')) { - elem.setAttribute('data-wdio-ref', `${++refId}`) + if (!elem.hasAttribute(REF_ATTR)) { + elem.setAttribute(REF_ATTR, `${++refId}`) } Array.from(elem.querySelectorAll('*')).forEach((el) => { - el.setAttribute('data-wdio-ref', `${++refId}`) + el.setAttribute(REF_ATTR, `${++refId}`) }) } +export function hasRef(elem: Element): boolean { + return elem.hasAttribute(REF_ATTR) +} + export function getRef(elem: Node) { if (!elem || !(elem as Element).getAttribute) { return null } - return (elem as Element).getAttribute('data-wdio-ref') + return (elem as Element).getAttribute(REF_ATTR) } diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index d679e105..e2a6cec8 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -17,6 +17,7 @@ import { applyPerformanceData, errorMessage, getRequestType, + isSessionGoneError, type CapturedPerformancePayload } from '@wdio/devtools-core' import type { CommandLog } from './types.js' @@ -324,11 +325,7 @@ export class SessionCapturer extends SessionCapturerBase { const msg = errorMessage(err) // Session torn down between the navigation command and the deferred // perf-script execution — expected during teardown of the last test. - if ( - msg.includes('ECONNREFUSED') || - msg.includes('no such session') || - msg.includes('invalid session id') - ) { + if (isSessionGoneError(msg)) { return } log.warn(`Performance capture failed: ${msg}`) @@ -372,7 +369,7 @@ export class SessionCapturer extends SessionCapturerBase { * into the capturer. Public so the plugin can flush BEFORE a navigating * command, capturing the outgoing page's field edits (value/checked * mutations fire no page transition) before its collector is discarded. */ - async captureTrace(browser: WebdriverIO.Browser) { + async captureTrace(browser: WebdriverIO.Browser, forceAnchor = false) { if (!this.#isScriptInjected) { log.warn('Script not injected, skipping trace capture') return @@ -383,11 +380,17 @@ export class SessionCapturer extends SessionCapturerBase { // disappear (page navigation) between the existence check and the // getTraceData call. Two round-trips left a TOCTOU race that surfaced // spurious "Cannot read properties of undefined" errors. - const payload = await browser.execute(() => - typeof window.wdioTraceCollector !== 'undefined' - ? window.wdioTraceCollector.getTraceData() - : null - ) + // forceAnchor: capture the current document before draining — for a final + // closing navigation whose async initial anchor hasn't run by teardown. + const payload = await browser.execute((anchor) => { + if (typeof window.wdioTraceCollector === 'undefined') { + return null + } + if (anchor) { + window.wdioTraceCollector.captureCurrentDom() + } + return window.wdioTraceCollector.getTraceData() + }, forceAnchor) if (!payload) { log.warn( 'wdioTraceCollector not loaded yet - page loaded before preload script took effect' diff --git a/packages/service/tests/assertion-rows.test.ts b/packages/service/tests/assertion-rows.test.ts index 9f045f8a..eae0e723 100644 --- a/packages/service/tests/assertion-rows.test.ts +++ b/packages/service/tests/assertion-rows.test.ts @@ -15,6 +15,7 @@ const capturer = vi.hoisted(() => ({ failLastAction: vi.fn(), captureSource: vi.fn().mockResolvedValue(undefined), injectScript: vi.fn().mockResolvedValue(undefined), + captureTrace: vi.fn().mockResolvedValue(undefined), sendUpstream: vi.fn(), cleanup: vi.fn(), resetLastSelector: vi.fn(), diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index bec3b873..a587f5d8 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -27,6 +27,7 @@ const mockSessionCapturerInstance = { afterCommand: vi.fn(), sendUpstream: vi.fn(), injectScript: vi.fn().mockResolvedValue(undefined), + captureTrace: vi.fn().mockResolvedValue(undefined), resetScriptInjection: vi.fn(), captureSource: vi.fn(), captureAssertCommand: vi.fn(), diff --git a/packages/service/tests/trace-granularity.test.ts b/packages/service/tests/trace-granularity.test.ts index 537c0281..ca99cb7f 100644 --- a/packages/service/tests/trace-granularity.test.ts +++ b/packages/service/tests/trace-granularity.test.ts @@ -37,6 +37,7 @@ const mockSessionCapturerInstance = { afterCommand: vi.fn(), sendUpstream: vi.fn(), injectScript: vi.fn().mockResolvedValue(undefined), + captureTrace: vi.fn().mockResolvedValue(undefined), captureAssertCommand: vi.fn(), failLastAction: vi.fn(), resetLastSelector: vi.fn(), diff --git a/packages/service/tests/trace-metadata.test.ts b/packages/service/tests/trace-metadata.test.ts index e34527f0..8715fb42 100644 --- a/packages/service/tests/trace-metadata.test.ts +++ b/packages/service/tests/trace-metadata.test.ts @@ -17,6 +17,7 @@ const mockSessionCapturerInstance = { afterCommand: vi.fn(), sendUpstream: vi.fn(), injectScript: vi.fn().mockResolvedValue(undefined), + captureTrace: vi.fn().mockResolvedValue(undefined), captureAssertCommand: vi.fn(), failLastAction: vi.fn(), resetLastSelector: vi.fn(), From 185517e7513ff6ae445205cd3c7d31f239136e01 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 23 Jul 2026 13:24:01 +0530 Subject: [PATCH 099/109] =?UTF-8?q?fix(app):=20render=20full-page=20DOM=20?= =?UTF-8?q?snapshots=20with=20in-iframe=20scroll=20and=20correct=20click?= =?UTF-8?q?=E2=86=92result=20mapping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/browser/mutation-at-command.ts | 37 ++++++ .../src/components/browser/snapshot-styles.ts | 16 +++ .../app/src/components/browser/snapshot.ts | 110 +++++++++++------- .../app/tests/mutation-at-command.test.ts | 57 +++++++++ 4 files changed, 181 insertions(+), 39 deletions(-) create mode 100644 packages/app/src/components/browser/mutation-at-command.ts create mode 100644 packages/app/tests/mutation-at-command.test.ts diff --git a/packages/app/src/components/browser/mutation-at-command.ts b/packages/app/src/components/browser/mutation-at-command.ts new file mode 100644 index 00000000..add2d1cc --- /dev/null +++ b/packages/app/src/components/browser/mutation-at-command.ts @@ -0,0 +1,37 @@ +import type { CommandLog } from '@wdio/devtools-shared' + +// TraceMutation is the browser-side global from packages/script/types.d.ts +// (its addedNodes carry SimplifiedVNodes) — the same type the snapshot player +// stores; using the shared Node-side TraceMutation here would not be +// assignable back into the player's global-typed render methods. + +/** The DOM state a command left behind — i.e. its RESULT, not the page it + * started from. A navigating click's destination DOM is captured a few ms + * AFTER the click's own endTime (the mutation timestamp trails the command), + * so anchoring on the command's own timestamp shows the PRE-command page + * (click "Login" → the login page instead of the secure area). Bound instead + * by the NEXT command's start: the last mutation before the next command + * begins is the state this command produced. The final command has no upper + * bound and uses the last captured DOM. Falls back to the first mutation when + * every mutation is later (command precedes the slice's initial full-DOM). */ +export function mutationForCommand( + command: CommandLog | undefined, + commands: CommandLog[], + mutations: TraceMutation[] +): TraceMutation | undefined { + if (!command?.timestamp || !mutations.length) { + return undefined + } + const idx = commands.indexOf(command) + const next = idx >= 0 ? commands[idx + 1] : undefined + const upperBound = next?.startTime ?? next?.timestamp ?? Infinity + let best: TraceMutation | undefined + for (const mutation of mutations) { + if (mutation.timestamp < upperBound) { + best = mutation + } else { + break + } + } + return best ?? mutations[0] +} diff --git a/packages/app/src/components/browser/snapshot-styles.ts b/packages/app/src/components/browser/snapshot-styles.ts index 72699132..4a8d2cbd 100644 --- a/packages/app/src/components/browser/snapshot-styles.ts +++ b/packages/app/src/components/browser/snapshot-styles.ts @@ -89,6 +89,22 @@ export const snapshotStyles = css` flex-direction: column; } + /* DOM-replay only: centre the viewport-sized sizer; below-the-fold content + scrolls INSIDE the iframe (native page scrollbar), so the player itself + never scrolls and no gutter appears beside the page. Not applied to the + screenshot / screencast branches, which rely on full-width children. */ + .iframe-wrapper--replay { + align-items: center; + } + + /* In-flow box sized (inline) to the scaled iframe footprint, giving the + absolutely-positioned scaled iframe (zero footprint on its own) something + for the wrapper's align-items to centre. */ + .iframe-sizer { + position: relative; + flex: none; + } + /* Segmented control like the mockup: the border lives on the group; the buttons are borderless pills inside a small inset. */ .view-toggle { diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index 3193057d..fb806f08 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -5,6 +5,7 @@ import { snapshotStyles } from './snapshot-styles.js' import { renderBrowserChrome } from './browser-chrome.js' import { drawElementOverlay, clearElementOverlay } from './element-overlay.js' import { commandPageUrl } from './url-at-timestamp.js' +import { mutationForCommand } from './mutation-at-command.js' import { imageMime } from './trace-timeline-utils.js' import { type ComponentChildren, h, render, type VNode } from 'preact' @@ -187,20 +188,39 @@ export class DevtoolsBrowser extends Element { this.section.style.height = '100%' // Iframe absent in screenshot/video modes — section sizing above still runs. - if (this.iframe) { - this.iframe.style.width = `${viewportWidth}px` - this.iframe.style.height = `${viewportHeight}px` - this.iframe.style.transformOrigin = '0 0' - this.iframe.style.transform = `scale(${scale})` - this.iframe.style.left = `${Math.max(0, (availW - viewportWidth * scale) / 2)}px` - this.iframe.style.top = '0px' - } + this.#scaleReplayIframe(viewportWidth, viewportHeight, scale) // Layout is now settled — the one moment element rects are reliable, so // the overlay boxes track the replayed DOM after every step and resize. this.#redrawOverlay() }) } + /** Scale the DOM-replay iframe to the captured viewport. Content taller than + * the viewport scrolls INSIDE the iframe — a native page scrollbar at the + * page's own edge, like a real browser window — so the player adds no outer + * scroll surface and no gutter can appear beside the page. Centering is the + * wrapper's job (align-items), so the iframe sits at 0,0 inside the sizer. */ + #scaleReplayIframe( + viewportWidth: number, + viewportHeight: number, + scale: number + ) { + if (!this.iframe) { + return + } + this.iframe.style.width = `${viewportWidth}px` + this.iframe.style.height = `${viewportHeight}px` + this.iframe.style.transformOrigin = '0 0' + this.iframe.style.transform = `scale(${scale})` + this.iframe.style.left = '0px' + this.iframe.style.top = '0px' + const sizer = this.iframe.parentElement + if (sizer) { + sizer.style.width = `${viewportWidth * scale}px` + sizer.style.height = `${viewportHeight * scale}px` + } + } + #handleShowCommand = (event: Event) => this.#renderCommandScreenshot( (event as CustomEvent<{ command?: CommandLog }>).detail?.command @@ -271,10 +291,14 @@ export class DevtoolsBrowser extends Element { } // Switch to snapshot mode so the command snapshot is visible instead of the video. this.#viewMode = 'snapshot' - // DOM time-travel: rebuild the iframe DOM as of the selected command's time. - // #renderBrowserState requestUpdates internally, so only request one here - // when there's no mutation stream to replay (screenshot-only fallback). - const target = this.#mutationForCommand(command) + // DOM time-travel: rebuild the iframe DOM to the command's RESULT state (see + // #mutationForCommand). #renderBrowserState requestUpdates internally, so + // only request one here when there's no mutation stream (screenshot fallback). + const target = mutationForCommand( + command, + this.commands ?? [], + this.mutations ?? [] + ) if (target) { await this.#renderBrowserState(target) } else { @@ -282,25 +306,6 @@ export class DevtoolsBrowser extends Element { } } - /** The last mutation captured at or before the command's time — the DOM state - * the command observed. Falls back to the first mutation when every mutation - * is later (command precedes the slice's initial full-DOM snapshot). */ - #mutationForCommand(command?: CommandLog): TraceMutation | undefined { - const mutations = this.mutations - if (!command?.timestamp || !mutations?.length) { - return undefined - } - let best: TraceMutation | undefined - for (const mutation of mutations) { - if (mutation.timestamp <= command.timestamp) { - best = mutation - } else { - break - } - } - return best ?? mutations[0] - } - // View-mode flips swap the iframe with <img>/<video> and don't fire resize. updated() { this.#setIframeSize() @@ -326,8 +331,9 @@ export class DevtoolsBrowser extends Element { } #renderVdom() { - const docEl = this.iframe?.contentDocument?.documentElement - if (!docEl) { + const doc = this.iframe?.contentDocument + const docEl = doc?.documentElement + if (!doc || !docEl) { return } @@ -336,7 +342,21 @@ export class DevtoolsBrowser extends Element { * representation of the page */ ;[...this.#vdom.querySelectorAll('script')].forEach((el) => el.remove()) - docEl.ownerDocument.replaceChild(this.#vdom, docEl) + + // importNode into the iframe's document before replaceChild so adoption + // happens node-by-node in one document: a cross-document graft makes + // Chromium silently drop body's first element child (the leading flash row). + const html = this.#vdom.firstElementChild + if (!html) { + return + } + doc.replaceChild(doc.importNode(html, true), docEl) + + // Player chrome, not captured content: thin down the replayed page's own + // scrollbar so it reads as part of the mock browser window. + const scrollbarStyle = doc.createElement('style') + scrollbarStyle.textContent = ':root { scrollbar-width: thin }' + doc.head?.appendChild(scrollbarStyle) this.#setIframeSize() } @@ -408,12 +428,22 @@ export class DevtoolsBrowser extends Element { return } + // Insert added nodes at their captured position via a detached holder. + // render(vnode, el) can't append — Preact treats `el` as its render root and + // reconciles its children, replacing el's first child instead of inserting + // (which would wipe a real sibling, e.g. body's flash banner). + const nextRef = mutation.nextSibling + const candidate = nextRef ? this.#queryElement(nextRef, el) : undefined + const before = candidate?.parentNode === el ? candidate : null mutation.addedNodes.forEach((node) => { if (typeof node === 'string') { - el.appendChild(document.createTextNode(node)) + el.insertBefore(document.createTextNode(node), before) } else { - const root = transform(node) - render(root, el) + const holder = el.ownerDocument.createElement('div') + render(transform(node), holder) + while (holder.firstChild) { + el.insertBefore(holder.firstChild, before) + } } }) @@ -720,8 +750,10 @@ export class DevtoolsBrowser extends Element { // time, so points without a captured frame (assertions, static waits) still // show the real page instead of a blank/stale screenshot. if (hasMutations) { - return html`<div class="iframe-wrapper"> - <iframe class="origin-top-left"></iframe> + return html`<div class="iframe-wrapper iframe-wrapper--replay"> + <div class="iframe-sizer"> + <iframe class="origin-top-left"></iframe> + </div> </div>` } // No mutation stream (DOM-less / foreign trace): fall back to the selected diff --git a/packages/app/tests/mutation-at-command.test.ts b/packages/app/tests/mutation-at-command.test.ts new file mode 100644 index 00000000..be8c70b5 --- /dev/null +++ b/packages/app/tests/mutation-at-command.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from 'vitest' +import type { CommandLog } from '@wdio/devtools-shared' +import { mutationForCommand } from '../src/components/browser/mutation-at-command.js' + +// TraceMutation is the browser-side global (packages/script/types.d.ts), the +// same type mutation-at-command.ts operates on. + +function mut(timestamp: number): TraceMutation { + return { type: 'childList', addedNodes: [], removedNodes: [], timestamp } +} + +function cmd(timestamp: number, startTime?: number): CommandLog { + return { command: 'click', args: [], timestamp, startTime } as CommandLog +} + +describe('mutationForCommand', () => { + // Mutations trail their command, so a command's RESULT is the last mutation + // before the NEXT command starts. + const mutations = [mut(100), mut(210), mut(215), mut(320)] + + it('returns the last mutation before the next command starts', () => { + const c1 = cmd(90) + const c2 = cmd(200) + // c1's result is the state just before c2 begins: mut(100), not mut(210+) + // which belong to c2's navigation. + expect(mutationForCommand(c1, [c1, c2], mutations)).toBe(mutations[0]) + }) + + it('prefers startTime over timestamp for the next command bound', () => { + const c1 = cmd(90) + const c2 = cmd(400, 300) // starts at 300 despite a later timestamp + // Everything before 300 is c1's result → mut(215). + expect(mutationForCommand(c1, [c1, c2], mutations)).toBe(mutations[2]) + }) + + it('uses the last captured mutation for the final command (no upper bound)', () => { + const last = cmd(300) + expect(mutationForCommand(last, [cmd(90), last], mutations)).toBe( + mutations[3] + ) + }) + + it('falls back to the first mutation when the next command bounds out every mutation', () => { + // early's slice ends when c2 starts (t=50), but the first mutation is at + // t=100 — nothing qualifies, so it shows the slice's initial DOM. + const early = cmd(10) + const c2 = cmd(50) + expect( + mutationForCommand(early, [early, c2], [mut(100), mut(200)]) + ).toEqual(mut(100)) + }) + + it('returns undefined without a command timestamp or mutations', () => { + expect(mutationForCommand(undefined, [], mutations)).toBeUndefined() + expect(mutationForCommand(cmd(100), [], [])).toBeUndefined() + }) +}) From 2ca2216d6e7285b3abfe883834ec78bc10972d7c Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Thu, 23 Jul 2026 13:24:59 +0530 Subject: [PATCH 100/109] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57b9978d..bff88351 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11252,7 +11252,7 @@ snapshots: edgedriver@6.3.0: dependencies: - '@wdio/logger': 9.18.0 + '@wdio/logger': 9.29.1 '@zip.js/zip.js': 2.8.26 decamelize: 6.0.1 edge-paths: 3.0.5 @@ -11993,7 +11993,7 @@ snapshots: geckodriver@6.1.0: dependencies: - '@wdio/logger': 9.18.0 + '@wdio/logger': 9.29.1 '@zip.js/zip.js': 2.8.26 decamelize: 6.0.1 http-proxy-agent: 7.0.2 @@ -13969,7 +13969,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.4 - debug: 4.3.4 + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 From 5046adb4734909a09dd9ba44c7dec839690b4cf8 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 15:38:38 +0530 Subject: [PATCH 101/109] fix(app,shared,core,service,backend): box assertion targets and WDIO text-selectors in the trace-player element overlay --- .../src/components/browser/element-overlay.ts | 60 ++++++++++++++++--- .../app/src/components/browser/snapshot.ts | 4 +- packages/app/tests/element-overlay.test.ts | 53 ++++++++++++++++ packages/backend/src/trace-reader.ts | 4 ++ packages/backend/tests/trace-reader.test.ts | 34 +++++++++++ packages/core/src/trace-action-events.ts | 6 ++ packages/core/tests/trace-exporter.test.ts | 17 ++++++ packages/service/src/session.ts | 7 ++- packages/shared/src/types.ts | 6 ++ 9 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 packages/app/tests/element-overlay.test.ts diff --git a/packages/app/src/components/browser/element-overlay.ts b/packages/app/src/components/browser/element-overlay.ts index dbf00d42..02109759 100644 --- a/packages/app/src/components/browser/element-overlay.ts +++ b/packages/app/src/components/browser/element-overlay.ts @@ -37,10 +37,57 @@ function elementLabel(el: Element): string { return el.getAttribute('placeholder')?.trim() ?? '' } +/** Resolve a test locator in the replayed document: native CSS first, then the + * WebdriverIO text-selectors querySelector can't parse (`tag=Exact`, + * `tag*=Contains`, and their tag-less forms). Returns the deepest text match + * so a container that merely encloses the text isn't boxed over the real + * element. Returns null when nothing matches (locator absent on this page). */ +export function resolveTestSelector( + doc: Document, + selector: string +): Element | null { + try { + const css = doc.querySelector(selector) + if (css) { + return css + } + } catch { + // Not valid CSS — try the WDIO text-selector forms below. + } + // WDIO text-selector: `tag=Exact` / `tag*=Contains` (tag optional). Parsed by + // hand — a single regex for it trips the redos linter. querySelector already + // handled every real CSS form above (incl. `[attr*=v]`), so anything with a + // non-tag head here is junk and bails. + const eq = selector.indexOf('=') + if (eq < 0) { + return null + } + const text = selector.slice(eq + 1).trim() + let head = selector.slice(0, eq) + const exact = !head.endsWith('*') + if (!exact) { + head = head.slice(0, -1) + } + if (!text || (head && !/^[a-zA-Z][\w-]*$/.test(head))) { + return null + } + const hits = Array.from(doc.querySelectorAll(head || '*')).filter((el) => { + const elText = (el.textContent || '').trim() + return exact ? elText === text : elText.includes(text) + }) + return ( + hits.find( + (el) => !hits.some((other) => other !== el && el.contains(other)) + ) ?? + hits[hits.length - 1] ?? + null + ) +} + /** - * Outline each selector that resolves in the replayed iframe, labelled with the - * locator and copying it on click. Selectors that querySelector can't parse - * (WDIO-style, e.g. `button*=Login`) are skipped rather than throwing. + * Outline each locator the test used that resolves on the replayed page, + * labelled with the locator and copying it on click. A locator absent from the + * current page (e.g. the element a click navigated away from) draws no box. */ export function drawElementOverlay( iframe: HTMLIFrameElement | null | undefined, @@ -61,12 +108,7 @@ export function drawElementOverlay( const scrollY = iframe?.contentWindow?.scrollY || 0 const scrollX = iframe?.contentWindow?.scrollX || 0 for (const selector of selectors) { - let el: Element | null = null - try { - el = docEl.querySelector(selector) - } catch { - continue // non-CSS (WDIO) locator — can't resolve in the DOM - } + const el = resolveTestSelector(docEl, selector) if (!el) { continue } diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index fb806f08..76f16712 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -532,7 +532,9 @@ export class DevtoolsBrowser extends Element { #testSelectors(): string[] { const seen = new Set<string>() for (const command of this.commands ?? []) { - const arg = command.args?.[0] + // Prefer the captured locator: an assertion's args carry its expected + // value, not the element it targeted (e.g. `#flash`). + const arg = command.selector ?? command.args?.[0] if (typeof arg === 'string' && arg) { seen.add(arg) } diff --git a/packages/app/tests/element-overlay.test.ts b/packages/app/tests/element-overlay.test.ts new file mode 100644 index 00000000..92fe495f --- /dev/null +++ b/packages/app/tests/element-overlay.test.ts @@ -0,0 +1,53 @@ +// @vitest-environment happy-dom +import { describe, expect, it, beforeEach } from 'vitest' +import { resolveTestSelector } from '../src/components/browser/element-overlay.js' + +describe('resolveTestSelector', () => { + beforeEach(() => { + document.body.innerHTML = ` + <form> + <input id="username" /> + <button type="submit">Login</button> + </form> + <a href="/logout"><i></i> Logout</a> + <div id="flash">You logged out of the secure area! ×</div> + <p>Login attempts remaining</p> + ` + }) + + it('resolves plain CSS selectors', () => { + expect(resolveTestSelector(document, '#username')?.id).toBe('username') + expect(resolveTestSelector(document, '#flash')?.id).toBe('flash') + }) + + it('resolves WDIO contains-text selectors querySelector cannot parse', () => { + // The exact locators from the failing trace. + expect(resolveTestSelector(document, 'button*=Login')?.tagName).toBe( + 'BUTTON' + ) + const logout = resolveTestSelector(document, 'a*=Logout') + expect(logout?.tagName).toBe('A') + expect(logout?.getAttribute('href')).toBe('/logout') + }) + + it('resolves exact-text selectors and tag-less forms', () => { + expect(resolveTestSelector(document, 'button=Login')?.tagName).toBe( + 'BUTTON' + ) + // `*=` with no tag → deepest element containing the text, not <body>. + expect(resolveTestSelector(document, '*=Login attempts')?.tagName).toBe('P') + }) + + it('returns null when the locator is absent on the page', () => { + expect(resolveTestSelector(document, '#missing')).toBeNull() + expect(resolveTestSelector(document, 'button*=Register')).toBeNull() + }) + + it('does not treat an expected-text assertion arg as a selector', () => { + // expect.toHaveText args carry the expected string, not a locator; without + // a `tag=`/`*=` operator it must not match anything. + expect( + resolveTestSelector(document, 'You logged out of the secure area!') + ).toBeNull() + }) +}) diff --git a/packages/backend/src/trace-reader.ts b/packages/backend/src/trace-reader.ts index 163004f3..2abd0ae5 100644 --- a/packages/backend/src/trace-reader.ts +++ b/packages/backend/src/trace-reader.ts @@ -243,6 +243,10 @@ function reconstructCommand( if (after?.point) { command.point = after.point } + const locator = before.params?.locator + if (typeof locator === 'string') { + command.selector = locator + } return command } diff --git a/packages/backend/tests/trace-reader.test.ts b/packages/backend/tests/trace-reader.test.ts index 4244c261..3822abc8 100644 --- a/packages/backend/tests/trace-reader.test.ts +++ b/packages/backend/tests/trace-reader.test.ts @@ -335,6 +335,40 @@ describe('parseTraceZip', () => { expect(trace.commands[0]?.point).toEqual({ x: 30, y: 25 }) }) + it('restores CommandLog.selector from the `locator` param without disturbing args', () => { + const zip = zipSync({ + 'trace.trace': toNdjson([ + { + type: 'context-options', + wallTime: WALL_TIME, + browserName: 'chrome', + contextId: 'context@abcd1234', + options: { viewport: { width: 1024, height: 768 } } + }, + { + type: 'before', + callId: 'call@1', + startTime: 0, + class: 'Assert', + method: 'toHaveText', + // A folded assertion: expected value in the positional arg, the + // targeted element carried out-of-band as `locator`. + params: { + '0': 'You logged out of the secure area!', + locator: '#flash' + } + }, + { type: 'after', callId: 'call@1', endTime: 50 } + ]) + }) + const { trace } = parseTraceZip(zip) + expect(trace.commands[0]?.selector).toBe('#flash') + // locator must not leak into the reconstructed args. + expect(trace.commands[0]?.args).toEqual([ + 'You logged out of the secure area!' + ]) + }) + it('restores callSource and sources from stack frames + src resources', () => { const { trace } = parseTraceZip(fixtureZip()) const click = trace.commands.find((c) => c.command === 'click') diff --git a/packages/core/src/trace-action-events.ts b/packages/core/src/trace-action-events.ts index c6f9c712..1c6d6220 100644 --- a/packages/core/src/trace-action-events.ts +++ b/packages/core/src/trace-action-events.ts @@ -213,6 +213,12 @@ function buildParamsAndTitle( const params = isAssert ? buildAssertParams(cmd) : buildActionParams(action, cmd.args) + // The element this command targeted, under a key distinct from `selector` so + // it never feeds `paramsToArgs` — lets the reader restore CommandLog.selector + // for the player's overlay even when args carry an assertion's expected value. + if (cmd.selector && params.locator === undefined) { + params.locator = cmd.selector + } return { params, title: formatActionTitle( diff --git a/packages/core/tests/trace-exporter.test.ts b/packages/core/tests/trace-exporter.test.ts index 9fb5b6ff..ac5bd278 100644 --- a/packages/core/tests/trace-exporter.test.ts +++ b/packages/core/tests/trace-exporter.test.ts @@ -74,6 +74,23 @@ describe('buildActionEvents', () => { expect(after.result).toBeUndefined() }) + it('carries CommandLog.selector as a `locator` param without touching args', () => { + // A folded assertion: args hold the expected value, selector the element. + const commands = [ + cmd('expect.toHaveText', { + args: ['You logged out of the secure area!'], + selector: '#flash' + }) + ] + const before = buildActionEvents(commands, pageId, wallTime).find( + (e) => e.type === 'before' + )! + expect(before.params.locator).toBe('#flash') + // The expected value stays the positional arg — locator must not hijack it. + expect(before.params.selector).toBeUndefined() + expect(before.params['0']).toBe('You logged out of the secure area!') + }) + it('returns empty array for no commands', () => { expect(buildActionEvents([], pageId, wallTime)).toEqual([]) }) diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index e2a6cec8..43d19ee2 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -186,6 +186,7 @@ export class SessionCapturer extends SessionCapturerBase { if (hasNoSelector) { commandLogEntry.args = [this.#lastSelector] } + commandLogEntry.selector = this.#lastSelector } // For setValue / addValue, prepend the last selector so trace params @@ -294,7 +295,11 @@ export class SessionCapturer extends SessionCapturerBase { startTime: last.startTime, callSource: entry.callSource ?? last.callSource, screenshot: entry.screenshot ?? last.screenshot, - error: entry.error ?? last.error + error: entry.error ?? last.error, + // The matcher's `args` become the expected value on fold, so the read's + // locator is the only record of which element the assertion targeted — + // carry it so the player's overlay can box e.g. `#flash`. + selector: entry.selector ?? last.selector ?? this.#lastSelector } log[log.length - 1] = merged this.sendReplaceCommand(last.timestamp, merged) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 5f8751c0..6b49e05c 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -184,6 +184,12 @@ export interface CommandLog { * element at capture time. Synthesized in the exporter; drives the snapshot * click marker and the timeline pointer glyph. */ point?: { x: number; y: number } + /** Locator of the element this command acted on. Survives assertion folding + * (where `args` becomes the expected value), so the player's element overlay + * can box an assertion target like `#flash`. Carried through the trace as the + * `locator` action param — kept distinct from the `selector` param so it + * never feeds `paramsToArgs`. */ + selector?: string } /** From 5ea904d5f678d182525f5e7dbce3e9d837d5d517 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 15:38:59 +0530 Subject: [PATCH 102/109] feat(app): add a copy-locator hint bar to the A11y tab --- .../app/src/components/workbench/a11y-tree.ts | 97 +++++++++++++++++-- 1 file changed, 90 insertions(+), 7 deletions(-) diff --git a/packages/app/src/components/workbench/a11y-tree.ts b/packages/app/src/components/workbench/a11y-tree.ts index 32ee0252..4220b6a4 100644 --- a/packages/app/src/components/workbench/a11y-tree.ts +++ b/packages/app/src/components/workbench/a11y-tree.ts @@ -36,6 +36,11 @@ export class DevtoolsA11yTree extends Element { @state() private copiedSel?: string + /** Locator under the cursor — drives the copy-hint bar so the click-to-copy + * affordance is discoverable without waiting for the native title tooltip. */ + @state() + private hoveredSel?: string + /** Reverse of #highlight — the row the snapshot pane points at. `revealed` is * transient (overlay-box hover); `pinned` persists (box click, which also * opens this tab). Both matched by selector then accessible name. */ @@ -50,6 +55,7 @@ export class DevtoolsA11yTree extends Element { // A pin belongs to one page state; drop it when the command changes. this.pinned = undefined this.revealed = undefined + this.hoveredSel = undefined } #onReveal = (e: Event) => { @@ -143,9 +149,56 @@ export class DevtoolsA11yTree extends Element { ...Element.styles, css` :host { - display: block; + display: flex; + flex-direction: column; width: 100%; height: 100%; + overflow: hidden; + } + /* Fixed hint bar: names the click-to-copy affordance and echoes the + locator under the cursor, so it's discoverable without the native + title tooltip. Stays put while the tree scrolls beneath it. */ + .copybar { + flex: none; + display: flex; + align-items: center; + gap: 8px; + padding: 7px 12px; + font-family: var(--vscode-editor-font-family, monospace); + font-size: 11px; + border-bottom: 1px solid + var(--vscode-panel-border, rgba(255, 255, 255, 0.08)); + background: var( + --vscode-editorWidget-background, + rgba(255, 255, 255, 0.03) + ); + white-space: nowrap; + overflow: hidden; + } + .copybar .clip { + color: var(--pick, #38bdf8); + flex: none; + } + .copybar .lead { + color: var(--vscode-descriptionForeground); + flex: none; + } + .copybar .loc { + color: var(--pick, #38bdf8); + overflow: hidden; + text-overflow: ellipsis; + } + .copybar .ok { + color: var(--vscode-charts-green, #46c96a); + flex: none; + } + .copybar .idle { + color: var(--vscode-descriptionForeground); + opacity: 0.7; + } + .scroll { + flex: 1; + min-height: 0; overflow: auto; } .tree { @@ -246,8 +299,14 @@ export class DevtoolsA11yTree extends Element { return html`<div class="node ${sel ? 'pick' : ''} ${hot ? 'hot' : ''}" style="padding-left:${8 + node.depth * 16}px" - @mouseenter=${() => this.#highlight(sel)} - @mouseleave=${() => this.#highlight(undefined)} + @mouseenter=${() => { + this.hoveredSel = sel + this.#highlight(sel) + }} + @mouseleave=${() => { + this.hoveredSel = undefined + this.#highlight(undefined) + }} @click=${() => this.#copy(sel)} title=${sel ? `Click to copy locator: ${sel}` : nothing} > @@ -264,6 +323,27 @@ export class DevtoolsA11yTree extends Element { </div>` } + /** The copy-hint bar's content: a copied confirmation, else the locator under + * the cursor (or the one the snapshot pane is pointing at), else the idle + * affordance prompt. */ + #hint(): TemplateResult { + if (this.copiedSel) { + return html`<span class="ok">✓ Copied</span + ><span class="loc">${this.copiedSel}</span>` + } + const sel = + this.hoveredSel ?? this.pinned?.selector ?? this.revealed?.selector + if (sel) { + return html`<span class="clip">⧉</span + ><span class="lead">Click to copy locator:</span + ><span class="loc">${sel}</span>` + } + return html`<span class="clip">⧉</span + ><span class="idle" + >Hover a node to preview its locator — click to copy</span + >` + } + render() { const text = this.active?.snapshotText if (!text) { @@ -276,10 +356,13 @@ export class DevtoolsA11yTree extends Element { const nodes = lines .map((l) => this.#parse(l)) .filter((n): n is A11yNode => n !== null) - return html`<div class="tree"> - ${header ? html`<div class="hdr">${header}</div>` : nothing} - ${nodes.map((n) => this.#row(n))} - </div>` + return html`<div class="copybar">${this.#hint()}</div> + <div class="scroll"> + <div class="tree"> + ${header ? html`<div class="hdr">${header}</div>` : nothing} + ${nodes.map((n) => this.#row(n))} + </div> + </div>` } } From e4a39e15a2aa7ba04e599dd05b6558f5d0d61e05 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 15:39:22 +0530 Subject: [PATCH 103/109] fix(service): flush buffered field edits before navigation in live mode --- packages/service/src/index.ts | 59 +++++++++++++++------------- packages/service/tests/index.test.ts | 24 +++++++++++ 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 34186b88..83cf0b75 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -721,45 +721,48 @@ export default class DevToolsHookService implements Services.ServiceInstance { this.#screencastRecorder?.setStartMarker() this.#sessionCapturer.sendUpstream('metadata', { url: args[0] }) } - // Flush the outgoing page's buffered mutations (e.g. field edits from prior - // fills — value/checked changes fire no page transition) BEFORE a navigating - // command discards its collector, else the replay shows empty inputs. - if ( - this.#options.mode === 'trace' && - PAGE_TRANSITION_COMMANDS.includes(command) - ) { - await this.#sessionCapturer.captureTrace(this.#browser) - } - // Smart stack filtering to detect top-level user commands. + // Smart stack filtering to detect top-level user commands. This bookkeeping + // is synchronous and must settle BEFORE any await below, because afterCommand + // pops exactly what beforeCommand pushed — a stack push stranded behind an + // await would let a same-tick afterCommand miss the frame. Error.stackTraceLimit = 20 const stack = parse(new Error('')).reverse() const source = stack.find((frame) => isUserSpecFile(frame.getFileName())) // A matcher's value-read (getText/isExisting) is captured normally like any // command; afterAssertion later folds it into the expect.<matcher> row (see // coalesceAssertionIntoLastRead) — no suppression window needed here. - if (source && this.#commandStack.length === 0) { + const topLevelUserCommand = source && this.#commandStack.length === 0 + if (topLevelUserCommand) { this.#pushTopLevelCommandFrame( command, resolveCallSourceFromFrame(source) ) - - // Pre-action capture: state BEFORE this action executes. Will be - // stamped at the previous action's end time (or 0 for the first). - if ( - this.#options.mode === 'trace' && - this.#browser && - mapCommandToAction(command) && - !INTERNAL_COMMANDS.includes(command) - ) { - const snap = await captureActionSnapshot(this.#browser, command) - if (snap) { - snap.timestamp = this.#lastActionTimestamp() - this.#actionSnapshots.push(snap) - } - // Tag the current document so the post-action capture can tell whether - // this action navigated (a new document drops the tag). - await this.#markDocument() + } + // Flush the outgoing page's buffered mutations (e.g. field edits from prior + // fills — value/checked changes fire no page transition) BEFORE a navigating + // command discards its collector, else the replay shows empty inputs. Runs + // in live mode too: navigation drops the old document's collector, so the + // post-navigation afterCommand drain would hit the fresh page and lose them. + if (PAGE_TRANSITION_COMMANDS.includes(command)) { + await this.#sessionCapturer.captureTrace(this.#browser) + } + // Pre-action capture: state BEFORE this action executes. Stamped at the + // previous action's end time (or 0 for the first). Trace mode only. + if ( + topLevelUserCommand && + this.#options.mode === 'trace' && + this.#browser && + mapCommandToAction(command) && + !INTERNAL_COMMANDS.includes(command) + ) { + const snap = await captureActionSnapshot(this.#browser, command) + if (snap) { + snap.timestamp = this.#lastActionTimestamp() + this.#actionSnapshots.push(snap) } + // Tag the current document so the post-action capture can tell whether + // this action navigated (a new document drops the tag). + await this.#markDocument() } } diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index a587f5d8..91ded7ad 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -194,6 +194,30 @@ describe('DevtoolsService - Internal Command Filtering', () => { } ) }) + + // Live mode (default) relies solely on the mutation stream for DOM replay. A + // navigating command discards the outgoing page's collector, so its buffered + // field edits must be flushed in beforeCommand — else the replayed action + // shows empty inputs. This drain used to be gated to trace mode. + describe('beforeCommand - pre-navigation flush (live mode)', () => { + beforeEach(async () => { + await service.before({} as any, [], mockBrowser) + vi.clearAllMocks() + }) + + it.each(['url', 'navigateTo', 'click', 'elementClick'])( + 'flushes buffered mutations before navigating command %s', + async (cmd) => { + await service.beforeCommand(cmd as any, ['a[href="/logout"]']) + expect(mockSessionCapturerInstance.captureTrace).toHaveBeenCalled() + } + ) + + it('does not flush before a non-navigating command', async () => { + await service.beforeCommand('getText' as any, ['#flash']) + expect(mockSessionCapturerInstance.captureTrace).not.toHaveBeenCalled() + }) + }) }) describe('DevtoolsService - Screencast Integration', () => { From f54d5aebd7298e9bb91a0eda61863534ecf331b8 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 16:26:09 +0530 Subject: [PATCH 104/109] fix(service): box the element expect() actually resolved, not the stale last selector --- packages/service/src/assertion-tracker.ts | 4 ++ packages/service/src/constants.ts | 10 +++++ packages/service/src/index.ts | 13 ++++++ packages/service/src/session.ts | 43 +++++++++++++------ packages/service/tests/assertion-rows.test.ts | 2 + packages/service/tests/session.test.ts | 39 +++++++++++++++++ 6 files changed, 99 insertions(+), 12 deletions(-) diff --git a/packages/service/src/assertion-tracker.ts b/packages/service/src/assertion-tracker.ts index 416d6e5d..4275b33f 100644 --- a/packages/service/src/assertion-tracker.ts +++ b/packages/service/src/assertion-tracker.ts @@ -81,6 +81,10 @@ export class AssertionTracker { testUid: this.#ctx.getTestUid(), stepUid: this.#ctx.getStepUid() } + // Reset before the matcher resolves its element (WDIO's $ is lazy, so it + // resolves inside the matcher) — only an element resolved during this + // assertion is attributed to it; a value matcher stays blank. + this.#ctx.getCapturer().beginAssertionSelector() } this.#assertionDepth++ } diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index a30f6e3a..3f8565fe 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -11,6 +11,16 @@ export const PAGE_TRANSITION_COMMANDS: string[] = [ 'click' ] +// Element-resolution commands. Tracked so an assertion can recover the element +// expect() resolved internally — `expect($('#flash'))` fires one of these below +// the top-level command boundary, where the normal selector tracking skips it. +export const LOCATOR_COMMANDS: string[] = [ + '$', + '$$', + 'findElement', + 'findElements' +] + // Console capture constants are defined in @wdio/devtools-core; re-exported // here so existing imports from ./constants.js continue to work. export { diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 83cf0b75..1cd0967d 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -66,6 +66,7 @@ import { import { CONTEXT_CHANGE_COMMANDS, INTERNAL_COMMANDS, + LOCATOR_COMMANDS, PAGE_TRANSITION_COMMANDS } from './constants.js' import { isNativeMobile } from './mobile.js' @@ -788,6 +789,18 @@ export default class DevToolsHookService implements Services.ServiceInstance { return } + // Record every element resolution, even those below the top-level command + // boundary — an `expect($('#flash'))` resolves its element inside the + // matcher, so this is the only place the assertion's target selector is + // observable (see SessionCapturer.noteResolvedSelector). + if ( + LOCATOR_COMMANDS.includes(command as string) && + typeof args[0] === 'string' && + args[0] + ) { + this.#sessionCapturer.noteResolvedSelector(args[0]) + } + /* Ensure that the command is captured only if it matches the last command in the stack. * This prevents capturing commands that are not top-level user commands. */ diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index 43d19ee2..ae2a63b5 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -7,7 +7,7 @@ import { resolve } from 'import-meta-resolve' import { SevereServiceError } from 'webdriverio' import type { WebDriverCommands } from '@wdio/protocols' -import { PAGE_TRANSITION_COMMANDS } from './constants.js' +import { PAGE_TRANSITION_COMMANDS, LOCATOR_COMMANDS } from './constants.js' import { isNativeMobile } from './mobile.js' import { CAPTURE_PERFORMANCE_SCRIPT, @@ -30,6 +30,11 @@ export class SessionCapturer extends SessionCapturerBase { readonly startWallTime = Date.now() /** Last find-element selector — carried forward to the next element command. */ #lastSelector: string | undefined + /** Selector resolved during the current assertion. Unlike #lastSelector this + * updates on EVERY locator command (even below the top-level boundary), so + * it captures the element `expect($('#flash'))` resolves inside the matcher. + * Cleared at each matcher start so a value assertion inherits nothing. */ + #lastResolvedSelector: string | undefined /** Collapses internal command retries onto a single entry (see #captureOrReplace). */ #retryTracker = new RetryTracker() #pendingNetworkRequests = new Map< @@ -55,6 +60,21 @@ export class SessionCapturer extends SessionCapturerBase { */ resetLastSelector(): void { this.#lastSelector = undefined + this.#lastResolvedSelector = undefined + } + + /** Record the selector of an element-resolution command, ungated by the + * top-level filter — the service calls this for every locator command so an + * assertion can recover the element expect() resolved internally. */ + noteResolvedSelector(selector: string): void { + this.#lastResolvedSelector = selector + } + + /** Clear the resolved selector at a matcher's start, so only an element + * resolved DURING this matcher (an element assertion) is attributed to it — + * a value assertion (`expect(x).toBe(y)`) resolves nothing and stays blank. */ + beginAssertionSelector(): void { + this.#lastResolvedSelector = undefined } protected override onWsError(err: unknown): void { @@ -146,12 +166,7 @@ export class SessionCapturer extends SessionCapturerBase { // Track last find-element selector so element commands (click, setValue, …) // carry a human-readable selector in trace events even though WDIO doesn't // pass it in their args. - if ( - cmd === '$' || - cmd === '$$' || - cmd === 'findElement' || - cmd === 'findElements' - ) { + if (LOCATOR_COMMANDS.includes(cmd)) { const sel = args[0] if (typeof sel === 'string' && sel.length > 0) { this.#lastSelector = sel @@ -253,8 +268,12 @@ export class SessionCapturer extends SessionCapturerBase { } /** Ingest an assertion entry (node:assert capture or synthesized expect - * failure) through the same retry-collapsing path driver commands use. */ + * failure) through the same retry-collapsing path driver commands use. A + * fresh (unfolded) expect row still carries the element it targeted. */ captureAssertCommand(entry: CommandLog): void { + if (!entry.selector) { + entry.selector = this.#lastResolvedSelector + } this.#captureOrReplace(entry) } @@ -296,10 +315,10 @@ export class SessionCapturer extends SessionCapturerBase { callSource: entry.callSource ?? last.callSource, screenshot: entry.screenshot ?? last.screenshot, error: entry.error ?? last.error, - // The matcher's `args` become the expected value on fold, so the read's - // locator is the only record of which element the assertion targeted — - // carry it so the player's overlay can box e.g. `#flash`. - selector: entry.selector ?? last.selector ?? this.#lastSelector + // The matcher's `args` become the expected value on fold, so record which + // element the assertion targeted — the selector expect() resolved during + // this matcher — so the player's overlay can box e.g. `#flash`. + selector: entry.selector ?? this.#lastResolvedSelector } log[log.length - 1] = merged this.sendReplaceCommand(last.timestamp, merged) diff --git a/packages/service/tests/assertion-rows.test.ts b/packages/service/tests/assertion-rows.test.ts index eae0e723..33176b43 100644 --- a/packages/service/tests/assertion-rows.test.ts +++ b/packages/service/tests/assertion-rows.test.ts @@ -20,6 +20,8 @@ const capturer = vi.hoisted(() => ({ cleanup: vi.fn(), resetLastSelector: vi.fn(), resetRetryTracker: vi.fn(), + beginAssertionSelector: vi.fn(), + noteResolvedSelector: vi.fn(), commandsLog: [] as unknown[], sources: new Map<string, string>() })) diff --git a/packages/service/tests/session.test.ts b/packages/service/tests/session.test.ts index e3a28bba..a1b09e2d 100644 --- a/packages/service/tests/session.test.ts +++ b/packages/service/tests/session.test.ts @@ -159,6 +159,45 @@ describe('SessionCapturer', () => { }) }) + describe('assertion target selector', () => { + const assertEntry = (command: string) => + ({ command, args: [], timestamp: Date.now() }) as any + + it('stamps the element resolved during the matcher onto a fresh assert row', () => { + const capturer = new SessionCapturer() + // expect($('#flash')) resolves the element inside the matcher. + capturer.beginAssertionSelector() + capturer.noteResolvedSelector('#flash') + capturer.captureAssertCommand(assertEntry('expect.toExist')) + expect(capturer.commandsLog.at(-1)!.selector).toBe('#flash') + }) + + it('folds the resolved selector into the matcher read', () => { + const capturer = new SessionCapturer() + capturer.commandsLog.push(assertEntry('getText')) + capturer.beginAssertionSelector() + capturer.noteResolvedSelector('#flash') + const folded = capturer.coalesceAssertionIntoLastRead( + { + command: 'expect.toHaveText', + args: ['hi'], + timestamp: Date.now() + } as any, + (c) => c === 'getText' + ) + expect(folded).toBe(true) + expect(capturer.commandsLog.at(-1)!.selector).toBe('#flash') + }) + + it('leaves a value assertion blank (no element resolved during it)', () => { + const capturer = new SessionCapturer() + capturer.noteResolvedSelector('#flash') // stale, from a prior assertion + capturer.beginAssertionSelector() // expect(x).toBe(y) resolves nothing + capturer.captureAssertCommand(assertEntry('expect.toBe')) + expect(capturer.commandsLog.at(-1)!.selector).toBeUndefined() + }) + }) + describe('websocket communication', () => { it('should handle connection states and errors', () => { const mockWs = { From f1bfefe789d6ac2b42803d50b1e55568f493932f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 17:44:59 +0530 Subject: [PATCH 105/109] docs: correct filmstrip default, add Errors tab + per-adapter trace matrix, fix test-results paths --- README.md | 23 +++++++++++++++++++++++ packages/nightwatch-devtools/README.md | 4 ++-- packages/selenium-devtools/README.md | 4 ++-- packages/service/README.md | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b474433b..40a352f3 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,28 @@ All three adapters (`@wdio/devtools-service`, `@wdio/selenium-devtools`, `@wdio/ The trace **format and the player are identical** across the three adapters, but **capture completeness varies** — WebdriverIO is the most complete; Selenium and Nightwatch cover the core flow with some gaps (e.g. inline-Allure per-test artifacts, retry-aware retention, Cucumber step nesting, auto BiDi). Each adapter's README lists its specifics. +**Trace-mode support by adapter:** + +| Capability | WebdriverIO | Selenium | Nightwatch | +|---|---|---|---| +| Trace mode + `show-trace` player | ✅ | ✅ | ✅ | +| DOM time-travel (mutation capture) | ✅ | ✅ ¹ | ✅ | +| Dense filmstrip (`filmstrip`) | ✅ CDP push | ✅ CDP push | ⚠️ polling only | +| Per-test granularity (`traceGranularity: 'test'`) | ✅ | ✅ | ⚠️ ² | +| Retry-aware retention (`tracePolicy`) | ✅ | ✅ | ⚠️ ³ | +| Cucumber step nesting | Scenario→Step ⁴ | ✅ full | Feature→Scenario ⁵ | +| Inline Allure attach | ✅ | ✅ | ⚠️ produce-only ⁶ | +| Assertion capture (`captureAssertions`) | ✅ | ✅ | ✅ | +| Auto BiDi capture | ✅ auto | ✅ auto | ⚠️ opt-in ⁷ | + +¹ Selenium reconstructs the DOM per navigation; anchor timing is approximate (a navigation's snapshot can lag the command that triggered it). +² Nightwatch's Cucumber and exports-object interfaces get real per-test slicing; the BDD `describe/it` interface collapses to a single session-scoped slice keyed to the first test. +³ Only `retain-on-failure` works; the other retry-aware policies degrade to it because Nightwatch's `--retries` re-runs a testcase internally without re-firing the per-test hooks. +⁴ WebdriverIO does not yet carry feature-level ancestry, so its Cucumber nesting is Scenario→Step. +⁵ Nightwatch does not yet stamp per-step nesting (Feature→Scenario only). +⁶ Nightwatch has no live Allure attach API, so per-test `screenshot`/`video` are written to disk and listed in the manifest but not attached to an Allure test. +⁷ Opt-in via `bidi: true` + `webSocketUrl: true` in capabilities. + In trace mode no DevTools UI window opens. At session end the adapter writes trace artifacts into a `test-results/` folder (created next to the resolved spec/config directory), suitable for offline replay, AI-agent diffing, or any consumer that prefers a portable artifact over a live UI. | Adapter | How to enable | @@ -114,6 +136,7 @@ The player exposes everything captured in the archive: - **DOM time-travel** — the browser pane replays the page from the captured DOM **mutation stream**, so scrubbing the playhead reconstructs the live DOM at any point, not just a screenshot. - **A11y tab** — the accessibility tree (roles + accessible names) captured for the selected command; hover a row to outline the element in the snapshot, click to copy its locator. +- **Errors tab** — every failing `expect`/assertion and step failure collected in one place, each with a jump-to-source link to the command that threw. - **Element overlay (pick-locator)** — labelled, click-to-copy boxes drawn over every element the test interacted with, cross-linked to the A11y rows. - **Transcript tab + Copy-for-LLM** — the run's Markdown transcript with a one-click "copy prompt" that bundles it with any failing-command errors, paste-ready for an LLM. - **Cucumber Feature → Scenario → Step nesting** — tests render as labelled `tracingGroup` spans wrapping their commands, with Cucumber steps nested under their scenario. diff --git a/packages/nightwatch-devtools/README.md b/packages/nightwatch-devtools/README.md index 2f110124..cb7a544c 100644 --- a/packages/nightwatch-devtools/README.md +++ b/packages/nightwatch-devtools/README.md @@ -84,7 +84,7 @@ module.exports = { | `hostname` | `string` | `'localhost'` | Hostname the backend server binds to. | | `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | | `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | -| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` (or directory) next to your `nightwatch.conf.cjs` at run end. See [Trace mode](#trace-mode). | +| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` (or directory) under a `test-results/` directory at run end (base dir resolved from the test file dir → config dir → cwd). See [Trace mode](#trace-mode). | | `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace artifact layout — `zip` writes a single archive, `ndjson-directory` unpacks the same files into `trace-<sessionId>/`. Only applies when `mode: 'trace'`. | | `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | One trace per session / spec file / test. `'test'` is what the per-test `screenshot` / `video` artifacts attach to. Only applies when `mode: 'trace'`. **Caveat:** the BDD `describe/it` interface collapses to a single session-scoped slice (see [Per-test slicing](#per-test-slicing--the-bdd-describeit-caveat)). | | `tracePolicy` | `'on' \| 'retain-on-failure' \| 'retain-on-first-failure' \| 'on-first-retry' \| 'on-all-retries' \| 'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. Pairs with `traceGranularity: 'test'`. Only applies when `mode: 'trace'`. | @@ -151,7 +151,7 @@ globals: nightwatchDevtools({ }) ``` -Nightwatch emits the **same normalized trace** as the WebdriverIO and Selenium adapters (all three share `@wdio/devtools-core`), so the archive format and the `show-trace` player are identical no matter which adapter produced it. A Nightwatch trace carries the full per-action capture — a screenshot, the depth-indented accessibility-tree snapshot, the interactable-element list, and the Markdown transcript — so it opens in the player with DOM/snapshot time-travel, the **A11y** and **Transcript** tabs, the pick-locator element overlay, and (for Cucumber) **Feature → Scenario → Step** nesting. +Nightwatch emits the **same normalized trace** as the WebdriverIO and Selenium adapters (all three share `@wdio/devtools-core`), so the archive format and the `show-trace` player are identical no matter which adapter produced it. A Nightwatch trace carries the full per-action capture — a screenshot, the depth-indented accessibility-tree snapshot, the interactable-element list, and the Markdown transcript — so it opens in the player with DOM/snapshot time-travel, the **A11y** and **Transcript** tabs, an **Errors** tab surfacing expect/step failures with jump-to-source, the pick-locator element overlay, and (for Cucumber) **Feature → Scenario → Step** nesting. Open a trace with the `show-trace` bin, shipped with this package (no extra dependency): diff --git a/packages/selenium-devtools/README.md b/packages/selenium-devtools/README.md index d974a5bb..bf4b4c8a 100644 --- a/packages/selenium-devtools/README.md +++ b/packages/selenium-devtools/README.md @@ -312,7 +312,7 @@ DevTools.configure({ rerunCommand: 'npm test -- --grep "{{testName}}"' }) ``` #### `mode` — live UI vs. headless trace.zip -**Default:** `'live'` (launches the dashboard window). Set to `'trace'` to skip the dashboard entirely and write a `trace-<sessionId>.zip` next to your test file at session end — meant for CI / offline replay / agentic diffing. `screencast` is ignored in trace mode (live-mode-only feature). +**Default:** `'live'` (launches the dashboard window). Set to `'trace'` to skip the dashboard entirely and write a `trace-<sessionId>.zip` under a `test-results/` directory at session end (the base dir resolves from the test file's directory → the config directory → cwd) — meant for CI / offline replay / agentic diffing. For `traceGranularity: 'test'` the per-test artifact lands at `test-results/<spec>-<title>-<browser>[-retryN]/trace.zip`. `screencast` is ignored in trace mode (live-mode-only feature). ```javascript DevTools.configure({ mode: 'trace' }) @@ -332,7 +332,7 @@ DevTools.configure({ mode: 'trace', traceGranularity: 'test' }) **Default:** `'zip'` (a single `trace-<sessionId>.zip`). `'ndjson-directory'` writes the same `trace.trace` + `trace.network` + `resources/` layout unpacked into `trace-<id>/`, skipping the unzip step for scripted / agentic consumers. Trace mode only. #### `filmstrip` — dense scrubbable screencast in the trace -**Default:** `false`. Records a continuous screencast (CDP push on Chrome, screenshot polling elsewhere) into the trace so the player timeline scrubs frame-by-frame, not just one frame per action. Trace mode only. +**Default:** `true`. Records a continuous screencast (CDP push on Chrome, screenshot polling elsewhere) into the trace so the player timeline scrubs frame-by-frame. On by default in trace mode; set `false` to record just one frame per action. Trace mode only. ```javascript DevTools.configure({ mode: 'trace', filmstrip: true }) diff --git a/packages/service/README.md b/packages/service/README.md index 1d9d91c7..06a74728 100644 --- a/packages/service/README.md +++ b/packages/service/README.md @@ -47,7 +47,7 @@ services: [['devtools', options]] | `hostname` | `string` | `'localhost'` | Hostname the DevTools UI server binds to | | `devtoolsCapabilities` | `Capabilities` | Chrome 1600×1200 | Capabilities used to open the DevTools UI window | | `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below; for trace mode use `video`) | -| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | +| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` under a `test-results/` directory (base dir resolved from the test file's dir → config dir → cwd) at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | | `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace mode only. Output layout — `'zip'` writes a single archive; `'ndjson-directory'` unpacks the same files into `trace-<id>/` (one less unzip step for scripted/agentic consumers). Both open in `show-trace` and other compatible viewers. | | `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned — one per worker session / spec file / test. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | | `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep: `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'`. The retry-aware policies pair best with `traceGranularity: 'test'`. | From c6de98d85988d91c6d8a6aff0169bea67e22676f Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 20:09:16 +0530 Subject: [PATCH 106/109] docs: normalize package READMEs to a shared template + add CONTRIBUTING --- CONTRIBUTING.md | 96 +++++++++++++ README.md | 103 ++++++++++++-- assets/trace-player.gif | Bin 0 -> 1847771 bytes packages/nightwatch-devtools/README.md | 190 ++++++++++++++++--------- packages/selenium-devtools/README.md | 8 +- packages/service/README.md | 86 +++++++---- 6 files changed, 368 insertions(+), 115 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 assets/trace-player.gif diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..b8070bff --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,96 @@ +# Contributing + +Thanks for contributing to WebdriverIO DevTools! This guide gets you from a clone to a reviewable PR. + +## Prerequisites + +- **Node.js** ≥ 20 +- **pnpm** ≥ 9 (this is a pnpm workspace / monorepo) + +## Setup + +[**Fork**](https://github.com/webdriverio/devtools/fork) the repo on GitHub, then clone your fork and add the upstream remote: + +```bash +git clone https://github.com/<your-username>/devtools +cd devtools +git remote add upstream https://github.com/webdriverio/devtools + +pnpm install +pnpm build +``` + +You'll push branches to **your fork** (`origin`) and open pull requests against `webdriverio/devtools`. Keep your fork current with: + +```bash +git fetch upstream && git rebase upstream/main +``` + +> Maintainers with write access to `webdriverio/devtools` can clone it directly and skip the fork. + +## Development workflow + +Run from the repo root: + +| Command | What it does | +|---|---| +| `pnpm build` | Build all packages (`pnpm -r build`). | +| `pnpm dev` | Run all packages in parallel dev/watch mode. | +| `pnpm test` | Run the vitest suite once. | +| `pnpm test:watch` | vitest in watch mode. | +| `pnpm test:coverage` | vitest with coverage — the thresholds in `vitest.config.ts` are the floor; drops fail CI. | +| `pnpm lint` | Lint all packages. | +| `pnpm demo:wdio` / `:nightwatch` / `:selenium` | Run a per-framework example project — the harness for manual UI/runtime verification. | + +Type-checks and unit tests verify code correctness, not feature correctness — for any UI or runtime change, verify it in `examples/<framework>/`. + +## Where does my change go? + +Read **[ARCHITECTURE.md](./ARCHITECTURE.md)** for the package map and the full decision tree. The short version: + +- **Shared type / constant / contract** → `packages/shared` +- **Framework-agnostic capture / reporting logic** → `packages/core` +- **Framework-specific glue** → the matching adapter (`service` = WebdriverIO, `selenium-devtools`, `nightwatch-devtools`) +- **Server route / WS handler** → `packages/backend` (define the contract in `shared` first) +- **UI** → `packages/app` +- **Code that runs in the page under test** → `packages/script` + +Resolving question: *who else would want this?* If "any future adapter would," it's `core`. If "only this framework's API needs it," it's the adapter. **Any change that would otherwise land in two or more adapters belongs in `core`.** + +## Conventions + +**[CLAUDE.md](./CLAUDE.md)** is the source of truth for how code is written here — single source of truth per concept, thin/isolated adapters, typed boundaries (no `any` across a package boundary), naming, file/function size, and comment style. Please skim it before your first PR; the linter enforces some of it, but not all. + +## Tests + +- `shared` and `core`: unit-test every exported function and type guard. +- Bug fixes: add a regression test that fails before the fix and passes after. If a real test is genuinely impossible (needs a live browser the CI lacks), say so in the PR description. +- New HTTP/WS contracts: exercise the contract end-to-end at least once. +- Coverage only ratchets upward — never lower the thresholds. + +## Changesets + +This repo publishes with [changesets](https://github.com/changesets/changesets). If your change affects a published package, add one: + +```bash +pnpm changeset +``` + +Pick the bumped packages and a semver level, and commit the generated file with your change. + +## Before you push + +- `pnpm build`, `pnpm test`, and `pnpm lint` all green — don't push red. +- UI / runtime changes verified in `examples/<framework>/`. +- User-facing changes (a new option, CLI, flag, output, or workflow) update the relevant README **and** are mirrored to the [WebdriverIO devtools webpage](https://webdriver.io/docs/devtools) in the same change. + +## Pull requests + +- **One concern per PR** — a refactor and a feature are two PRs. +- Commit messages in imperative mood; the message explains *why*, the diff shows *what*. +- A PR that touches more than one adapter package answers in its description: *why isn't this in `core`?* +- Don't use `--no-verify` to skip hooks — if a hook fails, fix the underlying issue. + +## License + +By contributing, you agree that your contributions are licensed under the project's [MIT License](./LICENSE). diff --git a/README.md b/README.md index 40a352f3..9444f512 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,29 @@ A powerful browser devtools extension for debugging, visualizing, and controllin Works with **WebdriverIO**, **[Nightwatch.js](./packages/nightwatch-devtools/README.md)**, and **[Selenium WebDriver](./packages/selenium-devtools/README.md)** (any test runner) — same backend, same UI, same capture infrastructure. +It runs in two modes: **live** — an interactive dashboard that opens as your tests run — and **trace** — a portable `trace.zip` artifact for offline replay, CI, and AI-agent diffing. + +## Quick Start + +Install the adapter for your framework, add it to your config, and run — the DevTools dashboard opens automatically. + +```bash +npm install @wdio/devtools-service --save-dev # WebdriverIO (Nightwatch / Selenium below) +``` + +```js +// wdio.conf.js +export const config = { + services: ['devtools'] // live mode — opens the dashboard on run +} +``` + +```bash +npx wdio run wdio.conf.js +``` + +Want a portable artifact instead of a live UI (CI / agent diffing)? Switch to **trace mode** — see [Configuration](#configuration) and [Usage](#usage). Full setup for each framework: [Installation](#installation) · [Nightwatch](#nightwatch-integration) · [Selenium](#selenium-integration). + ## Features ### 🎯 Interactive Test Execution @@ -257,38 +280,81 @@ npm install @wdio/selenium-devtools ## Configuration -Add the service to your `wdio.conf.js`: +**Live mode** (default) — opens the dashboard: + +```javascript +// wdio.conf.js +export const config = { + services: ['devtools'] +} +``` + +**Trace mode** — writes a portable `trace.zip` under `test-results/`, no UI window: ```javascript export const config = { - // ... - services: ['devtools'] + services: [['devtools', { mode: 'trace' }]] } ``` +Common options (all optional): + +| Option | Values | Default | Notes | +|---|---|---|---| +| `mode` | `'live'` \| `'trace'` | `'live'` | Dashboard vs. portable artifact | +| `traceFormat` | `'zip'` \| `'ndjson-directory'` | `'zip'` | Trace mode only | +| `traceGranularity` | `'session'` \| `'spec'` \| `'test'` | `'session'` | One trace per session / spec / test | +| `tracePolicy` | `'on'` \| `'retain-on-failure'` \| … | `'on'` | Which traces to keep (trace mode) | +| `filmstrip` | `boolean` | `true` | Dense screencast into the trace | +| `screenshot` | `'off'` \| `'on'` \| `'only-on-failure'` | `'off'` | Per-test; needs `traceGranularity: 'test'` | +| `video` | `'off'` \| `<tracePolicy>` | `'off'` | Per-test; needs `traceGranularity: 'test'` | +| `captureAssertions` | `boolean` | `true` | Capture assertions as action rows | + +**Full option reference:** [`@wdio/devtools-service` README](./packages/service/README.md#reference) — plus the [Nightwatch](./packages/nightwatch-devtools/README.md#reference) and [Selenium](./packages/selenium-devtools/README.md#reference) references. + ## Usage +### Live mode + 1. Run your WebdriverIO tests -2. The devtools UI automatically opens in an external browser window at `http://localhost:3000` +2. The devtools UI automatically opens in an external browser window 3. Tests begin executing immediately with real-time visualization 4. View live browser preview, test progress, and command execution -5. After initial run completes, use play buttons to rerun individual tests or suites -6. Click stop button anytime to terminate running tests -7. Explore actions, metadata, console logs, and source code in the workbench tabs +5. After the initial run, use the play buttons to rerun individual tests or suites +6. Click stop anytime to terminate running tests +7. Explore actions, metadata, console logs, and source in the workbench tabs -## Development +### Trace mode + +With `mode: 'trace'` no UI opens — the run writes a portable `trace.zip` under `test-results/`. Open it in the first-party player (the `show-trace` bin ships with each adapter): ```bash -# Install dependencies -pnpm install +pnpm show-trace test-results/trace-<sessionId>.zip +# or from a project that installs an adapter: +npx show-trace <path-to-trace.zip> +``` + +<p align="center"> + <img src="assets/trace-player.gif" alt="Trace Player Demo" width="600" /> +</p> -# Build all packages -pnpm build +See the [Trace mode](./packages/service/README.md#trace-mode) section for the full artifact contents and player features. + +## Development -# Run demo -pnpm demo:wdio +```bash +pnpm install # install workspace dependencies +pnpm build # build all packages +pnpm test # run the vitest suite +pnpm test:coverage # run with coverage (thresholds enforced in CI) +pnpm lint # lint all packages + +# Run an example project for manual UI / runtime verification: +pnpm demo:wdio # or: pnpm demo:nightwatch / pnpm demo:selenium ``` +See **[CONTRIBUTING.md](./CONTRIBUTING.md)** for the full contributor workflow and **[ARCHITECTURE.md](./ARCHITECTURE.md)** for where each piece lives. + ## Nightwatch Integration Using [Nightwatch.js](https://nightwatchjs.org/)? A dedicated adapter package brings the same DevTools UI to your Nightwatch test suite with zero test code changes. @@ -310,6 +376,7 @@ packages/ ├── app/ # Frontend Lit-based UI application ├── backend/ # Fastify server, WS gateway, baseline store, rerun spawner ├── script/ # Browser-injected trace collection script (runs in the page under test) +├── elements/ # Element-detection scripts — getSnapshot, a11y tree, element list (@wdio/elements) ├── service/ # WebdriverIO adapter (@wdio/devtools-service) ├── nightwatch-devtools/ # Nightwatch adapter (@wdio/nightwatch-devtools) └── selenium-devtools/ # Selenium WebDriver adapter (@wdio/selenium-devtools) @@ -319,7 +386,13 @@ packages/ ## Contributing -Contributions are welcome! Please feel free to submit a Pull Request. +Contributions are welcome! Start here: + +- **[CONTRIBUTING.md](./CONTRIBUTING.md)** — dev setup, running tests & lint, changesets, and the pre-push / PR checklist. +- **[ARCHITECTURE.md](./ARCHITECTURE.md)** — the package map and the "where does my change go?" decision tree. +- **[CLAUDE.md](./CLAUDE.md)** — the repo conventions (single source of truth, thin adapters, testing floor, commit style). + +Rule of thumb: **one concern per PR**, and any change that would otherwise land in two or more adapters belongs in `core`. ## :page_facing_up: License diff --git a/assets/trace-player.gif b/assets/trace-player.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f92b117c151664c74559e8fad83d99e043f603c GIT binary patch literal 1847771 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�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%0Dnep`7O}!s!T}%h<bG> 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 #ji~0|eQi-;?2kOpKC#DhK;<d(9s^9Cj zJW#xPpN&|#=X&1nfJtkaf;<XUuC*}cPn__M4e^ZjK2a0Lm<&)y38-h&_D@$T>v40m zP#X_;#-ELQlNNX`iDdBUc2a1o;8ru6e7DwW$C#?R&8VZB^Iv?PtL?EocnaNKMr+W3 z-Nwq)vMwP%XBo!!SH5NY`E`9lIecqVF(`}L@XhP_Tw33jC4*q?S8tR{H`kw9@$<e^ z)%w(Ud9KjU(69a*iP*lmam&L^hnsu62Keh3OA3p_LL$?vKR64q<%V$|e|TKEm~q$O z<NdG&zmcYQAs^}7IWpYx96fR4!!I}QOuHqn%zJpMR-Zf**e)Ee^?G<@=YhKkGicu> z>&zCeDTDKw&Q|7qTYVI365J|??A2Hhg5Nn*_(Er`Qu>BS2K@7dqq#4&HVu8Mx@OF+ zhW|K>?b^6_<T2y4KwX>;|3YKK+h$X{HPYBEPv&k7OQ|h-wmU|M%{$j0acDt4tvc4X zd;yK1?A&wV?X5#YFT&mzUAS{gG$`%JtIwn`GOvGOlbPzU#r`-X*lXKv@@LH`?{}0l zHxI;Iv+Z%9;0sR#0zPQO0sO<GHtU0AhECbMahaAr2>EhwON{S^cDp-!PT>c`@?&jJ z0tf9L?%5J>%-<pA+-^I$V%yzX$2WYjvE4)Ba=b!`=X*XyVA{NCakd4LzQ>QpHh(#A z`uI^5GY@_ZTbljRbsHi@PJ8a(Z8y~#vOC7}0`-)%#-U~@GSp!o+`;18JC_Zbo15G0 zzHr;@7GHSBO!?gpqCN@oN{Y1`7>LGv;W<`4GOG8YHe4up=#gC%`#|0H)qsB_^&-pd z2t4?#hg<O7&+(IS{>z99mpb-aNC%vA@R|z>F_Ai$;2kf0)k@>N$EF8K-NmOhjZW>p zN}hj!4jd9&IF=MOkThI;iMsRBP=@3P=5p7{rRW6!79cg5aXHfN^834cJBu%GYQ6m7 z>efKg_N`LLlMI9r0V&*i<z`#bVuqqG1L4gv_M#!anjt({PQEOI3<M2KP#k)2!0tUY zX!-JciK}mo+-6-pZ*{oZRqa*Tn5?!pS>s%?R%WtJO|o7|@>ucJFwxBsMQ&xE-AvD= zm~k^x%xh9CUZz-nO~Ic_xrIuJH*yQU8epr9adD8|mYM4KHQA>()tL|DA|vg(@mjc7 zYT)T>?lsc;Kk$B6H5ovi(4TzlT$*=g+KJ3G&vOc#l{B(U`m3QdH}IORa(YN+`l+qy zVI^wM1_RtAc(=p4M~xBWb+oTjMCb>iH-1}opQ-035kVl+(<n1-Yi7o|%&g4JoSMw* zFEi<1GxKG#3O8om+?!SGlhxFS^d^x!NEtrp>;c<t&;&$g6HuL*U0ah~*9i!5vg>7X znzVC-a5;~@W_N7OseNhsI5WF-Z%&&`ZeM3MYh!MojC_gd!MQ0H1J}T`2bYy&++?^V zXf=r|QpmkML)cr|S%NeGMg$NnpgSR3gqHnzW9Db=8+?@P)R))SGH<|fnJ6Z({2^Na zd*fLG0OwpsadMEM^v4N+2#_ho00bxiA32Zr<On*_KXu+n+n7l^cS8W5|CKLqr3R1* z%@ktXDEXRypjqx{P1-t-g7u*V>LuwTDCI_(tVaoeHW@DUJP*YH5O@GNeZBkZbvaoG zj8mXS1d#kUP!uTdz0HhH2ea~oaCDC>9#8ou&))-Q(HHg>qIlXg51xDm2Em(Jks&5* z5RQh4G3Y5ZH=q}@Jy#7yS*9=&kRnq|@c`sJ0GD9^ipHJiPG`f}P{|Xy&p*hewtDEd zyQU9I)TXA_$J(0L76?yfZWRYLcHJ)Y$Wb*1T(EEq2~;D2f@Fv&6Jm`85i}knjBZVV z3esU*CS+9Qh9C~g1xiqCs2L96(jZc3gaD&d5Dk$53I)&*YZ7l_4DkWVMA5fUBu6z0 zXh<xRA_DF-2tbBAb4pEkHW7{pj0PcygUU=m4O@mh!6TMHPypzFyNTv8lZkoOXs8_X zCQrSD;y@mI0OG?%+F00V<#n86Nl-~iw(MoD`*q5-%W^Y!EpBI{(d%xWxNY@12Tq1@ z=?1)acrFe)FAH<S>FIO<?p%(D830-_$_75@n>_*?v2eq0A|LzVB5Wv^4m07vIwwId zcB!XMCT}V`bJ59}0>{uGhbd4|mgGZ62v1h0hy&bc2q6l=fecsXi0l#oYkdHozX?u< zLv|WLM4^t13djiD>j}hz1M?&Tti9!28mOdG(zLaN&?%KDk*1!XDMSI^TCYEBQdztT zz}PTH+By(>zx6h3=Kei14veY>KuG}4Ap}tFRDTuWy<u}%fFcpzdK<!JgU*bK^}0Nt z7VqDEmnaF126lf8g+Pg}AX^uP&GRJY@lo=4o`M#Bz!?n#Ii)VRstEH;`Bf3-qO}zl zhkNl&#DfHwp<&iDP)oXj07pc)D+fY^W6(EfdviXYYk*}ntekJi^tpS;XeaP0AhA@X zrUuY}u78xT_qESd2oJC&Ac|y&ZX!?WgqW9w;Lbw$S#UElM38-7jR7b!5o;&VhQK3h z4$L?kqR8t;aA1Uy8ZHMAn+2Drb<rH)%Naw%{nY}bMl>GilD+Y4FJMN8gSd+MP`!DN z+|g2)01G}ZTWH34#B)>eo>_UaD`lLi3#B!x>lU9Rbbt?(Ah#V41HJ3oPKLF?WeXln zRQoEotLA4G-Zph_)_;|Klh?W!p9F=-JGpF_2J@yX7RJYMHsS6sa$o|@kW&0AuOtBM zV0Gv*KvANp_4y_>N{2vpE7BZ_Ch`6s!ksCgB@xi3-_*o*-VTG!CuZ}pK_eX9k_cBO z0rn=)mEj^e@*^1{+>!#wv5k4$X?J-Tj9zI-0U*!2o1OqN1u#Y}Ac_a20dS)e*k}!+ zSx--twfQ7H{VbDNpLfk^BU9UjsbPZFC8IT)b37e^NRL86ETG4Rg0wqS^WuczXM#9D zu#6u2gcnk#$V<fwnE?1C4+v*@UM%h%DU!Pg5O|;VN7?osIRdpej_4HEzRV}o0-tjr zJFxKMk18<edQK<6@0n{L#1bKaW85_nB1c3Xi{AKMM2psJS^o6cY+L#Ho>|FM`|y53 zZogx03IVAabkZ12dW6h-8oIyXtHATG+iraMdV}jTuu_w=crHJBh7Ld3AmWiL{^WY^ ze!AL|{C$_Q6-jx53^46nzUK6xj}W*n9E3zdv^XL>1`^){WaCGOx5eFyrEV8DrzF)6 zT^=2xeIH6zc$vESWt!*9jPRFp7}Z%Po_Y{KhE-EH4Hx?5I={+s-#+|JyQ@f{Uxk8> z&_^2p@C`ykkkdmpqv;k4{ljHwG;u)UQD)h`hFre<){mKOmtLjS3_tr;=jp+06e=hw zc`<Zy1SvWaE(E{(6g-|ZRLdO|&kZ-_%QIA}1^6lSGfx4r+r2`eIbUAo3x?%2zNG6s z$zIIOhVqXu?k!yO0i`Il%6JHJ1}eiCE(&MEEuN394Ri4zk9BoNA0m&1hzbvBQQCxQ zBXxPFo(@bX{+PhdO+++}2rP{F?`sgjuhVTVMNWfJj+tV3h{1`>;zSVf5#&uLcy<$I z(hE<My6@AVu4CTk+B}sqh9Xaz2Y||GP*5KSP~bDSpA~EaeDp_q!?RxGJRN=Ylvio8 z@@qRL*i+2kUYmzJ!~xAY;K{Lf{y*N472luf2?%ZK`RIh^bGkj!mA6T^)%Tl-CPUW> z-Bzv(-+_Im%}s<`6N`8{C}k`d&}HPZ1hZbN!m!#MSj8Q6w@<E$xX~c4VQ>tm;<5n{ zEf0{hAaDlgi5*5=U|Ws0Rra)<nw1M>LC;*DseL@-PriE+Qj;uadM!~8L$0xY)#ysD zpVC32(1<J<r~?l1{7J7X9><46IJ4kNuW!QHFf$Uwja;vWd%S7iJ3buLn!J^u3v{Z$ zyx34h#=X^9s5PVLvjW(2{jIxjLGkGPvk&v%<=O+|W*!~jAh@7E>r7Z>wyG|uzU{Uc zwx%buMkW@%(-I0|af0l!Y9Bx>Ob<SnGr!u^76mv1U8By89yq|00Y347r^)4Ya0~U# z*f1DQZ{h@66JG^ogK>$&D8@tV_i5XMOUJIuRbAjX-k7PM)6D$P5$b<iW^+Cq3)99! z9B{y{96fo#K6Mi`hWW~h2zOxu^Q$7uj#WC$>9=YvQjFL4vp+QPgApTeA=)zp>9O@i z(2)e^av(Q_yL>+Oaj~#HkLOpfueci&K)LToc*GIT3W@oS1R#8`&!pX%;hUd1(N{2A z(u=Ll+c?*8X*gdH3uet_>xSor=H6QW__e<5Qyq`lu5+tUoo5LA?dk7d8ntg|vme?k zt)cv9V9(xdW+VK8uN~vi&3J@AaqV;kG~Mw1_Ib^VhFJzWFEUELr*k*HnfA-9GR&IT zk@;HW#~IHbnKE>0!;cqNvfjU1@w>2Q&Rj!1TkF}uG3TtD__4zK)B{#=NtZ?7LbYGp z-;Z0z2`T(b@&i{EPo=rMb-bqKX&)jZ{>~}W)MxB|rucj3+|B2HEXhbr5!2C_RNG(9 z8sX1NxRtzkIR#>1^@rYQ!NDkZcrs`sS%$|Qq1y)*Fg|!Z^c#H~E9d6Fj}N0V<j2HD z9eAv*Zp#4N$)u)eA!++C_tS^k5*0SYt+}5$@+3unU-2e4p0h?&((;n|gX#Fvy;aBb zJ@>TZ%SpSlFRg-k!#xkUe&cPq`<6SHXf>Rc*WoAR$z2)lti<HEXWl){-4d_pxf(D% zP`;y`vG3cLD|8{}*4OqHd&&=W3JdxM>A7#Xd-VA`#e+Y|4;vg;bQ>ct8t=U*{w!Zm z14F}WK@+Swc=)bLk`+=shPaV$wt)8NS&uORDP-DBZjM5&0(vh9uhF*m#ctz%I%{@T ztjQMVB?-%WWADHgpOnTJJ57;z-2B?hwMwd(${LmE{lZc3%li$ssNLGtQ_Hun(8Xl_ zRkPT(%E~1Da-Cn!8r9XSk$Q+0APVtg<3w@9(k|sh#pC8Bkti_=+bWk_D1OVrE1B72 zfxJZ46d~j3T&o=ZB&Ksc@3Y3D;}~qnHbV}(&&ja0TV0?HCRrj-qxPU*@3?@etE=0< z+#P;JPCg<<<u)B=Xuh&D3T;1xhsaywJGXizsC{YIN_oY8LE2@u$E`t@<Q0P;FtISz zgcgx4*JAA0DD%r&q#=7Reh?~#Ws>3!-`M{FB5X#Me(t!L!-Ry6$EHV-_P$Lo(A^Ht z=qh2)RFR@Z3_4xieces+kxtduI{djMkaz^68WM>&VwLvP<H+}SqAY0np#9F<ckz6+ zWR*zNdNkx{h6T#zPU;UZC`sl=Zz)sOXysBQ41>i}({@#w_&`(Li}@jVsf{pA=hfrf z<CnS0$}XFIhS>)sU%h23iM|S)@Dx~2-T)2XVpsh!eues4x90uLNB)oA4>tSNFTdNT z5_{M$1Rk$a{CUqBIwYT8#F{{f)e)ny6Cw@}lm&U%B_>kuGKGFIq9TO(Nz<59ju)`F zkq5{Z;;~Vhj{a<_K@0~kAXey(=fEltTP4E7swWeKtWi;Lv12G}s(4JX^<hEAR1_R_ zpO&AObi<pOfVNG?3rPKF1VGIkR)*&_tts>9h~ky_s0ccl3Y8#+R2@+H*0v?$`||to zf(Dsm;<k!XMtsy$f^HdBkYnuos%y=BT(c;N3T!N5J?FgQ6y(m22|0D`tz15J0T2?! z<|$Q3Fw;_b*m_3fI(9eEeOAUxmKKFwQ$?7qIAEM9(W+WrFe@4aDuuHY^R_~{bX>N% z&!QO6urLiirwg_#)u|_i)Fn`j99ssOznY}1LK)vuw;~dJjuNnS_F#iVrM<-6-b;Ql zujR%w?9B(SI&z~aw*2v>Ja;P+K&uE>0F>!iCe)hPw4x>*B~BuP9&A@>Gyn>qlwt7V zC^Uksi4|jCfbojhC?-WS2t>kBN52A+aT06INHa|H7I$)t4wgfOX;GA3yn(6nv>v7> zI{>nMRD=Z6fzJ%`H6uX5vCkLkC2ln&J835oa~1l9o1Luipk}*&P>LOQUkZF^kOqD! zrZ{7wMdj$0+fFp{nQ^R)b2$)gf)(EbU#8@4CdB}|u#3;a3R6g9imut9q<Afb%V<!4 ze`JtH$7=+yMJkfft?o&Z6~<Dc#gAZNk1kR~EQ4bt0`deLI(nc=i!nw(slX0`IQ{Y& zNcmQNO~ol$B!we_4H4zvx1V6jU8oRRhq^Rod&1>fZGX+$DV6ix11J|jFJP-LR2OCC zIh~yBJ^I!_N3QW;=s>X`12Ak(VWJ2)NCt!Har_k%asXSNMqrjju6EI#lLsXTx-e~q zxQN0c3{ePpKlbw7X3UNbyer_ziAv`d8KYl@xTZl1A1UoJeYCeH=%Fe*26gqx-d6ho zg1W}*T~1EATG!Ox@6g`rOkdnxu*Hb|;L_^$ZO4*xZuFxbXf`rMFEc=Gg1<7NTK|;i z8L{l?mIDh-(gAsi>vx<RtbNg1ar{#=WkQX;U7+(YTq+-!V4v9Ma;V36;QW|Ik+iv! ziwmD94$vo_+-hljgVs`W@W+?*ofkU&DR2vtd6tv9`5|lMU_h#Ac><qtR*GcyrU@jU z#!VACIqvg1XGri+v(jApL((D8Fx5&((|#f0@U??dRb~VM^68}9*VzeCLv0({jIPO& z(nk-`Vd}*3D?E=ZX4_DQ>~);a6>i;;>!h1r8{^KT7L_Ta92M|(>O1l9e%(=n;Fn#$ zIcts?r@!nz{>Avf&7aPiy(S_gYSx?mw=8OZbJo1RM~UFPd=`#ax&c@4wiX#?#o90B zN#=Un8xHqgid!mBFF)?+Hr$uq7Ett+;o}@U{QL$Yu-I<%370G8&u`fW-gd1&v8QTy z;7(j%+0o6u9xsLmtKy6shgR0_UmkwZaNw%q6m7%B*-+&$CRCB?c`{b(+mMhlhEcTH z@5JFZLOui=g-O~;i~dOAv70tkhiee)`>jMm*v)%hG5r>DvPV1DSIIp*GZ%Pv)5|bc zbO?u%e`0xLoVlk%mc@+YnwB-5IgE<l`kd5fS{NzvM$txgiZ;hdwHrMsb49Mn`qZUo z+s9_cp6tp0ekwWLVsPR|yX+VqdF?qUG;+X3evA?q!32c@G0}=Ew1v?3`^HBVMJmr# zoVvjc8`r1`fL?vPl#I$&R=t7h&$JA@?KV2?)*d?e;BjC@@aW7z<oTgi%b?2i(b?k; z=Z6O#2R*DB{dg+={HwQ?!L=_&=YreMk9~d|{5WDO7>*2M!?%PqNsn>j|JhmNHnx~P zFGn<L_!{w=_UQ()zUZrbXkYr+(k+MZY1f9(!K$&(cjCimk8U|X{9^1&ReShcV8i*b zW$xH=1M&hVc1zf#^!Q4<!-d6P&YByR1;IRL&6e<KxAD~%?H9g0Xb7JR9{)Cuj96*i za$zxjeC@qM#Ogr9g)dd(-{<2a*8bwG`P>lkV|kp*MKS>iCaA{bIcuP{OxSKF{0I{f zz(mF{QK?M6LMH!xra%i*u%9XP<_~9$M5Cx$qu9Deaoa|T-Hnn*8l?gnrDGZ~sf{v) zjk5O}<yso$`x_PBG%7AND#4nt5>3i#O)Be}RBfA*LMqkj8sH=xf^yIDFaRT`#1%Ki zk(=~#P|AmzW)D*e2o#7GC6+`%a45PbdG{DLx^FVM#%oP`m2Gs7;HYL7%>$@9bxj5_ z_0W}gsJnHFJ1~DJa$WHqgccy?4iz9!ka$W2j)I<wLV4Tj2Q)!2vJOiI+D^c{Sl0G8 znVRDH#F)piWb5nNb_V@61HP0|<tPpBC<U$NUS9wfLXn_SkkwHe(D}%rygD2pK!}79 zBF)?Z$J0%QYfTbZ5M~yMp<Ra)Yy_#15?XCCObX1MVy|X%#MVA;%HDsrZMSW`>C4D< z-jPyfyeWfC3LdasL+YaeDN;0E5RAMB4D5wQTeo1{qtT8w$`>gzoJa_hVq<L&BY;XP zLh>2vF3F18-A%-Gb~{rE2@($6eiJ~&Ec%j@!<Kak;8fJQ5ZN$2o0u@DAeLfU90j3J z#Hmp85D?OlXqaOskO7*iMM~f(a8!#>1}M(}l<0ZvCt2&mY{<5bg>@azRof%X+Ar^? zA~8UW0D!<zFd@+pVsq$80Cb0{qkxzr&=_5cp+y_KgR<)oAkPG#7)51Sii}yLDi)Nl z7Et0)^71;UZ@TL5cND2@Mw>;SJqb~f+YBXu>+w*1Y)32!l&5aY`V_f=f)xvaqDaw^ zIh}?rpn3;|vLAqE6xp<Z@>+U%Ie7<tS_+RmErdBeAIa5xVw1PG%*07Ts)HgJ5-A=6 z3g7@SVh1<v2u0A{KB2I@ZfYB1MIx^zC4#``SJ<&>wksiQ`^$X*gj2EZzOCsxpghM8 z!rlr+XAOkeTwk#FUuS2mXLtQ1W>a^wpWd_OvYx?c>o|Ao4I3{a*(OK!GhATnTzJTl zv*O&GXAn~s)Q$ynWx<cK5P>XYEDLpw#aG1Qf4~xGWeE<jgx<1*KeI&Oy=ci^QT1Li z(_Znn(j@C%$)mkefxXhPy_jpgGDW?z4|?TVd*ugu72ftLe(qH|iprRx%KB2xp)M_@ zMk<%6*Vrg^PippFQO(VL?q?H(ZX2lzxnz@j^mB_1-nzVRanb$WC#3RRKOCiQ+GjrF z!qxkJb)H}F<hed<Y@gYKXBL?*9_NMMtM$EOJvXSAc~9GgKiY>M-DTjKU>PoxGIV!+ zi#@Cw!Zc36C-lc%?SFeQQk9Xi>Cyw#T^HR@7meq98HC7C6;KQfc`}iwiUQ}gZIq@o z5oQqmDTp8nlGX@lQUOgSeH~hR`)L0MeE$~sppDSrR7l@U26~r5^rTg^kr}9jhPWPe z<wHdynGiQW3XT++)f*+_o^L>-$b>|xFSxp!(431HW{>!A`l))O3H3O2J#v&^eH4Zm z<zWuaUu|`QyqNj`K}_w@XHaldigb0<LA@7l1(y#g3|c)9j=OewoUX3VjO4;IbWSQ8 zYZIztW}|dS09H0yh^FwWB&w@3NtN0Z6ZpX5c7pNuerG$kpn<+Pj!PhXSH`uy%7HI* z%3Tmcl*W=ig%sdT2SwHk<UP?p+$u}ET7J^y<=&J&>@|<Wo-QT|ImNlVvM%j1yfl3H zl1V&HS$+s`4EHE~y;oW2IWO;S>F+Dm?bq?*@gGKNibiT5j67-`sT&xne>?K{^GE~y z6;pCQqQz!Pt~DOt+Ne;s0&6$BZ&Q%EqxI<~{Tza0nN62Ev2)<j;G6w}{jch0x>&J< zo${m2-(S_vyy~}m_Pq5G>vPwW&)az0vf52gdSYL#&lzo$Tjz3w+WmBt+miTdTykte zeQeT`IAAyS#&zuN(Xn@dWA9_frml^BC>oo7FgDXVHajr(@$J~$+XLliM>&^97bM3Q z)yF@XjxX7be|8=Ja&&w-aD0VFez-QiS~ULc!T4J1`1gVFA8*IGpT_|N``c6VdDB10 z569SuARhUFjS3=_inI9@Ndj$bfkC$5JGRglwlHEsL}~)9F(JC%3#>5b<B=bZO-Kd( zMt<;;xycrPI3d<HAvZW7|87Fz%Y-6gQb}qOn>H?SeL~fKQf<$q`msrkpve#4Z3<N< zm2XaJKb+KQo75eg)O$Cn|7DWcZObD#8)>{YUjN#}{xxD<&{!b<U*HixtDIjT*}tk$ zoBlVdoKiCX_f$FGTcZBEC3}|IyXU31hL6{OTjsp(y0N3-@%L{lpJv9N{e(ySO^^2f zPs#p&q8g>M*NRt-3N4V%PYV@?-Msm;8ueum4=w+r8uhEnIaBe66ekzWgGcBEDa)76 zRt|VEurM7X-H-SC_xOH%Fm$Z+Bd=sX^RbG}E7@1SN%Q5E>~EIN{Z_K)wEcaR^UKV9 z1Ax@yRXL@3C3}?SD=kI-pCx;97vOG~l~WQMBW0*%*CrqQOOK}aN0qa*%VB3I?SZjv zK%w3q1>=KNaoddK`p-CRtXewr6#hl<{)H_fJUtpg^O8oh<1URQza4T*_RshAmWe(W zZ1qYR5IDX4^9vE_e_68svl_L`{kS|%K?*BFqNK+(@5Vu2z?~8`FSu6<Y{jOCT$X-l z^|mc9bSFPjd*^dV#_xJG^Lib-^XC50vd39S#YRV>tdQtjsBhM||ByIui;JE@c!4gG zwbG~77CJQV)Y+SN3s}Lt)ER5L#0bFmrQ2Is6c9}?cn%+W{eUUxZHqm>;^qTN-gYQ6 zLhveImwz0emXl~koL(XSSPR;Wk8*G@11B+J(PlLI>9v%L9D4qPNE#sIiNiw*&TK4^ z_rd}!Yxx|URaF^D!<qyYcA^8zMeGQL*(7wwavZiB&j-UD<lpq1B7`RinlOh1w}?l= z*np4`iL%TM>X6~n!-CdolgHII*#1+M^U(e!im866(H8Pb{{MGX&Ob`_8YjSqpN{M< z)O_O7w+-aS73sKjKG{?Ivt<7_DNc8hLGbTV9KoCaNy+}AR_b84hHF@GW0W8<o4voY zziBT`L-<I}o9=|^KADuj%1^nRq+1s6w>}HymF!o#Z&@yP8va)$dyn*)oxGC$cXg=) zq^p#_)Jqir6u^O8`?FrkU`Iv$kJd{^|3`;PzBxh%eiMt0RG*z0`_B}U|K|^t{;dqf z8*_j>s>W(j-o^FP#n+N7bv_iP?%|2W9v&6l3C{?c*1i&dK}Tm>-sR!Lg*P2L@w}mu z&Y_dMI{a_-QeKAMq}o;Zl-KI;>hN7-cbcShvyg2XrL*Uy^ms$1*Ny!DjSMxo-11m= z-Y=y4&pP}+X6WD5;T>)&6H6qHmo5BbhMIrz%2L#-vd~bFX<gV+5A9t`?lvfh|Kz;M zr2lLW9;v^?vX%B*s@|fsS*lyRG4Eg0;h)*t{Wer$dND9??>~o1$32{uM=z*TmdC=D zxtCa?{6=&<=E8Ci+WP5_W}k^BqgpdZicO5(>-f!-=GO*rt3QTHhGoH1pInVt;)UaJ z_HR%=*H@3pIH@(_F%3W5>mI(Z_%>I!Y>*FqjO6;kL{Z}&Fto(MFsB5$2sfA*zM<~Z zO;a=oeQ|t8xc4LB!dM9*LT~F9^hvJkvaA)Z$-xn~)WYY*VA;W9xY3Wk<|y!l*JdPT zJVujw(A$^}*NbU{c(SY|c~kM{d@K`_5Nk;^1C+9*gBbU5>-8M`6EkIK2k(2V8UTt0 zu}nHuuk+suZhD$(cn){OOJKu2YndLji4a3^@nnci7tc|v%_NC%H$JC8R_MZJTKKPV z8JP${Jf9;f8Vw_E(r}IgVdN%JfD(rl#Cz<?NfOVc!vOM56bv|wQI59Lf?xpv(<~@R zZZI`&OW1*e00?x9k;Oz}P?Dh36;`ZK21(F`a2Tt84?vNu1U%>zDT$hn4mDm9X}wV^ zb?@BtqX4w>W=@!EcSH!%olY@RWw-v3q3W6TzYUc_3e^8GLu+H8ZBEC0hU3%Jdu%~{ z@VYTiG5JqoG2T$g2kXsmoAt)&&!N&kWoR-lLsKl@t=;;!he}!MDDTK3rv>nrVlqEA zW&OXSm~`FOv!=7dGx+af`sWG&gwp?vY1V&t1+Z<;zsX7aAC2jm7mUOIZ^!g6|KoqW z0(i0$%JV;#T*<khGyR+YF}NaT`nG}<Q->xL!(E-eTG_)}Eh!jN{&v*;xmx-gCvBfN z0y#K6`}3$<e!cd<f8(gDTXFl#uhr7Oj_ITdxR~3?1>3{>|2d|$eyx_OW*1L{)#?3d z0xtVR4w#+&^z6@={(Von;iHCx^S@dxHF_zt_>SBv4;nTs`}k#q+^)a;Dj@v`aWrH{ zMjV=dfty=(Om0nor9ec`pSLHyaUVZ<SHEZFHSMPfI2Bo9_uHP-`6%=2d)zUB)v3ZR z-odpZ?Qtfo?4ENfjB3MZL@2WS&ws2QuQ)$fH$QiNp2;-`<FtsJ3R~z<x)ZioeHa}% zA%$yLTk3P$@%{7Q@hjiID28AoUx(PRz9BG2NReM<NVrE|X3x$)UQ(_zjQCcw<wh`~ zR$yuE2X|--m%DU!9D$`p&Vd|CcL8QhmWUtGrYS%AgkOVX)S)r7sF4DS$QU|m%8L=c zATWWjB{Ydn_nbYqZ+zAT**LOM1fp0s3O_z%!S(`zM?c{aSODZ_GtNuVN8#KTZkxnC zXy=7^Z#jKrh|&des5}njyZLjqboZjX_kl6Yki|EBHOPj-T=*eutnLa0a{rSuT#JZ* zAA9<eTnB}}C3q8mF&1)fUx9onF&1k}51MXficVHFFP&q<A_^(uVLVzq50&@w6CPSd ziAI*?Mcag_a178<+F9%rH4anLLAzDgae=DUlFbi&k5;j!^Lvsa`FG<Xg1m28Mks5P z7CuUqh7GmiSRryaS7hXO##<7i4fNSiB^;2ZM*#Irm{Ee=Y}D!9k>a~4pmtIuTud+; zuFZ<&i5Eh*?uGya213kCG_v87nnW=hBFbAur~nX2I*A*l6-P<k-K}z8Y6vf4c12kf zIQ-EX08cq8BaC>fl*^Rph}~8K$|xJjHd>^vw-ujSh_!4OItt;BMR^mWkU6YagB3Q4 zOKTEzr^jj%CO|7pGwL}xMux=Z=bEVs*J8mq#|b{64ECbh#@+}R7V1q^vWN^O2p97Z zQEDBVJt<M=T_%(~V<AXeJVd-@;Z$iDRkzD*8*G0C;85HIHj!iMTNed{rt<hJXq4f+ z(?Oo>JhQ#zSXFN;xHgd~ImiG+XemJ+)z*TF=x7}*@W0r5^KdHLzU}`!&o!7?=4D9B zP{w4ckhD;lSs5~fNQp=^7)mTMkIR%X7MX`ol8_e3JSCY@QOOu9AtCEMbzS#x-Ou$r z_jBLR?~mu*e(&GdwuNmwj^q2?_x-aYv|@-SvvG|Jd%n^GSOBz6A1t0TiWI4AI{JAw zsA7?`)bjei!EIsa0WF<EJ}m=d^;0n+u$pC2q)D$y3A*!vLU$%y1M7rAbL810&QJmw z)yP5eBzuIjK8V(o3&j%fOxixpoSDRz?0MvT?aGfw3l2l^3IJVC55UljKTPl3L>G{k zC06Qz<hH!RZ1VckQc2{&z*-80kXnxatny~;&T5%t^)6`v&0|c=kC>XGHRzKjZU@+a zbQon#-aPxj4~)DBqaw)bIoXzZ9nWMs7{sF{cl!=w6P+TJ!l{W1Vb7k(Rewt~Jc0?7 znjk{r{hAuZ+8_@(kVTKs#JTNh@alt6<X${zd7Na=?#zd>I}w<A5<u}1zCyKo;0Ch~ zr}0^_Gzc3mgb12IqL1x|c&It3<pqn~i*nIC>yDY{d7bH7tZq416LUT?Ul^NA^Ac7L zL=_Y@FZ`f_j#y28J?RO<?T2M#t|_h~gdr3ClY=>#wo>yodOT9dIEC&>=6&m0!b7TI zHNB6@yn9^vOX|YY8iY_zB=i!x{?%jYDee@*7jG_}?5Q!8{&pvN;i7aLM5E7r6rufP zzC7I>)on{_?RhqB^<(_*odb1+kze*f6-4ULWX<rAr5n5ZUtdqeSA6eT^55Ki53toz z=!~dA0-3`I<a?fP(V+6-hDl67ZHuVU*ND>%AF$8XU+nX6j=8Y)QHV{YU0ZfJK}+y@ zIPG+1C#`Dv&cm%KSmnUm7+p<eYnf6E`vFlbt|m)2OfyrTfLPpBBvozt04)q8xqr)g z=m*j}*A3n^y8e3Kv1?3|Ttl4Ak}iRHmuSSdwR8_wZ=Wk&fM)CP{qCzZ^|sE8>)PY* zjlOg3vYou%SO4yN?{^aW!zED;aEdCM%m*~e2P`p9vh}UE9^U>+ifi~JZv3P3^!9RU zU&H4^eLpJRewn(<_H;(ucw-=Ad!@+u>6}I1#!&tC>dExO3&SFtqi^0hMLm1E=-s#Z zZgcxPg{_eqX1w)5fVSRl+_;?5xAplj?MHuH<4U3N&$-jIjgh{_wa0xw7jM!wC)l1j zt+yF(FK1-0Dja>bG2FMkrWMX2=WzJP)YA6G8`}1I-?Q!SeYEXOc;$s9LdrX;4B7{# zjS(4ZiOeHJ)^#EV8_1y?$YmMG;}eKY4dky46dVZ@S`WlwgG7{rHblJW|A6w~hM!*F zq2Hcf{|cg(>+t_QTgLxeQ6B%+g#71EuMGjj9jB7w=v4QA2w+-U7nZ=)+kXpS{==4W zp;ESL2j#K1v@D5bXF~oR<#9S4#bCLaiyUio)_5#?g-JH*J=E29bh;pFv2L!WYq5T@ zm1(JAc}Rch>DuS0rN)i5uBB(&XlCj&(}=_OBd3HibDN&=e<eLfs4&Z);G8~HWyT<F z!@*JJ>Bs$?KP9#5{%K~0EA6y)_7CmGn*DPf5*30EBjoxPgu4!29%;iLm~Ig6RlhuP zwV(Gx;J%l;Sz}g0dj2FZe!+zD=(dmF&xx03_ZM9og`3OPh!-lpWRJNcM!d#1n+&}J zuD*}SetTn{mg4<>^()KztpGOJ?1|7<7Cs-AgnNDbqK@`veN3q5^_`kM8T;c#%4PSg z&sq0|eP=!f8r|@{m(7|rTN0IWWBzRw>!x=_-~GD_HCHWeE)Gxj-t?-c8QooKKF#a* z^(A}U*0r|%OPR~PTEl)TT^h!>uD&`Gm$^D7opS5@3s1If&-ZcrGuJ<JTKI1~%jxs? zm_Ow80x#CEl(4zB$rG^sWRlH_dCRq98*&z)UD9Kt;mHtZI~>5Q48-`6k)k?H4AzxF z*akA1PvQvV)J7Dl?g6wU1Tc1OmeB&j3=WRX+^r`<WZevz9B25k1B3&L4U-q$ik`pv zR2fz@DU6}%etRx_=S27kW<&Nw34Sq!uMvdkT&|tK_=yXMQ{8a&cKZw28(*XB;p*+H z(}D71tq1}9J-+j|TMwS~jHwvK^S`BUD>n<2;=_Rq5)&Y7Et11ZM9>N0;13DFytR+J z+3q0$FEJ!@e>3L*5kbEq9~0G}$9Q(RH7=M8THAxbkR0MzjeKH=N+72iUxzRf54ut` zkQ?E8&4X-W*@F-(K<QGdq(JA(rkru3C>|skP{!Wo3bsnO(aT|?S>EPy8r5|Q3WcQT zwfK|pK~k0j>Brpgh*tPnM32nO`wF0qJlZbinkw-*6A!;<F#gMyF{65$7_f3R8+Z{9 z(JS-^qF2cDhDDk&MZqDegU8V3jI2T%x#9O)a=BoX$G4!DF@J*cP(4mpxsopzQ~YZ} z9$P6;{(VB8o6Fp-K{TFDD9_<vy|wE|iAhT5V1eptF(IbJtWfWD2^_$*>?t|*xbyY> zzXUM#h90D^mN^@iS`T*))zqz)d&HF5OzRETjji6-<B+oZ-Z|X3v06c7DYK{3A8F=a zs|+_RJImWO(yF>vMfzj)_MxuP-ks`gmU3rp{jq`cwdx|n@{1N-V?%Xok1DxMksN=| z5ZSpBmVUnycKr*&(;w+h|H~O7|CiF8{zq4W^92^A%9(ql<q>CiX{!1$555w9QOjMd z?fl?rTv8oBSInCh2@6k7)6P3rLf!k)zc560rt$Qgd(|6K@HCFn|8*s}CH-2O{(dF= zXTsCs`D3u~q;JOFCp)pY!w_*m!P9t!`TFAgl5NShG?j83Wk7A}?TGphbf>}`;(u70 z{&gDfl56|>X}nkM`|r~@o|Rr{M|dh<88A5Xiy>0Z$8GY9A)-jHF=XTYWp&s-Y+p^F zWAyKIr;{wWe$)v|=4;Jk8M<=)L)ZEaO1|^$q76}){SIA2YVKdTv_p5gzy9HxKu@hc zgVHg|N3vuYh6f`2mG1Pr@U$^o^qk*&&f2!=FLbA2_suW0zb#D{H<u`M`?siryW|mH zo$@L1bnUzcn>l;v4jwv%KX&=&>d1wPpKDc;lpThMapm_9DHY_Y&xIA+8w<Y}BAjg+ zTPuhHq&0dNW{B9S^!`VNNUG|x{68{8(1+TaSZ`2&V~C_GAxVE^h(zZwU-%P-NG|4V z7)&ka{~E4ikjs(M-m+KqYee7;;yn3($`Dyci^B|&2O%8vf2Vgd!Fo3XBJZzDK!Sb9 ze^aYDXhZ(D$`bzH60qoF?0*X?_dhyzW^(WDYJrcP9jM%nev{8*dqc7yQ{BY{*1PAX z3Uhx)fk?Sq9UE*asqCdyyOeRL>dlu+XzVNjdx!BF&lFnl6)ilQ4wWbtR~TJ%aC54x z_cy4V^sCBFYj_DrJwKm_7!MVY)&F3`r}czpZ$E)(SI9@!{nEQLF5&-zF4|cFO6cNc zDOz)Sa`7C32Ir8BY-yFvx3)OHws2S&e0{-lA^K}8zjyc7HlZ-)<#v%2gXNCBh0$=k zZlMA9a~8TE9^FTq%cyKjd>WWuXtMjN)=_D$YwlY52NZjbaNkNFFd1D~;-Tj(`$jSn zJwoC;By{Oftob42mm!IZENd~giYu!ldm=CGtu0*^CX71w6?vt(wJ~~+%ME!RdbfX( z*7H5;-S)oqiD2HHC7}3y<<p4$y#-9M8NA0nCFx(3^RO^@=QHK-y2*DWBY^e8RBn{A z_pIPXjB03MMOMz-eT$JB3p~w6^}!F{tLJ>FJDPfP3A4<qcKaFIdos0E+|qBEQKYXS zu<K|5`P%>+_SP!WB<=`t`0{S@+Pm+=x7N1<mp+X)#2Tvye6EPg-dLO-ZVb#xVGY>& z-jj{fUp?%9bQ`vO0Uy5|{fdX_O6(J)Ii7Mz1f$OAhr1~_BgBZ43*s<iLn+n@F<+so z32fnRs7Yup2V-nqDC`XS5?P#g(4Y)+C!^!~F5Ur*nxYyrf(sKGZKHt`tDQ8Wxus&6 zu*bspYxNYmg&Zrw$jh@)Ku+l^_xFAl3p>@&%b7M+BfI@P%6=;s`&_40KD{d1S?wPG ztM=9dbuXh{Hl5`uefUD<ly<CFlF_bj61&t&P@%N`W=%AutsDmRF*vt#Lln}Pr+D0q z^e4hr5muB#EIeVQLs(Qa#9$*h!H6&QF*AvssajtYQF>-VZ8pJB@4O|`Iya(WPnUUu zt7Sy@od;tth^E_!ltMQ=6uQUY3`cNMnID6Mt3sEP>bJE1=mMqRwVKy%z`@5IJ?_@8 zZr!hDfL;5&R}#Kuel`$S9WL(mg7xmjXmPb^$-Wx{-?G-a#nq>EX^rRY=F>j80Z1Xa z{-BGAnePmWG<iGwLshvlCYi(yhZsNxdrB@AZsQZKG`@AC`X26Qk&c$$Kzxm&-*z{> zKF8=$hXW5m9ymiSf&uB3@Q_k@5wd#LAZu+o=cOCb_?DDmF0`6HrZji*LImM*u99S_ zTeu1h1ewf~EQN6vhUMu-NHP0VlqFsl4mKii<V-Z-0@OPSATzImt_NITdHz(bg8BW$ zU;rsmIsDXwSV4R{j}RjE7P{xBF;OJVxiw$WD?I`Q=mRA$kOGO@O2sKXZYud{BfR!F zvY2y8zM5QDO~Fp~6OTMd7_?)21hV<KILYh3si(<O5Ev>25}^b+$gWmUewLn*q!K5# z57ay~C@>n}1Jh*laxvIx1S2k3PR9YwP^8IC-+zie?{(>g14M5=I5%GV8ZrvsqsmDn zqFYRGQ^`a&r?erYJ(+3hZa$CtCL7O|XgS;ZMab<U9KNOiAhn5oS-|dFLJEj>#{15u z12@YLFvqRj=OMVBZji;*iU6{V%2X*XLGM~tT;Y|JF0;&LW+bW@?}*R?U|1Ifr&<{E z@I*R^97aiH4PN8`AZRwZn~4<UmAJ(wPH#}eL?m)mQ-Xj73d6X0GiRezaKJi%uz+`m zj3fv)&O+9NrlXAZ=k{1qXb5%XeN286w=wI)HkNQoylEwIw|Wy`yiUi8g)?%3!Uz-m zZ4Q2q5CttFpiO|hcU#*uG6o|aax{UouO%2$3e;{ZZ<IPe&Mt<m8`wjsFQGtCW>h?l zpoy)s2@!{ZIf<qk*k}o>eMN`LP|D4m7?R`evL7`xmJiTb)zAPpd%#<Ezk@LBx?Q(t zmP!r88_3<p2{s|s*RO&}9>Ex&Q3m0eAjWDr8MZA%sL%+JXYA%EG@b_R5-QD?p}Mec zAzmTAKE@Mpq=^#C!9yBlQM?Kt?KmbFl-DnVb{?O^%|HYX!6T3M62(TMgrg{$^c*MP zqydFafQBJ*`2oOk=waaLpeC>-K!l3scgtgl0Z+PyWa;_n;s!MtgUO#%4hsViQ5mZC z2*zzmq0Irx(e5KeS$hh?8iO}xz>#zhDRpiYP)fHQG}<*{CqUY@Yxg3lDI{wP4vavF zA?s{_O%olu5|1UwlK3X@^zlwjoLL^o>*rIDd4A3K&C|qdM*~qPD&?I3W(LPx%BWt6 z=f+mLqG5a#gU6CG%@diah(im9184;dgg(~5s7as86GW+$y5?YNB0<E_PLA%qdM%S< zD2TzY^zt=T+yW0*AXC2)hJ6dcxC^t`^u~xYWT|{Ip9N%)5}3l^aF8U0NW(LzcD+)- z!Fq#>j4rw7t^(X~9_J3d8z*9X$g52BM-j+_ub@iGX80-~X>Xcy$mr~&Q>)t0yD(5p z&S3k6BfAH*L<fqI{n_wPZ<3`l&YJarjsI%kt=AR-<{&G{X7CW_<rIv<L2u^};KK1U zi|2vo)kd=G{uw9-^oZFMxBeNFh23!@hu3B~DW_(X^bcc=Wk>9e(u42zf*(JfTI9A^ z$v1MJa`>_WY<YoP<PaNr8(SSP<a&@qyBYTjIl06O=vOw+#7`edHq=-R?N>7MSU1o+ z9(FXu5`{VCUTZdJMnJBH`70B0hYim9?3+Iasywo+gS>eNey3<N;jzw=r1kJ5%W!#i z!yaz$^rDEFwy>=A2r@SE<+%uX(D-4pO_Fj%Nor(SZRE<a$P`O!@Ac3}=23;tQMEo% zb*WJewNZ^DQIz$l=8>o=WRxPiDKEEarv%tlbdqm1x)&SMuN*UA88he;Gn5)LQX4Zi z5;MLY^UgV1f!#aiwSLU?*s*J|bG5MxBe9F?u~cl_vU1#tW!#!Xobn5=56T?u_U7!Q z3#JpOi*h8S3h7`!sA6u)sA9_egv2^Z!u%j{@Wpef#Pe9iV}0ZK)8Yl6#0#mIay*LL z#)7*hP*wy)N4O&o(a~-K#f@|Pj!jfhNmQ~*Tpo#Mr;S>AK8}-`Jj+5sTH*ByTjUt! zkaTIL$|2#qpO6$*Nrt1OpGBdpX(YmvB;`>{i?rlZx~5$t$=&P8ojS>f+7iVBO^s$y z2k@%$PLN$cD9dA?Q<&J3pD266RNX4Y%h&V@19;|9z+CDDFO`(@*i_F$rr(P!4yq*b zRDy#2sj)v&1wFucl{8)tP;b=c9G@IJ0c0cIX+`R~MUaeY9nIwsvyV;h`j}UVnSL}g zEt(>+$U*hV>Edt!L1myyzJ;c}`Jj_22g!WK8wtnmMR6!LeDdxzkk7;aba65^0!(lL z`KV3<R%twhv{=csu?{fY(mc)TPR3~30U8d|zQUI1h}qMB$1@Bt^@12B{9#kRBoXm} z?t%d6g0dU}L%1OWXIAA9Fad(EA5f%1Y=tOMG7%=+i}nLDIOKg_q!<+lyaVy9vUxrR zH0e^mNr1#PHgOW*la@-Q2L&cT9zcb*<|jzby%PbJJ_bAa(uD9}>W{m70!=e#)4n7? zh?8K>s15xD^2`KM63$;wAT_8udQQiTG3cGr2^>-YF2#^ToO+$4OhRL%kU=X@qGO&U z5v2_)I1>m5@(o8gqf7;~4<cA9A)UP-0~M)91h&Hyu>?SS=#0o%CQ;Rt3j^^^_+^~J zNZ1!;c;ORhvmle|9c3vFRjDkGL|_*t-P5AboO}!6agJdP3H75i<<ROxvI7BdJph@@ z0ZNZfE9RpXLUP0jC=Cx3qYhwBM5AzWG`#6pGDHt|YRCbe8*FPKfY(OhF8(Ws9H>(- zchS;Zh){$Ggy^b^`ob_V5xIx>ixc>>vYue@V|RMa1LinX=^-eH3!w-%NWcXd{hneN z&;f(^b_1f3tv|Q=pJ=&YIf2ldK<0mUdN7S(B36jW73s;LIj7y8yhbTL0xYReL~`=Y z4K1C|h3&JM`YJ^UR^^DW9bACa#$_ScVhI$#+h9+Oyo1%lY=>mc{fOJnN2$|@2uVDs z;UQZV3fRpdSqM(XIFQW)X+k<}+9s<^MDb04mIM@r@bJ)^Y;Akc7zSBPfF>R&863fA z;v54GC0z-8c1m5508t(&Ej&h&lG8sH8=nk9!jK?<l*N}{-DK-6^b>6bYhRa3cRiS} zMr8kBW5eVraobm&Gv&eqj67%NR^uL;nU;5?5G4%~m;#!)Za^Xa2VdK1o{we6+`#cc zq-3z?Nui}2W^C<(FMrW)-@AfxcMYQ)lXbyYk#~8CxqP^^gL8KSnK)!yfvn<#$D)d_ zx!g$$2d@@4WTr+0N~UBgKb^Bo8M+zUf4=5IMh!CFPIRMYj%I0&CEblLu20fU<Fmi# z#n;fRZ+dhV#fUlmEXhoB3eY1U=o#t->)|S$q^cimJ!@>wYpQ;}iD$RJ_gh&4J#)NN zS0lfC!Y(4>JOz2cqX}z+Fd(3<CTb=&n+`rPMeW6WTYHK#$UV%^v@8BW=qPZ2gxbgV zT;2_8v!WdAezqlT3S&-?(a#T+#S1@)D@lo1IUV(BrlBXJMW>-fZ@k4|tHnt01!18< z;XDv5`NC4|g;m1~C*Py{@|zE)C!J`Cc8m^p5=_33*$SgTE{?alZMC`!wt1+fJe6t- z4>#@3NV=xh=GEQiKi=k4)~ucr$EVSbWLFLqRF0qpbL`dOI3v@}8Nw6F+<{zfPx9+X z&Fo0e#4%QOWNmej1v_)qI@vz?<uUV)d382SB3*Ot$i3_+5$t-P)>UoORpZxHo7q*@ z(A6;B)wtC~5$tYO>mF#rxA=9pXLffsba#(;_ilCf3-%1C^$gnd3>iq?Z(wHtx`w0q z#>aam1bY#ar#?jU5zTsMqD9_k_AZR~E^hTw1^brO`c`cE*8KX`Gy66g`nJaVwzv8= zXWW4!{m4t=JZAm$cl#Ni_A|fjXZ_ia+4Yj+$V)EUmpr##iYRnoFL6Iz(Wkp0nWu?4 zn~&jt`chM)H`uuhi3fsL^r4sfOnS2ICRu?rQGJ^It78W-A+7_$pq7g{hQR}x`(P(m z4TzD?nPb5HmKLrQXw@8O<*)v{=LX{BsgEso_q2@^!q1&9H&olj@lgzJra^g!5fBcb zYrpQ<>kusZnPBKF$*9g^fb;?o#(2VrBw-39cmQ#k1jQZ?hiO0?9Wb^CGDLy${g1>j z2zm0L>+0*>@-o^)v?B@aLiE}H6ea-Cxp|;qZUjugVyAS9Puz3Cp&W6joS(x852Pyw ztw9{}s6;E1PTd;@=9VEiiZT@n1ao^U_CMnDK(b7LQY0`+W>oMbU@V93KZ2H|zIti~ zIC~&LBH}Uua3T6$qY=>#B!CY?=i+e+LqRKI0Bb7x;Uz$fik^cEkyPkr4+N8yoDLYF z<PgGm;HIIi3`V!xmi>8iXa8Na6!7{P(!tdO2}~edF@U27DwzeK$M|{>(F&G;s|Pe5 zf`EH*Ko97$2PT(SpPmGjha!}v138>W#4)Fo;g=i{R0PTnADQ5YhhCPWT(!@k`caoF zeVwUnZk3=Op3aqW)0H|d5Q_G!{G`#3ns{1zF9w04nATrMDrR{KNH{T(Ks^jXh;Xjz z8l+r5uA0T}Gv{7-%}9gihB^uKE&QO)SjGXvCMl4V`W1Cjr`al$oUaeP&M*i$_k}jS zue|Pav<;AV%x>v8#;Os>`!qv%3Lwc7Iy|T7g<r|!$aFkX5$%}~XP*ttz${L^K6C`L zyg5)}G*>A!|3H1d+HStaf4=q?3Z&uPeB<^!&A^}_b|!4`rOut#?d~0vMfT4J2I5)# zWcFZu_k{#oekn>F=#njN^?G&a%?(B36&^f<@_;ZN(6t+oCgH-DRin0EqfsLcMc9T; z1nX5~zQuy#_GCyEQ8#s?Ep}gD^+f;5qL?speGa*u3|##T?j@X`U53ch0fL{6zPwx9 zV@T!t3Q4(x^~KVk@Ay94hdj>XPcMfM$6vnZ{ADEes}TDjGZh+JTb8HUgRgl!7mtiT zo(dLwu`Duak2+x_8~(v*Rk}S%zjtMzNP-&E{cU&rTpe-_QKjFyIKbU^l)G=mGJDnf z*{aR^RXf_M{n4Jtkb9Em{I;TI@##Gs8mbJ5WcqkHjRxfds|T4!OPN2~AU##;&MGP$ zxY9F8niYYqpqMBf^AF!OoJL{~<y&x6g6OL!p?Hwt6@a*Cimg1;Qw5^oAr~l6rb_2O z29+^j>t}=}6*?4xM~?$0{V3f_=ZvX<1`#E)A6fk#fI(DxRG|DQnyy^%fVulq)ofmI zP#b_dsF1C3c`!Q3hYkOACfK3!xw;3WO+pL9KbQjCr^UhF@iwmn#ZE=_Oa@ECC@dUk zf`KgTj~P*&%w6-0CVrkbRxW+-X@o;kRnfLLU4cN2Ad;M9Gl@!tn1bbLf`5VnX~BY8 z$t>)#>x7^jFjf>1M;|yL+RjXmyY#Ll&2-u*>&UHbB){1VA@_KUW;DsHcpyM`kKD`v zDherSQWs1;nXh*{z<m1v!Q=%4vcmSF(D95@U&abpM3j>}Y64MV>=!jL?WdOP8gKpF zMhRL{?dZM4$6jB_1%uH7STUB#gPQbV%xXG5QGreNy?2N8QnAC|oCop^vrpW$_85r7 zXf|B39+q_)q3PqFhXU5C?(d%7qM?Os);-?ah>jgMvib2l3gpP6#g7B!XWFuCH@z0$ zJ`JGTZMWsKJk^t}oo)B?#@d&+aduR@9TbQ!8u>TW^lrop5ClK~fPK9*)Zcw!NAKE% z@_#L!{}l@a_D?JjXU~xz{;y=_|Nl|%Dhgwl`3r+u_7pWPKj}|edf^Ler_E%?0%1gZ zVXE=46?UI84MpzgT^I988h>Nv@3>EeBnS_>gGyW<YBmD<f-q`t5;<S}3R=}nY5W&K zE6sJS9cKPz!y#Dja=c;|-1hAEpw%Bj0$i~B6mB!wai6{!yxfKh6O6}*q_`;@vm|YO z?T~@pr~j$m^(!RsSG`NAq)Yu5Gyls(=cx-{q>U|If7831hR^;ZgPO$!x-$HipcS1Y zt!XD{1^Wksd09C|L*d196$kcO^M^;~J8dQw?muAnslVb|rY)_<pG&W^-tcFMj!j1u z916QMcQ$_9WRN=zgPu=Cy(D3v9{gdeBF+Pwi?H6M_Bw|3x1iP5a`&O71`CS1u@&-# z{!uF=#{Tjx1I@ht_-f6Q`_)(991i{YV^sT$zX=*Am+)O6W<PBsGUxKMjg^#;7x>o~ z#AsWG*fqA-^VwH)akr*#GN2TQq{}S*l7qJaG!~%Hv4-AYw$#Eh+6S&!Rm!oGDA@az z8VsbR+rdo~xJEIABbOv6Y$LowVMa8_g*akiB-{iNMtUJMn%=X}0tSfk006@Rn)rj2 zk3E$EAV*3d$60FV<>dPjw>0ozrW{&H0?%a7l51xqN0htfz$_&};eOGcGO9aC@3?Mb z!$oNgL*kjP3wC3-L{txU%Kw#_k4DjjuCOlH4?I!d`v+$JUxHRJGr!1FOhQ|?(`1L4 zZ}7LE)wz$*IIn)`R@I$agH&iHwX1~sAcgW@1g#9o!Q}Lj?gF<Pg+1>7X`2c4Q|HGI zx_u91287j%3bkwsPye%^mEOx6<({~S(m!i6aeV`LHHVuNj>hI{OSsUi^<Jg_vOu_4 zVdx&iQHZ~`qVKr<xe>pew=@Ppo&UDm-&C*cKMH*+SHQmP|C;&#$50lT5&1wEJ6ZPT zvB$^1WBzB5dIAGnId8Pj23P!I{x3?(p<l|=Vr70~{v!;LwzvODdlaM9hhL$rh`NA( zcHVk-sy~aO?Ka+a3|!u6MZcT|z`@qh#BgJ{4Hdce$6#yZAU^OPgRP4zT5v1+I@fM~ zkwNXSKeR{X8r~@TV=KDTs>8o0^c93p-!1-}?p8DVIpcraihgqv_7`Y}SO{Q>YUVE9 zyZx1RXQ=d82`u!%9VI*G?cX{|{^Iuc6lz~cZAzY6c)0&KX5TSx8+|y~x>58c@zSI7 zV+aqUH<xriCEQ%BQz~|qt*6$RTQ=}n;rAaac(>D0^2_aSe0`!Gk|(=UGCABPj?szA zxFA@t3)C7$<LKgMj?*@?_1vy-ur<Vs8Lo$pb6f79JJ4OwE&-pnoisVj)e~%fn@Qa_ zHK={u^pji0jQdZwE(b|V45BpjY}i}rHM|e51Zb>N2pCOzvFoqe_=1IaEW)VJP#UzW z^{6m&FpAZ}^y0h^<53nb1NRG4BX5{THy=f@%tZGiJP*_ITTZIKdh0L|#Fp<p8E(wi zqJ33-ahh{(mrm`+Cw2NirsmgTp5$Ua{VeFr$jI~kOM8^jzznnDeb`^1)qZ24I>lF5 z<1t%OJ^lpqU_HM6;rIH&`}N_$q1OlRtC_goyx6+z)nT*c)h8~dtu;(bJhCz_ee~A% zn+h1umI+>|pWRbzos^B)jQ87{OHphA<oA8X7Z6O*m*I|*+Xw5lf0Uk~-B>wV=c#iN zAuv&jRL*-YS#Z2PVRzuUQ<V2Qp;oU-$d>7c?s&@+Z#Rw-@zs0Tzv~3EW;gTwP`i!F zB2S2N85rApB~w~tdiTwX+Axo5XDSCHujF+)c+tp2j_mUuPW(182;nQie9A}#MzwZs z9=hhrGV1Oh-#Q?ya|TOv6JxP{u3HQC_<n|}XdhJ(zL&~-nlH%*pgxKSIEZLt$~|NE z6bncDgsZE)I~H<%5Hq<r(<X80ByLi8M3_ls?=GR1+bg3lO<3F8W7gf`6>f^UQ02Jw zdXKSX4(dqget15IxpM4=S-T|rbG}S6M$*GWcUh1_f1xbl7>67E?ifY=;)Z4MM>g#O z8{S>7w@ieeZfPq>E9j8~6LDP)^hoYygS~HA)L$JwvzyMu;DwIDo~*J@Hjt!Ikq)Tw zNoM*^U9r(Dj(nS}>!kRI!yrONF&!!{l%~nk3=_>B-nDx<Er&AE3*zDurQ>eL?@s8C z-MX5Ev|>^hWsIlDaEWl<a?;{kHYSFi&t<pLKj2y%#wYbD7fKUnJT!;7qjxMD;aRMu zI+l{=_YEhvI%D3<7w>NrT)-Q#mv9;y2>xUyd7PVx;d*CQhQeyG9JI^q^(SJ!5o|d- zps(6<cHqRN1Eu!Ky4=~%O;1=IxTd~3o71S5T*ay#<q$L9((2L6ao7C5&v`Ru<_S_2 z_so4?6eAeRW9e*ojOpeRyn~fvMP%&(;h2~%j`wCmFRa%H*5~HWGo<Q2Q6JJ>7%y`+ zhX3}k<?Lk>+eKrp(j;oKsEc(u(R!XVOp`i>VgUIy_UdEUMo!@lZH2K};z{VOQ#CD3 z`!uaB*<UZ0)j}tO9NYIa2R3}$J-p}i>uvVY+etlcjJ}0thH$6E%#bh^zj$eGx+NNj zsWDXxul32;ACY$nmly-|1|24il<=w&#_6xJL&pNmzT;U37w{eeI@{Y?5aqbeb>Z9* zT5myhP#|SISne@yJ<pSt8i=TmA~6Yla{sZRuQeb|V#a(5MXYPv3OKUAvrbj{)U&9& zb(+IG-UlaA>v^{KG*>bI@e)DIgM=qx4yCmdA|<vDY_OOq?X$t1j7@QZ+y==8dVI1U zx`?snuOE+ykiqhh(z@s}62s9Kv{pK>44-Q=wLcM6MWf>RS+AT4RpS*7I1wJT+XVIS z=ekTv^+QX>h4{_wFS`+T;jwhffRb8X@0q6R+@}L};evH9xEvINQ6jQ|>(_BILvsf$ zp1PDvd>6gl)Z8GU;8It_c;C?dx~|ff1QW$$<~EH?Hcy!?Y=^~022OJON5&j?><b=V z@H}__E{mwMXu{auD|wm)JsCoBk#CMZs7bo@z|C!%ew5jTsqT!);_E$mL;D!YpJX(D zPON3^-Nk-roN{ETYuy@G>`&itAZYi8wbLqvJndf6BHCB-aRXdUPz$F>T0~zkME5uc zzcwC!Qv6dS0{p7g*hNAP){A0kDfEqs>M5e#QJ<h6)jG!(Nr;y=dj)5JuBV(6kt57v zs@^)C-bR_6e&=V7r9?IACpbrMWk}2$sTz{9GK=(gNeDfw8+zQkdOurc!tSx-^#?*; zxn&It{0Y97vtrk3zUjWhIMlz{{mDMCe@OnD%Hfma-I%9+x1=iE>0g6Jjv+HL^sK>@ zvL=O@XJPq$3hFu^o76F!oWU-T?=&y#2mI}*{N~ucPGUahV}OUCGm6sZ*RD@OO|(I& zyMLZ8qL46zcX|$#t6GDdB%XK&qZo1ec)BY+x8+!xJ6VD_rC1#j6p1dPxcXCBZhLn( zSC=ve7G;a!f{mCCy<O*Sr*XrOKm5a~rl>;!507MXjcwl!r}uT3d7S%jUPxj-{VI;0 zt!@5rr|q7|^ZRcLgYG<j-@*jhNyOJzh*l054>~Rk24u$uGGm1qd;)2OTw665eTzU( z;Xs^D;8l5#FG|v<a)|0p>SKAt$z`^E>p`;E+j7dc6)bNn`P@F33iq(wmJJW&ExL`b zy{(}ftf_M`c9m_f&n1DGKr9gyAc8_9@T78x$xQI6^<Yb%5bM+so7xb&kr4a!kh9oO zA-Pbe_2Bc^(2G8yZndG7&LG=NAj?;PuM!lp5A*Q}yOA2^7ak&18Afamy8%NIb;1LE z!b93aLM6hze8PBWm=FO%Sd5N;xN<la4<@&V-?j`*8;MAl2=}NBzEZ^QycUrK_f=CM zF^@=JiHJa*2;Uh{xDtFg5+O{6#K@2^AtFx4Uw8t+<pBxfqJ?oG53o_*>uf%?pbQaF z;2bFgs~_vpWtI_GOxT0-*ZHb|ILnwSSgDjh&P4*TgfK2@s1P-r2N%LchK&1Te6Wy- zN7z&?$U;VyjG(wGqj-p+KWpPKa5p#+ZA(PJ1><p+VL!2uIW-JJMH-O+3*1hlxG@Ha z#h_=yL)iP{%9Rl=WXNzm_!C?M-ye+iNcdD64|Cc#bixJt<DSmM+*S6$HMt$8iARnj zLwtR10*}Llsc=0uN^$~J#~@*NysT9``vlU~1IbQAI1o@`WRxov`9e8L08p_YMbY|E z!u=?iB7O$m3K8SffoSte(1?s8%z};>2!lad<4}C~WMc|k@xDWTmxO!YJ&@)^1YC4( zO-6EfpkUQXh6)#hBgN!m;8u8BGQ>WCIOBoB;z+g_gcJtNZRKw*hY;#VIbhK2geWWl z<=}x#)rqOpjk_noS!o%{vCgKNm{H3Is{IIK$Dv%vD0O>Kn-kK&pv5p~Wg<Et5ppC! z@q7qdxfl%IKSUSKxsl-7cWXJctsEMQLE6H<h72+8UIaR%D$-LInu$QG14`!hpfEAB z8k-U$5k-tZGkGAb<#xl%F&83Q(JC}K%}#jYj)Mnei$i|$-2s?8l9i09NRx;NSi6H} zkH<d=`!t**w2^}=2~+n?q^mlp>wH1g%H|a|<e)Bw1DB>LiA3T+4l>G_3TP5gNxpCa zJOuB(9qmDkJt+GGc;JJy`hnuXfDHTyYa&XXkQyY3bi}8@?eFR&vJ5WDGYt~vgBQ<` z#VF9BlHjkBD1Zmm`%!3E{q(>Ydm!nkXc-TZmju|J2AZqp*xG||^SS*jQjdT#2ku%- zAodc|y>-BAG%LUn7vq%*3fn_T*2Q;j6erh(qm?tHz$m|Arx+|~jLFofysIpi>P$wN z6JgpjYDp&^-UNPgNx?sdembWLd1N|F<SCONYh0E!O!%Kby4r&wlJMUp%z;P>mO?RF zXQ5qE#ruJPi#c9J1=dtR5=e)+?G^yQQwcZ6g8|MUMi1h8Ql^`TKKbgd5g961wITDN zhxqS=GK2)^KpPjKjj;+bO2syR<=zR9mk@d|M@pREi={Fb3zsO3WF(Y8iXM;{CPILc zErp3VQ4I0&BTh$xVwL#<geuc^NEi>w;1V9FKH!>2dni#li-nYNF%Re?<Z1AV91m?; zRtW$FI00mZN;o&u1Lc0;4Iey&gU)2=X)0K&11jPn9x~LXf@mE@!S(V|aNBx+Y+Y(t zYve-{AMmFXbP!(*SKMz!!j7Q|_st3qSBMuAk;%xJwSjr`Blx3p^cRV<!OF42bHTCB zVNdxIy?he9vBkXBVG&VbT$IF09q^}eOpH%#?0RIPM4q-i3V<_<IFxx^)cN*U<95gd zs4kF35>mmBmZ3piVR!05z!j>dLk)&O)HYCxQX@qHC5TZQogliNlcDQ6lXNa?S4LKQ zof2P0@0*4+<utYuhz&!QBo+{Lz_E;2F8uvI*RZ`b4@l4+LBpeD@hAcwRn2=28Q2JG zlp@rMYo{N}dOl{2e;igDPE4)cWP193{#igcC{9AV5l~LWfOT<1XwkFYt_l(AIpa{M z`g<eimj6s?BlRYPIGnrUiet`b2w@5z5s32%2kYCz)*~ytCF(+IBffWpKWe80j6ACz z34b^f3`;rcm^=cuKzQp}dOOH(0CD;?(unoYB;0%7LbGq7N<YgOYue-RjOAp8Q7TyG z`e4ZVJ_Z+p!J$}mBd#kW#`Kdh6B$*dVO#)67<p<=52l7kFg$6!js-RJYrPEOd>dLn zwY60jCBc0&Qw-o#L<N34V)J5+2yLQX0$+R(^GpnQM(wHrPFD(MVi*Vwtns;}FFK?m z8(4B0!b&5BOCc9RT4gw>NI;3`mg%I2k**^1e-y_1AhqpZXb_4{{y^H6LWT99a%Eak zIKqS+Weh~$(8(*54w3gj>e+)WGNpP{m>2QD#U8x%M41N<25r>=%+D{^SN!B}ye!Zw zMyUK&k8wZlu96dTWvaMCKSBrq%`r$tG75{g5bqDik|9TYJ|FIYa%mV}rE-%X+NiSB zST4&Nf1fuJ;X*_x=v(*>rQ4L|weukt(;!>8Qe`uYkCfyHe*kHeJO=4VKsi=|?;_K` z374J}KnMV!1r0y&-YqIM{Z)!}RIn?1x*)sD*H>?x-P)qU_<#$loN+7Bh^Yv`f&wuU zqA<8rME|{f-_|`gsZ4k<@J439T>1@(xMYSpxF#Id=u!9r2Yi}v<y{60<cvd_$RUFC zLD}IF1Af>8fU+!2G6!-@u*kgnxbO7IVOtF*sUv2!BaxQ|O~#9Ft-HKi01b;v93}>B zJNjhE&!wN1Ct^dy$j|wFq17!|dw*~?Gt$-rHP8XstD-e<FIA(_muyj=tm991KCXN^ zhLJ<7G8M^?AU#4nqz4&MUQLbN6ZLx)b}Rg%Hl|@HFzzRtw?SgU26Eth^VOeq8O10m z+B`z~My)b2`BcUO*w|){K|ED{0GljS=gT#T4_?n9o|QrJ_*ikERV^b{hFZuc{W4xB zMZGeaOE0RUF6^fb>h;@k=Gbu7!*6%J1dcAmFtjJSHBel;6Pf&T*zIc#bw+n}<al() z`i@t6+I(0~2RSS=^!Y(Xt0x|r1zraJuRFpRy2q96!c&+hg<b*zLK$tf&2k1Y%-zlS zClpz==ON+a`vt@0yI&cohp?zmg*hiIc7H5E%3C*1*}R*w+n%x)`g~UX^EtcEPX3>r zvp!=!c8E-JYQ{`?+}}S?-s>rgyJ|P>lQn&#aoW$H|H{xbv2kC3&`hx1OsM}%I4x@? zvT-K*-AwHE3`uA<L47vKNGi={_RZJNsoUqpAJ29M0&e&Br@M=J3vr3f%#P%oEmG&n zH{!b2IA`N&Qz^TvT>T$~K8nynv-(1d-9oFnP>%mXPGHQ+ynhSmi}>oCXy-j5toWjE zp{PoEAO+)3M>x#NyKjztflgUTL-}O%+<QAgi`Xya@e2#vi&UYdW%Z>MyQMY%rS+_( zjmD*|cT3ybOTcA;dHBI}@S^I~+`bS{eR4s-({R7sBJwhKdGMJy9-n=WFl$G4vkEI> zc7L@xsaLqo#uRo-_z=dzbY94qn@Jm!ctY-=(^q<j)54?K%SP-%t|ahIAx4>UhRq0* zt@kbI<t#qiMeEGUiGUTI>=nIdD+cdZjA$!_-K!=?SIy3>o(fong+8n0aceeSo(cQ0 zvadAKqU{;(0e5>Oc=h~#o_F8bSf1Z<J<1!y`ACiDyY)-8bqC;q`Zurl-~DOdiM!W> zj;;rvSq}|Z56@nY3|Q?JvXm`QobI(nah#W~z#O{Z&QfW+`2x@+qIiQX-!!ft5A;2( zh3R|Ysc!E{|Dc2c{AM!zjq$9n&C+$ny&E+Fo3+`Sb<Z|=HP#y9xZc`L!#dMnx1Bo} zKM3)!WBmTjG}RdqJiYLLY&e}r4;FS)clo{H)X3nQam2e{4X1v|EdQk8^y4jDUG?m% zBJBjDp1Mc>gl&>xMs9fWZCZ>4pKbK7BB+|xw<TM&iAWyjiN9?-H4*9(lfhi4oG0OJ zXVGM+;C(KKKW;leM9S3saohR%Ph$;Y1f<ODr$oXD$*Cl>Q!Z1<mQMe6tl_evV9AUj z^DlMj{v(aNq?#mre(Im7OGUphel>F?#_SC=>vUvQC#)`QUk`CjjS(8eBkC`jH64A9 zb}dVPCRCbnrqjvH?cx1BOn*U8nM|XO^|cN<SBx$)$m*7A<hj<)6hxhSGS{l&UhmPk zdB1`RH!_pHy_+wt-dGb@e6o#(F@7%&03N0k4g>pUM(NJ|H#L<qd7dAxlCDake7;%b z$gh=hxlN$!T$RcGV7Cv5w;b0z2u7)bdtS)4$y_C=`<N|vo7R-s-jn+%Sact^DRZqr zlr82nf|;w_u}|@|N3pJ+K+ip-$zvCd*KQ^;kJ2sXTa-!>p+DnB&c$8w8g<Tw*(Pok zU%cLUJlp3zey#74_gkO$<=*c+wQ2dQL(X1DO#6x1>)w;xd=4%6sNI9>N8<v%`>+!j z-c3S++f+7=M$cZ(U3|Ojl&8*G+pY6BM#d^@T@edzODHG||1o!<xRKDwvuv<wP*vDY zS*U-0u3oeD4E@4zQ}$r}0t@ioY;Xu#@1shIWc%rMePcLMGk7LokI?ANfb-u!oN>AJ zBfvebF)6rWNz7%get&?=*S^a~KYV#_JjH#uF(*Ka{Z-Vr?KWZFmQQ|b_lQ?3F;!da zq<s}y(TLqM8Pt>gI-k1OyBn`J1zJ+InVkW|-kGP&8{xrIn>Z2=k+ParsV(3~X4FWP zBR#^n?ne%=yg2k+d=K+giD)ZU+TrzkLL5~}+poGYaqXg_JhP#QvN4X*YONHND!r3Q zV_d~tEm5}eM~pZ1cnxcg?^Qj{_Tfh^-(|Db14HfMt5+Q($0W4*imUX^S9o{L)89M1 z%zok~G7+Kqx$QRda@=0VbD^y|0!r@1B(#H=2wz@%px`nL9Td~V6?dp?NXCwS$h%q8 z-;rvTAY&UIC-!_#r^%g}q}xrJ_W0S(kZKdD%5yrhDY^K4Dkf_6W#_}(I~oImF&CQr z29|<P7$lS>X!aRcD1;Q}IK_&k54Q9wJ@gfJy~3&WW@~RqgUTKG@Wca?NPX<V4}n(| zLNg;IM|<3_0N&7^yKCn#Y9AwLiCD^~gdcA7>QSO0#N~6@-!<=P(yIDH6;^UsV<e7= zOTCOVS;^(;kvMUvj_{3nkW8m3p~JrNGM+;x?|gi$?tasOiuNn{X&RCSKVJ=`&1n}L zd~0lYKH<fr{lnYJ`MSm-SBqs>AH^Py={TAE(CiTUx@JmbiB@ybvpj{OlX#`QTK-ax z$X8a67{aBU`VvXG+qX+pp7xrmC=6ALw3WES0ow~#QQPvtR#$sUe+6t8^L+fv38xYI zmIq&#{7Jyp#E$$Rb*eo~p=&g%s9HhD()B`sCe-GJL)`nRhv84qi*8VQR2ft5cH#6$ z6K!Bk&6#^IUZo}Twp`)k$4`y+-_{>DF)XQF=>Sk_M6ej}7I_x)<!V<hDyWDk>_E|A ztOh{I7St2!SB+iw`%xT%7W-Zu3BNR*{;t|)SXi&9`6#Y3&@1TiVK#{wtxp1>vPzW3 z0C4ff(i<*m=DcULJ#sfc9R>jB97YUKX^$?m&r=o#0FP!YTo|!*s#cAiz8TKnAog8z z06Dhhd=+pZ;=vA}0};4ro|*QXH3ZtTO~+plL<ApOJUEJu>Xp+B6y3V#q~B4l(QTdh zc3^!kC>Bm9GSOEep(4WNuR~%u{4w2ZRBZaz@>%QBj4b!_1*dr)rVn>J9hVoUbzO?R zTGZ<ouheCA_*&z`tnb~^>YKib9@`JebcQpU0vr9|M%B5zJu@c`Z@eVMR_BQu&gzv0 z-(j=DXYK2mHPYV`mt_=l7f~~dN#2mS$GYlnR6bW&xgl}d_j>6)k$J0E1w$~~<i2;$ zyxr!;Fom_IGR$z{tia|-yHU-9l%GOuikqYTpU2K%(xH1u)iET)x6AiqzPR7qd^5rN zxVFu3@k++#_>9rxy5XKhuZ)a0i?NRz;Fg{nZ#Lhp_dag?N4Ck<1if)>GjA_7^zhas zCa$(cJd0D1u=N4kSKE51_iOCUt&cdiC+*rs%Ly5o_NDADiyd*A>2qUkt<s0Ql0^SL zbG`FQVEFx&ApNgou4(fBkAOA<CuL6j@s;2;Gx_hm5<Vpu9Q^<4m5>w8Uu%*p#CU8d zH~NN{1~PsJRGG-|N#ZP~yPbkawL?l3<=ojgSx6(zeJCt|Jt(PVjeiAIzBmt_q{AQR z2kukQhtHKYhn8G~F&t6vD^T*Kn7qyt()%KMjdn8E&Atl}{Z26K7khuj_0fdh6O+eN zk)!*nW;ep`8?jbr+^b!ds=+_CY9&_O(OdWh`;C5shJJ(n{?UV?|LD^19+ds(TC|T| zgJHj6mo%0;7~-Te`4~C^6>OFo#|K^j3DSzuOmZGeJ@PNNvU}9n_%FjAl&2&8Co+<* z4(x||u0=2(d%E(<%)&5b@YIF!)uDXVp4CuO#qX}&XO5yIM;*Rw6=|@LZEFaJ=eN?C zgkpZKnN2_74z^;Eq2cepwR`_1@%=@u>4j0`lYQ&X77MnumRH!gR-Xj!m(BSgAx;sQ zymK?vds<N4pY)!bZRR`6?r-#dw&*n1<C*fdSoXTqE_d9Mw-4NJ5-;9+v$jZAl12DJ z+2mc*yv3Vcx6EGBz4fhMd;ias<GYN1uK3x&nd@=yB{*}<J9~BgQ_AJ-AMcuDw>K#7 zOVu~2H&y(%R)&xA53Eh^mixNF7Iu*aFq45@EzdxHDv{oR4Dq&8&~OjB&}bTupr#!C z9qlt456EcYJ54NCiWr5MbLh2e)4#`8s(zQ6U<fe*ZnC!oOAB^#i@d7GI?;t5^o!kO z4tg%gqkR?eG803)MSnLrkFZBaEcdFCcZD$P$%vl7yNo%OnY-3Vk<V0exvScbzg7CW z+hXB^M}b7ELi*QeXM=nE!|km>C&@8w!lHuHI&G?BUt@i`?+JZxZ&Tm+`pbi|nir;V zu_7eY;8Thpp2R8fn+Ik79#Pj?!N8#*Z||WFUHkJKYS{~)^qnL+O%x<i1zd&*{79-^ z!EdnN7c;?DP`F9WN;K+92U#yPA%(jGkPGYJ-D3Zi+HO#wkkZlpxA3Fkk?jXN9+Y3< z$G`WWD7xHN`wdhng$5U+FZd3?;m5zieo24upg2h)(d7(G93@ybxs@Eu-F^X4y_b>J zFzgq`a2)D<8T%&~j?RHQb$^QC*jOpVvy>3R^agYJSBrEE|09OOT(5}Zv-zH7X&JIM zbUNh2JEgxrq?rH|z=3G`YeKz}OhKVJrEJ<ObDoD`MD;Rts&ZdMVHGcqw^!Y3i^FL} z3hF+{>qz`JN4bX=|7cu!==`e0wyUQ6AB-zqk1O8)8s!XXEC0zT7bRr)Ym_rBwfpCz zob;LAol&m;p8mf+%KdL8vfn>KoX+xFo1M-kqNQfYe`6(CAE*4DP<K4o4=2>ksc{9V zUK{!OS)o!T8RXcDbHzM!5x*M+S&C_l(#iR~{8Gr8&n2aS%v^)gS}BV#7(;&h7b~et z{C?-bU#z6A*ZEC)@F9&j)s<K_0u$MfwfaX*F@4}~|6*p8^oz)@pFy|ycSQEn$w>Oy zda;MwQj!`JeN{b=1jOz#!fu+}g2!{rQ5nw`E@L;(7uYjpo~?qH7d+c=0Ww$G#p2wq zbcpGnuWUZCxBE)G^fQBgHq1+zezt>sTQ<EWPh=DcI$O`bxoDMcDaNZmbPFcQ?|w=W zWSnd|J7DyE<eFCIsV^e0t>=9XXjyqb6&ZHRijvw5-P*SnbFRYWVClsQL&sg7T}K?> zdi7!5cWA=Di0nH?!TmL`aYbA<1rvElU6Ru3(6l}od%;|L%JF;DlL*pfqqA?aZiai$ z2m~2zgx<@J&6zE6OuaGB{eZRJ@<#vK#sWuYY<)1ywjeJWHSW8#)Od*A?<)&OTtiUX z{tEJP@9q)56*^7hBZ05Z7?W4W=u&Te2d|vTM|AkJZ3leF?#uo$_btW$cG96<|ILl3 zYz`G)nbeQ|Tp#TVxV5Rp#<e|-p-D;xv@qhpX-5i^%i?9mJT}zKFa^~p9>n8kj8bfe z6Y8WR0$cWQLcMt<xH9;&urOoK)n@Kk?GRZ(V<ty>A?!{<y}`j7W+g4ctfaBYoJX|& z6D<K;U&Burh;XD7wd{piNk-8kT!j)Zq<Frn97T$F1s5G(I9C<*dh&w}GtgS)_i~@5 zgrikU(TUm2s+c|pQNb!@?Tz-T*lu4@q2#M=NA_yR`KuZ2Mz{##oy0&Io?e8(mtX73 zr@&~z7*SE(4n6B-xJZ8IknS*oje=z6d<p4@XCX<;Ni=-Elxat&dEJBLO22#=N8K)~ zu?Kf*8}emQL6noR=RjtlK<>6~w*&vf)ONK3g~X2T^QsTi`uz%&?&<cpSU*hfUdh+P zQhMC?KFF9jMz7qa+j}MbTjtE)Xu@9x_v*!t0!+s!S?diK5S6~P9{=TU+1tz#csi;6 z^PR86K1LIfT%G+Ps!9+wy6Bkr&LORoMYoGV0Tz*MuJ_)<jugs${{gt8tHI7=k_vnT zlVsLcdD44|4470+-S4av$n;1Wc}8|eC*)-?Svrr4;LYq6$RNE005bRY+*(Y`xC2d_ za#9BiOdb_CiBU{SI}MTc=6U9qiuLyEo$}HoLe9tMQ3G{D)pgwEdsYjKwSo*nykc>1 zp(`>d!i+;%gHc9~0+Bia1ebj!g9KpCOCUnXSBThM1)%1{NVCvEq_Iykvs4BVB}SoR zv!p=ul>pLXunJ8NG0{(e;$lF7Qp^{Fz8fGt4L<>LIa918iKiLM9+fw)enAKV-A^Ks zMNHiE5Pfq{HTP-}(x;hQb0U!C7!DNn0T`SB5Mc?>u~X-mEh~Z6d~yks^CEL|7sP|a z*$%!X!szTER33$nSqF~}!UXxp;~(2rnt|J%P{Ey5%GAO>BmqEiZ8;Km*;g|8+&uke z>|nWPGW(dd*>H%a5em^UZ^ugoAPHe+JzUe#Jh)4^(w^Cv1i=7|U^BfOM)hza$95A$ z&&-pmxUP-CVuAyl15xVhZLzw9kO09zK$#wa@R+*IDMNe_Xc)-D*bf5+Cp&V=i``Jx z#*7|#9IH?}aGW|32><_^omV~g$GEb8k}?yf$4JQu*q@bjqaZ+M1z>wJSYy+kS$Um~ zp-v8fxF`q{df<>~7w~`Bd-HH8`~Us_x~^Fa2A6#-X$ECYBa$SIeWH+T(J~=>jFK%e zV^?BGC`*%MucSgkgA&?QiWZurEN#;wOUwK&b$8$0_q+SOe2&j|IljNozy0Cpk2#*# z^L0MY^L%LQ*9*fqrc{grMhtK#LSuC@8JZZ4LI$7~2>~$s8AM?KTNVPY;s{^tr3+Dq zz@=>LeQsdR?B`ReF&~Y5jS>R$!#Aa-Cd@FvTEkN$PP~j0CtjzJMkMe6R1*i<o<hXS zApF*^Pe6<@5wB(lWMmRYw48_!-8qn`5De|unKKAcO=YzaM0{yBh^c^t8;yN*#m-)n zrRyEu1O&yG9zuocoIJhKb2RQ!5C%mGK&STvEIOON5$2ihJkE*-y-Wphd?F}Q$Z#YX zGr_Mn7`|H^kTN`Ww+NL<q4VP33xUuImv~IELy}bUN1XN8J4u@irY7OwJqKU^!u$Bp z&Gx+c%3MI8u6S2X`Caf)VWhQDOh5eMVE)Xmv!Dd+0dS3igQy&o5UWps$f<3+^vO@U z*ZGPj7syy!<ta{dZ(Ar025tFNDtOZoKO$Fx$uy?;3xk8t!y7~gUTwG;F!M-a{Y$T9 zmFUF7aEZ=`aqIn6>v!$$yLakq<+|-(T%AwNhPq6Cd}5(7am+4I;?2hs9D&%49iq|u zgU%ik=lQ+M69e&_d)(|ylMm%@)|5AWoxK+^KDsX?hHen|fh!irw~m^tseD}WsJ}~B zj`R8Bsx7m;^48B!7x#XMh|5otI`P$V1^?@v$9%wW?G8(EAzB<tcbgb;Qg37k4KVQ2 z3{e6THe^b;F{KcSWIj`H0FWPG5~i6-gm_}3J+@K&NkqJQe*D$Ec<q6B9m8m$$@u7l zF-vf<B19(<=Y(UfQAYXkQFjxNLi+{z;#~q@cix_pzKJ%}1SK*g#}2is2zA6Ib^Cg} z^4<DM7J-u6+YTh@se^V@h(Jl$L;w~2JP2eIo(sys5CL`+N{VqDNP@}GVmN6-WYQ}& zB!ZLdZJ4l)kQzOflz_IuGZG|v0Wlf^&`QnV52WTQJH5XgY*^;e<Q#R-H#yBO*=hiY zz07n-1?_7c@=^g;GNeEbkYc48cQGe(fa?q3#Vnx4FHL9xMuxm)ivfTfy4+!u9Tz3i zi#gZms^=FC_io(dmzJN(5M!qv>S7|PzheuXc4O8V8YVqx+`m5G_0)QXxgo5y5EMh` zs$9%ie#Te@cC!O&84i@8A!`dH!9W?3AwC&WN<rZf=L8Wg%tNdan5WOZ=WVkWXXzBV zgdjb8?sW9JdeGS+OplZ4NCd4J7}Hun90)$L3u6y}=y9|PC5=?OU6s4d3<>e>z*uvD zwVe=&8)ioi>XyxP=R0gc4vx+MXj+ERK)e`i40izrIa7+>$82H&2KNzsJH{NFnqYX4 zNyw09CM<QpF69De>g_jdfab9s1lcU)%CF=LuFeG?J@?)#gH^2sVfMD6e4x7l97%?? zVYD4$IN^zHg?G3EIp}1}^~=FZL`0ba!=up1wN-N=M)59&z8XxMNf1f`>{wVdjCMnK z*et)b2Fdaf8vIEy1v&;XWlTOtxzi!Ue__WtU{i*^F75Q$OebR)j8so;J|E-gmU=|h zNrZ)2&&lDF$->+0CD?!g8M9Rbd^d*5t_S?R0TUv|+sT_mh92i`SzeAo!yo}6M$bzE z9qWNjNS=|Lr9sQn8b=|rnLB5Dnhc~tw?`su3&~g&79>N<v!MY5o>=Y@uRUW0crwbJ z2-v}F8v{6Obpq~a0p9_zVd)@E4}1nlbqxsFfH5QouMu2l$iRRwmINnV_XTBXpd7b^ zJX^9v{+Lqu0hi_C!p@*rZ^kw?SeiB$@ITf7y!<F;!bREfAjewBpN?_l0q$J1_7r+u z0AfKx{2)Mo_-2@mWY)pT88Hnay+79*fxuztXun=0YI)q6ouu#pIQ|^1)O*;Kyl=BS zgyo?XG}43_C|A}F^C<M{g|NqS2a8#Z0(T#u&jPI-FsTM8|1h-XbF>~Y2eI;)9*jZB zhp^Q_S@y1@J)kTXED5M`&#S782DhY2vd&sBZ#wpxYOs$`YH>G4l?C-}OG47>s+5Gq zyz1r4AfHrFrPe`-UQHW|(co<%(CighJA-kVUR~?7C{R=qsFx3E5Wxo@k5~<yfVp71 z`aua6Sbq-GasblxV0RkO;GS};2U6ewB-UYS_hCcwhQUsxdLY>*Kb63Nu8o4nG$EwX zK$!?>AKoSSskZcRts*ax7kNxVy!w?o?Ck_gIDiY_(tC~eF8Qe{9O$f@lVX0VMnRg7 zdQ#KzI%jGEM*fViz}`r{pN2Q$C)%CxprS;C1z1|a_Vl_!b?{~0PJ2#frOQd>>bgij zSA#&XEE+_OK>nRR(9v3_@^kK^pa-t7IPvuBe0cobvHFPu$EZX`V|{~AlD}=jc7@u| z7X{INuC9&sErOX?hf-81X6Rf&^ug4U1&xY=jXN(COi4kqfTxH7#eq!mMdGnCRkDne zsDRTjsUEh3FJ=StfKs!j{i$91OFf#(b~jZ7Hof2FXYAvR=58IDE+FG#D_11Ng@dBG zK21Jwb8etR@423|^M@2bqX!wws4x<OJSU&)?HA3?Pr_BExmKL<h&+%|T{uK&43}<P zM`&>z-*3Q=vX_@_#m%rqYjdnpksoJDl<mQ2KXC6=uqpf;(kVdUiE*&!6>Gtc@bm2t zVNYR$`3g;iejXo_K*jMo94*l+D$B{QPOb^WIXDSwCl&8X7&??%bhplT`b_=Z4XM*- z1Z#Ht5RMja^AKS}t~@b+?%_Lbn42CKDqr{?ov0NqsNGOr<vv>bDKL@taJ6UkBDn?) zcD2LuQGb4bw+j7?HW8!I6KqO5VAU0D27~Uk{@rS5)81GSdXXv%Sj<I#N!qZy9una| zF}QS9#QGJL8g&;?fzzW7LZ(DC9`1C}MB4y)N@T1Ej6O0GvWdPq<wff&;mo4}wK@F2 z+R^|h$F{1pr>kKigfGkyx(saKpiOrbqRhJ`xPT@LV`j9)p18w}9&FDlvA|r}3LJr1 zet!6*G#OOh4s^n`3TMi`&$l-&CfD*EyfP%vi+S5S8bK2lHm}Lks;P1p0lgJQ<5*aG zhWAz?Ca&B6u+U;D+7>1H5kUux8RhJf!X}-=;PaRpV}&;s%eO|{lfZ!)hY}BNqd~Ot zJ=T*4Z=NsL<{pL|Fe(l}hrt$O*nblRLVRywl_ix_pryUDQUhZ~M8Ao&Zyj^p%0O8= zYzJw85~ECE0%eaRqV|?*v+D3f^vjRvF@F%EW8AqYGsI5G3AW;op$Y}o5okcgAx=tA zm&xEA8*2B#X4tSXb+jS_0rMQODRt&}etG0?v;snWb6Z&ceBN1@mZwKfXC>cKO*_%h zRODK-Q;mB>c7Kj+(GgQ3=Inr{2D`xGGO&f^7c>v6Pz%&VK_pJFX(ymSM?bLLi@AR0 z>BfQN!5ii$;Effb(sXDIZ-6C|rrA@uC493S7roNpurBwe;;xiyd8vzuVcN7Bqzc5E zvLjK%-`e3+Ve%Fg;FjP7ntS)i!ITa5tQxD&4@@aFEkPcIottdv=*4t<#;XFD0y%O! zSG7E%ylOolRd_!?I(NyS?zI>}igUNG`}$NT->%qHe!-Uf)HD6BQo8#$L_OPJx}Y6C z*JkL^E=az=YTsa!v(qUI*#Bx!e4;+3<?&PF=(KrS!y4cNBQCU=i;m@Di@CT~uFwz{ z|CKAM^aM6}f>q*5#XgZJegc2(II4Ongk;R0H>_+jth#x4VeGJa@vvs=@Od*6?XSaR zrKd|wp6YLYY7qO>u=uG_>r>;QrzXM6Rz_1-nT%L$9%($i(dvdAuW)3Ik_vTb#6jtq zqscR;&Cgt7pScx3``NgX2`%<KDLvx&{M5P-zt-nL8R}+(&*@5|J4{ByHjjqK{xGf# zjmCZ*WgzIB<8VrcBj3T1!*>i~ib`QQP8pW$nj9NdLl}XWVrb)-P>q&&M}^&tL!#s8 zb&Hf*#}<M6Jgx_)O}g_b&Q)K<5=TL;6fYceq-=pZjs~jnMjnR^RwhO^Z9aN=fg8GN ztW-$?F`Qyxfj#O6u(X|P{K3rdfPFFoerz<F25JCnNW_R|3o(H}-mugf3G!xP7|K}f z425=*SiX7=Tl&9LT@IEIcfcS9s1OEtuNiB|Mfs5dKQ2m-f%UK52GwHq06+t2G$3OU z>l-T|Ac%)u^x6GVn7tkgf?1$*x|^RI3d2PW+H4t=f1|z5%O4g{K-|BzST6t!VnK+( zQk#DY6UL1UgwbkESUZZqN~>4t3lQg}`?QxMmVrXeZmJ&wKHHS)!YG(hdCcye>elNR z9##Vuu!gaIM8J#9!*Je3FW<6E45=r0U#SiD-9Vn2=s*gvZ*nc@4-Glz3Nk>=<V{L( z$O!O~W1wCrO*-<$32aQ<47R^)(jP{8zmUHM*w<oh(wxi|0*iqeF9wL1guRexBOMCr zZ8ytwBC*kWG*FN2UK@$V@&FS$x>09`7z>KMNM(jdDD-Y|Nd_}2xA#Hxsa@OoF!VVW zP=e7@hhBMVx)aEcnw>U^(LL7JyQ0>y+b(I#!0zWVC4yYt+V~a`Qv48`HxoV18wG2f zggH*5A&x1R&!_c$&9Z~PNbv7plsN3Aja#>|ZwF&Iaco*r8)##<t%}EpC|Tq?JTXfa znfHr?I$F+ggqpozZL!56$7eRVi#D|;%B_FC=J3*AB-E8G4?B%JmaQ!^Ns@P-aH?`X zvH9|0=NB#~H?_oK6kJ}q)or_8JeN>+uirk{nxx?RdSlbBS3{QzT>nU@)7q0n=35oI zz4h$eKW|mC;)ZwLJqH(U=`7sv-seWq$~YNgR-0eKF<E^Y1)f~RL}SWgMch9IJqYD1 zs8U(-rtxtV;$sW*X>Aa?BW>|?17&*EBV4wY^=6ORu!)UHur^&e2^2P=CsF|L$}2f> zd?_xg?FwF4BXPQx-Y&2&PCKTQ%5A%{PvGtszCdlItTNmVC<=Y{#R_Jq6BE@8)Y*Hb zl~tb{kyRaAoC@Q4Ptd|&#Y>n(GCZ6J6LDlqY1fzIsj`mKqp3vWE{-6{k;u6aC&bf1 zlgtdCq)I8P0|NNHFL_6ZLmo)ihYuyoQlq>y`#3Q*227Flq1LwIGH|yMo-Lf6C?%E1 zFc*vb;Lt4+??+6+v{l#Ht$6dY3&5JuIDmvI59#1pNkASH#w;%19$)Bf3Zd=RaL|g5 zk;Fta{yLB%$s0Ml-hRH>q6TKZ7rXIJq6hKZ$X8u<<HPvCUCvMO+*j*8LcWCQV@qs< zoi-n{-F|LpqlbvWy~N8)H*Cw>R=>gbNRolOfBErx_rOz^4Lr6tJgfHzxrkY|G4#rU zhK)OKS}xnPtACqo53VGr{}E0*n{f;`;f&i-$bFT&C0;py*-*ffNm&w(pguqnw7QGi zkT7{dFrLve$zex5wjA?h9vWm21<BLPj$)1T+Y+$6mZ>Art}Zi=lgt_U+j3J@`aO#< zcLR?y$+#yY@x)?7?m@Y)%e@aCE1aH>W8^Yuc-7bS;QT@y#J6Oe5}om6EVD!2`5BET z_hECD6reLA+3bBPc7gKo2d>0kXh5R3Y#|u}rvb!c<-4{o*`q^!bK0DM5=fATApuko zW#DDY<h+Wf2V`>}23=ji*}auz-)iKCCFf6#$ElA^Z(d|ET5l!M)WzMDzAkarGwtZ} z2lukhjkVJsS@*s}lL(E5Ac^2@y6=uF=gXQ!?KozVW)%_Mr*GxQ-Hc5fGZPXlj^ql8 zouzc7bR2OgU~2V}KOZT$Gi`>E>FjOijfQeQZIU=kZ%=@W=iiQeY@H8^DkF~kM*_l* zWH}CzXmb2GTiBh-d{XRiO7jC2^75P4fc)1r2pRlniLs41OScss%O`MN1cqb=1=4O- z!#GnoJreXp6__ookuNV}sE%IbMiJJ-bx5|;(ThGG6OIU!$F}z}rjdPO69<uCSd4?Z z42<Wec(fHe3B$ETYW3p9b~q(TQcZDQ@Gzy>AVIel`Qi1oOD1v*u}*C(%{UywL{cXi zeRQAjF)>qmZxSYvD5ACo6h=@y<wZJM??P^}YgnuL+fHWZ#i$CtkOHySD8f)=ySQ0z zJCVy45^NmkFC{W`x~>Si6A?LzW3=cJ5wA^T3bb<=<O+6lx?%?uTY(WwZ-cZOA<et} z3@v5iJ`JuXN1Fy{^w9%8@mD}H1`eczbQ*qfMZEd~E?P~M9lY1r4BNyhAU7kuU~cm0 z94brl8bwG%-dsrYW2RJko42`*d%ZjlQsYuQl`Y2Z>5pq%(|G6D=w*siYOFuHS|6(t z$rf-VCbh3Vz5jA`dqHjlbYv+Px2eJmRZ25Pgh63zG7eqJu1BXcLRmYB!fr&gm|+`q z^F34k=~+jK+TLK3zIMTr14*(picoMz8)%QNZ4$qPibLI!ZZ1zc<j#Qj1HKmzTfq+w zI){UsD$2?A%O)qSw&Zx^qqR8<aoS?EDzQX>ckgthl0``Hio*dEnf3LzYlwl{+(zJG zW<=4N9dH+e|0p$iIi3+5zPeyuph0gvzI5T4$7a>DW(6)ji%$6YnRj97looiJ?K|01 zdRt=2y@X4-H5H58a%c~iNZpdz?ovSLeeS$?|IwhcrIxSHNRTf)Q<BxFUmG0OGI_7k z(6y=ma&Y*$3!7et_g{F735mSCV)MJ){^n83km$P?Hh-+|Z+Vjx67y`umf3s#ty7mn zVkh_IUaH!=6dyVei%CE6jBIV#P$|7bY7IOr70D4RlR^1eutW$#AfbZLo|9bLrx<Vs z#_FDx=c$vL+3U>Od9l=9W9S-juL1=S%pogpP8#TJ^yD0;*Mjr4$L!_Yo~)wsAc#v@ zleGX4HsG_%6_(AosED?S7Xo_4R$Onrd{dk!45+klAPj|ruxo&l<@c|J_k`jciN%XG zHmuZT+rvIw6zaMFD1QC=p~>`e?1vLz%3ca2dYplA(p)aq#YvfM_O*)ZS<WG)?o{6N z)XG)fbz6N{+0qt&yNCyOj$n6Hi0$l6%ze;TZndk*xh24*;lbTg$-8Q{tqgSUe{ip% zbJxjTErFY-9`sknQc&vGwOhKELNbQoby+Pz+m;pFzZo8W_UOv({;mZN`s>5%Pq%E} z9#Qb{@yGDSww1x5c?FL~4I-LuwFK{KC>VSb9?|?{Wk}Sr3&-z$$uW*=35lJ0_?VB4 z<X}wbz45Y-xB?dsUpj2?(qqr-I<YI>mq;d|X|9FCvJH`)x~-x6BMP6+pNi}<HQAAs zS2&`!EUIT+>yCpBh0hj8L|xlzvhz@X;c$+}J?M23y?E-;=qiEe-XxQ-l20-I)17x( z{93~bmKBZLM@07>HQ80^S~TI>5Pk1->#h^NE4M8dcv7``Q&?Tz;7ecY-4E`zhBKJG z7rPysuIK?~C;MAogkSkII9VLg`eyLW9)Zt~Cr@&0hiq?mPm~M@8im&{8+x0W5;L;E zK3vcVyidyET!ElJ{JL{(Fnp-vKW>BhpCfNP-r)ZRCyo{TsPflG-gJW>Z7|=EvH#4k z`_F(lKeGtuj=W09CUmP^-SiyUo$+d4fAGVS`u2BkGaE-T0)x+w6;}s0y*&9M_yVt0 zE2R0ujlhtW>7nY7*3Yl2L!1VqFDN%c)dYI2m2nP_Vx_&2)p6AnFWrVI_|UP6T9F&- zEZ`cXe7QMT-1~~s0o;ymmF#8~Mcp-W$5mog4SbbsJG~@VH0Hq-%98$TPp-Q@R}8pm z;+uNqtYr!{?6#Z%=O2-=?^m1l!^2>BA~kc6d)r407xn;Ma@~LtcyS*4;f^WUh{3P7 z_BX^vyy5T9X{;N6HMM7tSjKNaoXPJ%9GxTIfjDoz195Kr2E-Zv4#WvA9$#fb(W|Pg zwnNIu5@dJ3dU7jccSOUR*F~>e1N(RL9)k9tcXiCqEPC6sJ}>6|U0ty~VK?m;7k#+5 z!gbHbn_F*w+3_&$X5rMZifrsmcUER>=;*1C!r9lt{jr}r+U)ru?;nd5ewlrr8^>>X zG9TFaewD-cllcN`h>&ar2fKvF6ip|h)zsUB9C`6F*SJuT3I`l2V<=r(D_~AlfU|22 zRE)O<t*L0|oa;5xj(HO3sBV7mQf+e0QIhETogMSatWr$$*NX8I{N#xeq59^=!+z<= zkr$yK`~c#(zuoKhXCTfMYUdJ}?VwNM8hM%aW}#ADU3(f8r)UPHkh%L$9a2%68d!kg zeRtvrtVZYuJCwx@M>dm*5-T+&4DEK0Y*0=+phLZ_?bg*Li+*~=7O5dG4zihN-c3-d zNyMn(dT><#L&m2OCk|Rh-fMZGaBucPv&IFRDa*xWI6k=^Yf5$0B(Z7gTk{VrH`UDg z*@^QTGS;V!QTfl>VE&5TzW*mDj{J8Z&bJzJ#EG;2w<GU=$%#{uURSRA7Iavjef6k} z>W<a=|LDY-tg@WZa5*~M6K8ZI$K$vlWK$PEVwmmf{)#H(l+CRDGY}{8H^1(0K%Bu3 zjMAPyRKl--IQD;nPRvbv0o28B)Bb;0H_bEe=elTawzeQ$G*7P{vA@{*<<s<^yJ-HD z&iKF8ce$`?tmIeIKE#DHUe10uW{HqzXVp+*`O$t={{nyZ*J=M9I`Ma`n=-`G;~d@d z`T{TeS#a|Qv(5md`^)xj%j`$tLFijL<4@gR^MypMwclR)srxGe>7pT~Aihi0Jfw@} zm#mwFQ3hrC57y03-CsMG{9@Yw#=0>`bNs=&c@XqFAUy2%?ysLMJ-<OGrias)z5YR- z)rv^86m-gPMb9&3pWk3d9s$in9Qr8IM>3@oY~)IH?g?vb<<5E@y7@cnMo+`^&4vvW z@llceCPuuF?vv}#!a1+co7*XT;JgtL&x~=F^Ak6NPk1EGPTE{&tRs*<pXnrsIPe{W zHi38(GfZMAq@Y%lWd`+#IklSJx_D7iMk>n8s<f7|6wd(z38s)LrJ2kciTrBbEo9aX z;Z$jOsc8Z1J$gI_mr0sfffH0NiN`HW0wo%`D1euVVz;4S9LbCdH{CwO)534$5JY*I zNJ0(`*ACh6E$HTK3t|$#7m_D(u=s)6)DVA)5V|X#IL!eZn$v(#2@rRQhVmkGNSftc zE<%GO52tSIZJwBP`qo{1`W89e_ETw`xAR4>rD5dh@yn|$lJ!VWDL^Aknng&GQOcH9 z<oF}{5?QSDQdPBIT6%ub{gr-P+jsR<_XqEC8?PPzD<E9{7rx8C0>aO9m>LA;Wt-UO zK{#4B?)(M=x}7%yohUaRMJNux`z{asH0>R1r8z|8-9t%aiHB-Ru^BP{IPLqqK7AU~ z5$qN>H@YMM>uM~qrAqDCn~1rk%RFt?!?K?6Mu~KDb+_BF!uS52?^40J(o9F-ZjjYk zw&96C<Ignb<Iq2KG%6z2OW-%_rQCnwk6&N4vHO4EK>wTPw2~3?`Qas(InN6;Nx*1f z*ggNzBE7$}UWz;auwEK2VXGaN8;?TZK%(E^KzqNzfixKf#Z?nkRz6_Xv6@c4rX;$~ zD1TzDh`z(O&M>XWCK;(3Gw4ge%hL*?TG|L4=*7$Y1{1AsDZ1^pko0b(GpxS+m7Qpq z*2zZU^cSTC&o!wp9BfKoAalC&!hP(!p=pb`j>aFIVFE~s?oV@?*8y7>o<tn*q_>yz zEcYQDjc<-4)=OWRU}R1!_IEA(K?wi7qw!4qv!R&d!bYoPEf7NZraRKBMz#OUB>UFU zcp^*bn?L>slkDSw_a7aNPp3n_6T(-?ubmnc&I?@j&3d`a)#>wE)t-1+o$;aMJN3ao z&*|?SjelX1-EaoWK80IO)HJ;QnMtO1uz<5F_36-qhSoVI*(KSZIvRiT$M?B@XOevo z#0#!lhi-YlcQV6kja2K$v?Q9tjcUo#R&z)8V;Nzo1wfmuL=;a9`|gY--$H0wph?*i zOgLK|7kPi)4}bjE<@3=9Dn)QLM_D!~b#^F^b=jG<NbVXAO@zU1YfC|KIu*BGx$WgV zSeYZa8kYfpYEr!<cMA2BiCd1M5n4b<(A=EAgqJDhcNE-OOA#WquT*MBM_Lc8mfh@- zgi*~x#?KMSqG9v23PBZn28B>XPR8ZyLUNZLQw_N}K)`EX&6)XBd4MTWikw1;BpEp~ z=KfULJ{MgTv_oX49+bT}`kEK|LnAe>_AP6TMycEah86YWwyZGit%8e|=S)Al1X-t2 zuvMIR%`U+OnIo#Jjn8N6QYdkh&(?V7<yZEHnW{yu0b2$nD9fr6>ErLV`MkDd&6C)d ztG`agq9pZNU1Tj$hQM~D_FfBcfB#p1{QhBETE?HOmpo)npDN)*#ajY=xNPMaPd)=< z$OJKdq}ynrBWNiA6-q!sP}9vCZNx`c5iitB2a*l?G_fM41b~6kC$NFpW_2een|K{G z<Cwo81B{e#%(78ErZ5k%zCvW=-W$o$Io@S%&rUjE0*W{i0n?rCIglGs#IF|;HZbbT z8_1~;)c}MYc^KiuC!khRfRh9T0BQk|O<h$k$Kn|&?f{78jJq8zVL)B0PXzvfsr-E_ zKN#Ttxtb;*Tx25g&oGtSo+Vsgh(5XSXqoQ<2m71%67$QxP$k#@hN+xO(b+zHQ2O9w zedF~L!4X#<4$XdS*s<xTxnY-w50tl%ZX9fuSpDd^(bW0g{U^i9Z3idZr<w+?>lj&9 zZ#rUpN5!^uo2-9(PeP1qorc3zp&au^2`4_1kjj!N_4bXOtr0|L-u68gK4so`H+2yZ ztz`(T;X(@29GqQkyzDhDcEy0nr?p+e^J_dL9j6;YF4QJ3yY@tM_jHHA1yZW@qX)d~ z=}YRl)u|#sX9fs>JM!V$_U(Z&S9V#;ZcD%k)=~d;X24zlAImPg|JRlaZ&#swFT2dw z3mm%kTiK=6BX--^oj|S6>-T?;f4k}|x={b>VdKshL)Sl%UJY@6<11&^Wd1{DV9&yv zH(D-Cz2SB&=JOY|HqSKUh01*WW}Cl1FjnnsiJtxafw9~a;Qk!{mf7aMTjYDN3n!Ck zvXX|xzr)9luK&14eK=L7g)*F`ZZl%>Q~X;Yit=>7;jiQ0|0LK2OM}nzy>tD2tacC+ zuN(@h*LV;f+^I2IXw$xWv?wyTZ0onoz`osIHGa+v{ON&Fxr?;9YTR2rXu{vrY;2^x zyfil;z}YSF@Ob6-a$)4d^`hqNJtY49w`G@eAFdyK<v$)63i+s^WUbeYBe{V(0oBFG z17lNJ9#VEWml?QZYWk*y*s>4#aNQ^mxwz30_{E27?twA2&FgafVL#<g#fZYePNkn7 z7==={nt5rKzkj&iUpE~6%!7<Vx_92(un;)wWcFVBL$B-C^xt8c-#%R1C-1t=1-t(7 z!(~8KO;t68NL^R0kMU0qKDmrK|EX?}tcmp75n?*J^txo{i5tcXDIze<Zx4+73q|M3 zg@+Dua%Hump8KEZI)7kGjLE#@lKC}Z<BlhKKT;!)efx0PRXnMigK73)YzD_25`;a3 z8U->JVH1Ua`Qd7@Y2EUBuq$Qp*YCkDV`awIU1sxJOu}%gaNOrNtCn5-Jl+3T@$1x` zQx|u9d3xm2S8GM^V<w|hkPGgqTaF&S%z(mZptK>SxWYa@n#slJsw-l4)EZ)`6rA;R z+wjP#_yuc@3b}T*%QW$l$Uk73wVt6Dj*8AZ*fDRGmqI%O!2I7}nz^KT5-SfdFn!z8 zax^F?Wrmr$r<I5c&Kywnx_q5X+6T~GWpz~;fH6r#mrel>8+P_c(Xi4EkU}pxS&mEu z?SoXd5{L}FVzyW$u2ceIuUNUn2gIeK6lOVHCdQ_KjlQ=h5n$+kV2b6x>=1{D#MMTf zfJCpk%3Cf&Gg?9yPv8g+IiwgO-s>piXEYp)$RG?rB=xv9>I?%z&5F1%S1x?0T}k5K zcwlfpNL+3Ihs?m-hwIw|W2bdzbGb>!d#l7f#Xh7#UFNXg=*@Uht5ocykf_8Q)$Z@* zB>$I28n?3#e<)R7TWRBJvk?FDn_w<8`w{xz)~xYAajgHsXr(1<d>gIL5BZh-%O2r3 z&XlpEsdL&5j9@~K$*-JMFU@Hm^Fx|7Y(|bB4*v_f9(fax3}~!sVO>6FqUNj+E^uzN z1|B%@`dg3ih3c9*A*4sRU;63+RF{Fr1aw1G&it&fX5aydzHhzl!{`24Z#&Yg(NY=A zL`JK;kCoYu4_Z9W7SSMHo3C^_uRU4!D)J@>d`ACA?IuR<tg_y?S@$Ij^Iebj?y#gD z)rMbliht5>e&ZB>8?7r3w10mSxDs~u(?Wz_^>6+5Cb+pg^g+<o)!`2-O@XOLf7Na# zV}%>(ckEV7KViyeM8-O6f7foJ(lBd+A4=!?{^?DSZH}z|AqRpFpQ~zkZM2Ejtn=yR zS!A@@Bo8UMPc%*a;1vJyCYWDTds4~r-3?>UUIWI=hy8O4|G=^`&Z@l;nFHg)bD7z( z@;5~vCK}$f#z{0EA%42#rN#g9>9h{|D`WYQhf@t+%=gN$MBCdpbD7zSm*q%iw%5Kv zLKN7r#I(PX%Osq&!JP19^0xiPDW<kd9R3%a;(8)G#f3B<8Lj!JMI^*ER~eT`to6FI z;MYpM&2`jf{8N{Yt`g+ENM`n$2<A35OSSIpetNpfE;lvnLxx=NL$!(xo?~q^p}Sx^ zp-b^O8;iE!WvX?XDNOJ(wIkbv*Sm2B;IwR@mx$lu#{q<B3=A@nkCb|^R-!P}xQH-S zi?n8P0Q)A#9F-^rP{>XM5{U<~G>TS)plz1lZ9!|K+fJQ@6^?YwYkIkj>OGDop=p57 zSiB4xsRWx{cS!Emh-3~UL7;|&ziaV)>FKmAEP;Xcck2*$q$h&<w7e))HA{I00|V3W zHUt#tHWPBgyl1D%8w-wLCmatE8DQ{dUn(AEY|f$_RoO~GsA>N?Gb`qD@>l5kZ<$%m z*;-;>Q4L^7nwFCb{CT~d)6Y?;=Kr~t&ULvX>+Sy|`nijo=@0$9#|y)E&>a6&yU~8A z2${h(^*!@Z*f#zIGJ{>zt4&4v=DOS$3Ywnc{LaqMD%<<Au6n4aCTp>Ab*bcSm$~)! z-80krM@S_0pRhCPCxTk0?G{>_MUH&yE%-y1S+f}uTJ~~Im-(Te_YckKGMTCth<=Wj zkeMH-{WtpgXwCaSSn+?%V8<SvZ>;#WCEW-seo>8+$J}~5WntNG;v@1WUFNU)`Srt6 z(Z5Av?MlG-r^%MzS@A#g^Qimy#XPZ&0}Vb=&kG}7&y2F?Sn=iSC`SICM^4WERhMb( zznYR$spakediT~nkrtvKL}NAz8N<mIB*n*h&u-ZyGT%pQ(6T1`=2-FHdke0v*fTxC zx86Rp*z-u_Nz6QED@}E*er8;Yb@r8ojJkgNr_WPw_<YAt(tybO)8LIH%*jKKZ4_z9 z3?{4M^@Xt|Qyd|8UOeF%`)5}Crjl0ie=>tf7B&?fO2~Rk!I%8L-u}djcSu+EIIMPA z)BTpg%!Lw}hOWyx(QgrG^Bu)@g5=`-xAQj>Rcw&ZA0$O1qRAA+(TdJ2G6O_98s{dc zfH5bNKdmzV1wjJsO%w5_f}lKyfzf}LmElArEz4%WVWvQ!gX;V@U90WvZmZyU2;qal zSR=vB$Vx1IYcj(^M{<P$fCKi@Ayio1ftnGj`b8K3&<u2-ItAq@*S*nk33{s=fGOr+ z6;-*p5#C31bv+pZ>03p-*c4fa(PO=k2qqTzSP8K}!7vimE46K&z-_8v>KT>3=ni@O zaF=Dv0TndIRQ`2$=ui52Z~Q-AONC``r2TDgLGcC1#`QnwEztF1GJYaz{5*yKlPe}s zi~T?9`2P)_m7>V!|E6c9wVzT}7%o3jh7=P_AXm%)O}1uHRh2bdgAk0KGx<V@$PnE{ z`8$!JCZkU0o5=8R^u+fm{B0Bd+bNt;5YYT#ZWI1p9XA*Lto1h{!yg2rf8&bzmnqzU zvHYE2^cT;{(ydBCD<28-8LuV>;`Xi$k996Q@$tWO#r&l@9y~i<QI1Suk`^!XMa`Ah zn>i@VnhV3KpH-MIo2OpyF1P-y(;U_yDSe3-beZV!wrkm&zo_GLQ<$GkIk)?V$S_uZ z>g()Fq}AY)MTh9c_3x05xt42>Pa#B&xhXu?9wR{IKtH#~)P|ZwveEq#iE`Q&f|BWi z!b{vFu_KuY#JTnuYCD0%PSjZrh(2JnAJnG-_7xqg>Uzx%=u-f@v36M*^4tg|AtMy# z2U4>XY?v4sH**Zk0|MkmKv71CRGNC00Gc9XiUS1i!63@;G*OtxCaj`bCN(<<nIj9S z0g{G@VS&gdtax=A#^HedAQG8tcff#Wdx%@{BZTn*mVyfjXC4VCH1QbAde&tmdQ*{r za=d=cR-85t0+krBsSX>Y<Gobn;u#nMvYU=UfCOY?Xu!$Ysd!vfm>y5AC2q%=a<pU_ zfN&u@r!I(!GXofKB8jAgq@9gx0galiD46I)7Fz-&Q=iNaitNx=$z~)=QE-6+WxpsU z_+4apUp#%S++?bI?XRZro$L!qb0Wh$5-Jh?*PHOS_Lyht*uT00r=X($c+Zvk1tV_a z(f?u@m!)F+k23E6->YB#tqD7;fXel$s!Y!h{)^V&?q2>cd?Grhzg53f*W`$3|4PRF z%br_6LQm9xyFVf_E;3<5P6|Hy=l91Sd+v8e+<!h{Ww-z0{`mJY?#~kzcA+$E6Ml4J z>QB`#zw(LvK4Hnvil+L^=t}*9wHg%Gcv-{RXmrWk{V_rl{PgnL@#6JkXZKx>52`=a zxBE56_3Q3`xIdb|qI~#qfBdoMraWE*4XYgtnHgKZBIf&q<y~3KNBX%!_+O?+=O(P$ z0Oib=V}g(n1qS3x!6KwY1XUr94&vhU2so(AmxUe?21oTcGlcvsG?gu^Mu$YPa6C+8 zY(lqDa9>R!vCm$hS{ER&v<|?9ZN*AV3kaX2V`Qco7zqb6A$}*fL(`9hHjIpy+GuE= zt_nbQNYtXZ7DOYN1?@<Nq#G9vh8+b2YdHiu8>2{Ir^&W)#L?UYtyV7D9v3fW*K4kZ z=ccORm@+=(1nH8u%4WUsQcGYaQl^2HsEC)0p~Q<9BXE((Qpp|D*85;MA?gfw6?xk1 z-Bw<9K~1R@j1ym@OCgqQ>_$pTI8NE6prJZNYtu{?R*HiTA#hMWt8Ft7T|&tX1&~wQ zH%F_2Ah}KcEbB4|&=We(;!t>6yrwZxGzfv^IXN(J>NMQW)G|rFxPau?QL&h@4ta<t zhAHGAU)^#;4G07hL9x-72}U6A22zj00I+~MWmHZaD@8=lj+h%=0T^*)ZjNXq#X`lV z7lHTTXI~~Lts!2;kU7VQU;Hddbqr7u6hV@I06g8B+Z0wRE)D<?$0jBDLs@71xS4#d zEztC#eED5}jnL>Gw$Qm8F-zL&%;>Bw%7~uQ2(4c{%#?%~==ImTq;agfC!;5;X(H8b zS8VRp9iFW5TU+hk-*d12pSl7CYzNwHZe%78YRO1kb^C+_E1U&!e;B_-5Gg|v_1*Z5 zT<X;SeJq{XFR*lS|0$O43~mc9lJTS6tH<Z$;DyNd6NAEaI;IjaC}E}l_I9t>ezm!F zFJEoqe_GUxtT0&hKV9nnZ2Z18$^3Sy`#)E~xNaC2V_Pq`9y@BZk~vmlbeRhtV-0yz zO1~Sw%W~$H=)a8ks;VH7nyP^6lO=p9(01{4`M_ZOqpBA{;>dJ9m3w;98&&(-NcQw4 zd5`ki%fo#E)#r`!YwBX3KhQomAfdm#K4$aP?@~s_Jp5%w?bE&cf|~*)cI#YVSP9>0 z;swvVG<$RJQ+dOza`a;JnU5D92}A1-o3>@i@8z|pzf~we<L8g^LL{xPDW2tbY2A~M z@t8hkDIJmiyhYyDAiirbDLs#%o>KA7U-zu`nX`Hk!lq_o&5xYBm#(LVSQ4r$cHYc% zHg%G<7`>wBxwSNW=j}tw!O3=8`=TZO@$M&<I+};Pnmp+ox9H=5kj~)J`+nv72k#3U zRIGnMzcTO0xgGr{M#SJRjHy+-=krS=u7vDNLuc$75OIBcTytaAaI(T`x`l2?ZXow& z_bpgS*!qSvxZmEY+LIG+6*YQF<Ew=bDhmkp!|V6Xj+Nf|FoU!lSZwk-;H$VIAOB(V z-J2KGaJzX;Q08{g9p~(t^Ewva^hOCc-l%`y=Xylp!^wpH=E?1AFK+yhe%0G}YPsdb zFFS`0@SR^jh!tp|^y<}eW;9lwh_yLoYabUjRTj6(`K#CdFE)<aGjhDRt#9Ymd{iq6 zl!lpG1liV72MOYhiF=?!^U<e=YrD5CUT8x}#cX^}nHI5#R|s48bp+EI=SNPmH6x9; z=Sg9U%OjY_NcdeJbdv_?De9rbI6jo8H4h41cwqO|g!pia0;%ehcD?y#u>%(Sy6ht) zd*)%Q^RvIM^<&=dP?k+Ndv;Ma)qINSnd(M3p{xX3#7v6~8kSlOUVl4(jiQ%@4Nm#l z_-U1yf-PU&Rn5`2m?i}65nFvV*28tl5Q<s4?%F`>Dj{@=T(yd8BJUt^%rdL(*zkJe z4bsPsU&3s-<t?<TQQFa9M9B3_sY@*!e}?*MzBPBm<8veI(DN=YoY`TXIFo4zyw{61 zT!<D<kxfv4f2cRTOn=b`;A{88VzTzC+nE9`zTEJNAt&^=cCSg5)!EY{MJU~2qsMn{ zL~TyX{)oQ4!txOR<|OyM^46E5X)ziO@4H?c!JHFcC24dd2`OrxGk%Yrt&HQ`CMo1s zq<D5x_eVRG%=_Y(Q%V;XO1Cc+YXT4{!!bRms$|g#F)73L_Ix4C(T=F`RkVORg2?8p z8(OhFQmC&Go?PxD6|hciSn~MoP6yuSamN+Pci)_MNaqz!P)mB|nTs#2cK?ENy?E?$ zWb!Ukqr2l9P)?oaY)Y#}<X)KfO}IeM>_X`$s&|jsu$m|Cn#6uVEGEc^mq#on=Nwi_ zR_k{feLT(DU*oN2d%wr$eMRo|pcbh5{*CC5XVxv(@Kd>SwpZEv^s!w%i}<0?Mj=&^ z>Ro2C_;W@{{Asqc8?j5={gc=x(b7Vwa-NIN;Rn@RM!az4HZxlHa;}CZfMRaKwZuOd zmRNv6qwpc4Le;D1B`%WNL*0Jj(_zWpeLLlEwVP$Y;uu!{(%wBK5t3$o=xcdI>&rD_ z#~lZ!?(NmLn>-Z?X>;E*&T*j7H%j8^i!cQT&)_p^6G@SE=@zs^Rq$G3IkYieeX-xX zU|g;HHb6Vb6*?+B4=dV^;8|=pe<>Ok#7H#7v4e?Azh1dX4A&ER8o5xk443#NkSRCK zZrJlhK*qT8{G%n8uAn#Q%2@Fl)c{+ZAfV$xW+%R~Q7uIswM)XhV_XsU#=;e5(vGl~ zYDgr4rLs6|Df%%}`ZMZ$q+)8GpafI*bHWXNzUiW@0w#`v??4?o1)r?-T*5zg3tdUa z7G7iNC^B0%$n9W)@6}TkrF)^bulKK52|p83MfnkMw+9>_Bt6Q;<oI+2X!wDTlNmQy z3qx3K+2`_410-vf>vj^bZ9%osE?H?@wD^*tL|i`!OFrlKMjOUY=Mu}5-tQ1Mn@AgJ zTzJ85k;mCDVmQU~3l<ZnR=Kg`bM*sH(_*O?_*<d0#OdqB>)Ha|UVjsN^S$rV;ChGl z7jN3R%e(D?N%PmQvP9L`1H>mBijzC9@N>{jvE@^y)HGjL3G~gPp()e8B39HgqR(}{ z387X$R${MfvsQRAwfX6FmWtN~qDGgz*%G1dEl(FblDMnCy7;<emX`P9oYuEjb>CwW z*W`_$NXxK?V_6|_=n33cA1Cw;$#~(!Qq<dND~2=*H)1ql`egRDZ2Z{J**&kWMy+@x ztNP*m!!NHRZ(bOhx-r!n=kg*}ET(WmXS!YCD=*c)dH7k`<I5|)BG%#N5jFdn9uFmL zL16aT`eQTKcYl4aWC}bnwV%D+zkjUEzGcGo=Ip%-UngrbTVDFwe|qrn>&M2MEw7)A zfNEngj(e+%K!=N;IBrC|2CF@5HSp|h@G^`-W60b05?DoAqwuDDQyBLVEnP~&n)aIU zWvSc*&ED*3{k9JuBHksEYuQ31DnllN2jQqBtm^i|J7ap2h=%X<1Ii<McVSwm#GF~S zd^To!N^BDy(x5;HCoMic_Jyph4Z<5^t#fB@7H4A|Ijc>GfJQA7e#%s_pe-XsY)_Va z6&}8j8SlGbPsfzxe%E>A3Tx*(M#(!8q^G5Y05FgN^bW6BnNL7UcEovD6ax_JU18&t zm<X;!6Tv{*o)t;v#<(OGCLqp+#A>mAWUL(n5alLrs7P9W8W4j8gd7B-83MZ)*g$5I zAAukO1OBzx$X<aMf&hwZ^j>o1u0~lAGN8#xiQx$B;a~xHRXkrmHAWl=LH<b{1NN>E z<N$|oY0+)Kfs&L+q+9_`#p*{FR!HL!3APsK%StPqPArd<we~Y{qb8o7UVY1QZv&MO z*0`^AdSAGs^PO{s5~0Z)Kk?gYFsuSzU+6ob2AAE78n_4hgr^&21@(2pr$36l|0pKa zNEbZ1Q{QL5(Oc|%QaJ7?UEs-PZSGEjbq3{h(7deyg6sBIqB0Gh_~JoeCIzM~^bKJJ zNN?RWO_k~<Y{VR537u!*@3TZ_Sg>4{#PTeu4Ouc#S%gDb^5?SxywVkCvW{-uOS~^` zO<&QVXEtQ%tIb*dW;*WWuI(xtB=xvq`@>*_wRMwk2&<HaHjQNI-WMnJxi990d#a&L zW)6rlfe+L0j?tY|e@WXj3Dd{P7&;4DmtcSBp!@lQ8}A?7JadpHm+QGa*Ly>*yFa+2 zToNw#a#oXkY{hCw$-uX*#=A;r%lh0`7k3fJgKq_GZit<fLfJ&XV+(vyq>PUXmr_;2 zX;)w`a=v7ihqO<o5Hmk#;f|O?yCGOgD;1@>i-9){D|OO!YJiQ8Lw15mx~NSOr*q-0 zpp)$KEktlJ17p;;|4AfWl(hP$jG0!a;ZePiocqCzl}ftS4(fWSH-<1v0}dQ_0tu2` z%Xi;8FKO$a%ctiJoG*HGzX+e3J2WGCXp>y=$cEzQQN?42iYLw&zr0_3wmjqYeTk=) z9&e*0IF2Ect0hwn4$N#=1>M>neD8>An@rHHAQRmp=rCKTiH(22{<JPnRQ{-h(a}l4 zqf*gF3A55NhmR8074c!@{_r~*MieoyNT9NQcmoY<QHVG2-|7>#@&2!R0|OFH(mM9e zv#qbW|9hWshRslO(Qjy&iNXKgKH(FZIJ@S?w>j91fA9vL34HvUH}L<J<EgVU0Dd>H z{K*?QcRYPigcj#qsw_Lb2QyJo<xDH6EHerB%fcH|G&h~7=g&?Yu5PN5wAD^?XV;v$ zJtJ+~l2KO8Y{srotL=<72-;r15D}FU%VyW3u9|&%S#>XCLr{H$OSMG(BgeGB#zBKb z?elRNSK)JGzllnV_l(}y=hO00;_!=AL(g}YHOVY}5pwA1#}&1W0=9cY+VLJ*^p0Q? z;v!R6Tl*da+xpQhKE?Zmb`sT^PbWihigU-)!qRTdhM0L*b*_A#=vvYr^gec|Jq9_R znosd8uHJt1zSm;kR3IYT4<75aIb&sg$Ke3F1}!tLxHMf?u@7Ue=k!tfj_a9)i7qH_ z1KplgpDfS$&{9O?Teb1tX61($aTtSy3)j~_@L9m8OMoeRuAdrm)aj)Rty@l+W^7-) zxpFw;v3JCXy@B0K2Hx9b=2>Bcj>q!|FW>W{o*S+!ju|p-jqDBw`p!;l613}mae14L z!*dZb*~liQ<F)uuM9R=$<JnJ2&TsFK3O>E-4BR%oilZERTl&o1>X`R#q{T&uLZ7k6 zUdAhZnO$IB_?K5GfBu(Lj!H(;>lafMv7c8&@r$0^R?}bgMG>lDefcbzHaT`+RU$1Y z4t&|w&$X^;TR>je^==DehnjIbz+=MQgR6x6h;5-_2`Z$a_!3!Tfq1gj&@5Mwq}(Qa z-rh;Tdq`-(4t>FMbo$c7VnN@Ei_DEMr9e*>;=2kM4}u{U=85yBvZu3UV@6Y2J04?0 z8l~=PsNy!s6>Q2MGf>yG+&2*F{D$V*cE+jAXyXW}yAO8|s(rg(d@l+qeb3Up{k`=4 z;(K7l>mN~5YFX)NR_dBkW!Y}3?7E}h!bb&RATv^&q-^n6^^Vu&wW6zIifhDA>d5uH zWYno_(_WC|Hf-%&ED%~A_H3`A`qfXpNT2Xr_~_7rMaGv<%|R^5BEmJ#h1vO?zm>k< zQ_a2cIrCFVnxr2jkke4=6DL}^cCYvQ!-FwpJ8NdH(@S<F+<03+`P^x@Gufi(wp_pd z`PJ9g*a#HQ1eUMRyUn+YbP*^Rf2bA*xZ5#Xmyj?^)mGk-6AzRRGhr)o%?F?M#!c@m z`OyBirSH+DiFLo1zOVH>U1oT_(k`OsPVsjG%ev%_^?5?l>t_^1*Jbwfl^NYVAS|7^ zPOPr4+<nr~rlrc|^pd-xZ4yP$_=L;vqEcY%r7D*lr+2Bao^Ek|Xw%>HVDcnOWB%q7 zOZ!`Xi<-{8II3QrNM2jBf4FMk$BU!CufN;<V_p9B8lPoX@88G`197|{A05pHw~buD zgG)~YxE7r1tNZvJ4TG54`F}RGb3{(k6LJclV6pj~Yjv16{A>#4dw^1B*mJUrflj1} zpvFpf4BiIN`7{xLAga-zb?~(i_kwvB1vInW{92iV((VEjzGfw>8Pl3x9k<z~2d7}h zOvNHO=JE(w^Yim%nqmM_xXMm3F^m)ed%4Uz5D0QPZ86-ARlO7%%6?h{k7I27`h=#4 z=Y-F<x(eZI0sTIvs2zbZSW@6whqy&S90d-n8U7T1qr*5^Xskqjq!d2iMYXHT&bu~p zd*WQTLq=Ur`I={%9y2{|H|la5u07M)J#&>NdM5wMn&(RjX0G|!&7onQ8(f$XyH3wI zQ#iV2)aZSFu$jnDs+=gI%1Qj8%1yrk|J`q-$uCs7|E9ys@rT>~mvrurmr=9++PQz_ zD(#zp{=f8%WV^)}|DOh<n4SNd&i%i9BWHJ|jF%q%ad?Rp(I-z-R?Kb)Knz9?T*}cW zzZr~@G1WoZcjpX79}$!1mL8#(6<86(<S9C|msQ#ISO5IJ(#mTA$l(PQF8s|u|N8vf zw7`Q>V;O0tbN=~L785s+)3(?G#y<^yHBl}}btGF~ZZl;d2BZJ#;bjq7!REzX&ZV{1 zgF9OggAwAN&unJYZ8+vl>8D-ATK^pU`rTl(Rn~TDFmm+7vRfP9@LwrlVg-=S{p*u! z4Wpdq|M1VVtZyjvWq&)o9N1v_-C%Tz1k8q!KAX>sRqUIv_}yT%d)w>{yTT{+Q!cw- z&z-i1RJ5h7_IiH~{`|H}?bPRY*M4!@UM<}AB~*Oc^77O-FbZ<oHn|~G^CmX?)y28P z%dx2FxVQbM_y=Cu$MC-bs_VW!$h!#qe%hu~N!2nlX1@i$gk09f?-V|QS=QAi8vTdK z6M_>K{=z@cOMV<h6unY{_~%(c>YtAy2BR+JTjFn1|70*Kkt(NJmhMsum1`?8qc<?H zelO?CObc+^4LflZAOf!|Ew6Q(!CME=C15YbJ+~{DmR-t_QUSo+$;{xDujUUPA}C?n z87D}T{d>@*l=uo3HuZHNqfZK@y5UNkDuvY(Pa*J6GvmC8D9;ZR!qZgdT03u0Fj9V@ z+>+I1OSst+o&cIMBZhAdM2R;Z$EtZ=LOa#%Lv6iB6mX>Ok-i<4@#wIn(YXsQR<{pc zQp9Ou1ef5EL($-B3J7R4*$R!YFtE4b0!OMKi<6i1+1+TZ^<s1+AfQ3r1_h+_nA|%9 z=B;4}n34Hw<H>CBP1SJ>wH6dArJ*Hw3?WAri1#K!=^sWR0~(07;GoLP%PT)GV@2t_ z3zQisqBL!@l^DpzkZ>wG_V>GGS)4Ejy%E(d{@tm{r7Tqj2a=&ff=H{I66|l`y__Z4 zccxhG)iLY08q|GD%8U7D$J=B8P~VV*cg9h0Znfv&vG@B(NWsw(#DAJD4Tit;1l=5x zAg&(j?HUHg4gfDKzm%oKYDaq45+H95%HzTq3Z^k(G62SH(h|kN@%ZU%miX8RR+S7b zVi7TR4oK%05iLX0N6FM`nal7P&@@FD%j1X(F_<u7e6@=NEPM+9JRhiE0UNesQ=6#5 zhEgagUYoQs7p17!hB|%?P*U>;=1+6yCoei~s*JSN1&Kh6L12+e-8pO+34^6EWz67s z&1puJF#Dv1GCf{x8fnf#I^(}SxSXhTuRg_6hb;Ul6Gx~A?Z-ws@9`30eJ<LMkRXFJ zOGD|Pz*dSm{;MulKSu}eWylm)Xn!Pi_F(xYPP@1=j8#h~Rfrub_1{2dV5L6d_*78v z(F+t_5fm6%*)DEJhjOqaoLa>^ly<KJK8Pb=hBJlDSdij0a+8Epkw!OrEP;!$i)3Qr ziQt<>0>T9c8B#<>g5;PXMvc|(vzm(%rrqY}EEZ|U8grn*Sp$?&5*4*(1xiexfpNq! z;fzmWBs2&iG;HBS28v@<3Sy~k!gQi-qz)0IM+JrDiRenJ9e|+$LrQ+rm?X^rr-y6X zzmoP`g+;-c8MX;Ka)*dCityXg9qroeq@{|c!j1q(K9QUZq;JJ~Q9<-Q3V<!7i7X6< zK#KzSTp2|OGvFnJcEC(w*}|%1#>u<#Xo;MIfEkYhX7qYPiX@aZ@{3HQxP&imYBZy3 z5f{{gcv!Y`apW7p7&??*M~op%mmoqeO44`=qenL@TEs=&DI*T?Bi}S_U?c#zqrwWk z4dXV;@26KUN2&1X@v9dh4c`}T1D&t*gxz3Zfj)2t<e3V+TMLE1xlKB-h9T)gOcKE} zxF|v-3ilPtTC8~6q-$Ip<}suUBc5X;mtEK?jPx-ZKoY&nMFC#$e8V%In`j)#+q}#t zCzzN(T$?<d6@+bGIn?1|CS-8UMys46EJ8#2?dXATmkd<HZ!bu~Y=6aCBFc;t2GL%E zqwRN4rupZ^eCSZDjw8fA%fSIf<8g*h(0XJY!S+<<v)3C&OZLTN+t)JH5?zG|jb=E- zi%jC#hrOooLe%v3t8v%ZLP5pMY7LrgUS{7}c`L@#{#RRqUc2E0yC}FE9z=bvg^($h z@<lU><H1rQ4$WzkBpNws<y`>n)ENhSd+)EE|Nl|<=HXEGe;@aGp0iuWKGw!Q_92xd zjU_uFB%vWmrBWnGIcJRQA}S<J_O(PwQVk({vL|XR6|NS!?9n`PZNK0BTkiY0@B28O z<9P1>`NLt(&%Dpi_xpamOrX+aJshl#?D=IK%g02DvyqbQqsYBh$0g8GgQ!Dn1QJI1 z^q`JfK=a$sUUPsZlbXEcWY_?T<qtZ~dEtmiE-U@+hcnR+04Ix6*@Xw>D$jW=2^uT` zhW-asSx1f8V2rs{O*$xy2XBjlnB9Kbhe6GvAVKh`8XiIgK?X2jRp>KwnM*JRJO}BK z*C5m!6dCG}H4pgsF(eiRLo6UB#`DV!Afx%D5{0J2l>xwq+n1oVrhNpW3-29<3I*Wr z*+;tOp?P^fnr!980In<pn^P{D;18)#AU+O0%3#jXl5z^8%E%blk0K-D4D3)*02+2f zQGp5Z__uz*fogk1C2(*rP@?Zr>h30zXHQ%~?qS-+opZl8WqbI8ZGEiGy%6^uVpgk4 z+JG|tRyv4kK0_daHy471?{DFS-Fm~^3l)<__3h{TWh+fxZz@q)ViuAVFx%a(m$4`9 zK|*wh-Hx+1UJEwT1y;WnMs=UVry-M8{S5Ev+wT~#XSe_z4e{SvbvsQx68!L?hX9p1 z!3&~xBJ$Rw&Q^l#X#NtlJukGpLQ=(Wc9Hq1+paOBQd7kwt+VK<GH<L7np;p81g#8& zXfGY&@{=}iagH;0pebpK^Z~-0p7;*))Fp;poaj|8+!jH=Zl77wB_9KHtVp!}l?1bN z*M;<}r$ZfQM4KPjL-+07R|WS!zUJ}f+WwiVd(Y$f*?=JBy8r&`0q3tDX#>Q_0FQ~+ z(N$p2X4DBH{%oAk2{J~74RA!SzeWnrI>&Bd3wb+2->U&0I3qqYBk^%Y@|%p5)r_l> znd#dzukX*yIG>r7nVJ1KGv`evb2T$pGAn<3R^k4v;`3RhnOWtJv+lmhs$9*g!rgqT zYk&Cc&DR+>Yaibf2?kI~z(DcM*ckxDy4Estt@UVjVKE@Ua*+A3>+px{-qq~B{kQth z-x|!k#ofw{yty^Hdh4BJ4x6(*XJUWO)cKr`nK{#sb7tS<d|u7@DtUWu`|bJtw-?%+ z9!lPHJanxvDl@G=8(0$r4VjP!6FCbAkZ<xx-Q=rd3XCxEYfNFOJEDen#69j1!tY3B z-C;hKb`eR!!2pg5D0<{7h3Cpk<(3-kQ5nf4t>tP<<&h2Z^gME3ubS_;mdC?w<&ESS zujNss@=Xo%%{}rhM)J02<=fQd+l}NqtmQjO6*wCfxOfz}g%`MI6?oJYc#af!uN6?G z3VjU={n`uU!tok5dB;5Rj*k=ut`(k~y=a%7Z|PBFA(a~{mA@maXlJ<f;k6=Is+ewA z%<w3_99|roRU98*aD-!n*OQ9hnw5)n%ucn*Rfx~Mk(G;N<y{*o$qX++;{gmYH#5FO zFDreEc@ahGD4GI{JSb^?!w?6`ZjO|q*m*Ts01_XsUU}rEx*?Jn|0wIkh)cFnUD?EC zgg8F_xq3M|<%H>MQG#JbzemMjc*Ss5#YkO++eoqOVy=fITCKADr>m_J0H|O=EFAf^ z-@Sm~5V8f3O93G~nhOJ0b<9RIpD-Z<1Pau5*$EW{aIa4zm?#^vk<ep%B+>I{xC7~! zbzyAj=KRuK9$fS>%7+d5%po;<P+lx3vj8d0M0rs{Jjm$rLS2s_l;+$yVRzJr0+a(D zlH+7RKFkZm4rtFD%0dFElHi1<-rGm1e&dExKj1s7VrV>@J-YV5QTn0tj)yJ>9>&d9 zKtg#aJbL>lu4e<N!x-$rWAJdG2@~m>0-88_`T#c0T(*1=%7%^jIsor+MCr!>+(2c+ zf^bZft~k&Virkk1flQP%i^>T?q42<FJQ77jZRv>DkxC5C$}@?-zlV6&3kEj#R2dLa zHcXUy4@&(Us`LW_!YAFiP^Hgnqe`jPb*u|Ni*$9Y`?y$hV0Z1-7$4H%I^9ZFbu#*? z1loiMgpCxrJ*n?}Ti^YozUO9zyT*NOn<J~?4k#w1%W}Ur06bX++Bt_A<?g@}42Wbw zx|M**ZqMpj#zY~634(MTf%(JWtT=)l{cKMLXbgaO3T=L=DrY*kAt1pjzmyYnA3+A{ z!pr$0${K6{Xs-NKd%S{rLwPML&9DSy#S4Fq;~uUEm)naa0#fxXh+G1(%5h`>&1^7H zuXw%Vg}&#Dtr0H_jGk`sC{<tEQfO1EwN`SKC-?B-68Sa3U4eNT9;LPsrRZ#P@wa)n z?4rGz&1QzpuAN05oh1gN&ED(HRGF52Wzw@yk-tpQk?fX$h+NSF_cNX}2g$rV)0yY% z`7$)(Wmxu0yZDDj^)1KNUtaqBGAxYy(A5V=w8jSJ$8kztCXTiyueZ8fD1?pLXm)Lp zoi{Tyvoq`4vPRpo*V}Sr+L=b}xt{I$5$%Q9?Zx%&rK9cT>+N@CIx3AisysU$M0C_- zchq*?tbctrZoPvg)7fa$+2q;T64BY3-PvB>**V(T9nmVc23+@S>o@8e^z0gr=o-oH z8m;eoH`>Ks@0yV5o-*qG=-E9T(XBkv@oKdD>w0&rX8gR-s|C+jOA)VDvR~cCzFHrB z^>g&qkBH9Pl{^IhD^yqB>+<fI`W~LK9=?s-G!NDcHc7<mwdlpy;<sKCp1yu;^;lrz zwIF}5f^6^TC?HsQb<_Cn*I~JbQJ^<c#Ct(suB)5F@$B3BrSl*n)S|Y}Xspk8qmLrn zZ+Ze0X5Ixa_F3KPx4D>)Cf>Mg*NF?VxSi3rXQOla;VYbduj11IkFf#0aI2qg{r>uc zc*>x^*I>ZK!DF`u15a4^@`I<m`h{7E^0Nb>T?1hkhva1)QU(W%M$Rgh-bIuTX|)d_ z?D`@+227-S6vO*1!h2qQ9xhXV`N|{z*Ysg*Wsz?AF!GD9(A*nC{*hd*5%IY<y9`G1 zyAq3%M)IDHbP~V<uMxwYxwc+!Yo7KOVvkbV-vp2LD;v7&u6NY)=hM5+J@V;2@;NT8 z)ZS#YWRF?y+YtA{V@($I_ABPOH_XS>;&bJ+nnpNZ#*}RyKR#MQG~83@-b4(4hm0sG z&esuSwS2ZOeNq}fbL*W=L<1(J@zMU_yQR4oHFI(M`o-D3+UOy)Hk&$R@w3dDI>g=; z0FLEa3ww|3A`S6+_p4}ux>|$OPp=sp<L6~3h{-LlcMi+jl)snFW6Q=Hc>>M+!=q2j zZk3L;)Qy>VHuTBn_1fje?#wTY1y6oJ*t!8b!Y4H4%5ZGNuLl4j;t}(^_G*>fZCczL zw}xgMsC4s0E1|5?<AYJVM=7C9q1>|Bu>6T(NlSYkn&QSwMsx5053vF4DFumuAQ{a) zA<~io8q|RZ<2^j&T!;wVHJpaXh~pe)9gaL*KK%*BWpr>+_@19~ra$qG<|XX_QWMb5 ztOohc5+wQ5UhRh4$z?$sZ|+2cqz`Wn@n60u3Tm8#x>f*T;sLWaeq1QMp%{2#0jLoe z!Q&CQ7%=ll#9j2|;-B%4o__8;+2a+`f2qJn+2~7q(#OdQWfeT3&qwl}+2^vlO0;tz zAxiwPcUg=2NxO`XE^^#2phR!6_-jcYcX^ENfBFK`<M{dnXp?fHXO_{S{`}(wztBra z2O_vG2k0`V3iBW?rKI#Oq}2(j5`n`BAhPF>CIyfqBQ#T3C&k=QL{OInrEW#2Qvh*1 zV%4KYmkLO;&QJ1!cAOQ#<8UQJtn#9Q1|1MjC0d1gL6=fTKZnvK0th^yt%<Bv0k|$B zc>p*xhXm&Y&q;%bAS6#KbUMWc3k0I^phFO9S|SO>I=<J^@l=Yl2OgPQY|nMqoF<}p ziQZx_Ur>vz1*z3IaRkc2ckgl)j#-5!qa|5$9~Yhr!~QRRInHJA3-;`l4}uO6PgU|q zN;9n^9)gz4V^zxRWc>*Rxi#jlwec?d>mER*7-AX|jv*h!r`Whi<W@g8B5>`JI?Mmw zt1+GKF$4kO5EN7Uz<#y{Fb^#oa6KSC7l-Kq<Zl2?Vjm)o8+w13^NPtG+S&ThY1Gsv z_amnzZ`=Ft0oR>rOCAn*gbfjpCnK6Oe>wh4M(xV8d5x*fOhAo^RAtxBd<}z`NP(gn zz-K%z8bTSFlPQ2D9*fFh%#Dv*C8`pFvMZ?+>qImfFN*!nWYM?m84RqgQfa~I+YB-& z)h(FITfBxV-Sd?Bk(-R&Q(_fSQ1TX^L120wNfFaO+L-Si6=i;T%Rb?d8R0_TY(+Ib zQLE|nBw@g~SCrECfnNZm3e_g2!uA;=C}AQifk=zS3TdwIp!?fNY2lStycC-)Gjuf@ zLsID~jC6g=oXa>pe>)y=FD!Ym%H1|`i;0wb3NVhnjN!Lp2jGz}(=ZVn#r&m=eak1` zJ-x_5%XzK@O*AKMvdr;ZogYJshcw-USwg&!6csDXU|jipPkDt{$!=@JXr?o;6H$z- zcaif_VJR#M9dllUkJSKC;w5*M1YePlR!lbV0eF35<*~{}M1W4L^KHPWy2R2L>YCF> z3*tYw^U~{og1Y8HmP+@{MfRBMa+&*n_jgMiWC%5*CvM(rdGghR3G-<hu=DUiSQcH> z#XuhXY#Q4`=c7PXu&6VZi0l?<qO=oThM6?Un!WO{q$xKn2{ZX7V4f&a0yEO8vJ8$y z`VnKfs}z$sep4zt7J()KbV3A>K*RG;*tfTc63jT!>iJlhkvB+{FXVaem>W-MA<8F- zw1fo~w|g2+!~+kc#FA7Qj=p>V9v~)Zzcv74$YcrvfcRQ_;p|c>tsqi3Y?8+tGY5m9 zRq-M$+K5Gf(znux51-TVeEeDtY3x#bomB%ytFBlfR^L5EAyGYoU>2v*Qkz?(ZR&0o zr!9xAfpxjhFvKerHh~m;U<5&e;o<D97k5Uu8Aprwhxx=vUtaNvQ!EVgP0(mr@lD$N zG3?Nl9q8@gHp!r+yHN5R1&)Nwi93gU9ZhyXKTqeDt434hQGzK=K|u76&pj64JTDym zQ{12-M%A4>!od6Ee=`>hvpL8O=OB8wA`g5X%O`EXMK=3W<zZA{AZ45|<p1QvqxYA0 zoW$?!x1Uls!>TbNvoErFWL!uv&>%g1JsKThMYA7pz_YC(NR>NWjEE-DG}l<_WkRy! zxV!S4Y>KLuE|sRhi=Bgsn^4FLchGnjkS2Q9lS`yw%n3n=>;s1qx8U(^0IHFqn8>5Q zTM^+<X5~|@kH%AAVgYrC{(!J(QYhN%TdXDnSj90Udnk&i47?*1Zoe*-$Ln|D5i@=X z<E0o~e0<^&uYP!S#l4lcsx%)>CafI*VzQiQKg99q>cnx=z_4DzgSk91zLNLNYg2*| z`Le1ez}a$%r;(4$Mx>uTj=)bR91M9WBVN-Jt;6u)J8WR~iNf6*VrjzR!ZaclR4_F# zMd~q8t0XpVC$2$=kwO<ijw98ES$v~W5-X%~<8L%rB#4b<8Ce}OPU*#&;t?Q~5-jIv z!h>cLW&DW#BJ&N1oJv~sR3d8c=bo6U8cXA)*H<F>UMI>GN}x5_+mS+VAf=Q#=^15& z9Ek-=;pq<+t)XroAm*!Sm8m!j3b$q9M2J-v2UHOJ!w0y<9?(D@K<tX5SUIS4Aj7B# zELU>2mEDG)YK>Ah1CXIEFt)f?TeVdPZM3Q(#-Luia9RKohhdRyu9S`w3-G3&2l&XX zNkvf<9w}eApS!iNU3;l)-3BvUe%*Bcvoe^G(RpxD4SC0}VV6-A8QI@LUd{4DI%Z_O z&4+_j!YEkorFfehsygl(3lX>sTh3~rUE`I}dK8FOh~_>hLkI$%hB0E_E@@!BGp*^p z@-V$X=j>5CAH%(wgAaTaHQq$<R9dCZBml++CI}ufLWcWS!3`7ymUTnM8ZeKpN^qDF zx04<}W6wu~Lm64XQ!OIMJAB~IPtfh6O)uhH!@gZVnqZ_KMTZkx+St2w6J>DV?z!gU zafNGl#um41>sH6!3E7KRf5)T481o9w{*cPj9n@0zVZ$*I{&9`ZGu<(A1M6cpCzgi0 zUU{`(g31fMsVCIf%So~-SPH|vb(Ve+hMJ(LBVhd0t@6rV)+BKA#!H^B8qc0yIl3%a zdxa0Ec3GhE{BW*(L0Z<|JWsMtIO;rOv7o<d*a_t)m|{gWqlGD5Csu^tiOwIs{1<b7 z>!<A*Vv=_zq&u$=SrxB^;vB}H>(6Ej<9~ge8_8exq~l%tJr|?7lbdf2Z)jiNwzumz zL)pmZ5pI6}+Jg*l;X<FA?*fcv?v}m?vWDfX?Osrw2r;hNJ|d3{d^LUs#UGYABvtLM zLl(auqdchkY+dAF2{_-da)xkprh~f6O+Gc66G2wSylGPvBYN(z+pE6kO}lH${I!QN zdf6x4Te1?5`ySxYub=Mr&GJ)=J))^AC3~&$)aBsp#rB((HOppgj}vY!)*oSWVed8L zcPS{@08_z{o@k4OJ7P(u&)wO95tl>qm3Pj3AW%SlU5A|1&9_TTDaPrA69vJFN1ShX zG>TszzE_+$E_FY=<6iffa-W?a&;67{h}WLId-~~dujQ<v=SycRX&c9Rn^Zfiub=&c zxqqM#n~_@04O?nYO1gRn36MgNL|xVhm$^Ub9k=($SjyXNAJJ#)24u6x9!rk)8GWt$ zu=7;-?MEQK_T00DKbiZ3pDu`V_rDRGw``21!Sin$0rl|Palup4rT2H9_UAJ9H&^J~ z(a$-Zd}?%37PI<tch2dA8|xD)maA>L4&M*)ZvAkiyX1+yad1|V)#zf&`R=pNg8yLd zuLT|BGWQd#CUo{~@4c22Qm8XFV;{5DS0J}oC^0r`_WXR$!)Isjo*Vn+Am&N;J>#XA zO}A$ETK;%5kP}*SZ|uv7m>+KyEkf%ecl_e>^1{2tXXl<R%YHtKsn70`JJ;CpbS`FF z#DviEu;%AG=dMKl>LPN}8#QWRI9)CHWdDz$(M0FIdfKTR%gh_?$Lmt>ppqf==hF6N z&rTLEU-*1@*M*TX>G?;mG)j5*=S{nCR)N$q9qQ4yiU>a72I{<LykL;al!{%Dlh*x~ zvvvpadIxKVWGKl3c<ah(x0fy<!;{yqJX=k1FKW9NvG^)9@6fiK@88Zvu8;4EJTm$2 zXK2Aqh?r}LWW(bfYCFZ;X}`4QW2nUvDKNx@L480hfDV2ZI`SP*Akx#ngJO6Yp;&0r z43vPmj!i(=06+!7pGdHBEj)G<kigUCVnHq`6+s0h3;-S`jH(5AV(H3kxFDYXJs6VC z&6T1;7y=+oqCt+Z6p40)1WHfCsv&?#hKLOL8ODG<($}ap)u`>4`~&gASUCTKG@NM_ zTXb40LtR&lN#ksF;R=Ll5?Go<0NvCB;tOF3WfUUZ0mz-ELZH1&g@kLbq4Bg-3Qd|~ zA`uITGeANuC=d$?aBt*N%>`;{(j-WNLQ}2<9YR1JcRC`LE?o;lK}mA*u!+9<tty&Y zF%3fm+(QIaTInDO)S=RaTbnhRjf(Cd*eayiqq@4;V$H1OkV}hSU<o<I;&G;WbS%tj zpn0v;PdNgJ6^u+6O_=~n5g{ooO>E@_F93@XxW6j`0w(ntTKF&)m_o+~UAbofU{{*7 z0ssO&N}36XPE%y_VSoaY06@ag9GYe+GhwtlT_D5?03aa%u0DN*vyf?NbOz7~0_fSz z!uV`~N}8e(4Irm%oufloSdj|eR)f`H4W0D1%=|X(h?bj)wJXy?=pg7GkhoM<a@-jd z4Wwg-A*ld5ZvccFrU&kaq_``NIg2?BfR6z3hyt6a3Dx^y(2=Hqr)jYPp$sdbAdry{ z+lzu&CM4Pl3ayyinp-hMY05z~g_Kt1Y3!0MpqA2%pQa(RA(djVplbKPAt<?=rddqm zA=5Oeba@i|RtPpNfta2xoqiTwQ=MIm9ofh(!gqXX<_j@{QZM=)WEf3?KtmE}kpvn< zeIe!!;{#ss5@8`YX_O3Lhd~8=CMOaP4L0&J%xPZ~vA@_>m?xS?gwW7&Gz%qw2tarw zBrX#d=cfgQ@lXE1NV&s8esr}U?!OmM`V6aOKq3aPR0dr*wh=M_QSPwfv`wMzv#kDC z8&j_;dAm4%LM~A<scO3K6#?Tn&tBPR;qA1P7b*hn;4j=4OuXdP(;59zaJz=?(cT2I z5d6MQOaOo)`D7+-vBRct4V(LBmf5UebtNpjxVPe^ZYf~{J5%gf4{v+*xl``L>j%MG zHn|!B%FZ{due>(9cf7uSny^#pM6yxBHdK)FJ1bx<QGkCD|D?EAqbmXBzLPYNG+=gH zr)%@T6W*aGx}?QePFUaOzF%H#TihP<mVf((p`raFh337&CR^q<!(a9q{w%GX?7MHA zq~3kT*t9__b~_*q_PaH`P6S<~!G?|r)y{Rvq`3SSYfkcGE-k#yje8$De5o-~9ym9l zb+3`vQn6dyw{QGd>z0kAKHEOA3xcoOVUyFE2x7Js9VXNprH%sv27nOW?c@bP&s+fI zZj2i35N%BmUD4;v)=QVc0ziYs8CYN%z|84jisA2*_E(DQ!Fm3fIRH(A>l~d84iANn zy>eD|<xRV#+9NB&0_9qjw5k(id@3$_RS2={u}s?Ljmq6!LeMqiWvbH?a_N^Bumk}I z1<}2HVNTFG1|&eSvH;PY-tSDSmI15-O=MO~7TQwp&8a(!sv`-o#Z;Oiw&}JnH{jog zifK{-X~qm#ua&Mj4bPFVI<53&mtpJ|K*Z7QDPB^^#V!9d+yphqy{?UWn4p@X=g{oo zG%!-$yfsYOwayxT;iMuT0LWQU+)ls}Oq!58$QLVoCLfG_3W#a~o2I#$Pko@TMRpj( z5kQg$h-0#bku+I%+UNs!g=w&FJ*GnmZs^KauT_GmAQ1~!YSI-_xR1R_jM9Cfi`|4u zTjx%i%yhf7LDTl_kg+^h2$<<)2=kDl^e7{0b9AX`K&Q1?An27sy%*<rbfYK<#IV5Z zFMv!2ounD{_Szm9M|d*26RHGt=IEa)=yTkwL+-TokfE=O-kA#?M!O&Cbpq!NA(@^k zA$|Ci5`AFZ0xmG)A#!g&c@Jb17GCsJSg}VC=_;_9!U{$KwhR*;y>AEzGHD0C18PLw zFnxRW4ECMKZUTh{IMSqtjh&Dt!a+1G;%=g2DTxU`O4r$x3Qfk}o@1wt`a&uM_+{sq zF#C;W%D5USN{Z=CDj%QM2W2YX=ncEgRDg%i!tz0|up^!Du~jd_RF$m0J_lBhk5m*) zsMYvt@E$ZuvXF^|jnsI<{qBrPf$2x-_yCB959H+PTMj-*Rwi~sM7r1tX7$U#U3OFu zO~nNO3bC4R*Bx=Sop1CG;juv5SiKC1uEl-La|DS5SW4f@dJ0yEHL*}?Mo_%o%sPVO zY4|Y6Sdu10GIr;KMJj1f?U+0kzO&(lBKsPbjK67z_g?b$GHMiV?STjoiUfW-+^Nac zsegul@q#~(z5BNNqhH}uO%-R8GuPYZXptE-NjB|rrJiTjfqYMZ(%+%Xd|_>P=<qSK zP^pH|skf)ixypH(3fU7q46bPb_<)1x;$aC^>2?L+yb7H=;pJn&p?0n6d=n^ODty6Q zw!TBG9#l7goy^CCbCNR_X`C0zuu1?l`C?pZ*h&XB%^4W`?nfUL^H`2B9WC%yc>uOX zjK6i|e!)g9hj=Smywk(uO6`HNhy5CZGwL5_Zppd&3)t7uuFy}5yB74G<rmo2c3ow6 zGjE2<i=IPIDuKS>G+!S8&oGl(iTQE>5G1ukkI3#8mJ}p|mF_ft;(d%2DDc|JO#S}c zy1v{|n3tuD#e+vORdo3GinsELhv~aC7hqNf1Dg|$ZNwsa+=TlFg_Y7#t%Cx^fOm~s zY6*;SgpYjz2J-ftwCS90x|zBEc)r`m*D7Bs5VIUnM>E+9#+{1P;1lCNV($&#dcPy^ zYt)GuUQK+b7Po`I5x%L_v{rr(Z`|5j%a}G8_pV6Ph<%@+Iq9J_byp|)smhf2SL-C5 zB<YGTd$~6eD@Gk0Q@4LcUen~3!$gLgw~pVN<$b((>C2M;x8=}pE0@2mUjMdM`0Yo{ zxAm598-w3|e*DH+`o<k!;JI&oKVOy18x=gYn6aY0@_`58Imy&HY|$L<(cB<w8{hLe z{ume)Hpf#mcQq?@ur^3&XzuFlU6JS81U7xgzMA95oEA{6C7e5*ruSX=${f1q^u4t? ziOADZG2e-pd3lL>1=V@QZSzW&^UC|?RgTQ7o|`Ad%&Xm)S1+2^cr>qhiXVZo2W2Z* z!uLS~`WAMvk4Oz?Gp5Gk1%Rdex^>gm11}!Ru5Nz!vzo7VOZwX8@4iX9UP$N<-SF&_ z@O-kxB<5GoJiy>a@K(VE+3mlgNrh$-Tl)ziUb(^B9))avxnMiAVE1XketE$Gv$#iM z(NT5LY1^W+<>KCbi!MhNU57%nG4^--m1{>}iAsxJY2Y-DX#8o>``hBxQsDblF0Ab? zkCi$%*oZ37`c}?Hu2pjbU;Cw{k(JHVBgLQQX@mg&Uxi4ZZV3VK!4AXJE{P|iyDvAv zJV7DPRxkk=`ei$HA_cs7n%?h}r1vS<$0Jxe5at<%MW=!B=55jsOr8Z;UCgBC+=3!z z2HrB^XO+R6$TQqYpnveuO2W&P#G#d>Pb<mGD_1b9DH5xxs;gJGt)^M7rte$5w&}e4 zb88n{nraG+!b5z;A8YGWj@?<=Zkd#Wxp(_hFfR55uR#%pa84}cg>@s%ujob1;wsjP z2FlQ)rD*)r1JA;;<S)=zV>A_5ftS0-Dh9$vKSgp~=CN?3JDn5&Sa*5~xYM;V&WYiD zc#1s*GLE0O3=p;Y;T#bpkB3qkX^K>U&mctkj<<-x2>XMTS2?Jp2{yk1njg_b*kh@8 zfxTaW1Eqj4Yy9mA;EYcwQ}yEQZ5zFo8-4pW`j2c3oZA?T*%-R9F<i9q=F!H;%Z;}~ z8=TQk8)M5G?=U~#OZ;T3{>(YIdb4xax>czn9*~EXJd3V-EwAuqfKmp~S`r|`JeXe( z6nKKzFq&57*|~`XNha&zz(G7flUuPDq<+fnKgh*N-4z@asijAl9D1I??5~tHL&lPJ zp9yjo-i>77ok)%>@Q_csGKmyOb7GiB5tI~+!sH7;hNwHyojNRUCduuVrngNLSaj&w zW!S0hHM5S>wDSzl%mrfjQFirVZO)1v>1xWcdPj*<t-JWd3!N*DEvgTedptVxWp+_x zxYGCKRjuPonj;U64ON{;Sll#Pd*)Mb#qnkBclF`R^Iv{h)}hw(%PEmlU|5iYLps+R z2-7L!NGuj<BBIdff)m#de)swOEJ{j0tDIQHz)rqa6z&O2rADQp#cVtRdKj$&Qs~$P zGI4FwR~2GxB60qeN%RC-A)7VNg3t<$@&Rus4Ui?DHnPzGKZ%BTlydc%cw~#Xz_#4l z0Lmq6KCGC&8PzG8#t?FsqQdZF8vj-qDnfuKOxJ}U)9cqKx}zZ-<t)JG6NNChPmN|A zPG__DR9$*lLZ<pDnMZDAx+}!1mS!j<Xw(fWB<i#i6q7cOxGN@ao6S(XvSV#nF=ZEz zq*AJxfF$9nwfbYFG<!pw1QJUOV(qd_qymvf>xbZUEQw4x%uz~NaJ95etZdFK-E#UP zcb{y6KuMJEcSYu&XPcZhhXHyJcllL>Y)ncyC?ao_(jexXRB0-*gXp-M=atDaMPRom z%@kpvshf*A5DU|b4#u)*ya$8u&0H_jwgG6*mXxD`g8KK>koeG`Mq7-!laD=lV2<r< zSMJil5TLl5;&4k-fPlpo?vmH(@fNLz10EN&YTg`sqV;IhcvY)*JbuSr&nW9q7S^bK zZV%Sjk9F8D%{5dqPRBo#5g@$Ma}tsJI>_W`lSyTxkc4N97kUT&Q6rX6&LW)_;<GeE zHot~VkVZX~Ai}a~4!AA73;#k$(E&xnsu%yZ|5C3E@<M8Bnl$ilIS3%dv?%}*CFR7* zL^{OcXd-HrnjYts?S>mfbq1(rn5`L=eWF`J$PAopKbheqSe$YeXCM>Sh;urZA|g_~ zQwXxQ5MQl%d-}!BN26!^E<PGNKl$|0yU;_H+H4xHahR8r&3+buBvJto6{1!EK{B+< z8NNFm8-fLc{2CB=qnO7Z#lucsLkb#EXc6M;)et`}JKON%p-_iwn1|8ucNckgF<Ru_ z?+#)}MS-moA6_L5UvQNR@TcA3%QO~4eYhh4nh7~lHx`Dhb-3|iH!L~({@|50|Nc`o zG?%f`=f*$2JmDCxe~)UG8DD%G$+^n;D0P{|Eg&vE_gRX`(5<xJ{O*MSBp61?IFH_p z&QC&!#InQ&5_StU*}YW?qFj}!+$<5u_77U7pcGP~a&Hp9DiBReLoPdzWaOcXswR?I zDU7Y@Y<{0%6PfwB%f_GO@sSxXh{8^>yNz;%(qfyG)$hmIMdXU)VVl)#?#H{N6PI1c z==Ib06TBZJjEnDsIorRUcGly9oR|RT{`bhBqlz*diI>~k?<WVRUzPo})xxOvzHRt= z-llN_Wr_+lF-CDpM)IYl`QYiuSWiWwm?Q9VM#%f3-<0y^IO{edD<!>OiL_0!-6_5* zJ>RH6ZEsw=YiZTB@`w+LxF80H9C818&4b%N*D*9*aVD6|OZDTS0#xD6dd)_Kx@mEC zmQo*Yv@P8B5g^+gHfDhdA^GG@O!%-AH4!uH4++5Vv1DBsOL5qKZNHT;<>U=s_6JDj zO$#6eKr&dr`uY8x2nsc`%}$kkXMZcNCnc*P`y)bJ&C!2$?=8MXRWpfFJ1=oIARh)$ zWJ{f5Pd><#*(kO&<LOO}e~_=Vv&4FDeDAf=2L(SgxUaA0J2HD+Je^D@`NHr~%>i+? z{_96?`~<l=$L`Y>U;I>6-?W`PQ<8h@frsQ1rA`NxGT^Nea6_Q-D#EU}*z0MQL*48^ zd=?97@ug7dxFdAmnRB+n>sGIlqy$}26b2NAO#x3f9q0@MY<6l)@dbf<e74*j3zV6h zHOxFI_mNw3R+W=3GRTu-1C*4)O{#IOPvoX<{;byEL2_3h`gc=ov}RqNv<)=#R6mS1 z|Los2ZP2V-bMy2Gtx0nL3E=^h6Z;EK1Q~D;epuVGQ~OL>+2{woM~}NNYKP=$jLkR? z)y8BVwy!SpQl8nPhcYm2QE)`z{L%}4Xy)Uj^ob}+(lJai#aV_ZnpfGxs|@G+gjUJx z44Z?>l{BZjgET~sACEw5oKt`Tj5J`ID#v=js~yNCw+g`LKpDUG!n;y_Hd4Y=fN_ir zD^^kg4%%P<kV-)iG<|@#CJkUv5FqNwO5qX?@#bXMWsGTLTMH&eeuf}m9Bqg;Eof@n z1vL>d+5|Y!H3*c51-WO-N95%zk?L@hvkdDDNOWXq+4&JE1Q>gr4Ml}k5qF-Xbde}i zQ9%@>q$KOynI1qC*nSJO(w(9c6vcfj@n<`|;wO^1Z+|8L%Ia4@pa)h@A1b)M^;^N_ zq#66;b$!`C9~5bgwPl=q)L;0~mcZ5dijiTAT932K6%7|;XL#{(PZ`^Al*sM+{A2i8 zYkodY8boNeO>^Py<L9qH$O9mf5D&?anNp(6Axo131B7j9d7f{1kpi6f$m0`$?+_cX zsa*mBoMHLECnk1;Mu4mGD4YLgOIm3JwJCD32G<esd*SL+ObC!Mzh`kb)BECueF^07 z%4^q@P)irp4PJ!FXWOxWbT(vxVEQ{O-cC5>2*jIbBMt<CK2MbZf+Gz=w1S<ur;MME z;UiAOmBZiS&+vp@bveLfc}c@CiABV0%Q(&b6ap54EZdD=4~j+XA1m4Wbk^;;;b8UM zv*ic(6&C$893J<*>)^}v%ehm;WR^0Lf0|_;=q)~?75M&#%1s=CK!=XOO#U})q>45W zBNRl#8)&OS;T}Ln7ZTLuHl>+Mco`O>0=N5{9TosNrG>Ekw3jJr`T~%S7Qyhb(8{$> zph7AgBwoULyls2ad5IyaIb4K}4Fd?WFiF%8u*HLZE1xb1eU<|iY8yJu*^uIuLDY7t zRoA(Dehu%|mu(H;R2&|4SKJ?bcEn0_zHTVY#{cy;fE9q7`=O9{?8a3mpjYuLB%sgy z2;iSz04f>0Q<vlwGPYcoF&FZLu`)D32FQFPiJyDJpHFxt)-usEB4#C8>`E=(Pegk& z(f<Nvc&+)==~<?DY|QEm*V@;3cwn*{~pfXh65a&ePsOGuk#F$swJBT4<W(Z=Ts= zB9c$AXTzh{-u4+JSCQ=dr@i{f91{%i)@hX3&)0xQ+e*r~+k^m@NxMZxZaA;oI4qch z#VjE_tHQdsgnM9!mpv-!B@_ft0-mR|7@acaSz;hxqIl;PILjXSTFm6|tqx&#<kEgd zvgFvchC4hgPd)(l=9icfWtG?=k9KwPPrD*m9eF1(n7K^e;r+cyHlnQTpA|WBv#tgw z(k^_?#*#oV%u>16?)9zPJfE*`;-~P)&=gPJ(*CNTvy`jzb7Ju97*-%JbmkRg&O*CW ze8O1QL#V)qvCA&p3-uI{(rfz42@kfzxYi-=!5fMMSS31D5rB193WfxD8g#!g%81x_ z0T}>~_*n=)doY{B&uSY&#HMW@R1}b785&Zys#8!zTU6_fh!3}%V)yb{i9!o$`Ejgt zefXA`v!BcLhGEyFEffWTOe~Ab9K4P71VBdsv#^(}#r*-+t{?!#=mXc^PcZg^p0IRp zRzKKh<qbgkaDH@Oanlspgk>(ny-LQ+zLS`JnuS`qDs{GZS7Q8aP!=^OxF>Y)t&JD9 z-hkUyN>Z~e!Ix67Jr5JFyg#{M|8-@LP${gi;(=Zl!qWlYFB2yo=i{udp7R-)Aa#!i zwUK3$y;TM#hQ0T#rboY_@RKM$c2|$0{E;fxjwTJHo3p9$BKvkyq5?&nGo7~GN{#z) z_+UF{kRUIP0vfWmaL>0Jln1Z5mK6H?y7~~WA8B`+yZCWZQ{|vd+`)$`$|WC<M}Iun zVCy@ea=ce%A_y0FQYD~{NY+*j-dYrFtUA=@jIB{VJF(~7cR~HdSNpfR=;K7rg^HS$ zrkNjgGjk#Ww~Ef|P5F^jYzmGT4-5p^Uya+H9(L)7Zsw<p*N<H6{bcs$(|L4yBoyEw zFdZsfOcN*33lFQ_XNkKOMNPaq5UMh{(%<hy3i+9S=9nxCrFeR5B>EC5_HuD-GAZsl ziPwk}FYItmt6f`{#l2+b=syBfvT!5^`nze`M^f_F;^ZaLm7m2|&}u2_X*Pw$sobi2 zA%}&PF@f?~B4Ly{`+cB0EJ|>W^H#g=UvmAV+KteX8^%Mamygzl3<cpDcJZ-z@p6|+ z(?J&#B;!L0Pf2!*+O6)ATZ3vj?@Ds6r)Mn9q}3~Pd0k#lfpq`kV6on?=8+rP>UmpB z^NiK=E!3S>)e6o?`0$Aclmi@A|25bn!__3`@@!6WY4LUSlAO|#LiJ)-^)j>tZl1;0 z2|x@Ozrs>>-pBng^O%?9FO}Z=sa}aLt90-x6W2I6<*YG()!CJJ=uT;Msrm!svIiC# z4;?fxQt*BM<KB!^neRdalCzbU%W9J~9$)|Ent02ZfU>&Y-RJfnfB3BINsC5(w|rUs z;PE0c78KN7_w~3ZBlYo54HmkbB~X5&E*a%$O#%Mitp5#&i~V0{J(d42;u<w}S#|%t zHMlm68vMWBte+wBg#I^yxP7{nGF+CIO<`fqu~5_E!&_4}73UY0s_!ezt(hsU{JV8W z!xZMW24{y#P5BnoKUe;P)-w=pKyw8M{m)cSJRJTVi0gdr#2;Al%1gFiA5SX4U+X^q z)~x5Xfo1D=&)S?y6&^j{hg=iR)OmVwU1W|0N!ZObaGOALjXc{r=Uxa{@_la--e>o{ zS^P-i_ZF!mMq<x5cverfQs{P778XX!QLc)&BSeHb<@H&eZkeC;u4rxZKbfp1ee~BZ zu2b<)x1SsF^DD|ESK_=?p(`ZGb{D_mCd78Fhlx%H`SS)mp14~ge+}KKIOO}JHkixu z`ez{SBfF({vc9t6X`GC+?<GI-*TzH&o|J!cd7pdOgor|SEhAx<z@5pfy9nn$@H@Zz zCgpf2=g!9*jj;1q?>X~^Ph*pl*JwreyqVmc-f;M5sL|m9T>bv%?JspdZd~}b{#{`G z(sRMvx93_W_eIPv$-j!Y*s*KZ?O%I4BrYz_IbGSfFm&pD&eFT;p^GcCv^|%?C-)F) zMm|1QT}gJ?b>rvi$A^0&&;R;<SI)*-!i`7{n=5gC{_Arv)DlKdIe;R?vPeDh4&Dgr zS(z0vt};tosGb=@DsGteOWEc;O*J>L(k#uK+oWnI&$F+%QM_s{T02pm?+EFIRPWqn z)%0%6?qM0>`IPND*5%J|B1lb>$osL)@(RLn!A;6MmT?Yz4kCFg(j@2C+xFHgoGLGF z9`n1O@Oa!876u;a(7$i>H#&5px7b2A$;X@;kjHJ-zcd{AqglV)`qFsquVy`0;ynLb zv;GvF*-AF~qgnqqt>={NP*Iyh_<S0(lULQu+Qv+cy{SmEK>exc*3XG&u2ue}^%S<f zSFc>;T+-paHh+U<gwu(#?)3d9t!H*BCD;0&wVuDTyh?=5rizgLjEW2uw|Abc`}Nj^ zW2*nC_2m2wh&!%S;g&NM=pi(zvaJ!oh7kj?DQ@OMhK?DeaV0d-1kZ=p<Yllo@y1fH zmr%l2LsigTN+#xbJhZ8}17U-2<Rh|?GA<3!<McSe{xitrO18?T3U3Q9517bc78|e3 z2pQp>QmGV@#FoVEobP=!QR)TFFEhJ>$OxPa4QYur5hJJcCFir`k7!xBVDw6>id_^F zBjWIy(>u{h0K(FMF34^4sWPY__a>Ie)}H>WrcDs0WY&7RT_ieQ>F$Cpt6nJqz^won zW9Ibk!mPBAtmta(?}1(t_=-qwIZ`fT&;G?5K$n}S=G}`Gfnt3ChGWF4seM{;GPvUa zDv&5I#;!PNZ#y!f$Et1JdG}13?Z_K?K7fw>Ll+l6NF2C!_oyUm>}&Y)6E^>;z*|4? zPxS8a2WKF{hsxe9Ro!?xvuG+Qa5Z|NZs-|jnt~t_M}K}@dj9ys$>6pNsmOjJuea47 zy0{DSyvhbx5t(duqyZD`^tyX_v#002_B598Q3{A9PY9>2G^se~#tS+FVmAo+JlunP zKf6iEx3w(>&+aF2<oDx`G=UU>s+1TzKTOavaks!c<l8x=yyJ13<E5(fU7sh_zkR54 z`>k1@sMT|3wIkuNdPXV)BpUcAN``5e=8!)oG5a~hqq421Fu4FCK&cyfKKSPD#{Gh^ zk}8Q~)mB*IbVGSfPprd(T#2q}iydpPQ<5L#tJ=@l2)1>s+z-BH$8)<sl+m*b2gEMQ zOy6WUDtK7M0vCgT6yw7c=<rf!BiS71SD7kojm6#X46ffwx<NTHfNOPOLSH-CL`h~W z%FZ#RcPFw+z<SB7G8^Cgb8?tuy|vJ`3ML0K`h<Cw>=yXsJoYuc!Q#Li+4<uc#Q?wm zc{B5FzB|sC@!Tq79O|boQbhECf?ChRbN%arO>*XaF(;RO@nv(-J!=<b)~YQ%PJF#g zr1Xt|XM_1p3cn1;Od6-w7Kl}SN&WV{M}@-?Zrb}!B&B-&1NqA1&La-Ny9FsZ5W5wa z9>pU9>OT^MR?T=QC*r55#2*%i%`OS-x$}O%{4W;qukjmnx{H^*9cImH{wx^PS&Q3# zhm|N~8k7*QxT#1yp#R~el=2S7bfBu$>sxx~($bA?I_Pj2AXUpz4?LLK?|F3)_m*9M zN{%`TZ83)(MWj>G+E1(U2uXbvyVe<u)U;l+%VvkBV6$&(6txPFs`fHcq*eA4+C=#j zzE~~YQk1UM9v5<6&YQYe^GL$_i{h&v6_vUj&!1bBc}Jg2HHRk=ZOdl#J-g*<^B2s| zvnrhEwD?^N91{0bH;#f23|1;OJj&wm;C;cVZB4wmhD+w%U%QkIl$P<CbrugeLJPZ^ zcyM=&wEDCqe(dpEypOyXa5|hv7l~`|SGpfsg^ZMyk3@~bXpko84&Es`FZ114ycPf9 zhLGg&1+36^*$n&YPqZ68z>Gef^!?nUkh2`}rF}HIKq_#{Qb?B-M$nB?y&o)jCn_?Z zt}o<+YH$Zu1b>ajqYdyS+eE%@!`rT$=b=F|O#Jqs5De{%+?~?~)5orEhIHVt&8ZB& z`+(HB3zT8uEj@T&CSD;3Phy6lKm>VC#LWtSk|1QfBB<?%OlgYZ0GD~e^K##h9Cyd> z4~r3MfXS)BXrGH{p=e}aLkwaZI$dl7`NWcGz`bokE?5!UTD($9w17{PZ9f>BAwq7& zfAovPsETYRooSB2C)V!YmmX*B<1lM^M#<@1fk6Pz>3BXc{)Bmg^mu|k7^@VP*qV{p z?k>_)o2WD%(QPGs#4Iva6#pLrC;{*X79fwm&`y77AOCB#(`qHumPYzt_=;Ui1b-fW z+WxR?=-$7eogM{Ewr{ji|Afi@iFVpiuCbEa))*_I;oVt#fAZx&^1>y*4t6um667u} zZ=UHZ-aC1shw|{3p~|;4$@YI~AHM{Ln!K<7Q~NmCnx+wXJpA#mT$rrwZHIq?$p&*m ziT}A5Cvua){~Jt};9vYtFj-&IUD?GGe`p`KY5|jp`hx+JNiHVvWU|rH^yC!^T5T%D zT>R)%s+CH~f1!P(UVfaO=zIO>$4nfW>njed$$T$%?CQ+NKYYdiEnfJsf9u65u}zKn z&5Oe|GE~lUNJqHZ$M)jH>XE;&72%~k{}e#~S^IcSI`GL6J`ViLm)a>~(#gluzj@_< z51?}+`zZCk-dyeD-;4~;fj@l3niYw-^|Z2vJ;E*j(Tnq6@xt}0P2uvF9r|3f6Ic8A zZ@oC0cX>3vEOhYjiJt98I&CZr{H1-|^4Kl%M9{ECs@BrK3824YE0*6mW^%fg-^0IQ zD;N?dSN_q9^PBeZ<YPOm=Rdf~@^AcQWZ?RW>->H`HFj&PniOwr<UjoL3Q~Q$=Z^h{ ztnLF}g-$4=Le)Aqkh}rwd3ol#9Pj;j^>UE4>;7i_7rec;Xc~{#N~Oj8uWQfn0<U=W zUs!jYJ$Ma7i^42~aA2i{l+OxTXSWcR5%q(%A3zXTQV0f{AHzb(%{s>DB8eAy+T;M# zW){y@060#Fl3QanY(Y}!B8hwmq?IWaNx@!ZNAdii?!;aW(i2M@2Y4MZ0%sg?n<B;! zbC=FsFAj(r24p!4%otrfB_@M*TlfYEmO)b^t@=Ae(RwkFF5lzbIu*prNGaRHz9$@9 zx0D`%n<Ix!h)AVz>`-ybR<4_@DPh97o+_j>{5|=cCl(=G37{6fU%AAmMC1}8p10|0 zAxRW2+6j+Q`kcyv^OY2>+pK%PrW`vBt86Q=wma4WaLB+H%1oPc)_i)gU4i<(wsyC= z`M(FyfAPwz?zV~bJd?4b3edZuri6Fy#&q&I0{=+>#YutF$=TC(MTQq2GR|6j%J>=> z2TWMMnh>qd;gFS#3w%SK#mi6>=SGVt7#pG>o`J<}_q7aD#YYRLYnV}Dd0D+$?PI^* zA#@d6+&i0*<U189$FCNc%@$XQ?bnpuIkVfUwD)%-!)_OhuT5Vp9~-%ai*|aBXux}_ zFn92m2Egk5xl)V8JGZm8r^cs6UezZ4he7<CB(fcP_WK~#_-~8jtz&r|{x{-yz9H(^ zKMmpocXd<#pnB)rdc8Mc^mnTF1v2vebNK%Ys`p=;fJd#=y2W3H|F3TXxZ?Q#(I8$u z%bF<?+zF^hKuO1DP4L;j3(96^^9P>(r~X~<1qz~BrR;N6=hX)$|LWiUOWff4laeCD zVLnNzBiy&W8}{*;#_!^We=~@=l1Qv-`CKF4?}D<ZOw)grL~71+#qojvO+guM_iH^d z_&5KqtR%|8^56P*w_b2fJn^rCI3~k+?D|;J|3KXEcR|@d3}UW0UL(WgcS+=z+D~_X z{KgOZ@s0JTIKKX)fXu)0gJPALz>?01R~yS`6`0#rG|un&x#}tp|Eb3LUEHvDE7^EM zatll;T{+cH0gh5lz?6aK3Fh39>u3T<QCN_3697D*<9L|H7@K?$m0<$3R9@B(ph37W z>+(inuwqP5o}WVGeb$39;sVOVi<zj+#1{+-w<HO_;0kfgjHzruoY=67W9oht{qr|| ziwVDoDPY8v<3>zJ$q_0+RW7LopF$Vpnj2TQ`|vre#1xCp?^2sfi8%$ZgzPA=BEAWC zN!K?Z=iz2~l00fw+Q$^lL>aNi`Nc`F;PeDTgfza%J@!4qos8D<BQn&s`<OtE0NRNA zq8dxV=TPbR7B)_f5GQl?5r7~v0q&JOgj*Z_N5MQ%m@9;c0G_+*QLZf=VnHD#mZD#K z>72>}ax|_pX70?5)~Um~@_Kf@+ST&heXV}c_Ld{YO~CNF<<<(x)a{+LKd9b+`gc7A zg!<aLL%ExPe^KLH{e2UVm<muZ>ebpcN&vFpov_Hi_;<Aw0gG+zub<&Ui00F6q#ZVY z`ghfybq+Zcl!%_@y;x$`px2u@5_0H4`4Rh5b!k%O`sa=KOC4iuxP$nb5t3j+PB;Uw zk1iCy){r+b#SN75L>IVqmAX9|QL35Ri~Y(a9=PMHxW{LIL!tgQrg4Zr#`KQ=_L%<P z<>i4g_y1qGd^>n^{xvWEuP|@yDEuFq^nmf`f6dEWO?u&9d70co`ZF*8&o$})waYhH zWe)gVlYSdUtN(*0{g|jpUW$eK3|GD|au~(+>&*Ovd?71M0`GHdwp7c6#m&oqENr0` z*yPb5H!mxGZ2yJpk$hWF)+o-!ytV#5rvHX{Qxvl0dL;eJD$d9S{xzn#n)I*#F)z1h z=%iTS7hddIRtY)vjOY7~Z-3?Ge;m_)^GN=gmm@0f$;EVP^V;L&xnueYBf5=P^m+at zH0l2~FaNV9y<F>H#p0t!{!bT&s4-rmV!pq-eE(%(yF7*tP1truXPwix{0`o`c8(3& znEboEy!s*I$h#njWB&5-$I9Ipu5IDZyli-?^saZ-^xc<#x_tk`m{vvU>TF_3{98@> z#^Ugw9?6~Or6c|{n7!u7{>xzY&wibMGMJg{=T;9|S!fmQivrp0kfK$?GZH&kfks6+ zRsCiqi&7YuLEAgS*c2w9h#a@zn-dhTtBjUcqDTzFG(m+g(K=H}Sbn{RWD<po(J;kw z8UbLK{{(I4=$$~%Xc$GJ(0BrTMRp85R<rmN@6wbjUftTPq0RzPgeWd$11*MUfwwOB ziub*2p&2-VCld2SI1Lu6-MYykF0B&F(}3~X{VVYL<R*@gmA=%~lvtyD1(CMa-G)`E zDG`6<Wsj<>8TI)po7>v#!>iJm>-kF0GpwBB_0l7h@`=2U+uf>q!JV2|IgG+f!-@Mz z$2%2~k6Jsl*Q#!?KIe*xS=k}YU&ofo!+JN`I{giQlP~yhe$f-HktmOZNU(lpN!LkX z)=l<$p}`C5?$cS-+0)#GEq6?xt*gE@7g1z1iQ6L>K9{}pyTR<Qg)P^wW9=9&zQ9D= zlT0N_doJs_WWP-;Hdj^e8YDB(dt3jGLLCbbuXntBHC+A=P5Qt0Nb>Y)&Mg#C?A4A- zRl-ukFwV-plxraFS0gu+I9@Du$+H>A_fN+iv5FF}8HpyBH<Z}jDs|8F7^sRLD0kYe z?(wR9@L}D<ilB?fJzo5QLJjLG^ImQrdiFOIs(WS2Vr8(ahOfi{*Mh8vm5I?B-Us?% zG=T-+SmpkkJKl7K*Hkk%$^$k(0rYG@jImXPU=I<57)uZHlC%PkXmC-ey-PJUU0Ns4 zmA!p8zx3!CzjjcJ#^{9baxE8ydgeyi=tsTf$K4OL0+-CkB3+j22D`LFAC--Lb-Mxb z8<^sgiQdX7061!Y@7(VT+vTTUlXN0JX}n+SU4FLIrE_Vy?ETOA<>x>7xz|!O*^tNz z3++IrfBGSdHZTD8F#RPIDDch_N0LA&nOhEmbyrxIB?Nd7;&T9KFpfnK%)ol_iCcbQ zO@}Bic(FaOILEKaz@Gv-uo+PQaEtNz@3G2M8lVq1Q)+O@64W;$GV&lF;SRFu=G09; z0;ps_2gUJpRRbTQ>q?AxgjrRs7PZM<oDLdW(P>zD4w@5YdhPTC6*;%k%3;w^=y{}Y zfIK4jnKc3rgF3u>u$K=20{+xmipKdS?22dp{xC))_SI`Qw2sN8^(%O4IEi}+r`Xbd z*7@dIf3d^E(tTaCZco+*Dw7{_zpsDsc)K=O+x_tFxvpQlf2<9$1ZpZ{>_7V|s$3T| zDZKyxQ1_l;QK#9~cV#kEk)sqjXGAhZ&KU#|kR&1kf*_y*7CA?ipnye?Bp@I;7C9qH zP(%boKtwEZ5UHo^?wRSH?m08(T+ey0_xY||e9-;hd#!b^U&iRBD;EqfW|RQPH~i{; z`TN|PvHJRk(XU?jzQ0?nr(o?i+=?W}%&+I}LWyf4{E{`_zEEyxSqnx5W++TcR$pj4 ztU$OtnVZ_YNE~zgm0I@WD@$SS#x5)8rAUR-rJ<MfJ-uBKv3Q#?`d5v87sj@e__iQ; zY(UeeuiGBZ4#M}C?PELiDYt2B2!d?}v#Ya_uN_wwmw@%<-}}42w!$|4O<wzNw8H-R zs%v(^yexk86ctX&rdL}sQK0ic&~B)<bgI~-KrctHuI!)Jg>>F0xuBskyWyW#9lJU9 zx8`(}8o88)Us_?i6PI@57Q27SYn$U5MtlkXyEwl48GOgPB%=k|o(^r_4{;xdpBi_x z|M-5i`{l!{j*kDny!QXiy6|tWy3%-Jl=xrEYb8a$U3Gt37iQeQ{0(?oW=Y@v3wGMo z-Q=Iwh3Q|g)4vCvidt+W{`0!<=c_K@ss<Lq;Nflk>D=G1x_@35Hn$1b>HqYq%b5nK zF|buawD>9r>w;J`p*j7puezVu>9$Aou79yEK)lcm0TBp%{o#l56N<(tOY*;z*M6=G zzshSYOu0X?(}fvZ)X<`D>E3^Dg(W!OvtHkSt_v+{YMX?sF6=fis6U0`%5t^;j^iI% zVV^K-?5_!+|BmDPWnEB70nfVMJUb!He|7f#A}7TkaD0a!zJboj{tP@N)TOuTfjD(K zAC<l!V5i9eQaX<yw1l#k6$cAa2f~CzMsRw>fr#Nz=OfSn1_MW3IF5=r$^{6-h0^j9 zYAG?^*QCjvDDYGd0pP+VAmAvPgs)MGmr^6<RVfzcd8Gb;P%L9dtj^E}4+G*L!IUN_ z#?B)u@wn;)H|_%Fse!)pNu~+je(c4|jQujX6N#R+9~t*c+Ao|`Ckd7=`!J(wGvFeG z3Nj$26Crk72<6ZaDnt?EsPz7{F7T`C4w*i#d03+OOwfE#57apMC@1Kd@HO3Go4H@* zHQ%>G_LVys?c}`T(E=k*)V`0%2tPE_1a@BbS5{Lo!QU<GB)c{qMw5$!@ab?+jMn}; z;Avs;Eov-&MCNGsDS)DcAg_&w)vHnjG<G2#Vj{R$f!QzutBFtVzW|<cUo`>}BE;#< zwa>%}SDmxoRMs4A5kv<-d4`BUZqkAw;wZ!DyHokp`z2b2f@T?I(?yc|rACQ@7R7?E z%gpx6E{+ObY$$tOd29c<J%x~Uzu?7ZqS_#s?hVzMvYGmt{R*!{AzOAV8fdE;?@XvC zUm3D$JgIwuCa{{o`foa!>#Jgv%AIJ2-}K7YSEmG*yKw2h9ki*h$!z;|T@a*4k-4Ej z<2W>dKu832Lz8Ey>2N59MuAPfx<Bdy!0_CdNIth$9+z$asE?3!&)<od(qqw&W)7rw zp2s7v_YsWl#l|i>Qj#zSb&{X%cGW`<uuEuRB$h~e4^15*9)4dINMyM#Y88ZKrrsQB zkfv25CWS-Ts}|X{aaffw{YN{39Os)~Um{LI!dY8UAZ=tPLd^t9j??PU4;3Hti2uN~ z2mmR2cim?C3~AG};wO3I5QBgNHMeSoWTY{7xw8$PZ69`vCsik0Gx*5-?x;_8tU4)R z<m0*Tj9SA#stNw?3Mb3)-<s2T6^?)3oX$vsyBo(q-Ko0LYfZVUE-5Y}7XSO^^weLQ z)90~}!pyP2En=Qsa>UAZQ{Nzu4vlwMvkJ=z!Qb_}n0?f?<6j84HdB+2xOJtXXS`oH zx7Oeynn6-X6f`+lTO?NcnUCl(Pp;^Gp~$n1eUUuEx^UYKB|=yiZ0@JI>XLYQD(f<9 z0_lho$<RpDmEDuzbTcsn^i>26?kX1>j;tU#XGNbu2>CCL`u|*eB^>p55uL%BXTurd z&O_O{FN;Q>$ol>_p}99w0o^n%Q@?$s2`1S87T@G|CfJp+);mK)V+HyhcE4(`QyQ4I z|9N-&{~wNe?a2SEyFK%tk9zlwQew5ACRo&4)#p`R_(FGr3C7F~sbBq@35NaUEB*7R zH_<{9wAa5M_0y9FDDdmwf2DuxZvUML*7uwC8l>_IH1}*p<3Bs<|IJt0H*;v=m!rP? zGMh4y$lkcdpP;#QMkWS??sjA6(ES<PfUiG~dIC|=<zF53gzonLf%bYg(k8)+iMgnF z%!R$|Cp5R}x1(MmLv8+_v{!r<XiVPW4_|4koBufKe;h7G{|-y8>_LL;2(j4e5WC++ zTrRDmPjC$JKMa``Rq*<k(14^W7%`*6eSq{3kkEF`9svZ9>tIaj;b@@}0KgFm1TOQb zVz`k&A{}+QsFWx!azH5C9!UTx5=~C5N-Qgm1vI`)fsBhsN(!J!`^KRnwyI=~<6R*9 zW`EVmb;8eB52H~`2}6`%!EQJdz<ZtMy!AF^0O98R<_!}(E2Qu=QKu)EU<xIjWcGWy zz|(60=_3^Aint?l@D6|&zDS}Dz%q(sJLOg*fMgB;aGyz}AOv6)G9Qa%F#)g^a-_s= z>LQtt>L{%=zA#%Ch}c^ih_$4o92pxzPIstVM^%)Y|GzZBs1^B7pNU8RIfX?aD*pUR z+e{f;c$h?8IXIf;faL)at6k{7Q)`;G`-=%S`%l{IOKtrDlKQQ|6oU5pASbw-jdI~q zPGHgEQ>F<TH4)#?#wEcg?WX*yElscN%^dQ6Jmgo0gqb?eU<#0tk09It-ZV-5f=xwL zI%4K<KI{Xi=<RDjo0G}Rp=c6B7M+WiH&}agy69_!K#;OL0$A(vMEI>*Z3r{F^u<CL ztRzk@i)T7uaxaHlmPgT?Y4R6n?$;rUeR{%+$zuqV6o3Z^|Bsbdyu|-(NLMtw{yC|z z%nbJYbx7MKNp1ZKp?b-2M*4prd;2$o>`zIB|7Vrge|t*(R9^o%so-9KNFWU9k|K9k zXjwfe4W#lPQQ5}77}9@JUWIev<$Hvv?4M4le?6rCoK*O)mDhhWr2itR@Sc_K*Hh}k z*S&u}rJmox?)!?J(j3gXD9HQ2h3bX=o^0+n>-k$!A?OhQ^}kLk{5+-3*})$NY#p!p z2?771yq^5UDfNA8K;F9?)cTu2_6NWQ%lf@Plg(f3gNS3qEJ3TqR8=7Cb1KX4TmM8h z|5bUl0E67vNC=Jg#0D4;13`I}C!A6Vgx*J;PEs2j;grI_egSNZYmpsch_!XPs2}4Z z`2P~HLI3dLnB*cgU=bIMBF~3EkJjnoWc~wSBf^o6c4{^v+r%NxdL*B|VW3y^?u#IM za_6slJbjYxt3X$S0#I8~pG@<1qI(TCqf$qhYye>paB2zJ9MIzA1pp}+9S{^~G!#=E zL(E@@jCDgp7;7#Nnr`%#(+8l!w_*~53ehn1BTnw;1a6RFsknE#;sPYNe`tjxHd6-{ zAsLfs04Pr(R^iI0PWlO<%E(u5fkOT<zkZd1n*J^Yz50&<L4THl{(DO%#jxu&bhX<b zmrTAV;M)XjHz8^Dj#07hi0v0_H>Kf9P}rZ7R!uM0Uj0m388+AcOj<p+A8r1bv~nKK z{d>}Cw58$O2kal0%zu%zqQcw%7fGxCm!+V;nqM0wh3UV{ufIt_eU^B@7s8VHQwmZ( zLRGfr*4`jEM?yc7R+p{8eSdV0{s;5ROw<1V%98mP^UHIO0MYv?1^vbR`ooeblf{yq z$mW19{pw%r*&%W`|KFWo|43SS)xz_CpS1eNlKH(0zwn18GgSysq1y8k5TvAyJ>4DG z7W?tH`SqcEdoJMHKP{QR8T^@CfZwE`6+x`h+37zyNB?Gi{R0s6*Yj(21k^m7L-8!U zyyMv6m-!X@=lNxlkWagGD>Opb@z?p~rrPSg9WS$oH6TX!Ff>AmLZkqUvje}(FCM?J z%b9?mQU5S%hl>#JfgZ@f%~%p~6ewmoG>Bs{S)X?07R)>B{$7e#v`0Q?7NhPb)FOKj zxvDkkV3n?Dby^@Zca`GtAo_PFFgv&x2m}BD0AdIL|NF5;L3p7=^V<t0JP9j5?mr$| zYJb5sW4Z<W4;1V#uOU2$#=XyVzp_6KpF23BGhj2n-Ny8n^bEF*V|A#B)um~lz{wVV zQLtNIt84TV&$@BE>CKP3Z^d|HVT3TYN?8EJ<m&J+6dz=Y9C9Od6va_MQ|7O8@bc@s zM&B>~jB8IFGK%nQy6f_e^X~}((JNa_-ujaxe-RM<b?vfgTb+7-<&`qe$-%!>uqPz2 z4!7%+_#F)-bk@MWly@(pyn@(1g+uX>3rjKF>6vB_-ufQUZ6e0kjwb!j8sEfA4nfnQ zQm5+9CXCaW)(Nk#E`HQSK8{-U6rp^}<fx#jV*$p~E*7R;H`M*~hzS_`Dc#neiS~hg zl)!4H%g=zQTT$uHfavGdCx@?rYuTEYN{h0=JF3?-gEv2~Jw?kf{bqQ3&c&|Zy(_%2 z{x`$>m$hr|+TRUtcE<caj;)`Dx6re=v0oHy`E>x805|(Nw#qZxDgSPGFY}`QbuQ`8 zhWDQp>|X<-gthB+P1N6VNmnd2A65xOga`6#us)^jpIJ;H1JUW5CNbahU+Eo^%gA-3 zR-Hfqd7R6{18oGkyP_oY$yNiTgdVz#z4=Q1^ES?L1;Lp9Ft!HtQ0H~2t%LVxWZD}1 zCTZ@Bro`AP^rXE}SB*`XyV@WE2RmHrseh-aiS}2gn>P$7^!<h(y&V-oRB84BbRN~X z$on~wZ7inaUZWnm#XayN+1Nqy&@(|%WDLUBh~aHQHATQu@|S6@+f0E;pFfAVx0w@N z>@_?N$-2Y$eY4T(+W6NdqTZG#_S{gOhXqs?K{}5QDZkPN{-``P8RL4~s@u)yce;D% zZxUuV<^0NgZy-HHNiFr>E9>LcVwLCN(aA5`J)fD!wQql$#moFSSbKs0Ikr@6cJ&|4 z#W8fWn)Kf`Y$AVbgnkIB844v0#aLj>A0bCph^<S=%eZyg_j?n=7lC9hvSu$My$x(% zvk()r@w7*ln{X`->w>}-Gm<P4IK@gxK1x$V$a1eoXpvxy@b)F#%RiiN`5`#Hz1~oh zXPcNgIXVscA0{)pUWG=z)uT_;)QIBW=2N=&VD8*_FLU*nIRzkxlxrD7{z!tChAVDB zezzC@x;KvM`bU*L*$mmCYmxB4kLJ_s4IfA(1)Vd;Ilj83%ky51rzjn#A=c;(NBX2D z(8h7SkQ|IL=!;y+ddklc)^ETI_0Ck(1IZjGvm$D|4}h2V%&zP0^ZO)`<X;tu&)2tn z=97V9`J{38l0I1kBGXnKDfzBQJ_jdZLmv1^k}uyNSjqRXMwjk!C5hqu`sXKjK=Hpa zymepQnR}Ug)ViinVTK<K@}YUcecjdIO+$Ye$j>HlQb*;ucW9n*iCqQlrp?K08f~$s zO4S>O@|-jgyDhD%bEK=Ge!`ySdNuF+NpYxwd`d#4dx02mUi+n4mUGArGN~m{m5F;U zGpU9fBT&%FLY`YuT7z;jtn`ljX9V<CB#6B8lWIoS)WMr+&TgN$VL{2MQfAH4vSxrL z<2azkf1ju4^or$_-%KWbZH0Yeto|iIcop+7ANjx+l|trOOgY^pjjvx!(opag!QmK5 zfoBd-Nnph3dCp04(o4~h+1^PARo_GXtI)!FXyNM`Yjb_DqQa%|v5l86cFM1RmYS<c z5~zAE!sO(9IfE8o79m{!b<*{^{-ce&8IBe@_{q*jAygdOs1hrD^O2d2boFS%u%W&; z*UshG&3b=UxdO8^SL>J~jk^B#&jS;OXQM4HG!vT&>k^+_3~Qw42`MDyzB&m^NsMT_ zq4DBY*#*0p%@Qu2J>u1MHF~8QhNhRVzj?l~T72xX&nE}UH?4P1J65vl<P9yeIEjBo z9(loqwa;5E;Vxpop1X%x?xw$Jxf3+N>Is>IcV3LP?KU+-FJp*@5vRq>xsPx3>pdlI zUO9aL5i3g^_)!(3ng4O`tQ#nLEb-Xnj)uNy6PHH4u9w2I*_8c_A;#-F2J`%%1R5C9 z^TE5CHRPfzafkSrz^|`;h7~O(wBKS%PV!TzhE^4(?wGEOe#w13S#qCN-p>Ere6=Wf z?lPJ?uYSW<@2r)d#O!fuEdAiKew#--j~L`6+o;&WB;BJP${VJw5_@>ofMP}t^(+=X zy6p<~sIG}km3eI$7wXkSU=nI9FXpFCJaK=KiLDm=d|uC>e05`SPPnl>MN_ag)%Z#O z%r_w!Eg7YAPbD=<?6Rb8Q|2IKZ6kZYs)vtqDG*(kSY$1}P&g0#pwh8&p#bGIgw#^l z`c^Q@ZM4U<wb0-;t6DhT%+NLTT6m{Ow<=zWy4CTm0cR`0qHxz~rZZ=AAy~H+Y5pnT z<+r-+2-|s6O8nhJ!*e*F&{|dur^>*fc4b9chu}26Qn&X>*tgrgiUJ>=-6`=<PRV+3 zV@+#Nwl$=Z_K_9o=SHsP@ejRw7}?;Bq_pNrp90%0TedHV(z|p#xj3*X<EB;W$?%J* z+n+|heaW_OnK<M-crp#!LN=AD6$TPsJ_VqBFMoHhOUe`qRM4P3URi2*u(REM+^%2w zz3VFLUb?tlV!u}EI4oN?*f|zA&dg(*x2075D)@4N(!h+W&~2aX+xx?>>lY2f4lPSZ zfyJ*}zD(p+Ha{plxS;)Q>r>t6y51Ql)~Yc~m0fJo`Nf-;0U@Tsd=I&{L*z%a$%*#u zsWSy4zE7pL<9FglTjt4La16=BQN8%Kx!!uhY1}#q?n##Y@Z!@2spH#P^xhmK43TH7 z68FlZ`M1v_=utXM=JdkFSNi#!5_iy1^n~h+P-^Q?+Q3ly%uvS0Q06zGtVf}AI=tQe zAuC-sK_zSeH`+z*FkXo;zv?i0pqGu~73S11YwZx@RA1Uq=|dWX%`&5>g}+6fxcERA z`%;*Fo+=&<qu&mpG)33vX+I*O@rB5)Y6tidimtZlLqhKlnnuX`gat=Nr~&C6+-TG| z;hq^R^F{nN>lY3#(AI57fvbTt5|IJXG-_`YTx4l__pe@yK?WXOwbz2**NP6Ki9T|s zxue6Yil2?a!(+7g;fB0X3O)vD)?D{xV;S>e8gCgW1LLv>;K6~SF|rD|I+5vVvDQ{` zEE7_LYy4)n<GeGe&503t>4NQH0bZ_`DoYUMF^CEo_>D}OnSS=#5{JP|{ux!l0%Dq{ z(-B5GaH@j@KM+XQCvpOjFcTB>zEP~YQE(~7F}>08LtxT+X41wHO-EzW)=?6UF?mNe zdCxleATaqTGx?-3`IO(!sWb6Mqwq(@lqLiWz3cHhliq?rT&U99$@g2AP05^u>J7lD zis4$HU}n1k7OLT_z?3XW_nRoVQZd}c<R(S99cgL^8BnIQgiv=(?Wz+48Dt|zh9}@t z<DN$V$Ws6=p%2cJ_$eOqYUn($=S|g;i(6)h^Kvq$xD=y87pr=S4^_(T84B;cW%*<v z#r!%#Jn&Ie7q{i-q)+SA&Ubhn-qL?MA7lNN#;#P*DHMPJ(cd~wx4oU73Q9KurAvf9 z^uNTwdYtjPI)SV!1MiT@I6)tCd@rntk*GfagvewGW&Sdod2uNtTGb`(m?{Or)2;0( zke8`Tg2>l}$2VoBGa*Wt&It-oXKh1EnY<1-=nFd~s<LP#1o#_{uFgbdnKwMK<pdE` z1J9yqk-A}e>4MJ*RU~qVXV<faFCix6Vn&;g?MzRK&2s3rV;B%QZ>}R2<lv-ubOyNQ z(T6+q{juzEZ>6M~;1?&e@4khTdFMQT6tu0&vP_pdl9dZL&05OKF^Q#)xRZNYok4<l z8f2Mc6&nqROKv#|1m!)2qyns%v?xvx{rt2>&*-XjFeX6yy(V^2sSJoJWBK-V2KNks zp=_EmfU-b_UlxEE`&6Ae|J+8d8572PnOjo+f$`uI)mUeLwLDt)Of{~&Y^Q=Eo)9Ey zUW{3WOD8k$T#D%3htW(3JwZRw=4V^F1(D0o-dm?r0gK|Pwel}L1F04!mZlRBiaL*N zlK7IHhVn^#3;dab0v;FN)uZ)oE)F><X599vn<z&A!ZrK0Lm+`=$Kjhxl1@rem`n90 zO467GAKH}W+$zm%F3p}RO)o3Wwc(#DEy3trrWF(=H32{z0MFbbD&mC6e&)Mj6i6QA zc3D{D^KK^qTpVVMfdW&WaTWo3%APl*0YFHo6afX30#xaS>)2$p9%h%Q6%kbfplFy8 z7UaAL0WAvkY-BqyRI01yLYykeF9Cp61Vju()dbMG4DV}p+0~<7Cq*haR}@_WaKmAC zCQt${%n=DaJn@V!dvR#01|7}@;-HoeAYphlM-_~3F*whiS2ioRlo@1)fm-6K33M}{ zf3;^Bx6d(^0vA13OU}knr5>&lR8_@&gOl%a4Le>S<82vaexssG{-u2wfU=5^5QoZQ z%g4$95hqEM-j8*^2tshRU<ZJsH^dA8D08m{0i~=JlDFeT+!vv~aH6XinET?(yh)fR zj_S&DnA?qdObrJ#1pspZKv4}|Uj(R98X7Yi<^mi1sNLGu8?w}H*zq>zs@X>g34-Tn zzh*XmOpVe?%}aVm8~=p<$#K{n!6xt$qd!0O$3TOY-ZYK9aw1h7C3ATM8hp7nkk-e8 ze4^oj0$i-?4ykGj%{Hhi9$x<het+#L<~qXQHr#44a#99vQUafxX~KIq(Q!b|K0ifl zUjcWbI69mC-BpFTsC!wcg~H(D-{I%+g_8Exh>mo1qNQM}i`f);_uEqua(gW#OU;bH zCN@V949Kle!<BL;*W+a#LuVSJY8$+|jo2}m%Nt%I0Y`VXQckqtk&Y(BSa|16RQ`Eo zAA(2!5^o~$;U0qAr45qG1<HP`EWu)Bk_yUW?j3;hgSyU{w$e$p6X)5vtg{}ifggW| z3)v!=n8D1ga7qsZg+qH)CkU-dUzOKNGST_wxSL0U$4eGLo=_kf3X}^%Xbv)$$5c^I zyi{eTW?JrbFkoAM8C`v^&n>&py|vF{zR&BluljP6w_?BN%NoB{zWuxXcU${|=KHl? z)=>e|Cx_v-oBbO=-ko>hH25;O!7TzCQ~shkfFmU@VpljSft~iDPR%{$jTS_#%V0(} zGGv>c7ulpN&U(!y+H$;24=p);NW~-Fg+~rULM1Izuz9xZ{3Gz3c?La2u=Fh`*9e1f zRR?~&Ej)X8Z<|HT2_V@D59(wdiU3fJw@IM@EL8wjUF=XR`{nP#3fweH^P?-aW2-@9 z>)B%)*^I;v{a;SUaICL>a?M&*imI=b`}FP$b0KQFxl{YUx3YW`b~<AnmysCf=2Rf| z9KUoKQC>Yx`k;-yvz-h$v~>z6DTOCKk2>s1WMJb(E5bkXsY)z!x4}9nI#GiL2vTlK zrW`nPJv_pvl>|QlJ=0Y+d<J)j1X3r!C2|DK9s=dETigqKXgL@ovpE}s;CuJrDY0@l z5g=vmtUh7Hc0WjAnVEjk4b&Mi^$vbf9DYVdUD63MI;Cp(3@@zCbM%JNPeWBV;l2g0 z9!yTFp+F2~St-YpD`bcw4hY{kM>y;KYibjWCa+0Tfv;NO`4Z`Bi`+x^Ce|MhP$M8D ztO>dza3f0vXFI5@XAGozB4n}&%ZebCp0U5fJn$W^jGX%sdOwbN5@O21jX?<@IR$X^ zgp4QUEe@tMkWc3*x#|=c_#{FJUQCk+?tG0$%5cpOOKrcUEd-VPpn|Zrl1)tKEw_R= zAli78j%rm4Eus~<4377l9&VZR2;(HH8>d*3PwM1$@0KTD9K(bI)_=euRb6#X%zMK^ z!tg0rwNy<7Ji%OTE*QZ*PGB%D;*m{vJLNdAa(;<|mI4rZEP(#|#GRFe;C_IXp={Py z9#$_JCEpoX`v7g|GTd}&m{Y-Fc}dcA*-abhM9wE&8BN~yk#uQUG|!Q1?4$e4B{lmM zt&kO++!ej{6$7Ib)va+()k?!$#zOr83SbnFo<S}IZmj%CT@?__1@xg9CU%ULMRC=% zJx1Z+lxJ`|eS}ffCwni%EiWcA)A!)eL<$77Nf$1TK``@XQ*=TcxIX%}(?IcKi0(|p z!r>aD517hvozZkHx{^i!1tI3RNbCq8ABTW_000rf|4G2S_5@{TyR!XfBm(FuTB)5w zi!%E}Q@mkZ{i&Q8A#C);KJ|;7V<j^gja}sz8P(kW)VDRFo93#YS*!1ub`6+*-lUlr z8yG_n;iO>VV7Z#hX<Kj^OF+z}N0`?8f}M(x>aSCxa33Hr#?uax_n9~qdlC(39fL2~ zZ!xE?v#D+o<t_Ls_tGzYCRv(;10hG}5NBKPcio7XL9jvPJLFPirja3}^BdT4OM($` z(`b##5!_E7v)Z!K^`3gAbPc2mW?D+60D|Qf5e8KV$`1I6DEt`jxq=C=+Opp!uFhm< z+o0uW8xn=Te+eHC-ZGT<rg4*@=`zB#+)evFb!if{ySb$?`<$T|or)bzuyYG@x}Fr( zl+~4eMD><bs{Ak+g3B9+SfM=!){hP`i1$Pw2z0rpSI$Wsl7^ZSPppAVAyldNu43R4 zc(_yY3KJfSOjXaU1QoT16FVM)eXxkmLvZyfk?OHX^#S$vAxZU~T04X()zS_RpCU#` zJw-Ez9tR^3RZ{RvfCES;?m(H^TqT><CoF<iMMw<Z)B)H3dSZ##g98=da8{wyeR5Nv zZulwK6v&veN1119LN`^Bw5g68LQEL<y`uX8;rxN;#<h3QsNjF}rTx&R-ON7OR!GHx zx4SEn;b?;lNZuJe0*YS*@f#zc4%=HF=%L;-fV{;IC@`3Un$>!7Q7wvsO*w+mbXg;g zPQ<<^)AXZO5}Q&8gvo40CymE2SGW}Cm>y+s!fabL-Zz|ffqd0k2a6esX5f~IA@;+J zC5xXsXYKZI)vU-cM>&$&a>Js`^1P(OoT^J?D0!e-d1y6u<UWz239GpG5Q>-2ld^UD z027}KNjI6k6u}V}c{f%xK{p`(QWP<4<3}`S+<Xl=yLBY%r5%@{M<Q1!<-lbZqi?XB zd2TE^08+saPS$}#hq)pM+Arv<Nl7S#93Ol}Gm@gNfgpl1&L>{_jccY{gIO)%;cg*+ zg2N1F$WnQwGAgdz3@0If()uGA9C<(Ce2uHy%Ya)4U*C5`v#Yp7gkO7-dv0LzSSy!Q z1OHL5B#IF=1OUq_kmlnDoJwS-Sy}muqF~4+_VI(c(Xbe9TMXuX%E?+wBr2!`h~Su` z07X-p_+aqos1tkQ%u-%xvE1yD=pSmAPtr~e@-X0Hq7u|8;8X$K5{OJvtjPzFPfO?t z6c^U$2}!x{48`H5YV^fAAW{Yra$(*EQm-_m4A0L_Z-)xMjgT^uTPu8Nr0}gr%2?@e zWw(#!J4D(<m59f0NX407n!{9+;cBhvV4%0OnJ(Y6+R12cX=1ZH<sqz@u?qB2;qT@2 zU&9L6U(CM$)-$pHX;|SkGsp6yioew=<ewY+Em0<+j?@4*{IOPn?B9hI@~D)5ntgtQ z<3<18?8_oe61p;WS{T~J_qf|jT)cUY@S4}W$FUZD@E+dYfWOEg9e%XC{!=w?|ChP% zAU|@q#n9vZP>gzz@cQ2qWk)Gt^sXg&ri@<eOVP+E{$+w{?ncOcJJD$qY87I}<3#`0 zo{9Y@VTF3xa5XWD-=2v*SqL6l@%>FTZ>9w;mHw<%_(xblH?sJPO3MK=5YnLs?<AOg z`kN|tOz&Rn(<7%hQKMQn@@rKD;)QF5Y*_5A+IBWP8!Fm$*=|G5i*Ko{$zZYIFZIJ) zEn9uxy}<DC8#mjI7Vf>!9X#U-?chE8ep8jswq;ZMWc9gs7loojWh=Z}NTQkc`8|_n z4<`fB=2idA>L$wQ`RW1g`{bQqzTyPQA$aYkq&u|1R$O(F(gHV1x1#t`t?MADDoGyi zyNf#iO>l2Q<K=11kU_zz&mi)Ga9uy;{dvNcY%V;dCw14>qz8}j_i3XP^N{Jjw#FjU z%x49kdv~Mb>%ly;l2E~WdL{9Og`gHZ+u_JTW#Yl&b-si;RUyq*FID^GQlFWN+7xxu z51zb}o@%WO+L>FT{vk5D;KbvhR>1YpR~4~IPB(^ll=NugX}5jKYVDQwnw5uZ_P1WA zsw7osCKfzzd;>#x1uY$GRf(y4U+6fnDKkI6r}|?q!OwK+=E~^-LUBC!@Du0#({1p? zlW|<UuZLHnZNtjF-Y<vB$6F6)z3{8v(U<p(C&Z@lCU5TzjGskch&-jTp)SR~BG*aH zVe{tw{_gcVkASAs&s$-f-x>Q^FDegQ9}T9xaV0`SCuNVvC3u5n7Kgkh35)p_>Bcnx zLe#W{j=*`TMvN$rZ&x%PS4BCqu#@8%=pQFp3j0v|X5h?X)Dk^L)VTKsz9-05E;!=i zXba!(I`wOIZi)+D@z94{UacTmNcL~l|44U-L5@n<h}*c<g!PqnYoy|)U6(#*i$zyo z5`}5ZVObvXzRrMrng)_cwNQPtXkdo85KTwIrPU)dphr!ea=+Y)rL;hsrz}2^E$d@) z5Q9pR1R{X76*<s;TZ`RaNIFM<1dz<Dn>8{iAuPo80+*p_cPS;rebeq(@3<vJ1HsWx z4kvjxs}U7g5u?3XI56!hHtd+@9X#whCJxYzcUWZqAgm*+BsmuKrXrhKmCt^pdn`7{ zJcly$n$F5+BQhP-li(I!@{bw#7si!UaVzet8q`F2F6rXj<|8)jrS)1AHj+>7zr@09 z`+L121;VNypkU(O&1+vPQhdOx(^~H5P1;|CpOfH^oY5W+%@pSp6kf)0X1u8REaiBV z%>on0Oe!g%3f^um%zNFH*}uM%MCh-eA=^kv_u|g`T*HZav0iPzlXx9of;D1r;IFj7 zf~@Sa-jxrHlPB#xyy#nCrZ71rdti~ps{a&~N;2w~C+5=1DL8kltbx>Ju_D+V0NZM6 z=-Q}zn);xKuRzYK@Al@iHAj#h@tiqU4N~UzXhY2R+UvH`5l_a(B@8_rNdCsF{F<WR zj|c(Fy4-j!qu`jUKcp^);}<200_-yAI2P6Ncj^def@gWmDWM-G^>1FNDC<9Kl1*gV zOY&!p;h^dn>E<xvVd^ZmV340oyL}J>$E;x>@pG@@>ij95+kBF4(VY!}b5(1us@^vr zekd#zIda2G`kQ-a$VR$d)@cP)Lzf>$+fX&vT4czuYTP?h*YuST5np5eKqB`DyPFf^ zFV*sXRC%$x-_z#K4Tgo?(g+~GQFWZv$TEFPCXfv49qVwq%>3?6?~2mL81wXn<LZpM ztw+@!)$ia#YNlO~^w|)$gq}}3=^kytOE>qUfTojyK&vsy^oH_JqQ1w&%Oa^n%($y! zPnt&DimF44ZGot$a(qK_#hl&yl9gqiOYK}eTY7QF=Q(f44zSkeU(!8rWcy<Me66KA z|7I(iG}A%r+#5i;C#&<rUL(6W!jr4+xQ;3xagVZ7pL@nOsie^+uSzOSE+<;6UGMt# zK<7PIPcG|Kj+&;S0R!JG)ABD;Q?eiqH!PNO{3Q)g0oZO2sCu(nJF1C%%daf{<ideQ zq^4X0HJ9tTFWEC+W@b=E?|sej<d&u?qurrBR_@1IpERUUcDB8KaZ79;>71Jv#CR)+ z>UmmkQzY=<=|wco+TfvNt(=exI$d8uK(auGNiq8R$290ok?6I)$M$cdN8i;ZUh!;O zojG73+E`m>meUx)XFHpHWWB*Xr0;HAUw5reZqfDv07yQN1sov%NPyA*WU&D&=K;`i z2#D^26eKLMoHWLP>@vL5_$s6Pw8V;)2#t(7H%iRw_SGdQJMrwjOn5ohidDy)P8;pc z*BTupMAz8Ytt!Zun(%U!>P-#guG01ETyLtb4-4I77`j3s(>Ru-r1RaN!hMtUc!grZ zYhXg8X~Z*oD$?t6-lyX&h<G0Poq=vzJ@jWt44O2c5lqLL;)LnO5^JG>&>gnWU>XJB zWmG6xeF}i|jkh%yJhNdWx*{Cq0AVEVgfZf7qhsG+p<wJJMxQUQW6`KRQkx}~K?R5B ziGl_W+ws-JoZ`gXrysg9(8nBAz|Su_PN`E+MblLN_0p$H=P$~%P^SP{ThUNi0Pw-g zO~f^uO;?pCt3K;pb`RFh7s3!lu2<P_iPp$mNe%bBNFx>mks*sRyszz>Z{f!VzngcB z$Q{Q@h6LKC+%46H21Z|{0o<#)03<wsxnA$5@){tBgz=+6PDs!@g7!5IEs6xF;Xu?# zsHBD1>oqm1aVWhBRM{IMR1N$hB~0O93{L?GrvSRs08&VZsI)jm6)LP3z=(wA)d4Kg z;2|xx4Q(;o3&O<XP=S;%k#3QV2LB;*F~SwwWhO>Fe%YDNgUsYA860A50{zx!zK-uQ zXIun_ug3&z`}@pZ_3bBMqCx!WpreeiR#(>>MR!WBT6;Ll9))>srG*;QYrl7ONon9n zIkX|Nyga?CMG@n*psDbr{sQ}fA-9Vtr30ATI*e)&K(q)F9tfjdB&ef6N&avKG+?vF z>7)q7fP}eLCAuPEv?juEILsOYWfX@wii16HAUzBej|Fj<K&??A*%S~928uvKjjLeX z<4~J%C`$^+#so^00U%tQ!rl<;ap?CL7&Q`N=MAABhnm5`HW;W87GN|E-5r1_qy5ar zp>|jhwF%VD8ze=jO7l*$0RSz%LB=T{<8gp879@p%x*t)I;01u%<H=GeHV#0VSQQXC z7)f`WYUBVgJEF6J!<5GXbeGapQ$VNuP#YqKLn0rMqWk>35CMlY;YF~37FxE?G;$`M z`I?yPqxgz_G-BJfj*;`s;uimTgECpMDp!d(bs335@wXar!QnSJ_q-^@p}mZE*~WoH z0LXCWT?TZ5AUv_EA1FI}RlgX;iiNqRKy)2owpbt?CS*toMo*A1y&=kQpdA)qw+L2= z1v|qZ=E@R~*B~<#$OgyCgo99)LhNv9Vs{`4O(0n$v?dF9eetoBIE;J|EObnzyqN8b zdqDUAkeEPiW1-r(6uU);g&YjN2+_tt-0(OM6&yx}gD880l*M6#u|RAoR22?##8Hu; zp~{OuJ~UJc1$rX@6@bGCSY0LzQ~(KG6ad<ILo6Kto3T*Yl*f+ZuKtd(?dh=;4k>Dc zmP$-OUZ(4fD2I@@uAv!m6(yJ1%`@(4X$JQNY8M5vuUstU&9Iizbib}z5|O^f;}m%i zzxEMu-Xznr3P44`>{VsjE&?b4ekqqAiv3O}GQzBwL{R|v{Q$5p?Qu~lL=gvYb^!Rx zMlfPQcBrSY#iwd1xpp{KI1+-#rAWzvw7m(+CBzI45?+M7Vgg;qfz+^se?9=^MF`>j zyrXx@IXFzkG6#=K!s9W}v*=<39EKjsxsHTTz+o`VlksB=nK;<k1S*CFI93H%V?oh6 z7&r#1hJ+AE$>bQQut~8sx)_Q}u^tD!_>8e6ypV%~y6WhyvhMSNomo&I0SBOzHw4Uo z)A_Rudz4Mag^T^4d`f%J?j&yHi1^;!bg3El>CW?fHu-P;L+?V|&18J<TlvOCJGqM! z<;}tjQUDui026GOEgGai<jijZQNe*V(IAqPfQL+=^w_L<H(2hmSjQxk!W(jS0hYP} zwuHl;XFauoN6m)<EmJ@UahL!aihx6uaUdISC|4DL5c9uw0^#;9<`svrAPJf}gv0xZ zG9CjVLqikFAo&|$u6vLzYp5DY*>f8JlK{qS5ePYf*kE(<I7p;C%t{=l_YP{11=1D= zU5qbs#DQe7WtKQ9GlI@v1q6|#S@1*6aF2TgpoC5r11kpFxf{OPu2A@Mu6TfpOicSh z-jq!Ko>`#CY}}oQi@^t6Re@@%7Yi)F?h&g#B#i}B*gO2I0Nxa+xe1UId6Ni9Xnujx zdINT%01S&DQ50}`-D%buNLvN9#WmYjK|f>)6G{2^@B*L7yXrH5&~HjgN<;8fz?DNP zE+oSs^?gu52#bS_z@pT)mCfpG>)A4JJ6gncHe`uIc*5#xsP)xOqM$lFQNuY0fHe-} z%nP(!1$NE=HiSF|-vL<Sqr%RE9`i#f<xID)g#;kVk7dfg)l>5=LIlLKoZdRg)fe#5 zRHQx6Kn7G~_WDaS!-eB+F?4I_N97mq-CAS5_}TsHgY+7fA>Rk-0H_0CXXvW9D}WRO z0No3}wJmm9q)3)mwWJEV&luCCWy|3J<PaDB)+;ldCS0K=yxJes9Oi$PuhKdx)?@Z) zRh!K|qx(8hFBeL*(<*Ac>ozvO*HsoY+|`Ru0jX8p43=nc)nc=)&)bx|es8uR<eDuh zSKvp<z~^q7w+GeCBQp{v{O>NMi|(h>%&VIAHkz7CaD0@`TPn}O^ED~P83;xdio%=- zV`s+t-jZ1hWv9r=_n>>$w<)SoKk}>I?A%snMRbGwyC#D!kp~lnh7e2mcVAW}!95RH z^0xl$BpNyV+S-|@b%2!IAW459YR!Hj%DuCMi&LY(-!eb6=rW6<Q{=PCnC^gatx@ZG zKd7TAIfnwQbJX~J0kvv;FRgxU>*)J=&A<r)y}n_L1^D4eY<#r=`Pf)Y+B|yAT>|QM zSCLEjq@s_tGb|y#OW5pO2DV+e30Lbz8tlxm2y~?996a<OQ<@N*8740GQHV>=;~k+o z?Vr<&7ZNPcPZj9Mlb~_6+6cQG*Q-6ubB!%i=13!s5?~9#yN<rj_PCTuFWPlk=KYlG z0o6@K->0_~4}=?^?zwNgyeLCGz`=HTXk-GCIFZm=u%|I`ku6>F)@v)z2_lgu=J(k1 zWfq5YUP(lq1{4{K<!bIfIs|@n7}SS;+!#3*b0_lr6nJ%tU$9cNOZ0HY_s-WT6x&p5 zjP1bgtwWDDxji%Q(kJysl>wekRc;cZS0};mO)@ULCT<(I-RFj)YjP871`!Bo)wpfq z+ep{9tifjZ@2|MlCX(5>+IPJohu^G}g|16!WHRIj*o}S);+7%+N>IQ~ws}@K7`_CS z8qf0@vEr0bUUq-8t!@zaeoijG!uRuBs!{=K8~O(K>mvN9d3-v6WgKbLMPw@uT+dmc zLBaw7h(KgjmR5Sv=s-!^`%hf&?iTe!pp$6fNy&V>n)fsQ!Z+gfN5a`gIfGm;tO4)h zs8%YtDZ+@HFbkh^Ac0sSs!I56z|C#eX+Og^eO#4o-7{1#9hIHlvp;N%<$8O^wg8f2 z4^#TESmAa$yJ*}+6zIJ`s|>t?Bx1@X{KXH9d>?jmCd9lx=oc=B^nEzI${u7(Z9=#B zjn};)Sg~oe^X|)cK@E#Clswdx3%ck9`m>Kjp+u}kqdW5%YdrZJUay#rtZUg8-!RkI z^0FG+yK@@OoO?eb$gvo4x}0IRA{F9%UX(|+@}m~s0VaoDP%>JDB32q~(V9jdv~%a4 zCocE<%`p3{Ra6IBYtfjt&wz}U>nOxn$_t3SMs1C#Nhde(iyKvE8#U*?+{F^rg?y>c z{nFU}rFr2?>)Ds~bDLP@%`W@Ro{-JH+|7aZ&7p<O)^lIRmA_1GZIJJLqQN!OEi5FR zQMrap-8d+BH;Nl$lepP#>n*CtYqWNsl{LE^5l=KObnct?)^hsS_nAuTG8fmCJ7GGQ zth2Lk0CpTm1qZo;gWbmwKgE%D;K)DV$ZkSzp{b)qSL2cvE-!vWiLS`-T0hu&{Yd$a zNATzGwj+jKSI!byVqac8kJwm0w-chg_&n1y2;X$QIcKrCeuHy@NWNoN@x!k2tKA?h z?1%iG#+5zIWQf+&J-ruuIvsmP_&pQ$eKVDPi!1w<AND-PiGpyuwjcJXLO;@+3y&9F zWk`a*_nP`3`es>F`J>J9s{OKP^47^I^%KwV-n`EqJQ;fJ%MZTp+!S*Uu2nctetl%` zd_qZW_w>m26-)~Y&2CDxMMHj!K|!yeS}716T=S2!qtxW%$8W#oK84`nxOB1OB0QB2 z`lRgXNqNUf<%g3h{7DV__ga<j^;f<(-v8eG^n2~olQJrzIQCOT{Jvb$LekR(2IJL~ zb~n}!+r@1*BFf7J${Vxqr$eF+alI9FriWAbk@L3upCvkX2*3ClWX(L}RS5U&hSqMd z^Q_FbtFp;QUF@f-AC8j6h>kiEk2>(*U*G{8+Q^Jh(DncazeyfS%5`r*E~Y;rl^ri= zUz>^esFlbj7qZ7ly`q!Kqnj(8MR+O9MZdJSG^M?2@c6vv<Y|Wani1if8j~d+8lQ!s zNn89JTMP_`8sx}CZah?tBC-@xY`ja?6<%?P1$D$sFARaf&y*a{7e&Hhp6_ZRTP(ch z@89~e;EA@nY1|(C<Lq@4l5gt1A&^}w+j`rnFOf|pWMuKF%aA;edY|p3m!Dc6d}_{N zc`V{K>B%lFo5Q@nQFi%xd(;nRFnF#G@A-jXNm03CF9hRr2m5rWrF7HCJ#`fGvZGuZ zkpapNhgH_bVy!al74LO_#-{|XvDu#n?kEba29ekXkM;)Pyan6~*XiYgZq2>e#eDWW zt7UPB5y1j3U8bmQ*5eWpg{oW@EFO~yuWIe(d|0JMCf0+KC<&C@tRX)h64Gc>b9r6~ zHKz5ftUD(wRPnm+gjA@~b-qlfoV5fS2FqXGE``By4h>|pT-3ZWAt=xwd%DXlUG7{D zNj=^N4{r@->zs(|iwK>DQe?(iBugBkA7k?JlWN5Hp5;2d>@T$+*6U-wT8=8OGGck& zOJ}+=RXMH&@zbXyiPtkxr_y|gmmozXn!JR41XaAEMv!kyPmyYPY5|>}RCJu(qM1|^ zpQYK-H8<9zi{&=ET4$Nl9!}S4eeF@*MVp&-=dEl5Ue{UK-`_uP?Qs2vc9Ll~?QR<; zfuA!L(_SK0e0s1uU5}UPO~>lLlOM;@a%iU1X!CIeOi(dY2%FxXHLUHX2oUtsN38YU zFw^a@b2p}ceRunL?Mk6fAE|ebY5zH@GYK8?WJ_bJX!a;sr&zwCMyGhOK3V6)3#*OJ z$qGrajvrWAr1(YSQeN>ZZeHG9l(}9oBq$Hw8q%y0))Wy@np$T1pln!pVZB9?yZptu zx0>?T^F@R*<~tvU%ynrE2T$X#1-0-{+-UIbyNES<UPmz<sma^o@$!|Hf@j^V>phpW zM|498B4PR8o?h>)r^i+jSs0%8(g)w|oTT0J*cdJJm)|a?vTF9}@BUa_mElWmpr5x^ zH|wsv|32$Vtw*-+SUKs!_SJJVlyzP8R@d5Y&t8en@fZoY>z|KFDsvXdc%N{`wE|R0 z^D5hF^K{|q56DCNZO&rbok4%G6Q9rb%7RXE73WFpdWEE0uYW{L&sE?g-aj#K?Vj=6 zd^3BkBlz%x_JPFVBF)AMrboOW44N*FpWAVqx;O(UZn{Y~c8{pX{tn};(wFn&p+P=Y zjxgV<O(w0dl_uMr_5jYY&%^jDl4Lnp;`D+^)tmQGdhfxOjcW8|DgHhLXUgEP=0Yd0 z5l1<CG*GKm2?5tc>DyzF3`%5=#Y06j@+TP^WFb2%F<I9+BZ3BydXXj4w%@N<w)-nr z^Gt|cUycpNu4_uBn@a3nzG%veB9P5rsoWjrbn{*n0fr3+!ZsIZ=ssx_NqFCLg}6kK zexe=9GP)HWWEChG(<C5R60YEvYU2iLMKF6rnW)+!2c@(O{dYpeEV!Wb4n05ij9fct z*j{0G2I{1Dj0Y}ruVe=d4kGlDb9=73WTv<A+9%&LEu4cn3Sfo2MB=I5a4s|-4N4TI z@C7o0uZ)jJijH$+%;LGZnAP8ET{sa-vOK-aW+zaocvdZOPVicDRg)2krBP0;AA`IE zqXu=N)D;C`d-pRswONZ^AQh5LK&rG$UKk)Cm)EWO#e_&{IxmYtiJx5&87W}`pt>6a zHakige=qznhh5WVFpg8ttZU@y#m))tn-}SI%AN%tjIb&lcCpAPQRP0aM(W&t%=p!i z!skvcpM8ujv#_f~mc!*D@R!BVaC=9XAX=T(z#BqcrAp#~LsP3^CTPlmRB-EX>Ow3? zk>8P+d%cUr8yzmaIb9Jpxys!1Rz>!VDtn2LzFZ3Hw|`6{P6jEG&pNu;#Tg~JEnMnw z>+WzzPg?5TtDo?c(ZyzOPNgt7)^+fgs?hg~oglomI{YCz>b@Tx(G7=A6>DtNeOxG% zFQ$`WZ#+^W6F|Xzq|I0+9>He~B#MNJM%nZ0%`sL-rL!>#UN0O<-zbm1yFXRvGRM?S zzg=}9n1Q2!!FEg1v?`dq{0g4axEuO9&X2oHB5^}&j=L`Owl|7-1{X!sx<q=Bu^T># z0!>${LZ4j~VHdB8%C6!7->3qxIHkZ?{gz0Kb<`P~6&$xQsUTv97Z<+XwZe5ieDQ(D zSUy0&o|J+99*drEG_$%L(F9Gi${vRM(K}-_=wSp%b1C{{oF!*7Q!FqrjM|8WXhFt; zl<*FnwF?iA7CkL^EH@E$K6ocWR40$}`Z|cR7DFV!&q2updwIHtjbeMW*C=BoK$$h% zbgxUgSuH-n$urAZ%_ybX5%w}>kgRSSHq)xs`<(Ul_l|;#!)+^Xw+*Pd9<;yV=DWFA zLC<U+$w$649N1Uuyfri0oSxjh4Bn4dnYZd_rD+Xe^(YFz+_naFZHX>?HbL*(#1P;2 zOyX=dLFk6F{$uf%`A&Yx;fW8PoI3YQsMaTcM@P%AK=}F&s*QU1E8csXy`J6D->SMX z$(-z+cH@!&6~|{+q@b}xhU#|xRF1hv^rcrzkBS`;N7qagN-~S&T=SG}uWxfdo;W-A zh>%h9z=sjFyeGOjQuO)mh+LFDI`js&IG*%o+-^;R<(pVw*E|!cj$6w&?q|D|{TuXR zH8bK~mE4zUs%DW5vl*v#8&N-QipxFG8Ta?AMYQjB)NU4C<7HH7s#*0>KV7M|AkPtK z+#=N@gx`XjC*><q?X4}@reE|6*4r{#ByB%D)q7gv?X?^Fv31d<_|91TsBb-9b187D zs<>0&eZSUx@xrr4c2(Ql>3St~QP~Wd_oaKP)i#o~{<~p2P2KlzJ==zRqi@*St7WcP z2a~hhTOAGY?Fb0rQ@-FelJaDAwvqRfl9YT?q`#AbQ1Gqj>}P8TuiIwo6*3F&nq&I- z`h#BLGk~XBwVSk~M9X}4cik@pk{x4+ZVWG&+$6d@f9P-3JbNRXxK(N9`crJ10{g32 z=~hEKs*s|H0r7oBdAq&dBWBIBLcX^07a~vjwGW{MWOnV{LHYQUCDnqSEA2DQ$?h!J z`|IU1&HUd>>f<NFAHAiBF~ep%v;!1NW=K(B2$uLEeblW?d17qR3HB3BCy8yzqhliZ z@s6Z2aG_2f5qCSSG>WknOSOk30V~;nnnQslAz`iiH=a#DuUk>A?q%wD+$^QF-42_R zYJJz<iAfv`>_SGooWML3J}G|jk!tZ>+O=IWd_j2RiP}@*ZkqCN*&{W13|Pv5|F9$+ zACV6}Tnwl4=q4D2@`c^^W5Oec)G4LA<!rO0G}K+=)z52?N=x_1D3(OHcgqQ@7Y?W^ znsjSwbjxLHNJjL?k96yusw-@&i)Z)fd2|~@Xpn}tyEmoxJ!lbZPQW0}kH&QIO4o52 zbQ!2$;Pk8G+&ho7Xq$Sc+W(+6{p0zecR88&Uc@(R+yJRRjR8x|ml$Yhv<&j=&}u}f zb<4(d)9iJ~x|Q5Vhs&O-;T1YzLE&_)J%m5ztf8ue3BQ017qd{0a4&&n_lPNIUw5h3 zYAsP}?TefY_o`)~3JMoX=+=w~*R;)2bkWAM^gk*E%Lb~;n)I*Ud(IMZ4)a9@KN#NX zeM59FTtICoe&;!vZ8k^X^#_+$<jkGBTEn|;RnxDNa=t3z6w=`RFr}tCA@?1Og}JDD zk93gisVqyWQnvC(?U3NX{Y2732|FYhNdGfiWg6+eyy?MW4HQwr(AddfacfDLZ5G4G zP;oYP#vQdPh0WP4r%TX7NDpO43{_0)noTE@gW(q0?M*^*U#5gwO$S@L<sWReZm0_1 zj;~|OQ-p3)IZ7hfgA|9$B#!Q(Gg$hL-w9lkCy!3m=@{XO%jSr$EkBpgdVjfh1i^bj zLS>i6V4Y)7qif_gr`&c-Z`)q(89(dU=VaPDx`G<;tRA&_;+EHYhGK%6cw@QVn`XT& zD>{v`Bi)6DZ4sKv-woG%`8pLwZEi8Wd-HUz>T!>OoQ2EC7P%IyIU^mjjuACi$R-KY zr9NhvOxzuHsFQPW8h`z=F^6M)%|qjw`Jw$0V<2~Xd&(<u`B$|0*y~)cq?V0=5bn`( zqlqu|upb8O8f^k|Prt0Nr%H1UJLImp6wegOV<)9P+!*{+uKd2+aAC^u@une>S%1_{ z-#th-%$8p~!BncXgSvLY|Dmb$d<kP+k+emR>&pp75mo%h3C$4_DaFpPR_zua?Q=Oj z_eS`QUD{>*GWX`y!!<hdR{Eo_PcpI%NbZryB}|B4?U4vJ<7k`E+?&L6la9@0>n|5R zv}8pn11H|0N4KWNxu-=b>r65gQr{NF-<xFE@*DSRkr+uEf!)fy85Hj7p>caeUAD2r zSffX>u-l{%tlJwNW}#i^rtQ@ee)V2Adec;SK>b?Jw3t+Po(4Y>sw4e>C^`>!D*rc* zKWEw;dnArMLiUzpWn^zM4zl-_&@n^Vdmnpdj}RRrG!!DEaFD%)Z&IC~-*r9zz;k`Z zb${;r{eHc<)q*2NG(V2rpB)ot{eT)BaUOjmW2o8bHI|@Lr=2omBxU9qF%lxA^(<mU z1g2Fp8|$yArsFkRcQ(RpY{>E+IDYi8Gi+)q0@3e>=-x4zADNQ>U{V79C=~rxev@kH z;JIJQJ3_B2UG>MPC(<ST+78!>a=L1rHY$la27hi@{y~{kz8<IK)?r%KQPDMcVETpQ zwvN+}Izk2c7f}i`IJYspX@*J9vdc!L-`_Iek#zNIv%6lxe?0lcY-ge)Efe<^nj`Yh zgNzKS%mUOaq$B5LmRr|<BoX;rY&9t<>REU>wp9ttdw)r?5SNei*Y%0ib&$O6C`5%9 zRd5<vO3?0)QM-px7%ZriE4p5qRO|m8+udR&**qXeh)puQEvxZisa@q^?DLT)&gEX4 zx9bk|Q*7S&Rrgm77;<s9RSfXHB_)4@H=K{_!Cqwd2XWps&uE=n3hB~%mX~@DmpUo3 zGOj2(-+td1v2lKwHnsfyqu#@rF6+j(JS77uYn_cW)v9vdV*HQ3kJ%0ndDoJ0eh-$j zRx8ja;FLJ~_L*N9k_`x(P82Vx=k)drSbv$bdFpBBsPL^-uYXs#d%x@Z6#chP8q52) z6<Sm5I+(xx_`?0#IjdfD#Yf}0G}j7^%J<b2DPo%5WgelCE_?b1HX+r^OI;~%Vr(L^ zY-B3FpM<S^DEUV8s5AYFrpp<<=S=m9;??x+<)e6f#9O;lGg|}4<=5`I2G@Cn0iJ)G zX^?hVm6_%1N&C`7`QK*TRlUtyyIgqZo-)|5s@`fH%%I;kzhuFpbSGB!rtCw-a@fU6 zF|Bjx$CCbV801%YJ7wYebB%4IZDhxR_ee%yY)PnQeOP?84rPB!WcIRa^1qxlm1qYB z5g`IyE>dbN{af`5iy!uc;HtAWp|S6J=hJIrL$Meei1fthmEeffgwvh-8zoEVg9wv8 zFU2G1S}(s8^^tvc6XKrjhK}@i)oxb$J`w!I^9`GfTQ0gkG?+F^*r-3^Ope~A8Eu+v zG40o{)9gFeFPMv(ulk!PiYKgAkNlu9*|6(=v|L?!8n*H6`NnCx)YubcBFje#-SgyY z!}q!DONbws)@*rnZ;=-dd46^A__XESjUqotar^36;N<8GX;zD>q%?O?eVJVPm~1-i zhpaTC6{nni_qOe)%oT6ek*u|c^7{0r=GM((Mn1F+6!&J8@P!@U;Zf*m`qkqBbb%qB z;H1*uG-r44_j`g}|BTWtm84B$@aEuvbLBf{wZ0lKZu{-4?VRQxX#KSjCYM}pm({Ed zC-Yu;yY1l88_w_arqV4X^sT8wn@$de&o7hKX$wwr&|Q`IcyqUk6`CNI=e@J;!BHu< z<x`X=`>;2gVuK<VzMuUG5!qcDb@a%VdnKKB=L?5(gofJ>$X==lelHSV6J?hu(q9?k zk!t6*Kj}ExWk(dUG9$eA>{Di1LP7e<L`DKOvj*9A)ZChTU_bbSWOvUY!AYiJx5v`H z>8QK->#jm`3TTYHE6KBUKrSWW+Xu5-ugyL3^LL0#J?B>TYf8VhJ5%+4!jot05lo=o z&QWj7!(E3LJwgY(X#PD9E;-nQyG)2swU@GWq*`<`xE<Sgvb%e#KU^Pc)!q7eL=8PY zW;j0KJw6Rl`6+UIe*gGl5GCBZf4_+Bl^)&bzx7*o2g*avxL}_nN1v^Pye$!_gAuRG z%nfr@mtWV1;hVcE=7s;bry!9h#LrGh@=i!=Psn=wNMy1tT>4jPJf`4dS;@9xB1iH{ zJ{8`j?~i=nyPW2&_>N<Ib~AhsB*p7p{$06CMwFi!xBVxu$5!TEka6G4tsiVe&EY<$ z-2WZZ4r1@W^8(9kbvCzQ;QYmK|7o9=(r&i@5)HVHMW|W=5L7->P07B~T!gWU(lEIV zI*T)Dd;hz>4h)5-O|hhqmLvFpkM4UPaPILqCRQvg)|vd=+2+19QdE|xnVrgA{5b1R zNuc^_J$+sf&+3<aHopPZyPMeo#gsqq_-=8O?+i|iNHN7qrniXkuiv{Dr1kWUsKE(> zsE%%t>Yso=LO74ozfgNV_{#ZWJn?k=@p)-$p~kp_`m%qSNao%5$|nDCB;U7OpIy4; zh4>s@xXzT6LCzG2CL?-3odpJsH`jZFHrn!qS_aZu#GP5QuSBeUwHQBJ{c_eoA$uKo zS^OyEaxC=X>wgj3|D7|a_|KDA5WJsqni3%>>Sce*Q}hOu1xXYAqJV`Gq<p>Dtn3{L zwTgG&C~c>7O?&^cx($VeX%P9mZJw$HP9DApvx@j-;}|B>^P@~*bqSk$U=q5Nc!4?6 z4<!Vl9~6DL{8e`R`59vvV*cBc<g1s>pH_pfa$N%%?XUDnFK5p)o>~Lm>^rP?-BRv) zQ(BP2pZ*S}dF;qHpZVvK^Rpzw;--;@&!*k)?w-|b_Th#O{i09+KJ~D~{-lkXs^v4! zg56d5XLnH_`-0l55n+*6q1U4pr&+GSf_3RoJjukW>nqo$SgX|rzK|En<xY7B|E(i; zqQ6s&f87Y-Wv?!$zPKA+QrYsJW#9cv5xhI{_qfL5Pu|^)QJz0mwJC(+o`9*S(3vRm z&x~2qeE-((Mx_&l;S3^gF&M>Bxtu=#wM4bQs7zjK!2+ECKF9t!BoMs|Ew0mie3$p* z$MNv)t%%3}-CNT<Z+-LA%JpwjXk^vtzv6ttyylDd|9s8+SAXRGlY$e&$^KE>AWyJE zam0**tg`7y^%!zq!ADb=bqEpjZNGz^46cMEPR-0m>B!j9L_v#oFOoI`_B?Tmy&<Qc zyq}8YLzjwofASgTiN?|hdz|ynROvW>eT;79o`o~r3;F0~RvDYbsA2x7^^9YrmEvvq z-|Z=(r4ElT?Y8^fn~O1Cc{49P{}ZvRCi!=G_<^xvb>Q(+c{;b;g9XB<^IAfe8)AQM zB3)S0@cYdqlS+VyHg5MyVrQ!S>h%?N1F|>UVA0|7a>JheUWMzIX7B3|-A{d?KL?+0 zS8T?Ui<`!KecyAcC7%|jJo?`HeMRUm4ITNfmh*$9p83dI7Mr2DR6{+&#|&cOA3j<H zC`}+YMjKgWjDrz0f;S4o-dnIQzm+jfhvV$gFqSa1iNTsors>7)XF29v!52B|pXEaH zZB`0o7$2{{%v(z!N|tpDiT>-%nY>W1WgCiMJ~s&8c~_P1M6SqRV3uu_Sl}|SnM>ym zA|*lVM5KptXKJ%tJbYn5Ewh@Eu4J|tun{>|Ww~#)SQI>0@{8v=K_^*`*O0}7X*zeU zd^a<c__hm&BS*JPwbq&3!gM5AY888d;8h+A(<5Ti`&9Djr)8A2UDD{X6nSfOOt`r0 zTnW`{B8L>3WOa@ge%7zb3pU-~In?<og?p3<G?3OLQ^!Bft9>-Nz?5UOUgs39C|;Q7 zD*X4?hK@?j7Mw{Qvv!|q{1RhbQN#1QsiK}fNw8~<a*VrpBvPHdhi)-{GuO?rz*7DB z^4w-{W3z{FKW8p!L*4D>E1#k^X}Y^FR%Qff%tO}&c1!tB6CSpR{7qUakIyVWAyP`G zcEeJU3GTGdbUzUr)6gJo)yV!`M4fY-Q-!VHh#_k!oPG&od`~!W`O_Y>*Dm<8u|+Uv zs>t$FAyW<+K8&mR({A6bAy@~ukcSU<LlfnMw09jgi88#-<I8Zw#oWSJ-Am0(mB)tW zKN9vU-j%54Wlu^p>IF7h_Ahe|2tUo^4J2Dw4oKi#eb_#Ds5jg4=F(r0x=ek9cWEu@ zRuc=ekK~}}=vxL)ex@7?{jRsZo-0RVfQ;pCb?$E^`9$<$|M%CdW4C1XfBF0iH}d*0 zDBUPt{$z9aZhOJX=kFeLl8$Qo=AGVJREsBA&@k_<(@6z(mV;K$zpV3b<?w<2yOG4D zD?}hOiNlW1Y)V(o?<1qWBWs*xu0#7*l|Ds~ZI`B;*zTcA2>|1#MZ<xyb7e0ue^%`6 zG%M95`pkbsO=q?*12ccKnnm!*|9L$jdMCCFCh<t{qP!*6b!n1`X@UPVz9r86K}O?* zdA{W#x!BEo`8b^6^+)8Ch?*5CJFyvV*0f3LL;F&`5C3oz$ko%JfvV@8RCf$|D#Tug zgQU{3-{dhmG0goo!}R#zMek>hke|sbKW1g>7CzfwWzGJBbE#M3hbVj^xL7y%$L0D? zjXXO!$5`w5h*x$WhBu(!75~&|iyn`3dB@3V8`8k|CpII@CYg@QeV9*woLer|ge>+( zwm(S}mP^e>VECm~{oOzNYav^B1LIJtr2CU~QhhK3%?E;&@yvtF*VRk9a--^JG^U51 z?2JzZK05eJKldoeDh2bs8mi8)sDR!CwsTLq83z`AZQ_+OFw?QE&`Bd(=Q4wD50H=X zD8<rEAgP!?+K0E699QIWk%&WlnnyvxLp=BRcJqG4^W-MKd-S5og5Dq*mhBP2s}$Ql z87EDeGi0>ceXyxRUszSqLH;0EsNi$TOlo;ZhN=;RS~L-PO&+gQn&|vvEeCOE{zc(x z%t!uDF6-4#Klcmh2R4|D3eQ$Lo$*HDtk_dQ#->}`H4iKbXR<D5YQMQ-jAZ@jQjMh| zSi1Pl?>3}&mgr+kve)?BwK_{OyP8~hN=*zl4ck$KPEXd;S#^o<>0XzM2D1TA;V;Qj zHGQ<s+8ToBj3tKLF-bqySz5h|hK0BPAazEk3x-4%rd>=Dts^$|I?op^2E{Kuz7E}S zJG8dwn>h=~Q~%uEtzlT2)YZ{Ew{PtpG@ACqry`PB*hi)D^K$rZ7t;g4KDN>Hy><7i zQJ#aHU%|B_BK&Qka*f^*cWkR=ySY^_5+C(5eOzPdc|Pu3>(}wCTkv-fs7!C(C-^z% zbY@7W$$?;YU$=Dv(`>=i%gLah53?7fUApTB?CuZ+tbFV4!R;!EYCa+BxWmuzN~F*& zZ1Zydh$XN8pt39``}vy!Qm?T8QktXG6tng+fAkU9tqfI@wROoXEIaa2{C=-5i4gD1 zy(UB9QhXIPE^6`yBHq2cFF<0CiwxF$xjDCXPw^HgHIYg`N<6z#Xj8!CCe|XMJ@M)A zYFp=AxF7w=M~tEcG>bXU$|ui#v2$^fC3Dz^jW^)|r-@65Y_^WwS-}lin8x6}z&{-k zRntG~GEefJd-@1I&aHFhmV<(JoT<~^GX9uJw(@Qx{SMiBQouDY`7RVrk;N#yE=)H5 z=HlvXNzislyd&H;jp3pm{!yHCDD0IGZ&2t))7oahtAyYy$x;Vl$9vC5M;C58-H>xl zZN4qNeP+&06ew`Oy&1+MJ0?bFQFW*ln>27FMWCj=Ys(IM#L@)YJP%Z&IQVx#Lgk4Y z={(0h%ibxc46BQkyy@;g{`~FTbX*S`_z3>^!!<idhUQJJFs-r0=&Y$qSA(h2uDQwU z2Xcd#%B?p8n%<?{1?|O-H~soHRKN53{uMbqQTiJEw8qE}HNx^0lOR?Vz2(FN`M95+ zAl0fu<?mOF{myhgPGPe{8~FX!JIu3`p11|;As|w|0+X69^hv}F^=|dWqO~$KV%t`G zDPJG^JnQe0Ja1y<q+<xargvRQ<Ye@v#E&#x+b_iREfjMDM}~LYSHr>}w-*p$@>6RR z7=i-p!qkFvA86%8PtvWmzhmPDY%7a&3MvGqBerK>q;d5L3O%-mj2)WXhs<}Mbcx-q zfbwH5xOF>Yd-cy`$|B}X9YmsvuRU{nSY1FCe|?Hq#E5j4x!w|qwwpA0orpi|sNTPW z_VQvN%3}TnR~=aFNc-DfX1BpcB^({-=`M7;OfXnR#`8(l{Q*ePailnnFW&cWqT7o0 zzfAu8d9v`H59Eh(HTsp_WtZ-&f9SRBJK4bS`}=yC!i$#ZrWc%MxzJB`*XZSV|HV}y zT(SR)qiNXjg&jyR_e3fYPH8sBGX_SNkh+u<dD~XJ)3YDdAdj;D#f=6hAfFOrDJhYQ z^(CpGyh;aFiuJ69_=07?!jIMdikeUcS+G^bFSoR<*7mYf@|ynDQ-^0GX#+-Qhmw@r z3`P%EZ42g;ER)`zB3XRw>3xVMh47%hm84f3`C4V#y>u{Z26?No3#}4Oyj|4nqDmxE z^<}w83f|NWKg+{8$6=z@`k7SZR(UTrbkxqewdCd_S;pVexy5ldMj7SEQsJONj($tO z2C?R(srbrpR!&O_rCUlzhE$l?uKBr@a|%|(%OaWg%6@4ZBQEjwah&{=TxzzU*vU8= zOET8`nG_-$OJ3<B#_Q0Pa;_Szlpto#|1Dd91A9ZUP}ByRX`O9lopbL4(rklEoc-Nf zHo?7$$8`@Rq@6CJxo)ySD@9i-mCoW*+}S7d9hti~0{yt;y4S(49s58CRk)$5NR_Je z59ACN+q5HtIEP#aht)@8$%F!?Paod~+cU3oX)ST>sc^f#vQu2oVtt=_KBq6aw|=`B zDZN(?=j7CgiId6X)@O^CHRnFPJtt+&#SJ!BsHnKtmkeo6QS_PB-ugiwUuBZaEl{&& zhhNwUE_)n#OVip>HvwkA#;(G`ZIZC5qg93a`Xdm{ZFI(ou(SF8x6<q$kBzGH-d{*c z5|1%IUcB^?j=7Doi}M4{@|3R6hMe@er6y_z9D0K5;{HhFQngdVsJ^&^BRJm~%Vii- zu4Y+*{^yK7S{D%^@R%J|Yp2$*-g7aYaJH$bvH3J-Hb!Ii56|ksV->_h8^zOCu;rBL zte43p^mkKJ9;^MQOd~SMgMrTj%;m!pUn$3BH^$+9&$TgfE3nW49I%C^F>$cQI&eZA zzy5ICGjQUqwY|?P!pZCS=aD>{gDdG5bZQMGc}t`w&u+ciEnr<)9TWCj9n8e{l+D!! zTy77})8Jk6k>>b4J@386XR^oZEjViKfqp_$d+(Aj{&y{<Aioh319sa9Os;vhwaJ^n zA7iy0(OvrBpK(Yx6-2QP^`bKLw}W;NG9iZRaUqX0@3-WNZRZBpC&ql=%(e~B>~(mn zdF8i_KkXPC5VlheYctL3vaI=)|JgrqtW;jEQ<<vqZeY(8aicc+oF(b@JXIrZ44>s_ zQ=rO|#R+8j)Em^*7Zz3()wqL$_!S%8r>FAT<6P7J@e4{jxsukUTBB3hwjMFCzsQVx z(Z0*_m0v_eUDujdw~#+=aJ$r+FW=2EL)G=xpo8L|JNT%!VoAR^)nl=G_pOvbc8#D- z=?dD|{dqfoF56CxyL;UXS1iMhIWMQYk^6&EchiOj;JrY7>R#bj!3T)OqO<tc7?0w1 zwr5-QiPC(LGXm+>wOy3e;HsT?5)ai^Zk+nd<?t6R%y%g7yI4tAgw*UCm<#qBH>7>y z>-@@>oK0}+=w2xn*{{pIv%qm@kaR!O?pDKZ!PZPig+4(&dH!aWx{T?DM3VKD&Bd3} z4I0)}7<n9;)a!Df`e|W9QK{gYv&O-O(ecau3Hkk~rTwB$y9s^euT?!?&j?f(y7hxy zl81k&jB;zZ+<CR~Xo6;4-{sD!vuFO1U{&*e*Zs<mpSJt&Piu?UcQhXaWD32z6hgmf zn#(+(3^>49yA3h8_1L*byX?L)ez~V{;IneDXm{{6d0lCJ|II(oES<x-Oz*LGFPBpV z!Mu&{)?d~P9w>9Z+!ua1bLNh%*q&UPl-)ZBtuP9kd3o{Ii<48Nhr!3e_)aan`AMok zjd5c_F5zG~s(JUKsrc;eT&~DhN1^#WPHFQWje{O~$-*bX2;k+Y+Io$8y9j5W&yDLt zp~B}9=7k$RJT4SDy^JsXr-m@}J{39MPOT}nZvH58Xn+4W2<$Nl-o!T7eFA&GN>;CM zDVQeKsEfwxE||Kis~?iy`a!eGNV0cv-(!nSxLehCAYdmUM&w_v$nw@*g2>&=tNnuR zy+ww-{r7vzJau*DIU~m9rP|z}eL+3*rX}N@Wl~>)ooHKk%AojNqW@aj2L(EBkPZ!A z7w_+GviMZ_9ItblZ|oI-<%F!gS%3H(lh_}BlonoXJ}6H0Bl_=TdGG~HH1`yKAMVsj z%|-C64>@S1+_3hjp65Nd5<XZcEzr}L2TLp;s`~5c__b8*jt{=1dglKo^Ju5rwk}zW zh5huMqt8n7X>EvGx3w=tE&kHQ^FJDWGTI76b&JkP+n&l1Yi%XzjOUw~dX`!-qT}Nw zR$peWGY*L8xVhi_46ng(^Ts+B;wg5#w7@IVHtunFa<83hT!5KTjB9%i{=8i<?X3N% zmGX1_`QWjX&++XdbvAqPFO#jGzKW(-2$A%h7Fmnlp_14UZ0{=;r@rec&>}8z_tbNp ziD%o3ZkrUmA<hu$F6fLQRrOERIFfiOF81svBCDM)<E3m_pakJe<e_i(r-0i|w!%*d zEmF@}kW>M;1KU4k^2#6o<hUh4$dKUr8OY?z{#8Xn!<q{WJ(MKVlluI#bJ>Sf9;NF0 zlQiJe8r+2Xc`VM@_N^dL-u0Y+-<kD|#O--8xECx;zfEnsAcJXL;mx^LTIZ9Pb4~U( z<yCs|SZ&mNC&9x$q}?|}5CcQuhTpI1JYS~QiC?$7D@k-m@3S|v?|I=?mZq|lfm5s2 zwuG*43seguD}^J+V=U98tn#|7%A{@%xOI!v!=A2(Z=`I-yKFv7+0J*_u1eW829sku ztAtP%zEWuAZL^2LoLSyG+7|*v^XRODgo+hX>EKDn4fwg9A05WoUfRXA+r^h4?Hbzc z`c&HOS+`r7w0mB+dzrLHZMR2@wC59P5EG_W>n(&8rSKtuU*vKkv(5CUy{5ojABhkU zIgXOhT{I@vH71F^gM!TlKqPwtm1Tl7dx8vPf-QQ2?PWq-dqR9=LPL8(pUQ+i>j_Ky zFPN4dg2q6(|9cS1??C$>mBkwEpIC$+iEmyY$P!0R2RNvCpGZqRGHC{@qu}VkBeY>O z`>SX^*_gYpVq|1vm0!hbz6wMEa7&!hx67N%9{ufehoZJ`(9?`j6JIykEI}L)G{n-1 z13KBXd|Pg1)r7zK2|)wlni%MUZ0hQ()NR?c<5y|_$)*!tr4z|zP!W1F809kAdo%gu zvhMa~$;f3Z_hxI#<rwtlSUk>n0Hj!;UbKWNZb>9PyJB%1QjP;fhRWu1<A7EaBOQu` z7!}+Zwk>`6lptf0CkaJiVCuNi|K!RDy=6r5SgJlOqkK7gUpb$A#ofLN8Tm@(zDiB` zDucc%3;AmMzG_$b8sEN}JAKecQ19b*Ax4)=mBYVhfsvt|zMj97$#G0!0N@sVql|w( zBDo(dhyHR2LgJeLlW!sPwGb(^QuVhoDzvfpxA7^o-|cUgQRq<a@6c4}H0bZNQ0TJn z?{Zb>_U-RhP-y1+@8z40C(j-i^18ykaHh;a;eQ%nVibKGA)4XE5D7Wvu~Juk(Q+Nv zxq)g2I4=ARp}!gO8b_o!MD==zQE{04_0ZEN!!oaj`Tq21z8*DDeCyjXV*h8vRdLMs z^;oFlxI#qt?|uWKfW_tOdi&r8lP(7?;6vIIP!&Li$54F)$ShGH<fZ1DAb$(R&;Pyt zOi-L68knL|nr0lBW{(W;<bS)`_$o`mq2rHUWB;sXVc`Q6CjKE>S(UG~D)0k&|J5f+ zp98iTL<a4@4?p>{$ThIkqV%n2;M<#lPrt7fo<@v+e%zfpP!}pu@}-R?Hu8S0;@iW! zAD$lI8Silt)BsZzM%HK=$w8W`Xrk}02V#5cAp<k}ir-xcgIm7$wnGQEouZ~{-M^$M z?7E)t@Zn}_@9nkxoBe4IYDJO%!cgIH<X!-1^y*dFpHHinPTPNr)BYa+986&Nv(5PC zlwJAEb@2Om<e2@p0kSu#|L&FS4-%UwH?&+Q)eVA*?>Y7;wln;rz5@W3k&G`uBv91y zkxc&c!BP8ry8Tbj#^3z;to)aDV7cXBdH>+A=IhozSrk$WnT|)r!l>Cy^V8Q<pHXm# zsEcMeYCI>1QjWgLaMDa;S4p6g%Y3Ar#b;DwN+Le=CikxGSe%@Ri(a9OEib?57!)I- z0_P56&e&0_B&J7d6$XJ~YRKqN&MY~Crj15ay50>)LL<1vekg%nA=k^Q!*#mGtUuTL zVUO?HSdK!Th;=QxL~!of)ZOfjMc4hwepBC>%4g5-clI*5I*p}0bg_{u2yp(8C-yJ_ z4GcwpDpPs}SF#RrpQ(Mohrp?Rz=(l)1EiI11$!@5Q~dZkxybqU`@j>vO>ePXSNwPe zpT%JD<G}6D<(hf-O2UKp=kL&bYR>C*$G<7q|2O#XkN3Cj$y&`fc9Fk79<Sx;QkM<t z!0DOz{aVYO68=)L-q>RR64ogkm|C$l2Ha-}c?K5LG8~2o6i*G4ioG@*A(#6;HA1QK z$8Z#(%{o0wW29*Gmd?s%`YnS)gwYt2JKgjf@IK*#(fIAh=XD@Rd#h6#$4{o239bxX z<99p-tTU7ffATBe3Dh^uyuZ`-(fEUK@4?K6yF=tAAI07YefcOctxG$}w&?Xm?>*D6 zS}3hfUHK=4!;iF|l`amlZWgp@=o2LvHan$Ctz<f_&TKn7eV-%JbVf^{WOhbJY{2x3 zuH5qM7k!n#rn83Hw=cfP80ndr<szNP`HDE7cg;<p>EC~S=s#&TZ~ORgZr(nc!hFFY zN%-r6Q-+@TqH}@w*G1Rz6oy5shdH|Z1zzzv*47q>U%%bn@WMnBF(Kx^2TUtjEC(&x z&fA8(i?mn?*)6eHd3x~DVm0Dwd44qt^v?p1AtA6W;A5!oS+2z~+bygma6~b!J`+e? zSPywKY3cNvX=h<0O@-3xM~1e@;-gGL($62VYSxRJc@C*oTLtdTi(5thpRBe^9v>~b z7N~^FZI&h7f4otd(S3Il#)MwlttpSP-m9xGUD|7C8(i9bTC>9M*`P7=+q3N*+qZ-E z>3a_kI~VP~9d@rpJv@4~Tl(#&?{x5?Z)Y!M(s6aiR`~JIH~poP5p6;1)68emR@`~F z5^toTZ{x#H^BJ)bXCLH_zyJKKLUsEbYwKfkUT}wq`E<_8fcd0e;gjO=;`Z3YS<S7T zCEpGX94>}jbOIMc5i^eYMa~_DJz8k|6zNM6MUaUK+Z9ISUG8^;4BFHbjQ<PY9^kY2 zbMlUT^$+YfT;Op2voFCNf_v6?aYe<~3v805zjg|oOL=WW5c{t!^c^_};r71wvL^%1 zkKoFAP%_SqQY1$s!3;PIlpn9K!%PKvKVk#Ue<lLw#z(U~x#6ubD6MIrAveZaXtKp{ zUbT<ibtN-cUOK&o85t<G!A_yaq<*XL0a%)KZ8tq%orh(T>%kvpuqqb%t3EZ#>|_3W z^bNGCii1Lo9|I!BNkK$$00D&q{yAX42&6uYANP%62gHC$2f+|p5K?Sb7fGu7J=tMu zRb;x1G*6m{0Pq`;UPSjAndTHhu!cyV^ska|K$&k+KZVj`xbQg0NC&`5b`nG6jE2YP z0#Gg72#gz@6X#W^AAtw4-4_PG?Epwp5g@&FWH^)CH)1P1l%o}w8uJLy*mG-Cc`ppo zpFn}7PvR&f@x(78oWIc^LF|g<g^yV$ZoTQnm{HPze08~@mgx7eVr;}=(5k{R^XHoC zW3HeLF2(;YF@~uePthIg$^$&@FiSiIhn5P0^hQ>CBla{9#Zl`cpu!*VP^Y?K`F=c9 zzK=Xv6|)L<K|sm>sAUUbfRE(37_J+8qr^@ATFg{G<1Y-93>{5%pY+SqDqOWJZfKkV z7{TATEUk&7sR%Ck*rJ))7}{)(cTsV%B7csE1uj$|mb73Rbk2?W5vBFySu8F79C~ZP z%_K7P#`%eabNi_h7w!$^tW6W~;T?!ab-?Xx<u!NnqhadIpnNF+#8#&&5c?QR<uwCg zvqX`WlA1xG(IruDak?D%=z?$zNJg*pCagS~7LS2)Ea1pufO(ORV(t1thn|u5<rh}G zqM>LNrooAUR8V$L-7x3ex@o*rP&7!NX@vad!jnWGDP&Qx42l>yyQxaAF=|9dNvj*S zM;}?i4RVghL<@RhBCSW95L!4L@JCdWs#Y|uG&T;QwFYI%2WjlTkEx20eyUrEIT7C_ zK-zvIp<E{_<T1E;f+G&&Il@J0iG)%mUJwgjU})Kp4m+H|IDxQXa0D`rQ85KH_zeZ6 zWQ9_pa76m)KO~p$-)B{f#@&?#gG<w65UdUmOm+;+1!qBy5%qr5<cZ)E1==WaP+8dq zSn8BL5hDgiUZ+aToel;y295KDfk}k0vvl}O81qT=Ghw`=>$*v)x699>wfhEXuL?fB zdQeZKkAU;Y<hu`CbQImsU4#WWkTb(@!C!7dW$|coOFK1y)bHl7l#|LbacQQ>1K=uY zKm|8M2FAvb?_55D{pti*kRT3A3^2m&BEt21nV1eYSM+Fz)#<-gTEevvnXI88r3-Ef z*@^<=JYP<bqn56c&xi%k(L|WcS>m*uxn>3oq7M-h72*|ccu$qFczJ`4*sPha(vvh* zd)izAQwtb2P>~`)3{|<acN&L-3{V&eTGR(P;Ei<JI)2%l4ZU_&A*JzyHq~4blOu89 zxT%}62%Q07A0d2X9;W!Ry0&l1P8p}edEClL9r71^2*qcte=prh5&@QG^fWD&gWL&& zyQymvm|jHZI}xj~+!&pO-G-V^C61MIOJZnQRdCE>(R360cqkfALhTYwlCN*Xio_GM zq3^~=p2W~5+SYTUFh7w3+TE#Wh`y{U+!POGC%#L_#47#-it$i#Q&||IP8F(;gu&4q zkOx%PZbT?;K3VCIF1pfFKM$v3@aH_S%g}f=1cU*BCuT^*QM(|a4_MF#BiZdCWVjfj zwE*BcwGOaD!u(^5iFw0N+1}(|9!g;MB_dTw<NO|x#mSuvsbgsUC|oz^3$FZf12qc` zwgD}G!Z#fZh%CG2_?9_wJVa*uw*oUnYalpopTtKX`l%w4SU?oGwlee$EJN**i1I@Q z`+`U&*c(W0T&**nAaV~7C+e>#7Nmu~cXQL&>Vs)8|8x@Lc_%`J+<po9{Yun)V&j74 zM1$Cn5Nsk$UKA>d0ZF4lHShirj4{A}#{d_4_Fhe%C^8n!ANztLP+S0}hy=^G#v%ZS zdOGO-A!zIcLCXcp;x()Ic~b}gMR<HekAd|`;RZLa859`04;Wxdz9yAWBEVDHO{^!m zFHSZ-o{(#dZA?u)y4ih-C}Kwx=~pB?Tc_vMF{N1SW<?Ffa-9<bld`168!(;%_b*uD zl{p)KA--LsigsJ5p$O!9mRs)|#OWNQ`sCcrBV04yv@R@td<XA#dF~eHw{zg<7MEM^ zo)3Rk1rOi(l*PH5b+A=rsZB4z2XaZGr*-#nF(@wP4Yl!s_l^5lQZuGaFsAtDjA=2- z;2^+he(qhCN&^<c^7fUiBg?XYz80Re3PqZYC2c?vC%$k#X=Pn|^yqv%QC$ney0d^y zww33Vk=Aj+5O1<1Mnj1kBwYi;YT^)XxAk}fFQ;!$rclHux{6G?>`_0$@CT2&bIgl! z@?^3qIC5HSu}h`^U$wZD$5@rbdCn2HChx}$^Lf=7aU0D<qS~&yx4CV_c^m@LrZgk% z&Pv8MdEfE$^Ph1&4&W9tc4gb<ix1#WYUk%Orbs#Cd=elK>*5$d!&iPLP%SQ4Z!G9! zeC>87=xKbXH{i}d`<)?iKbQ8>L2;IXGa<EMvDtu!j*hvx{QOzsBAWpsyX|i2?ILP$ z;fr>sEp<b}pR>Cl2~k*}D5wL%isjLm;T{PP`;aMiyF-j4E27Dti>)K#oJRO5x7Ld) zt*JPP0W5?#z#mU@SGz+}@2BKp8>dlLvPhP|NIa^}MVSEya_NwE|0(S)A>;p38lqnO z8y<=IDHBgCOO57AzJbh3$W2b%D7odX*5!VJ<*Oy+>jULqcF4E=l<$&I=nYgD=ujB? zsqj`p@m-+eWQXGPPsKS2rNuy{<qoAa6D2uSx!n%A!z}S<63VfG$`>8VS3i}1c1TU1 z@zNndq~|CKNfqiK75YvU>T^Nl`Q3(f89q9caJDL!q#BQ@np}{YQm2~AxtfNgx^|Gd zUZ*<2=v>`QQo|}p!?shy;atO6^1ge}eeZKsVM)PPHL9VV_akT3V6##mJmdUkl~X#k zo@dLY1<LK4$f+deU^{avf^@1ob?VP`UP?Y_3wqGi`Jngw!GNUhP>}B1PThCsx|5Q6 z(?NQ3oqCJsddrgfYeD*R*}}f6`lodIvFAdO(~Je@21Rs+FeyWlV8bUPFDhblFo8zb zokq7Wj5wr>d4i1vx{QS{jK!o(q=HT4x=fTVOjM*yHG)mGyG(j(OpVM;|C^O6x&LQo z$Ls^YxkIqIbC<dMg}Em^qd&EI@Ei~_XA#|H5ifO<rVxC;LYzy&DkIn`r^_n1);XX4 z3Bf#A;5x|gWtU;wh4q~n?Y3A>{W${@DVw*!Ht)J@CNFHJrEKSdP2L3CE_Yei=I~X* zEq3S354-H#%`9MG%P(%0GBNhggDw9`S(kL7NiNY8(hk(-)*BaGjZ%hWrbs$GJE>#} zsiUK<qhpSV6UDiiQ;Z|U`Sa`;^Vh*hI2M4TkO--aGk&>fHKSE27v~Tc_ih*OOBa7> zSIsU5<p4YHE}#L=4h3E$m;=N}pcHw-+hr$4yOE#)bfvH1*OXG}a#188Y3x>>3w6;0 z^t%Bt_5~#h_&PxpHJmbW$xey`t75!hI0?A9!)A!XcDK*&rO$q@tJ0YRfzSyIV@b2o z?WF)X8%0WvCmm}5xsW%OqAszyfGM8D6tiF9)nJMuRm1|tSW+SE6e<2zTLY;U8kq6g z&&GnrP%EVXgd7btBPozbVw<LXL9k2kWr)8_XmDug<DO7obKgmSJ2BN8p$4=WGhLCm zdqzoNih>F0kT&Cp!c(Bx0JsnT{{9hPDSEpU^(45JbmxS`<$$ylfAc3~bjdI<l2Qpx zUW_C!l_su2LS}$kmU@dP(>@oBzE`17|MomxCJ+0N;hSON?X6FeiXwxeNFDLe1{9?g z5<ZBATjEKDki>2tb6O};Hreo$ylF=?yckJL2Y?Ax=oQDLTZbN?VHAn_UN<T3@osu+ zX*1x0CG$h_3k`=v_B@OH^(<O8G5%KwjEO3K-f6CzG@%((iY#iyl9>ua#y*fVBca2d za7O@;6eey!*05QEvoYYRJQx$6bQldW#gqQ=X^25X!rntBWI)6Ca1K0iGYWRT2kOH? zOR=P9-j+WZF@(@`SZ_MXRr=eS#AAeAL6-ZRR?7Q#Dc^}-%({Vitx`BI(<R$q@b&_9 zSYXyXb51Ms4ZjRAz{t+b$bR%(-3qDSD-#x$==?a>y*JnUD)*LIM$d6o_m<rUw=mco zSJai63Uj`KDo2Ew^Uoa1_&J{Z0!spfIiq?pz5a3G%L1!lt4;YS13k`%WU>!!8DxPA zS@RG%N9Md~xstiZC5wwT9destS2?9t=<VLp-K)|=xw2E{r;WX3EmviK<*>GAB?Pac zxAhOH<;w-ui@)`j-~L_BAzwjK*dxwY8n0R=7G5S1UMXdbhW)Mt$ycd_R}r~ZfEt{- zdu8dutJ`ABxqeqW$k#X*hUyje=zG{J6jla@Ta?JvM#@_Ts#e7pRwaekrSy4uuwXec z)dhX^CBN&-<r}KQ8|wQSUjA-qlW#1NuYXwwV#C)Ch1b57Z+aKrG}+fQ{kv&S{^er$ z%jLe8YrkJ^$~W(ZHy`#jpB5GndY6)ssK&p)TR;k}uqUk~{jDTLiU@@^`X_B~D`l9j z+c*^3LpL}t!=qlyw}@RgODS~7DO4WrbbJu#RC&^=(ch_k-KnS0rShc1s=vdwzsupe zE4VBD$UoZamc8F~cd$aw<LmBgDNCxP=#VF`p7g&;dh*IwEF-9^eYduS;<~rIsQN=4 zh!X%eT=%_H=x=+{-__sWd)+_K-_L;s(V=B4u3t}IzkclY`qUY@d_6!k(<=Z5vjKyL z*Mo;oUiakmT5Y#GUB5Z*tp!EkcCUKAgmVf`{G@vw!xS-e`}GjVpCKN_VS(>IBZ$C9 z^Gy^swK6u{B!5PfSUXNNy9nB>U3#yJ$B0LQ*Q=0MqqeU{9U?k?`z)`Df`43drdIM? zDvXEzlCyE-jAE64ZzZ3=n%g*HKJi#S{f~TeI#J1=cjb!jt0UgmzkW}4(pNq8y0&lP zOaF&~;%6srNbK*wqkqN-)`OlA!G9iB<~+$#D7+!NST5IDP~oGVgxe2k^^yTThl{D; z+=Az{Q}JCH?dDVSJ5l~DwXsq+b+0?Mtv!({TNd+7QkVVh+huZUl|`)J)~TP|m@jez zfXZz$Wm{6^zq6VHF<94GmE~EL+vLh6gTgn@RABawR+%d6Xt2`!<G;-+SNYJ$Ci=*! z%_kCZT}V;u-k(;B|1r}LdU+<Z#y)0j<YV~<K3->7nG3vc$~HhktV6sx@HunDj1R0< zq8@qANoT%smklFkeBO~i=(fx^oU&CCl6P7yB$vW3*QwF~B1W(5M?MoM_)dl!k;Y~1 z+U9)N%}1<!*6a;=aP>~H0BF7)m8{Km`{8=2O+Zr-(Hs?6$Pmne>tjX^m21vD`;0l^ z`5_FD5kT*`l8BVhh2NRp3!^>`C~gN2HVpk)k~+&tbL8~<SCmY$?X=Mtc>xOF*iKU2 zDT+bHMV0f#q*wftonl?0aGkt!+mZsfx$uGE6O|KInDAqeDEhM*j>uU0h!e#|gj|@t z1aRpo@^$H2_-umqN&1dL+ALMA8ZMIx2tV7Y8k_(F>^~0Os?K)O!S0~1$N?dLi2Mfr zHk#so6sIaurtTphoO4wh4<g2biv1y9aU>JnxhN~Z!ks(<JMF5J7NY|`$^#T}tJTQ= zzgMAH>cgEPM<fL&itm;A%<}CY_O=b#xY@>{8=_7K8;+!VZ(M$>3c6oqCrJM9@~Qs& zMt^`zrL<5S0E?qY{Q&Sy;J6DOq&@&GP^yG|uU&mQzxif<x2*E1?c(z<MEuV^Gz->2 z6)12toD{*2L6pZoWiy7N&`6b0Falv2hY+ibX3}&-qO{ORRR|FolUw>a5|qeEh9oBV z#f*}`*-&i1o*7nrg3A-G{*Xx4O_i%ZXHiO)te>gYEt0>mny#3wCx$1W(Lgjntf{K{ zC-g^IJp7*DD54cKj(Mt+YMGdbL6LK)h<cr@jl{+=1w%%EX<~<{X}~eRWGm3{R6c55 zodt|&d>So0^%rpko;?*wrVn+<0Eki%R%B?LA$q7#(v4ivN+KaHSIU+Rdo}N@k|$=X zh*kNbfm69@=QJjYy6Dmawxxif7%zqESFwoKR)H~ZeQB7{${bkq5Ww?J8_JKnKb-ZW zj=q=`!WVkR1+KSFM5w67GPzqSxcimCJlz~r7_AjW$H;GCsfTH;i%$q~F#U97Jl!qD zj0D&{w+vN;tmWl>O9m}m4iPmf9Zbo@I*r8qvcgcCiGR{^N|9bkbV`*!ns7?H_mB8d zx*SU@3Swm@g`pCY#HfLVew}<KanbMtg9X&jf8+?^TQRgM=~yTwH7m(9L|#dh9waao zs!qy{7gYms;L#ws>@NVM!5xNN0>hcohsi0lFtId(VSX_T)NzJ+2^_P}aLPs+zfG%i z?ULPV3Z>^T1<bpTjO!3#et<fR_!NMLO#(x%Fh6c)P#|e&3@NA%!$=|)hEjc2QI8xd zq?|;6LC|9S6gA05l<Ey@+F=L;OFuCHd%%ro^@XbNgwaAKzYqka<D4e=fv0480;yRL z=nD&|seG6vNFAlhYSt7DVG*kGS7mXETYJcecrE=9aA0*1WpQ9tgac&6={~^k--rYZ znWZF3tMldBccy!ECu3g3RA|FD04rjQNie&CHiIVpRXXjz8l!KK#O;{3)W(X_8Y~Xj zwIOOJ%kp>{YtsxHgqRx$#9}=vjfT3X11eCb+vV(#Xc4R`LerEYP@^n$IbhL=pcb;^ z(&7y)dA)fV^4;&VaOiT-s(0v0*zwDrW!Rq)-~oH2FbatN#5_tOHi}V8hW_D#Suhu4 z)k%el(J@p4q`+PkllFNl6)#k@7QyimL5QWvdyA1L1J}uq<aTG`<ESKl`Q<%gW<ABt zmyxJU=_`5bM4XPXr@gKcXE;G&NaBDYWrnT-447QV&>O;*fQLY+5v|dP^)}oMa}aG0 zv<-}<tDXx*!GS$kxjqU}D3%;e!+=1j=rIVVM^D`5fZRiy!pG?15R!QIlE=d+p>$Bz zpA8CCOEuz7EDQ)DB3kfg!7bo<4yynP3PTlAeIPn2-U04;gV^d!Pk`EhC~mKzNmUUT zNw;Xg!7`6du@#<2hawe9w`9yl#E3SPM?zE`L7kWp+Exx2sq7H_3X=L7uL-8oQh7Rs zh*P=Ar*Ogz(PtaR^AX~rVG|^(0iD<w89EPggLK`uQ+Oy}K1P}XrA7*jYVhz+f>qPO zaK#ZY<0jvIRgWsus_h9aoq){jrYf$aN8Hc3k=jj5=Hy$ZIOb7xQU<LQTF#S#k@Vv@ zLBly6AxFS~2hcN?`$~-vW%63Xz!GNYNw(-P<cTg2L4HT#K4+Y%HBML)<xFlVih=4n z8^3F;k!nfOD+_w>1!u~!W#B<1GbO-aS6UD{+LwG8C~Gl85J=H5E86lolp2R2V({z# zHzW}ANRGlz$S($3j0N37N7J5F;rs@ZV6awQ@)ZFVC<@RgHUv@XBhwK=I3AMp;b|~h zAr_A%yil`2(G%0d1s>r@K$2ep_znFrH_cTu%$CuoSA>-qt)yW(#6qBk3k%`E#t33i zGhUuHsGN)=eR%k$^8wLFuNOJxhZIl6BU^>IXyP-V`q^NCo5CIOOE9Ye6D?w+a)b6; zqSf+)3H-u?1~~TUMO$m8f}&w%{;I^O*f_XQ0OTeL-Bb+|jVQ*0xH+le;CY!rZRz&x zk|yUn&lf*<NO$D?z4fRgAM+s{8F|kV=iuUpsY&1l8Jt9uN_I3R`QRV|<ZK#MXL2d6 zST3k+%#87VEICrT?W2MUv5@G)Xswzi=b<}b)6qH#G`iDyLtDK)Y5Bn8KY=Vlp^ge^ zz#vx!lw(D2LUZC4BS)XQAmqwNMb$aIDgB4RsaXq=p=*Y&HMc1oZ>;sPDE+vZ(c73B z6aBI)Q;!r4Sc_o*@)P4s3f$0)E=FCvI}@ha0f6#PV$>YbCkVVEoER5-yGa`q7dQmt zw*g3p*P+EkobUuu5R-0B)_2$ERQxni-3u5P3aN;2L(Or=D-H4D)yd;<5IFr0c#sE( znt#UPbmIq+Iv(^W_$<}F3V4wG_~Rpyj)Knz%bXb`oPyddh5uB<VZDz)0*SubTek$= zhmCVPbxl<3Ch&2%c~h=>gYpzJeK6e*By3v3hrM@M>p}PoVWEcb-R7*m!Ib9<{nt)? z#h22Cp?zLOK8woS$j|s8SWvakMXkzQ`}3>%VRcnZnUAff)wggjMyHD=VH;2L{n6p> zmGh=pTQB!Z`Ng68AuV6JH`=YeGg7)(p!d(s@~!m1qGy6VEhS~{M8w}yazeUB?sIxJ zhIbrndG)Uz9)*oOSt)_BK9C*Q`%V6+@nLn>8|C0{&(kNr{ATECv>n(p=8N$Dss~iF zQ=WQ;FivI(ZKr(IJ$;cS$I11(ZCsi1Ed6=J4{k!(+)?Fec4Ne*P)k?_(u_+}VM()X z_UCB5c%Y<-#Jb|~;~F8oW9)|~JF0i(r+bqDA0n;qy7qlviU^b!wGWi`%wwmgQ&KM) zJ(c!tLVF70er2@AMjklcRahKf=~krR4&PMlUtB%9d^Pfyi|SX?=i}7>YQDeTj5zLJ zb<L*Nc2@WvdslId%J<hOSJdgEbYs~+%BzV7Y?JQxc&QZK98S$YpvW526=kY$ES+}l z!@H652EO56oLDZN&~omZ5PmO=L|x|66W=)CuD|Wy`|tJY!0{9N(4LaR|3-<TPSboN zzCSoNDff-qVQ&5J-GisUXIlm@TGAqO3GUb5j|cyIL-p?va_`TNyKk=E7|?GwDj!$n z4P3iZ5&rw2{O`Q%&ENer!u5XH)&8;a=gP835I+W@g@L(Yh!P1H>Gh{%zx)pKsL2!Q zuK1#_HKS?WqUjT(8SA3Yh@x-T*~)B3YiD4%v|@PNV)zncb{S*tSn3^)$7p3li@l1L z;E$Ekij{GTt^F@X!BTNKSdVg>w$wsEb%IX7Elx8rPP;CSZah{mU!eWR<C=9^)DEq; zQ#{Qnt+z?MYBa))E5eG2&Uz>Qp`|bte*(%s0hJLeJCWeIli*GK%r`$)U+Y<pxWLm5 zTG*5TlPh()Bz^jiXQ)$Z-gdjEJI^9zxt`U<Bx}(<*hx$yPRig<inM%|^NOz2k%veF z;KIs{cUxgHZZ2^2i6&hD)3aK)<od+q#=7L6E=etkbVhB2NB1xw0ustL1&H!-Qyan3 z^88iBl7{$SjA*@BAbLKoMc1Cq{d-zi5dm_Z@FDgC5;}c8x_YSb(Y>5V{#KW=Jdv`R zpFF{zisE<<5j7|Ag90aDt`nU!I&L$p{Tu$ow_0fzZfXBnx@^>?xdZ_97tr-~a8K6r zKuC)FhBOqVaAz&Pz$_hFkb)=9SmDp0*3O`P7yer|)yM(3asbg}fFSiTPwOz(!Qfj6 znwiSPjF?1maN?0AS4v`<m_U|<cGlgbj0ye+Fr@I~#Ai<V@utKH=KORD0@*IaaTbXQ zPO^%wVcFG|83yhdh5|W8+BxBYSrf7X3|oE-xdi67kZd)Tc>7)fIU?@xv1j5mF4C&G z2%{|T-CSP*7mLR)<QC(-%@x&|;*`bEN+fi=)B;a`=7~gS-fyG%wdG67r<amT&!NIS zXX#LFoKG^9R#20FR^|TGIHy1^r>MTbR3NXlE(0M7UdRGhyK@&-0PwYVnl?8gEC4}( z88HY1)=fF1kOIT9Zi-;UgXOINT61Brk+3sA__u~Q!;l*>oVwWxL8cB6O#vc)0I?io zTAiNQAK*!c@fafL(O?+Dg~$jb<p)@0+)RD|NUQK6ao*u>>2W=#%sr`{&YT7faG(@Y zq6M0-sJKPJIo(F&QvjnVm;ymy5=4QD7NC{d0x%><eG1BiPW3PX_*-G%6Dn3Lc!vMZ zX8|`O90>myAYMx2_5;Cnz^p(C1=5HJ0h39`GPc4tN#t%-)Bd#t^I`#_beI%^M#>Pv zy9V&$0Vz=!X{)m58Jfn>wB%iZ!CsZo`;;^HB%^WwisgJG0Fv;_%v)z8Zv{&tYYytb z`&u{i27m&86Z;O<YXwtGrCIz2lZ6A26KI+-K!*X>uYqNN%E)9eC%*Q99|);KBMLx_ zP@qU_s0b2lgo53`gl|}x52k>0mI^8aL`DoSKH)Dk2l((X-6;?R4N++TOhjQ2Ly(;) zj0a07(e(p^Zur6g8{80<0xIi&-*~KDo%0J&Rsrsz%PfD_U%PwWMM3n^!Hzl*j&$%H zL^<dLEQkciQIOAzIrrKiWIBK`8l0AeAfKvzcyo@Ba8bc}e!qG~BtV9Mfo|ZPtxzJ- zdKnyuq7|Ce&;kHZP6V*F>jyo79wY+ORe&A-X3YT;d?joO<lz9JQ~{W#;CAU^ns|BH zjK+MDYW6$T9AxdXzZ!Fx1c)%Hm2c^b&I<3Kpo~*cnkndqJ&@QpC?g7xJOPI@b)Xgj zHoqD$w#{=01;K)meK1y_E+!oE00p{XsM4KKA^TcnFkrc<S`iEZZ0^}*gl|FN{zuVy z_*3=&ar~US?Q08h?Y$yy=Cx;Bd+VAZE6S#O?I?Wh3XzctDay#WMnYDR5V}ToQc^11 z-~Igq_i-QR-1|7^^M1cx&*y!d6JU?Kca9g-bb+3o1fYs=i+zdnxo{-VdRDR8SrM+P z2(&hHF=60hJFPbu+DI~Ov!b^}Ffe6BJDwV;n&-gyUpKa<W^GI@lOn_`vsoGkmEFEu zs|z!j<au>~jTr(m=wF8aC_R&}q?ije$3XbeaDq9AL&M*<!z^C`=3!8IMWC?bVc)zg z@+$2f@^I$Do%d-!dr%(_Ihzajz(eWDuusmAi7Qa%irTBs#J;JweR|uqxYPCd3i`&B z|G<HVuo2rM=Sw0a_V}2Zq}L^NGsVbfTt9xY(Brj;|0yLo0A{aXLcHCphnJ9~G&GqC zEUS3Rd8TH*^bb~M(~#=6cK}!^0@`W`pRe=|CKnIs(^>$%1v9<eyCiAni`GNEv&tnB z{2T?*>{7S-q~et%ADRA<E)gv)KJSL+ztw*}zE8A1kGZsWjw4ldGaq9yV96S%^B>7@ zm*jaTZSJRpZHA^WX~5rG)?PBrF1nx1jwAlh0JgH&_<Nz(+-v{Y0nccT+i4y%AN$Nk z2g#^_8PUAZ-QMtp!R_Cr+N?ZDrkcW~#RW-#%`Y_y-7TzaUn*n2wzV|Y+Dh$Rq>9jO zn)j{d2dgt!b|wsv=;#w=EK7{ndbA9>Y=Zhq1nECRJDh&n%K-gkVZjQ(OrgH<jO=f` zGosrz;u#5`b3qvKE&uDx>$`7tV%%q23i=Pij(@)$LrPxK2V@8uPS_z6)>Jy{^39!l zj_MErG@A@&$T_3zL{e@l<_#T*U5pi!@{~)i^jB$u%sdx6!wyv=$O>T|z2bvQh5^qR zX!~@z*>>29kifrKv?ZP$8U{mXq{4tFE175}3OsTLNSf*VB-Mxr1D2en-JJmONpQIU z!VK_SsGR7sm!*-Komh!)+}@-~X7F}q$aYHUXmTjtey`O^gMh<+#lRTJ&^o15KmS3W zP1X18yehZ~4zz^`x>o8LsDc6E6sQ&s>fc|=2tZWGfC!oj=@q6;KB2iFM1wfShl62g z%ArZ9Ojw*f5v_rP$)Lfqzg+9lP$&lCiia8EK<g&BaK+ohSO80Sajgp`j{~fUb=T=9 zVNI^msu0WlMu|^gU<E=9==wAVdf*{ulb{%-iOv=J=y*;X4`C)k#rIigpzx<I5MN3s zJQwmIYd%;5kRY@U$-sj}S{e`1l*a}Kk5h5(gI<yg<BX#NjH85-0{e{A-rxma#_7(J z7}Mt<v<dQJN>$`chJOHSp*d_j9#m+8<bHzL#KEK$0WM5uKupc$kr~Fxb~a3d01hTH z3BydnSaC4tU_b;1W87!Cc&PU4gnFMI$l*8%FQkX2oP{R3KN8!9DF5vU<An?7LgN>` zuj)cRd-57y_jok-a_;6_$=JNdB<M?q`Qo7-lapt2SDa}qZ;Tim5B0^h(i5TgZv!l} zc}MP?lm}$o6`?N;Ul#$QdoM^ZEn@25&voUcmFC^T=9r)6T`bSgHTkk-{N`NQTEQ<x z>?FX5fyKDWzH<U_=AT8HU}bzNKNG-dbqGl2%zRnps6Im@-9jcCAWaYj4B&kcCV+-e zaWJ(=02g<T3lCpc2Bh$xAz|=aqG-h?xGMmi0AbKDppX|Rl!h1rAV(N&74ZNT28~Y; zy|)R&E`v5`>O~GBDB24<4**ZKfN>2Nl+Zfv3gJ|Qoy7ns3Lu_X!$WMPCqSwKv&GQ< zSYqd>HY`j7&?m3zcbn=}*p~CC>5h?HLwb*k)h-=<^><QTNxar~S#`a9VPP-AcMqlv ztXIxX^X-bvEX-V-1VUmzU#x&A$u##}0Sxvbe`~}w00<wx9Romqc0pB$pD`6<Ze8O? zUE@<uW|y>Pfc-NwQUb1V(5Xj|2)T>RI~`n)AIhWQC^Q_2-=>fNdJLeK%T{{L`{E=F zxx8Ae1()|g*it%!-@=$DC!cONF~9AU9A9xJ!<xT#+WV{+JqEf$T7B{06jmI*PleS9 z5w}mf(oFpLJ2T>o`&}j?Ot~R^WSj_Eq&n^Ex}|EPl#B=lM9~Q97!Zc5xO(47WRj=g zUP+$wW+?A(BpQ@yf{NtcP3{42Bz<7H#`z}6dR83*_XL&5*8h3=ggs7|rDqju=@G_( zNHVB|qs6l1ILN>kI`xcy63Y94ye@cO;m+HvPW8vY)W69=%j&ZPNPxy6Js#Aje`07h zSM$7cP~e!80N93t78Ol!MTiKFzaXciPV(2{&Q~MHh2Hvw%ldI!9w%t-?x2@`xj*l1 zd`xh3Nv+Jgi~P>2w$3&+mmo;mQjclkBkJGm<a%#%j{Brk5JXeaR1O@0OaPM*)DwLt zN`*cYisZp4l06NRn1y)bd00K)WWdg`;le72LrE|c4_4~jvf+OmYUd0v;l6`V@!Dxg zGJ3@*TQ`+i%w>Ahx{8`B?>j%eWm{)mV_D<!LE5$k@mz0lTjh#ls^e>EH>a6h=azsE zjlQ2|zPh$u{W4yY#nlUe(e16D&&6FaWx)z4VmgT=&w+GKzSECH-DG&Ska^+)S!wz0 z%`=SM@jShRz6v$&aarC7pZ6((I@!nHdLiR=d@6op&ga*r+MT_-Pi9G9$MdM3rzdeQ zR^GHoX?W~UH0`~9$8J^ZQTF%x&fJ+R8`+C-QTv}?r%UKim*Qi7ZhUxX^{w>e*ZMT~ zpo9+ps|3U^?)9jr-8T+9ARJ*h2!l#4F0+Luu_K{z1R*#K@5RK1A(J7D%F|)`j0$U$ z`V7KNfB~~PEoRE3RZyYN<jAiCVO75NokZK0zSBo*rQq~YUIyQd86;6QCKw^b_r{p> zqOAQl@_gQ#GTlr0F)UG2`om1Nc{<!&{?*SP=8F9s5f<kjYVKR8OxZ<@HSf{)K1J9> zV;(#Yq=(!_N45|QwSWI?o<Iwt-qD0^FMuRgqi9?bW9%_I6ct!NczssHoyG_}QaLxk z#7nLK`JIRrB(!2Kki;IJ0YEqnQZdO4SVcAzm0Pk6L<x!clP3(N$l#Q|H+mUlOc}yJ z=u(CbCOCy&1A{14#Y!l<88#fxD&@op74Pu%dVjY0^-n!k5q#tu?WvOk!Rum#;>GKW zU)VijRuftmbq-!fT}t@(<@co<P((C=#2|h|NM<*R_DtpTJMv5yNsC^IpKCetx}|Ki zL*%TkAOk{16cPxhS`&yGGM#xztacTcWJWcVE}Tx1Oi5*R3ig7PC>y9;X3=9*Phn+V z#H5;vn5aO|87R;9(iYJ`ig;-x<>nayf5J^#?U!(qKfD6Ski%DC(&SP^N$_AX0trU{ z07rt-@yxCu-e#lgL7|jcdwr_H^P!3)M$1hKOo4wt=_Z>cxdK|EG(_1CxFhNPon8}L znZ$&Z^URP9#I?}tTf5a+C|MaNT%U1`I=MdUU94qs`%3G{FOVBUPPa`(k<-yUZbO!u z-mo@(-s}oe8Yfo<DTX&Amyjav;7?4K^C!-&BOEYE8JrGI0x6u2Yr*7iH#0D?yqcH? z>71fi-7F;L=yVI!vX67*^76-}$Z=GngfsN!c*!J5JRwLiLl63(3C68LV7MR&LGmiX zIC-|<HU#4PCW_QOd)k9ZQlH6;l1lzi!DuU~-};=A%F9>@!#08J_#qgaf`K#Ff%H*% zaPi%>a0@3Q6`j4`dgGnBm$_yMo767@aU<4D+X64nN705deymxpEx=yqk)dL(Zxj!P z%;-RYvHXPTN$Mw$)LsMmCoAX_oCFRAT9u)b6gX2Gk^NM>8f6!ZG*ARs@8$yP=ZGi` ze~8E<ZW6sF0jA;vz-+?cyw(!|T$A@RRKFxi8uY@EgkGjoU64&>(ou01f@~8{YO^NL zohJVW=OrgetB{j5GDQ*mig5mU0xGlFO(}U+57XDgs4$uYO(Q^G!{x8)OX|}J5TJbi zUr~Al@^0s!i(zTDrK_TsFEn!)U8}YAMiMg6sstk3iHKyySK&}$579hN399oH)JrPG zO5f%igc?Nr!Al{Dy8-%oHlj?bx!~`wqj4e_y(v`+iE&pJI&}r|T(tsz?`*?=RB|6( zuAw}ANH3g$+{?y`BcZFA;0?zRq$DNjuDBxosfIN)o&rPQ2+6wc9#Bkfs^2`2mSvl? z;#AkiTc^k%;R8XaQY`%aJn7Hwlj*oO0DejZjHv{~D-9U71X?!)`0ltY&O5Yq+c#eQ zQmjtne5#0503z5V7B<XtR$9`>_k#1t&$a5&3%W6E*gnxS|Fl>NLg}RZ0j44fxZ2JV zzs3ME)gii3jClwPk-k5oO`TR3NO0z(Ad~<xS;TJ>l*}Meo!~I4l`aKg9_BlX1yUpz zh!8WLd-RcpQc@)?;Nw&>v?$Dg{^um(Y_t%2ATgPlQh`uN@kAChwe$2fK~zn2;o7a( zpu}vKl71Yg`en<bLC5Zcn$U!?n~ulpjyNVMbFK8KiIuYRo_Ab6Jd(zPJY|_S98T{Z zyuU7OVv55vRCq&Sg|2)|+jixQB)XvCX4LF1?2leiD*4Mp8tt6StX+`gXeh~;OR(YM zc?MI&i7*~!*rcy0!H8m#7S5YZahc@i42~6-a(aDMOz-nebw^1Z=Mn4L9|a9=zOo<f zdtBFlxFN0-q0Uy`*5}$VbYBzYWWeg1=#}Nn@>}}MQ60x4Y9q?N#&5_+I#0x@zD+(3 zDn>>VKn4?_lF8lQK+xsgO~0QH&Mt2D(jFpFBoz<Fi(BS8^Y3pLsXRP?+aKx7J5^}; z)8kZk+v+m!hg5-|k2jP9tslmIcwT#0uhB(>OuKw+UO#M1SiC}@y3F>9|7yDJ9^@nF zIv4LpoB6$Gzg;b+OSqFcToBF$cXI{jRLL*7ZGcGm6p<x|Ov0;#K$H|tH<2`{$5TBR z)Ot@yY*khBL-4ulQU8|K#9KkxCSsnDk8T31+N&NLph^I<aLK6E0kN}xB}+q+DF>@B zYFTvZkXPoZ^jnW{ulQ!wr`3;sZEc22`!{ut*Qkt_vF6eq0Ao{}tn$N{vEamr(hau_ z4F%`sgz|B>9wJf%gF~fRN~jhZh>D*<=^J=ikzQ2;Vs*s*krg(mW(5qoPiIPxZ-CBL z@1VknHg|~Vypn+(u1&IurcFbZPc=+DLt~mX36#LVNMHs?4+BydP?W82k-0cVGRfh2 zv+!JFhJ&K;f4OJ^T`IQ;2+L)?&yRzPZyf+jXVqBw0g%3qj^<wiT%A)uxeE+>hzepp zBUu+-l3{diB__>cP50!5iLRy<I!m(VH=IIbFc3}>%UFYB(YT1j)A&u}OMj;xCc6HG zkl_6PA=&C6S`$AvQu!;O8W*T!y72cTUf=+r-{jhDbxmS(YlI;uvuu{00ty9qF#Vn$ z-Qee6yaWi}Y!B}?5u;8-;sL(d$IK?AQ;kZlZ~(b>lewg^6yHO?*#p@pVr+<)yh;Id z5+}A>l84x)OJXx1iJ`j2l55ImUxKt}FAovXRtWV6Xm7mCSOC)ovSI+vHjo)Z<ROxT zkJ1lq0Z5n_2hew;Ns0pv<skxp58C+JNJHp~vkNczI51Aq5FP>vq!9UVBx#?FXCNeU zM0e2|Tsqf96$048Kv_|J);fu?gI-9Rl%OV&kEe#=NFRv?I9pI0{6uI5AhrK=`-*{a zynzYzmcgep080r8wNK)}CQ+1fyEn5Avryljm$DHc)!~4TSr7MLA*wBanO9B666qy{ z5Lm$G8WGY|$-GH~@<7Uom6LR3ujlCgLkZjLRtiW1LGKOOoA_B6%b?Lo0(X0)N|GQv zNnX1}QankJuq0N+JFp7k-HbjspjD<$<n+mX#RCX(0I0wHw00d2j-+!7G7v!mGa-O5 zswNBr%e=>H03z8)e_a6(1>vR*z3^}NDl|o}k%p6ran(fOFp}JnE(s0rR6yu4L_QQB z53YitP0H;i1VG78**=o1=zAqeys(f&eKgddq=&%+9Izw+-wT8>Gf*)oSX&Ze^MWa( zStY;O16i}KB!GXD;kOG3O)%)#S4N)c>XZb$>q$r~k&TxqgeCrT<!ASTu%m#?O`W;s zTS>F>d=+MVC;+m_HOD|?R|Ffb0Xy%FcIN3o9^l8SA^&?LJ}e0slIM#h0!<{gIwRy! zdXox?0|o5TlN;_<0u-Y>0^RH@qGa2!7yvA}B!QF$Zo58C*<rDT25KekX6nXqfUMY| zJOjO1eayIlHUvl#m+g%(2ZpNvB!rmENL0u|bA*A@2cw+)nC2K=C|OrJ48x5h;Y2Mz z!-m9Az!C)D-~c(Ii4c5igRU+!8WaPFP%2((Q`3Y84*@HP44ZVt$^fDcLX<K4TW|HR z)5`Ddd5IF*OD`bcMEdXQNc*Nik0hQHR$HfsSJ(s;N+1e6hCAE9V`<XM(IjRbqPRZ< z^e6uOG{Szj2M{H~u$7N^lju`MUtg%Kn{N!T&_UvpZe$D!Jm*JZtP$6VlQ+e;d0*F= zy@oiEF#g@$JSZ41kO8ZKqH8h@-oSZ?JpL6jZn`m}q?}t29yDJ(2RK@7l3+&^ePJBY zV$8uqq__a@uGsLS`0g1Dt@D*bFqnIpNunpb9Ey$Qk~jAUjHf$+(NaFhIlXayy-8*L z{wiYTLJ~v8*t~3i!&MSL)d>QkK}=Hz2?a_})Q?B)E-u<xj+KOn++~$)Vcpk;+%&Vj zJyPG?$SVgNK!nRPti|hykD77Fk|GGjwwE49)F8GezozHOV9R*STnE7G03=0-hZkT_ z94)N_Swv@;C+XP(XV~yWLIcT7)&W@ucz&fFa~)a?u!30o=nf*X9iR!)AXq-;l8NV& zoeWqa4<1a>C-Ez4vl5NLqXxk>V!Kinln8LQ(e|pdo^$$CIyF%PP<f$0=Ry_~Lz>L` z$l!l#qtvRa1HhoP#`v5dle53<z)ejegFlepCdEM<o4rPg{8AOhXSqx3+PXNh)k!Sg zBGpoN?aCIN%fC9ehIQso%76_F5IL8gI=V1+t)eEdcxtSCQszGsARjH85{53$ov%nm zRUWGMl-P@h(X7b8;@kNqCba_W%_c3n-<rgx!kdo#8T2S&<o^2%$;s{`)Wc-e!db0m zly;#a;Myz4-%0w_()nqpJqd08nH@XtZLr{tdZ(Y2Pt?lF((1mh4%xSXpn)99!d;$j z4K3o^o#w&UovBA!uqKrM)SG6&?0$m#?Cr(B*U)eiplc{Aj~!jtxoEqnYWqRP_HeNi z`=QtC!itv1`&IWGbl38A^wMp!YY`qg>`N4}t~yPZbgcc?1oS7lrF`Wqh33U8)PJZV zwCokW3oRL~2U;%{+}mI5FYS*l?up6%HKaLD8H!{WzQ0iYR_IPWxdhZ&oxabkY{*Jd zRC{%iP{rB)z@9$&09*AT)AAYxHIoI?eu0u_fV`%xlo6QADTpEpgZu||Is&`4Cx_+o z#wQ{x`33Aq?IRN!VnU(}yLYF0r0q5@zFJrwURJH_>|^lS49-=bTVCF37T#MHNE;EM zSy)}!1zu*cIe1DpddYOJv`YdAl%U{II!A62BTgM6)zO*d#T0T$1zgVf*Ty5>h8(=q zjA_fv@_doIidDt$*LX9%)PD8aOXt)Z*X>n^h2+JMc(u{cA+d@SGk&V7Hz|5eJS0~F z;bmL6_VvTEdAFxn_nO%0vI*CUapRis;Ias_ukn(HAhVCXhp)rTbhl&`Ss36q5iu^$ z%FBf?9ubhIgggJvUEuOW?|Bm(2wsf@?{12hr5{Tz#Y20YG11R!-PeC+)uGYvO85HK z)RTQyS!eAv@G3ewZz2QdYv<t=u6_BM<>l)hmm@<iM<s3u4f@5DUyfZ@meYm^l#pOe z(=pP7w#_WigoMG+`O0s?RsECw{7$a>r7-)YC2po=`)9mdjcxSL>h@QBulA^O(dI0Q zg)$yF=o8Hx5D|IVoNMJj%Yecek6R%D#fbsuw+2Xf0_+__3N_ciw0tvVW-Hy#uY5e9 zLe-BxE#QHCU{!Y3vfR@8;o6Iej8o|VBcm<bvtJ4wE<e@|FfZ~E9`{TO@~K-|i_qSB zT)tf;f2CP|2T7+E_Qcy)6|mbfpbJ|~F89AL?;o&7={ODO3fb%&-|?&6@-A9;Ki%n) z->uLN>bDFU@CbSx5;T|?^d>uKs641&dq-u90SF%9+$WK}u-DThXdbyj@&FjU^h`T= z+A{cqNAOHY@W;g9+3euC^5FT#;7>1uREA&J-jqXNAvT9Q58R1BG$@E7GF^it6$O2% z4O;gI*$4^QObpq|4%sdb*=Y>f?GAZ87_4IIPDcSVscq$dlLPIRaKH81WSW8xJwktl zg#JzpJ<1OKQy%(P{PLc5ZjuQgNUIs{lMn=ViX{bt0;Oh&5F$}}C<Oj-4;~tZxDkfT z2}9ivqk9@gpT7BTFjT^c#1xI@p9P{gcfMYvr6EWwe#0WsU4K2Ua)n;yzHyZ&=jxe< z-xw9pasng{9uPtP&f(Ohti7J(Pn52kTde$2#=H#_UtzfPgW+<xL}<9=jc}=)aOu_^ zUSo72Ay<}rb%I&CTyvhA`}-Neh;s@N$~qA$q2FW#bA?_rbcG${k^I9}vyL0XHSULN z_C#n+L}-7G(D@dj>2UxG-PGdRs&k{G;ra}zm#!IwUNgRN&4~NjB5ihyr$<HSmy1lA zX+b)1L~aTLjv8Uja@|Jox~;->JDo%NqH7Oo6jy$E0ST*S;(!DeEJP=9pv!eW9pd+{ zdr+@mN?#)&BQXNM*u;MksB0GmBF$7Iz0|yXsE3%y$iT~Mfjz(c-$Vv)95yUPhE7C= zQ6sOiM1>1RMJPmF(}}un6%~2ux5wqf4x)>mwwS=tx0$oD%UqCm<(^`gYpOR7e!-)U z?Y;9q5ne=lqY_uO{jT`SA7!%dVikVIQ7;Gl`=0mj%awe}%wqJ*3cu_d(JhjG(Sk9w zc^HHMD*b#U@0SIBybogbKjvp$&e?9DW?ydd+p;jatdz6;X#7u<s_&1Pn1AEjX4#i3 zTLT}<|Ggf<ZtJm?cOy1hFoQK31oyK53dqvb(Tole%mC+YNgPkVU@gOMzKpiN9Q3?+ zuf=#X=}J(uaa>)_zw_x55@gaKCZy-FFEkgz#<SLK>@B+VCpYn0@0*xI=D$LI8-3J2 z;SR_3MR7wLdqQV#!8R*WOtQ?*IwDO;H#~M<X~(6V#{bu|pK|H&1u|M%ust;=en#y| z*tkcL$ro%nDk^Sd-Xs3EQGC%%LcYUs(_q4*#BbHy|7H{tvtCjbn<+2Dw86^V-o%i1 zR=aUg>zdlT8q5il@>3rV|F+*do75W=glgjV^nf>f7jB$tmxua@Bd&<~-Kh6C4&lDi zuyoyeFy>X5*InxJe>2qb-=0JqX8$w!27-y+02d~tn~LO<wvfE)rJupfYS~$W_IjPp zua(3o6)rlQCvNq?;!(KR+amc(eYd0{#K-QchOX4NV^VV%5%fMho)oX~8wgEall^^3 zvsz@Cyy0E4)Q3EKUA^<_*8|_yBc6yey*k{P%5^l3J?~m1JM+S5(I{Bvx7=`x;kT8s zCs7KYyA!DpX16IagoQ0z_UO&33F!vXkBh@C&wpviP{g*VK1O+Cyj&-lSuVC^4MazC z@F=Yql1ANI=f&jWRKL!@3|;+iydkc27Y1iL@}H!b&`U6SJ*ggwyKt~ReqTRFK0$p{ zL<Xa>-_&QCJgDqx%c78|`RB*_M3ver!fSdiGtSuJN19qEe}8>jop{<KmIT64qC{e- z*%-%6B2u`dB8lOg$vqs{Em7gCF!r$`mD{VNGL0_@R_=8E>g&o3kvyjdH>V7*<z7*2 zh<=cz&{uZ}2LM8UU~qbX3dnK;Fn|u)4gx4DAal%T(p1r#jAEB|8)~ZTPe+TGm6|+z z@H&e}IdEa<S=E~yjD9A+>GSI0d`a8KZo|)O-WDr*kCd7=*N)x8Mr<z(H$R-Xk4vUM zYt~ZtuF51|+I^(u(bPkHm06kDi^m_HI5h_@j=XsC@hPD{^Q`&H`nhKRsmJbbUp9Pd z4O<;4GjDBNd=-7Lz4*5E>E|9IltI9vt!cSGgI&gBwC&mIn_Lm|a*OuoU*47|Us)P$ zZ{C=w(9aUM*wL~zRcHIeW31!F&c`P2x8)aKz5M#AEn;VBjPH8p5;>Vc(6Y1b`|41> z%%$<p_JfVdD)al6T^)xzv&~mNk9WQL{f*L}MHRH_?)-DGIrZeyM0eM}-}|d??_2eB zpZq&I*!eus(?g{K2uWI*m`k#V4<TMhNn%vpq$Hz_B$rb-9Q>D4dHm{@)A%Ddm(ww6 zk}DaaMgA){C2Q+eGG$+Gu4E|=O0M2gnekt}ja{!>&DQ+2xtfDRNUh}>a0RUWXCnS+ zEzd%AYb_sdB=x1h&LQASp_AXEFGX&VTVIL^X;SMYK1BiRcl>J~t>0yRMqa-cHYl}G zdTl0Pqbz#;(MEavudR*yM1(Z$pUoAxnZkCQ@BaWU_t+ms#nF5@1!laxHTfQaXgFHQ zEEmp5lHS&-=uRPBsYx??tXowZ%lfd1jheDmU*Zt>q&hoRJ@;Yuk2&&FGUDHk4inmL z_t}8>6+9HJxD(VosVx)Sg61iB^n%4;pRDsK^6l5w%#bIWZ5^?&fGh23|7a=MKn<zZ zT>1h$Y-+~*YYV+lR*>#%HksX~8{1E0dxi!6eS<OuG4w(i*cs&d(T*}oFb+qzhWZ}@ z9J+8mN6L2{h-p~k&^O;>{2-U(an1m1>v32=72?{|^p=Zpuaa3;BezRaZFH|=LH;jp zXf2yz`_*4v=@!`HIrX0tI%>FYU3SXmx#L(F(Z;b8Ui0QA6g5+^k3om5*etKy`C~+i z@7j0$jU<lNAyMU@SF6RnId$8i!BjW=!om7ib_&w;SWQp5xpRL-zDg@{w12Qu`J*93 z_I)=}Y5(0P=HItMYv<DTLaLWWq#GYXYM6g)KYpT}`$W0Dv5<29-IDqay(#@+$6jW6 zaE(oz<yZ5&adU?_SB9Ydp3|hV{R5weW6>j}BHfXP{I46dj7+YSzOO?r%Aal{U(mDe zss>wW7^k(~pIqTEzwxU-$9VkwSUy8Mdi~!<b^H1oTNbE*A{kU2AhLM^zbw6;ntW%p z8GFyw8INp<6k2on-COY@*RgjgK_(i_A<%8~9Oo5$TMzWf{Big9i#xjCVy5#vjyYDk zc|&{?EPE?$mj?TH{xo42n@fIDOAp(cbeY2ky--xf@V+7rmQ*PpFOJ}KR@Nn%ln>iW zdx^FGeIi*2Z}wXt9nQ1jhb={1JLkTMeyM-t{M}iAl^eov&REP+NyKV*oSMe=TEjBr zvN5AWbLLU!rHcw)->*37E_@sie_$A?ZZLdiqE9~a&t#ZP{^ylrLzCxHR^d0M=gDDt z#wkbdG~z}}MKo+WCG{!_xMRE-1s%Z80Z)nq`pJ*z!ymh!_7`^@iy6iLLE~BT?Vr$B z>7FBU`AH8z&Jg_!3QThe4g+^TjIQJAZ-NYpOvP5v%W@);=Ge$;r_$saDL(w0OCPQZ z6-7+21>4lykLP2C8P<NF0;nb}_F?V<43f0n_9RKKIYjl^=NoLXrgT046cqE{hWwo{ zWBZ=^&P#~xUx`5#hk04q&9#d_T`oA-EF@uQ0)CD(%Pcs^MDLVguhYF}I!~@#j-Qvi zG*7-=5mA5?t-yZ{cvCQQP1E?ql%uQ0YU6`~=iQVNoR~VE(S!hs=K+W`2YhDCZZ3g| zPe|jV9kY0KjhwU?Ipc1w`rYZA*H?sH4(wla%*)hX_)?;5H9gkJeEZ>b-_JP4%{MRT z&)4i*EW0h{j}+I33t0tA>%8M~IJy~8!9vE->9!D2{x2(5ZUxSH_!|sEZWE&1>P_-^ zM+VE&tCQuv>Z5t;E2!P<&se^@ZR~a^2FnH2<}g`9&rv?Qo))&s?97d;-upD`kkTN{ z<hrhRvs~gq;R~5Z5}fTH>>lb_wb&T?$lFf?8D6R_tJ9(ZuVh}9iLumGU&{#mqi?ss zm79F>{BEQWWcKnO&f?MM<anh4VC8{Y>B(6S1E)aQO-NpLcznIa*)5kp7>1W(4W=J| zeRw)75Y*-OB*^lNF+TIGGKtaTS*GLY3fI$U5IVyI<)W<cemWAYms5~WMOm`u%=DAb zt;`DCYUjBJd-eOzrh4*ULdK-St1+*K@iA9kQ`2n8Tz8%o1&n@?i)(-DrhPS>Cb(9- z@n_Vp_B+TF^o3q@mRfq@%F+mWlW;?~ZJfPUB>V8dfYHiP+_2pFfGGQto0qL~%3KsS zu#4u?n19VsN2Dun23aPL-YGh`{+qqyC8oy_Ls=`z5%SYR-*f4ZQ91X0(>(X?jA{p* zF+|VIQMsf0PiyetIYar|>mK*!AVO^cpEn~*Q7M?QOKCuLtym+1a9s$_EHRX(8VuO} znKujaDEs~KsnbVCzqffm690C(Yq3O%^VOD)md_7=x!v(*`Rvnn4flFDxg>kHMeQN- zUMP=7EXcJFnA;u$-AXB8oTeOoQeOL+vYnx2HYWX-As|8LE~xh5$1T<-U*Be~2Ubs< zI;+$-HwsH9x2ff(sT1>o+O7P#ZC%ZHZ@z<~p7X6wgJwdWxS5BXZG&_SDmk<-5Mji6 z2x7Jg<idd{4#Hc*H_|X{b`US$E2nw3Uam|`Qj)RR9Kv(DUAQ7>+}+HpPhJQnN|r_K zNk=W&a?J4cEj*nH8;LS_Zhp)Cx?E`1pdkxLM~`1WV~%<B?({;^Q@KtT4S_exEWe+0 z$z3TiZ=Yz1{Nr`VoF}%u<D{qhhvA-tS9E@~KPMS?-_h-wc!3a0Oo<-yZz0g|d6^j> zM$F_UgFHOFD8&lm?Pt>ay@?=PQBn^gsrba#dNi<Pg>%lBNJ2;BB19_es>41IS#ROy zge)?su$k`G7dxe2MP|vL0uR-;KW94J4Uao$z0~qO=LU31jr!oR7>Qdl@T=OhNFibX zM?XME0I~ZJ1tQe3(Ca58SY6diM8d0PCg`h!%Zuw)vd@eg{m?RMg6`}w8-ogRoL4SJ zCJD4%KKnxF)*IL0NZ)Z<;`1TE1H?65Mh50yqbGo^ACv9y!1xTnz8}}4M$1Fc4&Xr^ z4<TMeh$IHV4<!12R6~WqWQm{^Ir36*B>gntP5|vGP&1mk9uqbye2$575uFQB$OVd@ z0}2?JQ=z16P3+GHu>u&la5Lbz520^Kn0ON@oD8_rcJ7LazEQRl$jC7-kdcZxr~XFO zCEAvO2#$-xobYhP+Sq|4uy7NKUC+SwMs@q)REj`ZvZWLuAT2$5AoYrlgq}ug1pjN@ z=f48k{gMnn1WWs4_)84j4@i=%{`a{}yy5yk@;$VnmVQ;Sa=&DlY56`>Tm<F+2726N zveqofOaz2+DF!AW9S$dp2ongC;>RHTnzH>c2oB7-%iIX3eHMXSggX%$M1~kwz&-a_ zMDcJZG(<ZWa;5^#iicY^AtWZ@)JZsBE=@lV=Oct7Xo;5$xMvu|g@~Z#wcOD#o=Lcs zBGjb<ZcGNOCgEJewDCGfhljgQ!X2aGr#w(k3KUC4BU}K`J`7?-$)}}+q=--#3~f3J zcbbIrH0AsrqDA&VrJGP8biTwsL`(|qUI9a()9eB8coWKq&vVa(XjlAaC>5k4M1&og zF`{8oIGVj3Lf9gPagu7eJqoW|bNc(AL0wYP4Y|!}So%>w3g*gR>vC--$ox=8|GLAt zu!+K9Qky6tU<RNC5vNL!k%ZgG3fO#f+(I-U4P^I3fpocE1THBdvXU?v;g<_@o6P3N zC$eDC+7uWTotLr+#Y@3F_aQ9ppfZgYgooP(0NxbPG7RP(2J@uAr1oJ_7??2;uAm6D z*@q0=L0}aT%KI#I_%b%yCDc|#e7R64oDaBApt50b8vo>549xuxoM|7Xhk*x>A#7*_ z9R`lY6?u~(-nk$Rm*hf=b)yk%M8LBR<Q;}c5#g2;m@FE>g+>?;LulT5%Y7DcXE-7( z-+mwBNd`R8L0b_)HAhiWs!&;4tdkJhFoeD-aYqv#qsEQfRk6#4DSkJISujfKwed`L z77YASTw_=L40h}HfoG1gzhC|>dD~#??OXEe!1>%e!4<$qNyz;RNO}rTXmZz(5`=Zg z23wVcE3)Mk!LLK{V~(=g`!Gfx1Pqfe-T^91!u4_i#6B#1E61GxxT8UBN~s<OhK_|v zP;={Sa1dGCL(4FTH#%Lm0#3!1F%a@R_a6wM5o(2iQ!YdT1Ggc<={8~7P4{8AGW%SF zE*|v61NIo$j`Jh2zmQtqDxMBt<_^Gz&)^~C`8vZ{F!?zyaAOQCsv}2S9cteMvBv|c zb%B`5BB}$iFq(GBKv@c`*x_EVZ?O<}P1U+7s>(WVN{=_1t;a+$*dDV|lw@L1rRj3H z09jpjfc+Th=3f<^e>3HBEg}Ml3natn$d+_CxYiI{GWVMDI>c}vs)L8IxJH|{-DSl< zcH6S?Cihq>Xx{{e&CO>;BPMwfjAtrmq+svwf;PFd_GX16p-!8M%hNKYE#9H|cOe58 z5JDI@$`s;+2h!&O@Xk$%GYBl@`J^etMzPR-|A8JJuxYwzgRYkfdtCS!ZiPljDIy$! z7DqI~lTu`igZOFWx=%jBIzOg1Rchl)@pShY36Gclz+`A2OQeym8p5j{BshkSI{>ct zh{n+wjgogxV}sp!XhI}8jk`~^=tDX(Y$&Q`-{^%Niry0WFYwH!W_X%)Mv?8<Y(Vm% zm(yLiEv;)c8BAXR!2@t=7*IM0pu#|T3WS3Qtj&6*Z-N5)peq?Z_!jPKCWBywl#78g zTi_@g1S$y%5g%P@^XEfLu@Mu6fJmZ#`YQDYU(WNc^6R!zgc||``)mD?0{aQ{zghOu zL7#`tB0!D^8iWTVxc-6AM)-V_03SMt3Dc$aMbhLR<cqzB2tc->{KwbS^^2Rxp-7xF z%eFCsOb%bQbS}nRRvnRaDG-aTskM@N$ktO=&1B>G-$CF@v7|`V_TRBjpK_?u|7`0M zA#K7n{1D{`!nHTvMEGPsM8lf~ub}%B<rt;qW31rwTmOc>l4wP2ZnW(ePROZ=lsbJP z!}8UHWYg8CG^mi$#dxVqnnm=_^^5VExzEW{Zz6q0BS#Q#P*FXh$jGU=E-l^6gohX0 zi-6O}07t{Bpfq#4z+hn&)zHGrid2hss$P4vxa@6s30rveR%D2z8*7E@E!~%zUf!w& za1U!~d9PZpqk;>tbVYfDER`#4r#0c5c@%IInbD@Yq<l4fRVqS6X7yZT(YdSb^>6*> z6khbnpej>g%Tk7pQOZia+>V;6wQ{DMBmvDDPtKYuWGr7{IPo4XuGUiK+Avgj`0%k= z!Q1LA{(idEV7Z|-+-0AH-{T&BL0JZG6E95MOEs0Qtm1lx`>H<iYj=Rwuz5%~v1Y6m z*R1wOd??keG0nm^gTFspw*7F|&3s)UZq2d_H4gJ~H<=$3Sd5wP>?5@lXB`aRV)v?a ztKoh(Iu?|0%ZUF&RJ81gza;fT@A_TU)wN4jHH~wfdKjVM@~jKIi-HmsICDgZ?5!$R zF4q)8S=O?rJB*<h>H}*~69(y^z$E`upAYtn{>edA%qP>zQR7Fkdb!^2#l`Q0``+b8 z^hph|J{p|baWN?8_qu=Uy;PYqkJ6ONSN`~~{_Va~mGLGQZa02haGyVBz4vxT2AlLr zX&MWfiJH9o(phy|wqG;7UvcQeqv2`v$=u%&{<T?OFL&G}Bjcf8ESKayWNloyzgYY? zyuHD1Mh+HXYUVEZpszq=xM(4ZjrC)x=KF_fx1!5F-Z}gz?Eq|B1HWb#7;=G;MOwpl z>V4_^ltt{Dj9GFQYsgtMJ?htYxnpBbzw1oY+Tj|K?#3G|*vwa4#924YHGUc|ZSei1 zc@~QUxrv{TE<#v9@E{@JiF;$uq0wgj$k&8RMIWcGz?Zrg*_Rv6l$*2NyQc$PonaSX zB{wW`qwIYnrecC?WETOHV!%!>oIPwsq8u7dK?_y%PRq?&kH`&bErgG0ek${2+?#D% z{KO~8x2EMy#V_f<TkK7kK_*g8M&_HaDh19Tc#8ocGIC4kODqN<nY|K5E8Qoe?Lr`? zYM;;Zx;)(Q^GsN?lKUt>y{Pbp-CY$O7|F*nKK9OSnNeW*B!AiW{KD(t1^d4rg+m~& zjRLWR7010=()brS>fVN8i0V0JrJ2s<^W%+T@wn@!?`}8P6eaqEp73hOCSTQN<2rqJ zj(q{%zl2Zd7wla7zPRQVOtfASuuoiZBfuoeztHs}J>;AA`PU%=q3NYre%dpd?%NlZ zC>qvFfkj>i+q`S4?)R7cuUKvc%HR4l<`Fk%nmxXeF#hpI;-)+aNfFpv(cWA0*jrEB z+brMP?%vy7+S@zbi$=30Yl9aQcO*g(OWNr8+|7mV&Bb%8U%9qa%V$djwnNII?(8+H za(`{;^{op=>&bKQM?2*;YSxyo*>r4ocw{z~f8%?H#0dTn*7=dJ&vFU(tjG8n4J<DE z`G@@HA13=h&QWy^R4yH;-Z;SCKadNB#o~Tw3;tkb-7%!GUCO_;oqn-ordY=oH$@NK zvY25TvmDr*E)p2lUf$O;UV3(Qsr6*{y=B!IuI=^u5Z=VVxyG+=#=eT|eLwU4Aml01 zhzN62L@QCD*L!|YD}G$J`mL4&OZ@gbQt(Jg=P2pYQOb>@wEIUHJx7_Jk8V+qvOgbj z{9_5H{L&HpnUdZ4d++PNy%nKu`@zLcso+4!rSAo{Til86bWgW7F7oLm`Z<4FXS=lJ zmV9+y{BYi=e{(nKkw7Rj=CkR2FZ}o~ZqGkDEWe)(!^4}7cO;Qx6UTn!;}OA=$#2IK zg7-!hkP$gBDwTY)^!bEBJy{VvUDG*TzjV5J<8=G}>2A;I`oxLRK8t4Pu_%>AjEa61 z0yDU@lb-k!ct-$}NpLy=l_5+&G>uaLo3fAbGDzp-#kG~Niog*3f{I5xY(B{dM&4tY z7@Hc?d`b7B<2RJg7I)4Cj1Szg-LNdzN;usOQ1%-o8C>Cl-?iJasl8aHoyyDkc=F!) zbe9@wdztb23k~J<vG%fWD-|x~8QfEq8);$TZA+E;Z`rNmnvx><p5r%<P9}5-rTN8W z!M;=`LGk)GCTz;owi43lm;3x9xnr8y@pI?=-rmuW_>(UB)BjzK>3!8Q-owBT4bDB0 zXZe2Z-Y}*9#0&->Jra;-59d)j=b3beto$bhM|NyqLhx*lpZqRecHI_TeEd3lv3{h< z={3!ScP+@d*Q$%*tBc1;?60qjP`SV<N_;89DQA2SXTA9kwbqYrTUCWNW(=ax<&HX$ z+w!p{jW>DghiHLaG)jnJqhE%E&h%DLWBE5(l_6*(deuP0MDv*eyS2~Nfg6d@N=7`F z3!WMAhPEgf^G8iTGZwh<Q)x)>cH39|fzz#iDXoDLGD<n+9>A;(S?z~Gr3VzvJGlZ; zdPpHRv`Cw}dYI@7Co?)Rl~(1QSI0B`Vd8Q(e|)>B@ohla>U)RC#4F8rQ^Sv|$Frow zR9uA>sTwb4^%#2Fg!393UlqBIE0C9z*_5<riHr{|bxs~m;f;eCr|+oipSQPn^nGFP zcq#R~gR`S=a*hQ{R;Jo=9x4PY{a;m!%|>;WrTRA7$L`(kv|E5CjU7op`E##e##!s> zYt>J`WD5?u8R&kPeL8Ft`Hk0S>T0xT#d@iYA_S{ZdUR6LHs%PGwXiPN-(OlU-Jrs; zG(zGYw`pBbP+peDm4+W9u|4+wjhRb@PaY^f@^*ADdaw1-&0vnB^-*kB0?&M|mC*&? z@2G@G7p?ne3nZR1%T0^s1v&ieFygyy*I}Bx`1XDLp;()LRgRH*K+V-DvyZ}~CVi>P zKNW?j7b=nm$(0+K4R1RP3olN4m-t00`{{fSYVY~}%dS1R^^&UO!}PED2NkVx!oPbW z?r7PG_OJ}_h-M0wwk5?pJLc+-QyUEpcq5pu8D7(>*M^eML}xRxGDZ_Z7)18Mz4`>{ z-9|S9|GruUKgbr0?JpQ*%5(&b<oyc$HmDV)G4-Sfzxe0pS=nd34(1!>3Ek?OJ!z*2 z66^QUPoo~jv0K8B{E|{J`On2w-)~QvacMmJqdGl*f4o~Y_~$=6jo9Cx9i_D=zDS%| zc>a1!<A&exXQ$Pk*Btx?-5f&w7g1NsT^9~)289rRQ_QH*m}AirxfI<12*2bI$lhAh z!Ld&@=b&>lvE<I5z8QS+Z=CzV%39&kwJS*qDMFu!Q9bIuJ3+F13>JOHn!7yTqVwK+ zc%;mzs!mr*#5yHg?klD#P70-2O&2v*43Ktw6=KFnG~P?IY}1`A(fDSrQM)vK{=ETT zyn*)t+U9<hTZY6n4exS%o!V*PT4)r%sR_bSDGf`ZW#K;SvdzB4h<+EmhJy;`qLAv< zAWNu|K4At8RjsRF4vOyAS)rYIpZDGjfYlJBqjfuFaml|{Yy`DX3O9L%L@;NBwnu#$ zPsWr|=Upl{d?fB;)7}?%*xtW4l+oZ>emQ7k#q)b~tzp`+MVvmPbDrM{Ox6D!%AHE~ z<8GXT%SnPrQ=fjuK{QO&i3AV8>+vKhrU^A+n0rzl=GDC+b;F)raPh8v5b0Er?d}`o zSunRZkDLtrpjeI^b9eN+T=3r<GW+_gBDqURk~z!YvqR}9$gLG)TnPT^QQ#-mL2^2c z!oi{&*2mW}nJR6!%oM=WuQNkVQrj0|a_33nsz)QmG<E4+hN>Z~>UJrflU3+dHe<&> zx{d;pMWQOX+v3viPS&I%e?Ph}|3%rZ@v(IY>?Bb4ozbLstkRv&-s^6qF|WUPW-98$ z>{!gkq^SAlGl$|K41>98DnaLNhGuN(Oyc1(bt)*`x_<VKiu6WR2MO~BI4U}IsH<hW zIqO7LoaxQH29bCA+5N6hyZh`zZQtKlMm~@>)DXwiyV>PH;wRk-%$`<>!>aeB7%f+} zEAOBO9YUM>IQMf!7k^e_?Y5IR^Cayi1quRD*e?j(hjw%UKMSA6<7B_`*t^)gxER^T zQf9Ja)PDYBr_|e^*qf#fz#YzuBR_<cWtwK5=r(J$8@})U;aVb`u=#8wc<*YxpVi2E zewL?x)*Et1_o0trm)B2OqS&o-Q+_XAUUBn`>AWZY;mpwe(|-SAC#g?5ykVWm17BV3 zOI_U>N?MKI(?v+|kE9uL7beJFy>7f<$NHS>asA?_v_H)a-)EQ~IF((^W2bgdUces@ z+j@qMsh3Kw)V#Qpciz<1cJ%4-UTf<en{XmYY%cEaJMw(H^B;>LACy|nm~woRU%%#t zPT|WTzIxY%>3p3JchT;r(3^LtJg)pvD!G!~p}lU$z9R4Do}JgeY7-%gOT&@D+3V7| zC&$k&j8{LlYTqt19@I82j+J2G+#H$Z$0P15-105^5!dVY1v$y>|7$EiBs>YJ2^fBi zT7?Su9Orw=IFp@1#sypb>Y<@7V}#pbEe=|vVTPZkKXy-*%4_QM&OV=bw$x|{PYB@W zo*(!$j$T#tRa{Aok%+F-KO4Px#X}!YV+8bf#x$f$ZGkMur|CT>C*P<9s_QJYSgmIZ zkGx?uOo1q1yEYd0Zw%b~_+$NgFS0SzV@l|Ada0VACi7K8-uM-6?js#>`EQr>co(O} zzE}M756CKKUXZxvKE8^S|5F(kvUKju%hYV22M<|Xu6BFU<UK!G%;)CjZhm7q@!ugV z|MfX&On&nRpN`#EXTF*d#jn{N_TPraXQvy<oqr||8>9GH+@B^7eO|gApQZKLQ$pkH z?%q|A5!a>Ik8!V8yY}nZJ$Anr{p-_hj7pAk+a*k>i+r#6-S+wVkNuE8C3N+>9bvcS zi@N?aCrE6x^v2BVPYi?j&#F_6|5a)~4Yut(8;eW#SrAoK3ua09RIo^WwPv)?I@o%; zuP@xWw!a=Vu$A~N;fdRSS97p4Ncp4Nd{-%~mv;wpZXCxUHCM+!Li<~@uO|I-Jzn03 z>a;)oR^&Q7XmVc7xY;CvI=3)ainwF7ds)M}Kk<<Il%-x>?&`8^wRgukdhVi1E$JO0 zzq{%_Q_m%&U*18h0@G#QBFY<Rl}&=GiYqQK;yl!V+^Tz?!QzZ$E+%AIhe77~-~aet zeQzoKM-H<szFKu5+eTIYm7>8;mq@IDVfa0|cy^%z-0!Rwy|=x5)jb-|dnO~!+UAwj zd+E;d$-SD>VIR-~MLVXXdx3ZsC28`M?fuRSy3V5}c>TFYPtKz{3#fA5nbF>|pI@nA z*II9QcSn1-#hG^#ru4C+`i3KFm>{gyPc6f3{XxA>Tql#ZMH}gfzQ(ThuX}9zq6Wk( zSZUqvy-!%f6@$TZ1}3uYW@~EJqI#OW<grh<wEfO@pzB}rgC~mm%JuB5D)%dP#P;9! z$&dEE`qPq<d6s9l=K`4XmDqQtzUxzeua9QyqHU{z1{>E-1EIeywfR-{L0c=IMzcoe zv*gak2w^S4s~g@L>WV!<YlHF0oy)=+P2Qcus~y84o%I@>^*b68eS=Xpngee;h7Y=< zJ6|<ViN2|V{`XJ4S@}V#vT<O6@gP)HB>sY_`Jm{}s=rezVSMz|LdiiK-C&h^2e@F! zzSif)Vd~ER#F;}s>G93WyyXasCrHs|)V0BtaHUl?&A1f(=w@tMf9EHx=%MX}!YNaf zbenp`@b{hMZuZX1CvCCGt;>H~s|t+P^|4w5niZmL7M;V1q9e`C+VS`FNA<f`{71Bh z20V7u3<idKS2apy4K*&jzWko-8<*`+t>t7f?4)Um?tHDr+VG!jN6tW*N4${q&z|Em zC`U~rwydGK*q)rg!4jWmcT{dk{bxaq9ek_FI0EA_>bH;=F&Fie9kzbp@d}r&sgg0O zd$axmMp-O>cIcyz2)09-3>(dD8I$|jcNpH(d5tShy&(4Pc`DMazc{F0F5h$|P^C8D z*-55_`_AYBVSGc=a-zUg;nV1PX+>-2gSOpH=3`!cPv#tucPZ#aLHpQ2^~FV23%bC{ z*|iIO@nbsdt<!F!z6-ibZ_fq<(jS{yEnID%GSK5^RQa!>H=i(85Pgw4MW^xU?WvpA z&lJ3z=8G|2$tmwMva1XTp91^cGsP_uC5&gn2CCJfld;iI3u$2_T<mN8)3yb&*Bq|! z$g+q$+2wRTKWOsD=3CU4cRhC21<n(6!oy(v1g+9~K7ZnM^#t2g*S~m+2RCIFy)0KV zpjaoU<%8t&`_<<$X62JsZtof-4{ega+XT3%C>xIVX1u4WoV7g}rBl1!s&;WIGS0Tv zUroKMh`OLVZTJ4BEWVpGf$PfL|NBl)?x}#G9i97RvGqN#$M5z>`Irlsm0y+boEc}4 z8)yDrY`SJQQf*)j`+(>CU@i8+y0DbyB47Vmtl|02HNv`sXuX;HZvSY^__g`rNRhz@ z`~Os?3+Qa3%}S+IY(&4_7yD}a&j53r@;>36h3i#^)d%D9<{vh$wT`!N+G%|l^0c2? zm;%l_%+RoP=WV!K$~?|H9-+wY_Kt>P!#^@a>YMB-KKavYn&VIGSQ5n1_Bj{3X0|#D zH*Z<49die8I<4=1w1+nn>6}Oxd0VG7+m5T^y2_pGUsHD>g3I7Ubg-S<kGI#|KSsdk zbUi1JO7DEww*6}`Q?=4N2xdyXW5)*PytK&VjNm&RW!EyqX#bC*JCBCy{o??BXEpY* z4_U^(Gj^4@WGnl=Gj`c`k~H=;Aw*e5*^+%vr6D09d<#h$yGqt9ZRR(>Kjx1)=bk&~ z%-p&6c|OnQdB6V6DlX%A_~vFBrt%m+@_EnYsyP0P6m*SZ#&y0`6jA!CG__^_`s!_a zqnZm>+b)EKIhcDiMg)Cm_z%pC0<vtn8DHD;yx^(3{o0AK?__WOQL59O?c!*Tg}xt8 z;j$mIsPdnNg7=37Q^X>PV{t%qaZqKEgm5UcaVWQ$Is5u?n|rRW$hj`>Q*YOzu1eoC zYp0^JM{(;CZLjUR$E+oaW|r<R#{PC}WOT|Db;|9tzdt&^FY@XmqoexM#ZNz`4=#NE z%<&O4$)L2e=DpDSC}uJ%{(0`!YueKF&xn=TvZGlD$JBckyDu*W*SnS~V?S*ly{#ZR z{rf&q$AQ`zm5ZCuo_g^<p6~N2LTMGG%F&}Ep2^KGmU^zZxIbRFahu8LwL)_kZBpyQ zwXg-pYUj$SrJiypf$}f#gcrAEM5_#Gmu>V{Y#d(7-my9ARqmaUeqAjxHv5Ry;q^^S zNizApLJe!JtBwtsT?}6%i(hnk|H-Qh*C(X3$h_}jeE4GF>hv6)t4*cE2La>?mh%I_ zXfgfs<e#SZfAxmHl9@Y;J_GzO)W#+_XO}M9EK3)23%dwMaJ%yslF_yJ0fK|aTds8z z?)yI%C>t(|8UJQ8oY~xuTo#l8nPJx>)D`Jk53XZFxlSE!B>7LPyXR|nRb|g!|Ewmx zM+#@tzio28V4r9IJ(?S6uYH|0J+o@m>~SHw5`Ic!THMOk&u8|1<^5leuXL+T=4%z8 zmxPXI1j7C67|_7sx)W|DyW^U&;$=4Lbu#Y>pS3VX`k-DbeSOGYj+;7%{5;jv!pFIK zS#Irq(HB?mH3k=#zpn@W-FEy$Tdbb>LPHhrmP_~W$6FWMJI*^^WmDb}s=g`Ebq47| zi{nR@-S@0!vrJ^~&<y&bW;WwDHg6tpCJb--^7q;4i#i0aYBiKP25%l(Zbpc0y7jN> zy<Vl%)H{bT`3x@lh+N*%<nvl#_fzri$?Lbu7yFv8`n5p+>s{Ngg-l<WRaZFmJlaeq zc3DN%QN#G*ue3#3E;s!K{I)8i{mSiq&Ha5jQa+brysxKW;%4vSBa-XVzSS3hd)y3D zt0z@(G9>9sB`<xNwb&Z{C+bo`OAPjFoXrY3Td%%^&+azKsV#&oGHVxq<qh`o(O<U~ z`>%8=ng5i~fBgL=a+`Gg-A^^3zQm_7^IGPFHaI)lQ>#;^zYtjzm{GjFC>vOh{T?y7 zT{TJD=3~bBaH(uhxLVUsK6w0{`?q?~^~FZOKy=W+EX3@2;49lzbgs7%$I_#-Z&L|^ zly^IU6Ud#3ilBP@cP`}S>EpmrF>dv4t_S+<y=RMF-HtlZPxN19zBmrRO$GCv0y|8B zyU4&n{+$~2z>RvJ!}a=7aLZ*Sdw)!6J$EZ(>Fe6$+P*8@^6)Mhxzjcq@<sLC!~TZi z)AVZ1pihdf{As2`q@A5;7!C_l+=3{QgZWBA>3Tw6<_4wxAiG7ZFQj=l%enE2{NP$N zyztni@QQEb&MpU4O6lI^=-z^vW;v<utn6sLAOw`5!oF&{P5;{}-@AvHgW$*ksC(1| z78uQ~P*IxXmpd(tzC0~Aui2Sw-*5>mw6DJ(Oy+bBz*p?Lc8As6+^_Zv<5WAOR3ZJ( zHUjCS!<vEY7q5TNnEQ|X4J#*oFGn9BZ|$Mxc0_LN37$kS-236z7qRf(|Mk<LT+@)x zlS-$?rR?&DhFTH-_#@Vs4l#3I-}G;>z0Kye+uhm->zg!x*1TD3zqdmzWp;<snH|`~ z94N^}l4N$@G=wJ)(<TBzyeCh2xFRxZ{T81`ay3UPRz_Y?JLdS3*}hc%Oi#^oc7M9| z9hH@Pues-An?+JTnzN1CJNrIAyXp5E&n&;?)x2<&Agn#XW+;Cgr4_x*A03H^I4zFB zaB@GoxqJD0<f2H>*IGvlyNaJpcq=Ygkoal;Y~lsGANG_{hu!SM;;(HVv?%lJzBeoP zulJmyZk|+{$Ef(8<c7p}eF+(89lZD_vrW&(`$06!;1nl|5k!7SO$}El@(KImA3hhh zeRKO`B%Swe=AD!4cbI?W+*^rdKGv9w?24{O<n69+{2Y66J;83nNjU0p#;=CWCLw-Y zM(S^fR^<b+IJeqQ4_}_r-uI;W_p5{Ex3XQ>JJ&-lXEMF?FGx@LYt!r6SA(kR6z&^D z@>klQnwyuu-0kFw@3gz2Jn|>2Wvh+r538<YA8kw7ZsvB<Z+<r)0@rHI`S{29(;ttI z`o+m*o9A6);$Ms3jI;Ybev6JG_IJSd-}u=NVd3jU^T0m&&}S{w*yXb4`u`{abAR4l z`I(*`TNV>SWcxO&cJ^WO7cuzHXJ&s4<?ZX2u{HP3zPi;*$)IX>Hwrdm#_q+veHk$B zn@~F+Z?F-Q|N2a(>a5x<4q|+(M*ikZ&&poQX_Mjp7yYx<lhYet*KRD|a)D;tg3_@5 z-6WF-Xi#j9eyxOoR~cyWt6q6ncx4igTDZvkrtoN<kU;_auNJeBLMglUz^@0Q<0Xo| z?Q5Qc)U?eDqMBZL?t<p2OtuG$*Y^FO*^~k?`){3+@9QidS(f{ENzFcS?6Bp)6p78Z zdW;mvUhH^0j-b4!vwj;*{L~e`I#V9dBe(P{?r_G1+_U?Ilq88vlj!;3PDup0v`8ef z!rEwofEtJwdgPEOsurPI`b%kR>Y?5tZ6aRr+bAOr<&x9-h&-s_NpU$hulnOf->;pW zi9bJ_k_HUe<b(hAjx8%cV_NGwdV07u)g$Gd73neaP=>qLr=&yTbc9Rc!H>X-!z-)Y za}>|r{!4#P4p#rWb?0w_{R8z^=_emQCz|VWALT_En~3uz(MXjL?JOr!2;rw!)T>h5 z&U4thWc=GWmwxVm<CAk|rn-l72FK4zSZ+<RqxZeUX#SiEJ~e^cM<4B1<JrIUT3)Mb z%2@DkilVXe2+lA0l+hd2Tb*tkTsRkg@#=ZeFnTa{T?<v{?Vd~<_Y_+~F}I0vNz@NI z`2u6y_bt@J+~gE46R0r|Esx@?`w|2Dw)W+gEQgIxqC4I1^?PuIk%A&y&XgJuz3@w- zT8?9(tWuYWrtGeXf7SyxL7wX(1$wNJQ=ZK#$HIBV`F5^lIQ`#Jjmk$E-@KljZzbgo zX3|MzmL*XAs)6u&i<AP+p&FYusXzV??Zo;xA2~=}%`5i3_F<j)QQu%AYN1Iv9|}t5 z`BVfPD=$50>dRtHh$ULk@b9lcLimnmtJ3*{hn~>z|NZ@`<=o%nbMgXkd1=v#jh$a? zS(ioY*ocPLE-EA!J`|<ab^X8AcTVzC?`-Chd8E;I+;LUOMc*77Ybd3^qd(R4AJ8?{ z!}7<<1Egl?9I~Gj*X&$ppWPom=a=K&IeqQ9wgHbHc{%NzS02mJd+SZ<uJ`5vO*EtI zlYL6>Fuj~R0X$18N-c8qHy#J~HAG6(h+C;Be&&j~*^@Hyt!aNLPVIMN+vr%3!t3Pl zfbt%xL}|IFbapAhJ|N9Rb4vWyK>B*gYQS|qigWJytsf3M=eNGQFbOQ3h&K9K#PjQ_ z>MYYqSPUUq9eX2rX!|X?M8k*F_7dte|AyHY87m%)JTNZa4Sw?C+_>T+mj}Ba?*0C) zb0PWjVRk`?zQ$=(0;4Ldd!-M(UD80^SNI?Oar}|dec8LI(~^}pPAR{9XJhvM9cneD z@qUmg_VNzxxk$ETieb+zdjn~upX+@;)OShS^cLrHqJ!;b?+A|J##V&=RUfO1i?Sgx z$wryO3oC6o|K8m?dxd3qlmh09GT#yp$O~KH>Tr8{C+=!PMQ^)-=2-nzWr_11ae4Ja zB8vIp3h^F(!#$VU%H^YLEGuiyX8Mnh@_Yh5*}PRuCa!)k(Kgo*ws4*wRB2#|g@rxZ zxoW7>%sVO1;D_CIo$IC5oHX(KD~v@v)Yc5&OJ26j-o5}WLU^U;d)*fvTS2MahKI-n zc?pY2a~rN$516V{+kf7<CmZ-tHYM7@Aw6#NH6n0YttT8S^QQI%r93R;Zg)-<`?V{t z?U%mg%F~Z?KHGY|`QnFTiqg_zUJttkYeP=Y&;yi5!JBKY?e_<h>Aw(bMh#b*b7}D+ zZ{dRg>Oe7R{XYId{PB1cQ%D|N1fTq?YYL$W5h+S*Vss}P8q4+_mG7U6U974%=1DuK z7?oKC={E})II6P;0!0gFq4{<NN_v-N+*n`@7SGoUY&WFqUM0L5%ST$3yb#2yG5%)v zQH+p2xm<ss`g;g|+EGjC{7TpHcn~r<_28$M*Humf(}>_b=Y&E@%c6DDNX5YVR_8ZD z-@h7uvIx9A)hB5imSxjwE&VupW(GpPFvHzmDD7!t>-4Qu(d`PwOqZEY%tb8gN!H}d zBkm(9SAh=});9~wm=&B{mK<mJS-<1B0yf0&I+!nJcBT2st{d^RLN1!9K31NP^66^$ z2#GV6w$J)z6~DlafFB8(ib@IIZkT-DZfjuV!d6)(^{&gXtAZ|&suaDodfXe<(Lb@R zbvXCtxe&4Kj>}`uyYyB?Qr%DIpi*7~v@$OZKQxJ?es^9QGs<RaD{lJN9AFYL-9N}` zM_|my8%RA2u{^1}>+GYLZ!~-=R@j)CDzCFF?Y1^uSj%Y)bN%ya>I*BTw|{~)De49f z`1C}e`g4Z4=hG3!TDHea&sv}4{dT<cnzLFe3=I1Eb>cCmcZh=6+4NQs!|$=S^wMt0 zLtQl#@AKSCvy=QDe)x9rob)}ZoqyMEcplDvF^;TXZjg4{9a|B7XZZXx$ERyIe^m`I zsp7W(wK)bEPpwV14ZAk)CeYKZo+T8#iDla>@oe;A>-aS!>Ju8o_dNe{ZbuoLm{;mV z<K}c=ua?PCsDYt$Ep>J@kro|s&Z=zX#qI0wT&yDQ3p3hsANGu7>up%~$6p&3x|1Ij zu{-LgwDxsnOm-oaoImo!%b+7p=ElGLCNF7kQ;T1HPqrf&+u|1$mgZ)hRljRXo2YSJ zM9d7EMm%9g7I|u|&)X%1br5fFUG6D`JPm5KqG5FpznVA5F-{3EERYbt8{eWN&fQby z_{mrGUrG^yGh>_gl>LM=ZsEALJFE0IhoSflhsk1PQn`y7hWW;SuJ>DN2ev&M@ud}2 z)Nc5h@AuNjQnT4_$2L5B=HKEmf8)!|qb!dfq>MkJ)f{#$oGtYG=#H`qn!&b~7`~0Q ze-FGU{nttVKJD6HmmD_Q|J5E594LL|+!uX2;kSIwrmrRNpP05(D_-87Q!jtEYB>JA z&*^0IKSjQwo!YA}?#M-RabEh8AFO&mF?hV(fNnFG>%yYvUysBSdna0XzgJFY6Bf)L z2Si@S4m~x}+&#YdIj|-3E)DZ~{)x+qWL?k_AOE47+VT1&&ORt5_tHskgzH55tq-|R z4~~6XN`KC{{(RB3aPS`!qIy|}^xr#Lr^mPEGUYwOXSvcYHK!Xjyl@*cv%0m_%l7Y! z-`t6W7NveVrvI0U_+hrBiKnL>|9>>^RE|Z>4t`oXw_>>d9;-J0-RFX@$s`>d2Q{79 zAS2dqA1NQdii}aY@w9jR<;%l-le0W+#Vx-|y0i06os8u^f+gSnv40oE%4mPSIK6cC z!)?cAX!dEvT)x#?zWL!r>-!3hz((c5<M%MjD>S)8n&HnmPv=|n9X2c+Z|B=v4+t<^ z;5=!nY`Q5>FmV4gm3UApkf)9uo+dMNf4R5*c|4W1`a}6d5tdetQdRwxT$tio5>MWj zTt?<rKzOh|sU?U$C#a9>Hb+q`ZxLI88{9O-%$OH(%+D29ZtYHlTwMSx1rIC`FSV-} zZ&#(@s`$qQ1%i!#T6|&YuUvu%3PP8li}=xX>Sn!j%(HaA5rTr>KEFzI3}<ovc_b*d zv;0q1D0P0B_ro%~zfk*i{ymc5mqu4atvgu(dqI>y8!E)Tl(HRWj|{ZniTm7@YOmt$ zapr=Mh!diQ>Lp|dDIBb@Hj_8_mIW&C_qkUt*HoUk^9J}iqe$7$orP6>9;pTkt3^Lj zOAuC1d!(K#e7^Y6`3m6+wVuyoLCd^%P^u;zD4^WHtIR`L{yEJK^;^nLv{E>Jq;R1U zw?czEu9QcXv-1ek958<q&63rb;!&-Jl7un(aJVw4=UT1jBcdN%tsgC7kWg)qCSsUd zZCEUFrK0*ut;p5p>Z{!%M*Y=B!)sSHLI1BQROAs7SP8pS4FgBNx8*-9Eth~|7g^Ro zq)7PbBg?Z@OG~%9F0%t*i8+{stN;Z3Ou0C_rt2?i7hGc(Eoz@oW1lAKkSiK^+YZ@U zVBJt-oyKD`i?$l}w(=3O6dD1S))UE#@3=**&dmOtu9;r&!U=*1=Nem8@Rx{~hg_|P zs+gx{t*5@2muan+t(doKt+$VuPjIbIw3u%KrPeo1%rDo+FI<$`YzqSfWzN5KlUj4$ z@#gy`>N@G;vas%)OH6)K6O4QquE+bPQ#4cuKpFxb_q`qX>%zpu!{zG2RmCGT#RFA9 zxEJ*dbx~)vVV^gGgT;eqefBXmL~3|Gnv~5gI`z5M?Hi*=MH<|T0A~=7@2`s=7QZ=J zcXL)eVW}=*L;TiG-K}GB!dV>wDUrxjpU5eZ#9yBzCXvh}fh4*KDtgfeZMr6j2QB5s zaMHN>Z%$<TGK>R|9ES9<ntKj)QJiy74H66_WOdhP_e<mq*XK-1+@7t!z2ukEE|EQ0 zpW9r2=U5`|tUeDZna}h%pYvMY0YxHLPV%nm<GY%Y*@_jJ-J;PKW;0wRV}@PQcnl<6 z{My+G2<6)dUP7vEy>qR&NViYey2t}5@In9M2g8zOlaI@0CCir{mv2Z`>^!bGmaIH` zT#1w-GBpr6rK<QFs>Gy-rZp){8-_>B121atnSOH&y2js(5&gOWg%ddI0oq6i!0uN3 z+cV^<Xtb$hLv2Gtv(%IBh9~_}jl&I%lTuBy4NXf@MNshxcizC<hL+!+k4Pmo-%yM1 z&6Y6$l9&jfK%Nv3l2>q@x*6O=I-uc;<MSf3W5$OwlFiXidJ?32)1LI!`kOj#b`MK_ z>GZj;>EB`gosLPgX2$0#NSSRF^Nxu8&}RNN?LsA#9fbI4bHN*59!nL=RV9CwYT}&h zm6Lg;+W1OSW=MZKYKD=_vfbjk{psuX;rHJQF(j>68Erx!@A8xc2LPvf&Twrs8AOAG z5mSGyzJRU<X-1##ZUww4q-#UJM25?sypxie`W86F^y3|;>@<JVw9vOnIiTF1VN&(m zZ||k3{EBf8k5Yc`MeA?+v5lkQjeddK!<KKao|f4~76~}YKrtkYhBlfv@sp-D4+a<> z6AYdC(z8%Gw9&M*Bl~5eY0&h0(~ke^$)JI6ZpGW5cAcx{<9>vN{up6OS=HZJP1@#r zs0T?&<TM;$^OGYLP$b8Bgu9CQt~p%!z1%d|{p8<|iOz#-U%H#W_shLnx%TbCkL`w< zi8H=;XFs-0-L^PaKP1r_@Y?q4?5t@v>qpA2CJgtCm0I%$9#RKxf+X5%0y7z)FC%o; zOC9R-9!AUmydZy))^ZXTa%#H`0>1B)0?s2UpxwK&ee!?%TmBBq|C?<2H!FX()N-~V z|F?Vn_u#iL3jWHf^3Tu9pC-sd@9v(8;h@<q$2u)A`8|kI;6Z^N3{B0P1d$=F$QT^W ztyY?J9O_OhDgXzm4<h9bXrVybyRGy+IEI(43?n$kcdd+bIHoVHOq)37-96+v0`o~L znnr<zxs8R3qQEN9#wxDBCf~-Uw$DIGMqA@d)O8u>0XDBT&JYEzm^Q9k3YZ&hjMWeT z0D16Xn7THe7KL*?ZRcJp@Q$?czEj|vYvcQ(z`xnXzpEf{(k4I&<F`_<x7Xzy*XHL{ z6cTS2l2;T~YZq1uKX*Dn|D43vIUww&DCXNP7NRH~(=L8XQ6jxv;*O%^y>`h;MX9=W zsTM`)9z`kocKf04kvM>d2!Rtgx@GjPFEB>9Jd~#>;%GW>ZV%;{I}`+z6vaCf<&~7w zI+V1OlnpwR&6HH^I#jF<hl~-{g}!5>;jc;I#)~YGa^f%yh$;gi)f?&;H?`0+(dyzF zEtC$85v5D-IxfvAY3>f`d{)xh><CLb#JUxN%$*SO5GbIm^Iw*ci1KB%&dXZLx(1!P zX3BbYKf#_9J>O1!EoJa+iuxZV`(kFpJDu{9Ojjx+wd$0wwsc<YQI6e?xY*HY+!JZ= zZb<)&vgu`HYSGUga^$TwWpkP?b7mC_x1Z7MDwZLUCa;DJm{A^mKQFv{=%53@bwL}q zE*mEmxW=&CO{0jbQNO%YY}Ek!2XC$3{j?YJaVS=?eiY?&IIa1t%lXrxW%^+jJK;{C zvaNn6Wcz4xemct@Kn8+H^f6My&s|s*8F-`<(PhdUdGYEnRGEOlM7#R}NRenbFQs$w zTBO-pil>0Gu%3X<W|U>6s=pCZzfLuPUfIM{-$g#s_?#Yf$36-}h#eQQt5k71Ov%!L z`#q?-ra4S&4_<`D=*EvYD3NZ6#pq$X@pj$t6u`#`M8$$gYgLneC0$+6ELJVtN;lN( z*h`#1GgTd8*NyN35MDiqSOD3mh9szAG(nWP+I5;3FZCF^;OO&gzEHzDdrblj`zdlS zCEN}ksx=JD0~08(o!)h&Sm`<&^rnjY!l*KdA0+s@Zs5zItQ2i7Vj?S=1l0v0+qzji z09-i>Za-wTJFb;NVBR+PHLnljJwa;|s5CHZH4wb1uB$;(Q=kBF_FvS$6a6^#7J8&r z76sSvi%$nRQUF@@M7BT@122S$R~6ZL=+6Z(X$$~U>cP*pkz@j&isdim0<`+~04;qu z?=eyrpf^l}2VO@9f{`P=2ASvY)sfU#&fBrYC8&X3%q*P5!?bh)!WzO9dFsV%0Usx@ z|BWRm#YUrlU9R4EdYXzT1B5?^!^l8vk7~o}Pyf0LPv){9tsn+XvNae^4;cv*KheUI z&b1QYWgwh)f+Y}ajDgVmY4e;C&=^MKDG5WBKfGuJR0xnf0yCHaM<ueA0Wee|ns=b1 z&NgioU_ycLY5?B*BT66<{Tzf5WoUINgimoK+UEfEXl6V}&`N>tT`&JbVl#h6*9tII zZ=+DrNSU8rTqFi(?J)WQDE1jmE69}xJQIMx#z7?U8I8sO?J0;P1IV94g3W4(SQ3jm z1R2}FMvC#~60hK<erg=F4D4PdvBZ)X)U_FufqM^tv0!Q_ZFg)LiDevs#S+l$C+P)L z2l212DhW6x&|s(sYqUE(?W+UfM45Q$fr*e`Khp?(F9`_rvr#wog||_uX6m0FvBBUZ z`k}ZiCG#eME-%9y4DSzU@rj%`63;2f!$882K^_zY-k6AJ1?d_SS&0K|XhJ1rH0KXk zJf!jNCBTHHkl3n4e_=p$9!Pbq&}HBYt6eCsHj3Jdq(NZLBOp-Pbgke~ZD6_*0YCSP zp+1lfo=B5JU~VPQ@oLkVlkl7B`Zu;|;o5ZLBzj&5y@WOrr47yLXD=f$oDy2-A@pzv z<P_u}BzR$-!`c6_<N@%&r!*K1_-WKA2jS(*Ukra?5U=ypGeCGD6T$#}A*C^d8N{d; z3}&W4D3&PoedgplXbJ-^Pd(p5FB27C=C@Z3Nnz8BZ#|`19;FrMxf9z;(0-GaCX>Rh zUZ8E5g5V6>c>naSuUVy5B9g;#-_7EY!5t=>zQSu(RR}O`s{k;9Wf`{leCR8p1lYB> z4Ww~gEDp3oQZS3wH#jfnLCmJCr!Db}Ov;F<aZH5HAP-8=vXM4CB{dNlz*1-Oi3HFJ zAcz$pb}f||X{JgvdHz&8ky{gKA8IT#K;lxQ{66JPO3Y)INg}Ja?ctJ9a<ZhM6=8j} zpp1Qe=*>@q?yZbx-Z`xohgsMpRe8DhR#2JZBB6QqxX@vOu%#=;_L*WbBF{zt6uaz| zf}rOX3ATM+oCrCh@vX*&R%_GoLX!*!(&1RFJMotP-H;|YF3$rg?usF$v!9*UMnU7% zJz#LwvUiue@(u@5XmU@}5g(F(;Acp~Q&|)PX9hL{HO_`3l;%=m$*=f0)}}}J6aQL_ zVl#PXs7<{WEZ+!~I?ucjOB}-HNREU;WnYhtS-zEhx;^t&CW^;1M>)O~&!Ak51C5pK zw}et54WKY%@$lA)Adzzvq!SDsC8Gul9xT&hQZERh#0^`?C{a_awupcRAc@c_!Y-#= zNe$f+%j6-Etmx^i-%wi|v4VPZxKR+AIjBfZRSQF}BpO@wj>DMCKr$^Y&OTC=6GakC z%0c%YK<?o(z@%eiZ}%ET2^5`>wvmS*qF%-x%n(jtd`P(S-UyI@5!gscB|hqjR1zA4 zMM%>1hCB1}(+v{Xb1^CiIzhzO6f`HJwmtm;<*pD)fPvg$Uxx{vUrw(%`X-Yh+1$H= zfMT#Y>h=KkVP-#r!&?3oId0jBXzJcA+N>Zf3_jEa3h{AE;FCKT_JAbm2PpuImUHVp zKp#q=g-UQ6l3;841whj)enY}A;>^O<c}>KgLxIQTfRMyM-Jz-8mVaBmX?1c14MEAA ziYL<WgLIH5+@M@AJU@w4!$>+V)Mp@iJIWvzvw@H&S!3A5yKI1sbK6QT??7e~>q^SV zh>k{(dF7e7KW(562u1Om-B0C$fBCrf!6C%ut+=~^<MI5pFP(#O4O>EtlARK5s&k3V zuBUQQIy+*k-)xP4A%~itU9aJ!%qwppGz<sCYMM0ytvVjHJiB4~vQEN}c2W9P&B3cQ zqWh1D=8T(_c}kRc^U|z@8(9@0ZuLKQ&7_mizk3Q7GVa{m&Azi-!3Abh4KBt=GE6YG zjhd>Cl*dC50f_eHpuA*0-LWC|_kue&CA9hOe|9{h{wlM%snU_|^zNrR5~5(546i$5 z80IqHMqc{GpYF^q8N8zyBA{z6SgcW^D~gm)GH$!dR)x`%G|kVl>0IGxE76m2Or^S{ zD_jE@Mf4duO#&vw{jNk`x!K}&kk{(D&lm&sNsHX`46A(m^)*P+?K?Mrt_nc74Yf2a zvQw4U1X)TA_2dfjZ~vuS;TPn7(~PUlC=yu_l`Xwu9Bg^_K07m?w!?^du4Q43$hxFS z=~e6I@YI6Hb?MR(xP1KpeOKqYY*?w0%T9Q)KRyY@%Wdq=bhqTS@`eKAudCiVir1|C zUhxvSO|F^Vz5k(eLunJAE*S|HefC;cd%<lQnrl_IF0v_cuXIv_6;MQANf(#7&8|=0 ztvC`PKv;>u%?&FEWolCk!egGuR7gaq_-Wl1nrg>JN;BAOUKZrB&^W$Z#bHvf)lof_ z!e97^?`X?Fo5wQ!YGHMgCy1bacQp0ZHPma-$o;ov>2P7KQkSF&7kIhcQnv0=&9YWJ z&--#Fn|eLbZx)o>-&AYlOzVuIq^v#{|5w9P)L_`<Z_^fM)8te1#OcW2Zs4~~TUt@0 zr%HgsbewIIe%Is6<<th&-?Me?Dos%~Ph9pLEnoCaiXCTHKv@B$0c3G&vPz&k%MJV2 zwbV@mR)HRZPwa0-zbh-cROhX5!(qawxTAXUyRXqK3sDN`bE+H!HGSatzS*{`$@@ou z%Q>g{$=R-zZ`(m?51bZvY<pg;|1bg1Ey`c1Zn>pL3d?`sye@a|=|t2{MAf;^Yco?V zAG&s;+8((42)_61^U+Ssz&Y3b+<VX0Rd%mWKX5&2zW3rs)b5RGY3E<Tnf~9b=!5p9 zo&K>#zigKcO1Nf3arnY?+5=Y&O=O8DD^A`Ua5xBvpeHX1U5$Cl<`ay6bZ&XQ7TpJ? z?xt(=da&Fn84^|9&$KA>;JDK>Aj?D_zH!-!fuS2{3_1thbMS<bPrFpkLb{`!7glwU zT_dvLxfV{q>ksxLv;>Cn`(=(0@scsR=7XZ9vh~TnlDBTx_re*c5cJmJ5EfSe=me7> z#AAUIW5QiXHb5=YWYF0YfIdPZByxBhQj!Oti3D+Za56^_*li#Xs6$zRF7zHVJdZGm zkL{E0{#m0?e$6E0{(t4i%Gu9&{Toru5*@N2hT3zC^sAy1G3-KAqhaD8AqF|4gTY~e z7|MkzI;B<;M*|)r8wjEtOCa!IlcWoR7a91~bufn1{7`3YI<$ErFpP(Y;@y#XPoX>- zM1*84cC5bUe*JWLa8%2K&p(3q?iJnmHpA;KWr^2DHIP%(46#U?xIvED<YewhL6})R zw7(@Z6{`WExrR#Otk}b#oW<Q<7E}2NLXdc5m8V$-gqC+H6$)T&8Ml(q!_S?+<<7r) z5d5pooj;=VUD<}pm*!_rjs1Hb7X#Na5;;S$2g2&hW=}g}F!8t`Uz%kB5!^IeUnpEw zU6)=4bvY{@{hiS;(aCZT(qe{BWOQDpJzp@$rK^NYbRxlmJOHM_&=f!hq>Q=v7bJIu z7t1n!EsCR&GcV1I7+_B5OfgV<em8(XgIETXus^3*NJ%|TSfm*dpx0ncf`Iz7BI+Qz zaPJOA21Hnz-$OS{u)<}WAu^`|^z7sm?9dsl893UjhK9i<24FgQHhJe6I@n%5e<my5 zKXHX2c1^zW*F;Q0ETfiNc?YLZy(l=$K;Fpdx?4V{MY=>`SthZ9b4Uybw99Wo&{!(Y za72A2xQx6lN6q&G-EIT`+^BdUK%mkNUDzc5)@ncvCh6rHnziNy)=OxtC3E6r2wt7B z{+eSRP&0k#trRMSprnpY{VDfbcj~pK7u<zmzgBvZf|HrVr?s+^S_{4-+&2)k-zT6! zh>%wM92uHJS{jAziG#;aZFB4Tzn@m@ZrIB_%V~X4JoW7U9;ymQSCjYLbrP-}@Z0#w z@89&K?pFGz=<d#`MV~r}VYJK`DswdSit=8{tofA!U0Kc6)W%RIt+xhS=Kbb*gFjne z9k((U1)!=z=$?M3{g93J%|$a>pgF==lzuQ7(b2yQrH_$gm7Jz`dBVW9$9PACiDL*N zjFxfTk}mU-A&;_{>{rFEv7d}3c<uEj$@jTVGkb?|<_DaT-oDChp?gBl^-qdrLYk}X z?P;(=T<rb}bQ`89kEJM#TVdkVdcO*uz9YmUM6F%3LIPQvEV`pj>G`H$78%fvl^xPh z4vB?n8OQhrEq$6R)1MEa>?}^EvELSgk8CY=!uhW^oLk)w+{+h$>~cdC@8ED)!7=2u zeJslXR{ZTGCLF?ZAjqdEBp5Cv+Abt{ASA0OtPn1&(k^`dK=_iPh<3P$Ub~3EOr^1+ z=#_9$n|4u$15p=6G52sW?{=|k2cop$rN<c~?QN_#+r<+P#8VX|GQ%Zqw@XkpcdA)d z8ZKGhE?IRTS)(ZRct$)TycCNS><X8D+AjU#Kzcw?=5@Htn|7Ir1DR<>*$*?!Ev&^4 zYo(UMrPdYYzJ|;FXqVeRkULV8{}nDz;rJmhEQ5nY;1C@++6bJ}cN}Ac0!N1eH?_j> zMAq$^?`*rG?4e>$_=r$|lE4$C^M^_>w31$g@|6zdFk=Wm5n>&o;?SYua;V~d_j*#! z$gzZK(4lJBe=0>rio%k9OX2c~9rCG4>X61^9&CUNA-+)Qd}+k_@{aRWhv#dQE>tN& zg$R(?0`>HWi(MTT_o+X}YV)|i$k_N|w7$l^e_i0}%h<c67_793lIFUVEF)Q<@V^WD zN?Jz|TE9B9s7tp+uc>F4+2{Zne}a-S(y&l%?oMsKpW1@T06iYE#W2E892Zi)tP*)y zAd;##pDrlfIUW_Kc_P;~eUb9f_~qaf&+QeSruO$90eU94LqYFIe|D(8xItK?K~$%~ z^`8be-y4KjgWA4^SJE%$v+LcByz;UYkQ0)pCu<laT`@CK<r3FDL}@B9j4WMKjoC8_ zGk%pL@ic3TCO>;dhixP&X9i_$GEivpPT7=gw-*VvI_~wlPW|1sMka?ob=*hLgL66C zX0RU>NDk^-W7zk<-+r31wM;v<n%r&-ZDg}96xF(WS4)sg<#?^sqO`QdwFCgIFILb< zxYoy79hOKNha->?>-Svwjh{m6jPicMA*96U)x!Yeaw8o!_NT4vcl0A)ZvS`1EM-z` zy1axz@eD%KjHnF7!zkbWd&9bpWhInjJr3ze&?NkLcN8oO<<xO!6l!iDlvB<?{-c~j zrL}#gKKvbv9Fef1KdUmOCsVTgC{%==2LO(Cf%Xu}Rcp$m3V<Sh`FVMA#cUcN1MD6U z6aYDU_oi9i!%o_K_YKV;7MW!T%rjS>DI!+n&F5sg)YtTdiI7MitB9YMn(hXTibD%T zsRFrmV7HYL79Oq&)wFT2JcL9lBjCzV&1S850CpiN5{FH#x4u%|eeJ>QmA1pqGIr>g z^+@|&e}zDY<l4oD>`%9Hx-$I6lg2x9jP1ApSV>OT<S`CME-2gfaC>_-nd43;yZxQP zH$%bG6de*c|F~QcL<kW8MKYYajh@#NU?<TOlAK^F$gNbz%h;<nBv`xrMHB&2=IunO z0r-InTa!U$OqG@dc-jV>6a`699rQ`QY)J|aYy8R?#CSCcXb?wTu%Wf}W|X+2or{IC zle83x<=A9+YzSaV_{xA~tN{L*>Q2tSg6iNIJMrV8SR{%JnO}D#8bgvm1d5EG$6rnY zT_jBC<^dWsXwh6_(t*@+Z!$Fo46<J>VW2QplId9@d8io@cnqO>);vrmSo}2{-dc_L z!JZQu`_8+NXp9s>{q3>T>a>wPO)}`v<X#PQ5JL4e*=M0zqXSjTl>rKi7hsL0nvI?> z-UGoZ`)32@xkR7E+6;fODRwMyjtr**D@zzsGDjVC2!0$*O3u?pU7f+ZTWb4PqyY)) znC0S`yJ+Z7T2nmaA&h2m5Ee=RI02ER2vJr%GL$4}jlFD1jwr&y;pEll>L3)PwZ|Gj zb?Jo2K;STR+$?+Gh;{=5O(Gs(sTnAw$U9i%@c5g^+TmF&!z>ZfjAv{h!)LGzGbHE~ zo}qyV;o)X9#WN070~%Nd9Wo=+&fO6>&_}$U44QTVu=+X2c|3zENIL^C=BhIFVNvsD zlYMxGSrQFEg3Xcz27wX>JTSH`&`Drytj?!+f=Xu60rP1P$6v;sq+5bmSiKrz7|Wo8 zXTUHq?wS0U8K3VXepEgN8t@F=dUVYI%@RS&uNvaBa^a(%g*};;a~>MX;a{mrgv6<@ zdi#%<p$zdZJS3VFENlZ~=|O~q5?vU*K_3tmr-w2o(Wc<T<!y~#aaJy1XrOqc2l0G~ zDI$pgck~jY!$K`V#F^LlnL9EGOy$~vTNB`Y1V5TVSOp2T5Y@G1n>nx*e0!xJ!w^dP z@CHj($QZ7^!c2pF`shd)?gIjOCvYgir9By;N`hHmK$?<ZhSc<qlr;^)UmszhBo|S@ z1>|-Q>)^w>yZl&5vJ}@xmd@{-j?M6<q?F5~lsN)0j75^U0ZndT3X7b=GU3SZB{J<G zKr;+}v<6Lw0oVeyfRAUa#xlUM421yDdj88G0Q?M*$6SPa0CQ7V&$7Ugdakc$f{dgO zg&&$tKQXUa|3NkA+KG2ra+6Vt=NUT*2^>J#c~ew4%?Azc-X~;Q`=;_o!DLlDV+Edp zpUl{dg{a<0yv_{Gv4!v^Yo&2UK4(w<`0T|S%jCI2pb&sA$|EiDRbeM8rWZ=(FYDOf z#}Qvy^u|u)zD>2Gx4Rt(cwKG_>eC7((V7nRU%?}x0QJIjO?vd?(#}H;QvX{xjUgN~ zzE7eIaE9ED%Pi@YU?SfNkA`$!p2lEj74gnWa~eKaSQ1Ip)sYrQ00^GIunMrXZfT80 zYTz%L5^zwUNmK}xgjZaWgNb?B^%tGtNU&-$q!6r~NQR4@#0fkMtpp%UM2(?c#y&hF zKS<vR0z3d?AHb*x+?yjjIFv<9frweG>yj}vp8Vhn_^ccNG|x3n6PAs^0#8!sGyto> zGV<n@xN&@n#{#vwbcO(<$VcNr;J^J9IGk8`9!k@RXB<21EKCjJ2c;CxKfD_Oxlq28 zC&yq7Ko-w44&&$5H{Lm!cnaVdnh9q8AECU>{#l;5P|zZY$8AIH10`EH0C8b~#&IFB zgLvI|+UvKl4k_7zJeW*^DT4IhF5B&iA_~cBe^=r5;Fz%N2zcK=?Dd7v#afe8SIyv5 z1X0ifz}aJghr&ojqF)&Zisd@J>mB`6UT^n(=q2j0;6q4kv{gFS2nO$Ftd{!sn%mfT zSB*{K6>^RA&j}_1)H-7Pefjg<34a#swh)L&nT4`rov?sgqbmG2?Ff!EN>5fBZGtqe zBdoBkE*GI&JQfI%(igmnyf=p(um|0x%RWmBobRvnc!yqkfbh>zV>-UDC|bX{jncu! z-^5S)yG-Y3M5GeK+>^Do&l@mcKW3wv*Z`Ue(j&HAOUgAkA=?)G_fY}(sF+g*MSpaI zV_=-WQPp-Lv#%^v35W(78nF^zC5{AHjs&&&7YbU3FIfBE{DgZDHwNyh4f4AQsis+h zK@M@gh6LY#F{+HbmFT~LY5<J}>Eh09z)^GMU(EC(Y~|~?&(1}NB^Dk(4Cs(5MVSre zE@pDOW>N$Hq-gP6t{z`9gDAxwQRC%47rXX)H9s-9FzbvAwzz(z#b=_PT*q`Xflh6j zgJh1%sUz1Ktu86s>A34_gHg@~!H0c!{2@9Z0fs^WSOTC8q`&}ni7j+uBEXCglK@Fz zQW8RrP6JB~L4_gUJUATj5ri5~pCUrZ10NZ~DL60>7=WfA86#IZr^o^+2#O4j(8@Nb zRmGCxc-jL<!icmy8nO5z?db>3VR0|Gm!BZu3U9}hvyU4WIs@nWg6L107JDN%7n-t9 znwOr(pX|u)-AUB#5M{)Y{IHjkAhf37Rt5={2o+J{>@_|heT1S%g$S*jtFIUl@}^=} z4ptJ=3sti8^V$hM<4~pm{ZGX0na|H}{5fOP=-pc$%08!+tMT;Ub2;10&mU#Ao42PQ zo5ckGbBo-rU~_EQaek&-@ad_5Y3rxH-v>(^<~_}%8!;zyPe#mQ1qS}XfBosXxBL0V z{?nc>3Dd9dfl1rkd2DbN4GBsjg4xtBF@-}P>u!&6#6r@TT`|-|({PM!8e2t%P$~mv z*fm?OALW^&IBDp4TXiYJGxx$yNgjlvOcIJcxYRlAHK~mxW+OGsXJPB2y)5~kOVzv! zzF0W8M!b_9@xJGpK<iWTMnUqwkc6Yujnd#>#Xb-G`)D^y(ev!ucF_r`o8@sEZ#FBO zFJ&a+LzsAct5W#={T^n>Er{X4CB0(({66kPW8#2{<fE9V_awYW0-b;T!`!~YVyA;) z&jyt&JJ*nge!76h^&@NdrtYPzfaboPv4AGlMu~vdK_;WXw&9uj_gBW`-UfC|YCe&% zP2(n!U{kKyLEV!=dlaCxu7EDMcO}cn$Jj?ItNDJQ|9$Eb&twW<c0~mj^5W-GKuG`T z&XblG6yxu~q+L4WJrc4f8-)LrTa<rAFCEAUWsq15ea+<LEN?4Sr4~HGe`~wu@yjlM z;U^<$Toq5mTb{Rf%f0-o_*U_qam0kIG?Aorez!5=od#t)VhS|sEO*xtV2qqGl>ZlD zJe|l8_1=<V+k9ux;a|wCy?obEu%^equ33kOOUGd@6x+}RnwF;MPk}FgL@$QEyE*M1 z-4PwL6uaAW@;P*$G4@L$vs~}z0F&FXEBx7wr@g9LOxM>6%uKJZ7rXHXuHFxk^Z8Jg zEFH5Ic}FhpYjtHXCGJ~&%hJwf^UGk~)z({C*MD?>$-S}Dx9j?6yPwiuxJgQX6Sv<W z5E6edD&G=+INqTW|Fbec@>0ojw>vkF7ee0M-1%^;QoU3-UFvi2x_sAq&lX#a%O6xL z<t&2UQ0?X1f_vZe-`{3qw;cW%jdA^p)rSDvm5_hwARrYgOzTC4meUMu>V+n;HWCj= z=>zqW-jZAcJl@m+4wM0}((EwdW$Z~nXSD_(sLcjm9rt04d#SL!X$TSoxNFzk;PzR8 z(RcH2Im2<X&dY!$D;w$WY6hR=iWUmc6Od9+p?pJy;1o-_j`vcX<AqpKNA(Icrv1$| zXxSgs>rPWjkT{P*p%F#Yi27JqZe-&lzVr?PvKmk}^U{VF&ey<t(-G2sBm@tR@F0hb z;KC9RbPfO~uR9`Xe*t9+5*T&y5Pm<B=s9x&<8z>pAy%6X13-mx2oU<c0e6t<$LSIP z%{<aoYjiRs6i<DaLJ+~Na27NGl~X4{tjS6GmH<jZ9Y8x1lHLN^B?v5pUTigy`{y1Y z-w1NHn<v2vNl2!80wWzhnNFRAT<#ozp)H{ZYa)!!5ORsiG@pwk!Y<==s0TpVBuEf3 zybdj09^@838Pcp_%%Icy`r_5dhwM%Ddh${Y&{Jyt-jBc>8>+gF4y8b(h>2Hh@(3Kb z1BA)w1gkYjU{Q95(_>fZGg_1R46${>d6KBe1vpxH0MN}4m3q($fyEN(FoIA^S|T8; zu|Xv^BoGhtU>II9(t-#=n*EKvIF|tn07`>uMR2h%Lt$75!n^<~S?%@s(odGj=T!MO zl0<I|_;Nodr@k<)Vo(7BIWLe>Bneg!)e;>DofGs$oIBmJOd=OA-a!mr+~Q60<v_Ip z5Yzw-G*(#OEPG+NDbVY#QBy#=62PmGrlfwldJn}4;c3LvQYTa_e&j^1Mj|a2ibSW6 zCLnnSQt8klkWjiL4iuio1lJsy?f9MpPe8#aL=@7GoX21YX`m1XjA=s=SV1t2-aLQ> z4*(p1dkUxhAizVS&YwZJk%SLBDip?ouf>XlCIL*?CH@(a6xDhNV2MwLcvT@Uo0Hg; z-@=oVA|z>Ap=@4$i4oDnHc=EolO`0yD?x;-tCP_Fd8q(HBGHua28ah2?mJF(w)_Y? z>Yr8pVm>vZdo}_QBB!v6VBxIlNpRpz4Z4=lW0D85jo*N*1ZzWSPlJ+t9RI69<B`f+ z=BRL<w?x(fm~I|{hR*yw8UsRg=Yd<*tq+YjIRI02h$m48z^q~EcrgHdFnJK6s|^>T zQgGd1BE51S#6q1!G17jbL|vbJ0JBd-=gz~0jB8s;j-Xz&0pDmx?zZHcY<mQeQ(4C& z+F^b&myE!9)^YXOvYP~GLo4C6I^^M!bbFh-fl`sh&U|x`A<CFGk!2kF_?uBKma?D3 zl><P8GgKkg*hRQZ0g_9CKog2B381XjVe;0s^z)J)Ud7fb8zw@+jov_=3n0*v0b0c? zDIASMa7{2Hx<4*4T(}I2AOmP7bn-dn!>K{*0SI+{Klq^;s)GZHlz{E>H~$BxsUKjM zA`*tuB8H5&2ygyfIbbRztgB$cCg@27<ebtg4wU#Cwz!W9cR+v@o#Y<f$mt_}Gvf81 zx!ik{gax4juk@+&lf~93n=y9aJDuM$lT(Ju{R~_h9hxLcqw}iii+QGnGo8f+f6n6{ z8;aN9Ui44p2AfXylE2a_S@VZuN-|0_v^9j8Wh3-ep&L28zZ^NM{7Si`$Z&_#)=yT3 z;F9*uL-S9jBbK&7L#Y*qQ8|@=VqYoT#uyy&Y7{-4q0!=tV7zp6m&wH6O{>1TCD7^H z{YX_0&802-o9>!!9|?<pj=vfUt3S%T6YbW2vb_Ckz~IaG+s_FIzr~yE@9Dq36lm^1 zJv9<6e{p()t$Sq;qyC-7^w)saNK?>{^JYqJIzyg{1(#$67gJcC?A_6nxP0qGO;<;k zb77jIe=q-5dKI6Xm*SSyO?h}MVKaVv|JEfP<?fhU#|AO%y@`<6TZPN<_3fATe3OWl zx3ICdreosJsKj%pvP};I>qe3wTS;Se@taC<k7ANA)<AjtxotKs-k)5L>&~4E1K9Tr zwiGbnun?&(P8x;PJV5K{0#so4ULyaKeP(eyaHS-yAUu>8i<crn;9)G@(=68Oyhspo zwGFuHgQ@FOXr4~_UIWnQrI+55{PBq8Pp4T@VPqPF8xaaMnm>nFjST!R`L<y~pLR-= zf@<u*x%A|?fOf8pdt6(a8T&m@Q))UU`5K)Vp#~#NO9Gm-!8FL#bOq@8ETBxH2+U8j zxb(O(xAE{<1G-`SE<F%sGLPw=56hkt0}i-MG=T%~V;f*}4GQ1$6AA^?_uSO~%i^oK zX#qfRf`G+d4m=btGNq$Kf=Z-OSH;bfwE<DGz15x>6HZpQBZ^kRKHeKcKc$<da9sri z(O87`!@!UKWx}pS5!Hn0w{A(DCZe7?su|{yI{*eUwMhwJC3x!3rUdDrn{;86Rwx$$ z{9lL1TOvXsrc;KRQ!r&fB*_}MSYx%v36*Yz=n}6Y_pC~kp)Wc9PfQoGLyQr=4etTC zIig4rP{6s}wuJ|9Ae^wq=vMeJ9R7mc>7SnM`8*gsjsifCdXk}VYMi3r9vn*4qLS!T zV|rg1QS0N7Y6HW~hO3%~Q*~(v&_T=x3d4Cc44YC5cT}huf`e6ZO5V$ejNH%5=H}fz zQFTq`{5l<3G+KhuHNxNlB?3fqFCOP7d@}81loupv9>PVkWW@nT(Qc-=?BDy&>Z1Op z-hedKj5fE{w(-_QLzwWv%AwrU6v}&o*7A8eHbmFSHX~Lp;GpO-JFbWZq=NT|!e|&H zXv>}l8yo`RAk+-UjX{@PX4g3r0mSm`YHg9pHn3G)dotYgu3msT6~{nUa@rzAaa6+@ zrnm-E#{nlSd2)k!c~+$ef6A>2Ng0~^idc2(06!6VK|`&ZjoL(Nx#zW^Bhj2uFvQ_+ zLWUUOy<gV^L9j*Q)6Rm{)=`$gd(kYCz4b+$pl)lbAP9$qh8TANa5Pk#1F+fi@-Bcm zQ8nQ`W*GoJ!Hs~1LR`8K<$~p2T{c2QzI|-~FInvMOa4+S3pXbq4&I9|LLkhq*ZTOU zsvwx~{v76zwsqekJJbJSE4z-(;Aoh(`MC|DQvZ&OEoc=YE<tCF>xMs9-mkj+ScxR5 z%)*a#q(>ptTF0qhKJbe`_xqNWe}NI+m4OVWYS)a|`zB}zKiYrY$8zKsb6_{@UZk@! z*6Ly_ltQ3b$%DXST^IxYLDz3)Gc5OGUAQ0`P{+Y?_BE+8xf~j1t_wBDx^q4hW`}_N zUWX?6T$>azJ~?DIz(H3>p|bDcCV4EOnYGmUDh1~rd(EE-kDwIV@0>ELw%&{RnyW%| zr|cD%2_onp=goE07nLS4p9(R4yZ(!g@Au|)&Uqn*uTp=0Ut~?@INeIGElN0MQ^g<Z zGI@BNPrkzdLiD@Y*jt5yW2I=OfM}ocC)x!pcw^eBD`p~sTy20!{uMzYw=^z<em&JG ziJunAv0(*p?j^HNIipDst^wemS_~x*s+<o<lJs^X0Iq%NW807qcL(+!BKP<vmjcDi z#eiM+6NCw;rS9vsuFIN^^3M2p^KyMFvqQbtWmUH9y4bk*&6#cwrM8Ga-N$!(3b`$J zd%ABY^TeGKYp}>vs0wQzi17{Z!lfutun-KH;Ib*)upCdYAc!xk_&$+IdaFk#k$B^V zp21rcTQ)W~B|T4=VfFW?1s{0`Qho7it-pWwFmtyKwB2xq#tjZ6KWcy0aZzRWFsWad zFUTuubv1AJL2KW+#M6bO*VE5Nv!&9$foAE?f7bQ(J9(LIsb=tK&;L1(uhW~8milp` zzaF4<{sDh!K!44HexrOPvqC-mkTxMprM4!lwnlg3t;)dgW!g|3@gaq+Pv=^nP+lH< zQsQN|D82ZSRy)zIK;%Oe)~k)5L06PXLv*k0-0mM8+eZXia_dq+;2Zs<x5&W<$pCBX z|CqbWsHpz%ZS;GRhM_@1y1PMQ=<e?BZbZaE1VKU?1Vp-9Kt#YnQVHo41f)xl5cvUf z=Kq{^)_K-CFVBl})|yu{FK4g4_qx9KeSN^<?7pl_0#H&F=vf@EVcb~~X<bYZ9(^yj z3222)`Q-*^qg*v934!APKGC3+?G7hI7sL#s*#itjqG+%PHwo$I%o5sfp|qna^*$9~ zinQ>z+Rxx<kYNBwe<jQ{gho7srhO{(n+9S}xt<<L%N<CA|3SsnLtbi&j$cK^gj31( zL!X-3FpC)ag^!D?3jjtYyy~{2;na0+2h`JEu^0CIpcC?#>B*{>=3a+B498y76dNA^ z&VY9LIz7tfqI}X^Hbd~$76#b21g)3@ze3u5Y4sybgAXZ2jdX&bl=^9=mf$!`&UJuT z2wEAhFOJ5x>FUE#-!|Ixa4rFM0|=(Ih>{7ALP0X8Jits~TT@T0DTzRuYSOq#DFc03 z$~;UC!))N!ieTF#4Pk>Ux^=LjgA2VHwyoBb0`2kRBa92s;+mYG9|E{g;D3B7_S<0h zIY4-QaClZnUlF9J2!iSYEXClO6@bqn@b3^vn5p$*?Cotb*^7B414}YRgVcN*7b4o? z*T1G;_3JL(21=nJtPWzurG7)Q77PK7yPl&@2fgY$%q>wtVu1i9Q{IKkC=MF>qGGJl z3^?@+@_mD`5Kki$3UiE8_4+yRnsYKo+t&-H80xF3pB<iTiSQPZu!J?&;7$QN1_+^3 znEPIeA<{F)tf3$4b_PHs)7}a+LoF}Ig^;j`e26wa#2Phh-|hhtD)*lA7&OV2MuBl- zUX!B0(gEeSfdFBe*~<&NNFp8ZYR%XzV80F?tj!j3$iXP-Si*p~6tMGcJpl^rm0k8C zhcwluLLC7FNzP!KJ5|-N&)qWky36JYyL2$AI8)ww2w+t_r)&`9D-AmtfpR*OL6MfB zagSG0-u-Gr&~gCUA>f6#K@{<+9Oe)x6F^=G2o6Cn<pA;Z)iL@xVh1N2ac5%(3>cKA zKfD+8ls#Aq0T>B^L$gC)QvtUy;6(=%2s4u@10X`Wpi_GmK!<u4EQtmY1wgzgH@}N* z;P(K4kS@f)b4(1N)C01^KvxwnIhM331;Vkg*z5Tv=P|N<od$DC0CZ}{?)Q<%JX_UZ zg$)3>5R=l)-@Q~pn*V6X@-{L|tcJ(8ZKJKAeZZm>g{r%CnG?WJ4E=Aw;#FLw5d7zb zOHr#CKpkJI8(^QX4Py_t+#7)wyN>BNj3MuWqD(FR%bFt(tJFHRaJPbJF|7`cnd28j ziPK<gRTctfVA>o<<MnrUv@5t$Ly+cjXC2QJvjziZ02u(up~5sUM?-pEfbX*3nji&l z*}?Xx;gaJNQN7JKJs$hXV4>5c+ac}0gr+o~zOU1J*4qvBQNXwYOmhu45$mSQphdC| zFmgR`*Q_bUsRzX=%x-QF#mpdi1>Qg2-fuh!3n67iL9zzGQfYC=oE)1kas|`@4!}7( z93U>Xz?n105qG+-F)D6fH6OK*Xm-MB-^+3Z=eh1hxh7ordW)zV+%*QLg#O&ow7m5I zpR25ip8_JeL6*o|-45|W=4lw>a3vMYPR#a+xs^q4vu+I#NHc|^&ZX0`q)(HXPrxTD zHawHs)ORE-XfwuM@|cFFH-v`^92zmU9=DePpD!>0^Z^j0!4wr|>nN84!JRglB=Bo3 z*<$HH6%V>SPp6JJKRmhef2U|MKsv$Cap*eOX#w!4on*E|;A@0yzd!^F4hV*HCMc@B z*Kx9P(V=mq6U;(LyC?|_{1sxOi}KfDGX%X-)mJ*>FCut+n&h+>?qJ~pP!}K2Hv^`c zy05E-&Dnq`%t!YZWM_2@lCxoZ&JhM%N;EM}-TGvnS>e`S{;O9!iPBNF3~~7KFg=>! z@A&WA0tmZ<%I^}T-u<NBL+`sKh0hC3qFm}-#{~)N_IKUsq6b-OUr6upO8d6HEB^MT zK%K>#U8tRG&|Uc7(K}<R-O=>r?-xiAcx0Gc^6K@UiZ8&Vj1*D<%>6HjiR8r`);Cm> zX~q4v7N>rxr!lLhvRO`VX=ZVoHo7cLZ)@iXyH3nTpjpP_U<jtX$Hi#HcT#c0>{hdT zhUJ>s0<O!mo>K_@3cU)exdYRB%XYu*<+(%iX2-!)cI){g%QnxsM%R`3W9!bq?THHO zg%jKE$CoGDD+|Bv(bzPS!)Ec+aUhXW(Cx?Kne#|GyMCq3(jV8cH{$*~KbFqjCreac zbJ*S-fM;q<o2Ysmw}Dw2Jo-YS>Ao@Y`q1Ayt53M`fA+<ZaN1oBpf<l|3%bjG!VTV= zs?e{pTfGVGZ*TG6U0Z#kPWE%~HK#ph?e_7-KIZNsB9jktdA9vIB_Qpk;nw-(@7<q< z8dC%lGU#%VZ+pLy(0!+khx87S%-qLHVB&II^0reY^n>n69KuHz0n!}u6oCUHi`La3 zGGmiKRVwR{GgTVrtU$E~-fe*&Se2fmDjEDQ&SdeZUh#7iKHt(#e3+TsB3~s@jMU^R z%L>xssq^9C$&7H~CE)#3FO2R^U{Ye|U_AXZ#`f-Z82l~oc34B~S5~l|%wgNPp6vLH zh`#)P13u`iAN^b)@@$^jvL*UWT!Sp0i*rM&bJ2ZNqLC5Opn^Uw#JH}~;LxBg;sJpB zItbu?btz>^`3dB;s9jZ}qOt$6`&rPB>S5F1IGyQOoAGLBZZ%TNtW;{`535b6shKFD zn-MuTg?epUnU*Fn7xzr8$D_*i6TkQOdx~*fWB<{V)E}=0#KUdFRzm;UM*PYSw~IV% z|7#a@J{N8u{omzZdlZB!!r?iA#I?f<a<d4>c)GA_#{|}#2&Y%P9oJ6DqVo~XsgJI% zozs-5mK*}qCH}c&8Jj(J&9P3sR?KzIdAt+(vizT0VetH8_o63PmY?08QAK)`_S`n@ zMMA*;H)uu)KmY<r&;J6=82;aZW}*Tk|GxvxKK)N+#s3bP>79c9--2e?hz$4tOVG@x zWB>mNnu)wY1wZ}2K(mqrj#>{bvfG(zMbcYxPiVT)>FWv-%k{lVi1-bcUOv_Ce&su2 z3LfPgE3N(7y3~V%QbS$L4GEM8d8!Zlpm%{R#{gDFHA5RR1~8%#t-6M0fjM-2hk$oo zLoadLQR{@MH3GWmmc-xqLy2eq11T<DBedI3-A{3s$HY%@b+fji18#ZvqYZa_1>N&L zKJmBNA&1G~=Mkl@y7EuNKfKGE!2dCRDfj#44ck@&JU(Lp8}D8`!$KdeQ7!Ah!M_rx z$hL>ZD~Dg9J)=H~q;zb2oj=1U{5r#@j<V|SddL1Wf2_O}=-{+I6z*XOC;T()L(A|G z!uBNO?7g_DcFQ1W_z_|vb@K*jY?Y`DRFctNXzU_7@4B2vBoT-znK&Oc=xPyYT@3f) z`?hr}K*rBU4OlV%iK{u5g?g#Pn7e=mnBwmKD!1+sgf3Fb{ujIo9po38z8-pOG$T4y z@Uxe`E+qVO8?lLuk`#e;%<NBz<zvN^%<<q*Z0&l(!k@;q;G^un4boYJ-Qs^&ao)%t zLLUEK6;(1Ip*cN=2ChhUjF7k-pR$sqTx97yIr{xO`z0U$HC+5~W`CtWIkZR7Uo33n zW6!(vZu7FnXhrIRUaEf^kM#^rw+I-urKm~4A_Gwu50)UWI*?tq1a>0_W<T}d4V`Fx zHflD4H4fYue2wpcBckiuR8mbDABmn33NsmByE9V7C&yu)05eE)Bu&PEhyHoa09!{F zqZt5+{SOC@Nf7BI>>NzM$J<nlmr^mlQ%-y!olOy^F&HC83fYobIf%e*bfWY&!%ROk z>DonzP^q9U@Ept#i-mT=lTRuMn4z`QeIt+4tf>}}UBq7$|6Pz8k)n}s;)O<HmP5;+ zEqaKcy5M<9GjpM_qd@@ILqGzZOjW{csO8>*8x{D{>PJ3I$UzyR2ta6XT}eJ))_a;Z za0~v>;O>K<MHpRkd`y;EW~hgyZ-Oks#Mq!}mL+e2K=1grviY4wUN@@OFH~pj&zYQ% zn%|%)m^a%>Bh_EyZYT0tnXPzt7nS*y93YE@lMo@avZ>Z+=5Q(AzkD@iKRdF*ds;jF zkt&RCoX%vV|12BB>kkbh%)y~l26->296$s<yl)uj_r&@?Xt-}{7u?Zfd&~YYicL2c z5Vde>*e8BT{+5y1A!054WMqO+jtNrxBfq>mf)CXW&CKH~641qOeL5$i!03vr?(8I8 zCq7U*ZdE?{%^ZP*iRRS|OoHb<hhxp^UYizBiM{Pt(`ePTyr=czqkR6g<+(}z`vXRO zQ6+KI+lIGtAs+D$fSK%XS?0d%o*MC19}9V0?A_<~)&G&3^gbA97Ae^>)Lj&=5V_1A zBXlIGQP;{6T5rwkIRek;=a0EvJxr(=F%cG8@--wjAcrlPiMoH;EIHzeH{}!Dja6&G zI9<dEZB_pBh|}+w7b_Z%spGorT7U_mJ4a0Sd^OTye#uaOEUCb?b*_Ei{c3{gmY`l` z;+y3q-(eMQqJSaqu>A3=ZVg|Sr|5griElXr@83K{;bnOjAS}?Gr-M6g=W2DgmBDRw zqQ0o$?B&YRh3@1#9>anBb<C{DTlqmw2X}7eXK@2v<1OB>t%J0;T%F95aefe`NtC)O z%H|?81tyz@g1?Y@izqf}NL$dLR#^CWU03($$xFvHwlvS^yP_}>unRbvT9J=JP%o<D zyBC9$D<`x>P<elC-SMiqpy$ZZy52Q5f~M`CEdW(A5Wsbi7^L`@wIJ0h^|JUehUJ0v zx#HSwy0IJZxoFV7Ts9flvKt>WgNr@@(SP&V)($ryUhFX&bs^^w;nKQ)_gr>)(MT_1 zq?o_N`#0Wj;)PUyZPsBR24wqOrycTis1n5J5Cf(8`wZU$RY8X6rlt!Y5Kg7Q>1c*g z2q7mHc>?dg$=1+l^BB#rnD0B;i0enEGkv?HoBd{57i!1{ZYzDSoHwqX^gspN=Y6hj zrgKQGU|@x-p$JC+)%LlOOl3JaspeMQKX>$5*-b)jo=1tLmd|9oKPHKI^pyOUqvU#H zsEF8K)AcO&)}Guk!5VF$IN2>lBAvw}Bt7ur(GN!gmf}k!73w()4Kof4#sG*?<aHBy zw+I-bVsLv={AP*{P(~CAY9PaH#_Ti3j7H<q03qszTDuuCyZEhLwayqDqeuQG4PhrB zGO+?DW?aShuUEOtzvC|oD+k`eMV^zgz0D@`z>Yo_XBhhd-`_EO<ix}PWZeJ`H##Oe z3CpOwj(W>VAaq$A&i{dbx#btHr+223AT9}44CDJCe`l#)JYJP}8(*O>tbaTYJr_$l z=Ib9EIh@HZ_F)rG6sUOpY~GmZ5)T<e8hr|3rP%;qKRru$n07^w&<A5dK=5D19h;dm z!-+JI_^HhRXL+%c=kWZ*?`(j(8I7YA@I|3$J$BrQ4)VEj76XrJ<_qvg;ul3xH1MGT zg44HIL{dul0*MfAHef}Dq>K_T0Ln?hWXrv+Su_xx4vt=gTfs*Fya;>G1%MR=vqFOL zgj8S=f>KN|o-fI^!kn9SL@CL^+yT${CRI+<yxK2aXDS>=v4sh0He?$b|G}*gF`hE6 zj_EnN56MmF*kc7qCAD20@mc~l$z3O7HNwPIPD3>b3_um;kvfy0ztfQoI4~Rph)@XB zksBuv060pxiCn?l5b=&&U_`JJ0n`5&U0AisI}Pm31QSe)*8@QMD46^yiFz7fg=Nr~ zpx!8mI+pH2L9iH@6&g&?4B-AR9?TQN1r<cY`PLIm5!f|07zXt}lotsKvhot-T?|7s z1ENB3t92-0G1L~DwPT5}^#rVmrnC-`M?tWQL~PhB|CGcE0ahx8*&-m#dr<ayAXkdl z6f0YyKv+x+E2P;r1BwAqi*-<p1&pBhm8}pY#R68401_A>^}`7_=Li>ogVYgVJ~S8` zqdw{j-`)!^heyOo7~qi#5rjl2bjsZaBl4-p+XoS=Fq0K!Pv>n<<%q|sX2L4rM!w{N z?<8N*F9P@|kgi9d4z|M_2{PIXG$;-tbqKP&h6o`73)r2Q4M1c_kdp)4CJpMi=WX~B z2+IRoIAmf?v?QfT7%l?NCj^%d0MnttbWE@GXJJEmsaB^XSiZ~=0oI#LFh^$*A>fRt zEN3RDV{;~}6dY?sVI?q(5L^&=nJW&lMFT5R@c%)-ieK^tfMXNj`e~WmX<%~{NNN(M zZh-w{sZYZ2P>JwUuoVI{$_evIgg7EV&O$0Yr%*m7*prWd={oc|H%#von#>KtdUbfk zzSJ!-J3BFimta07D4zo`dF97vE`469dU=&bV(22luGaI#UwqM@8O9|)7)uf4B12=B z*%r}jDV!YU9|cv4sX~@-+2@MmP+NkD)1uTS)42iwk~F{~FHSA(t?gbAAI1|-jsiO` zhU9z&V<|K&=ml}eR%C*KisRXsU{;e@iw2^H09&8|XEb2w39>kaTAhOBvB|v<gd6!r z4+Yo;fE_2Xzhc)Gz&)KHTjc*hUp|kai~$K3f1!9N82t@6Edd5YBvAo59w=BOR`XiV z)eCr)C7q|v^v<?9Un&3wMS;{$p&%ef;8oU9B5W)HVub+oPoX1=&qRx1c!+EQrhH1_ zR5JHeOd4Q03?>pv!bJn87OA!pR^zk|WH8rz8WExpkvl00LN!g_8zvHXVRmjBag22Z z6g#74?UQNBzxSF{I!JQINoNvHC5hvO!lsE}8_Z;+NpW?qDo7gnL`?`pNgl~snemG| z-i;|!#{4Na0&Ii=IU~V(0WkSAcs^IL(djGo0BHCw6gml;Nr2E8z?h3+)!zU-?2hj> z*fKKD5e1Piu44><F{gp79Dw=1Nv2F7EXv2Zj{TEMt=6%4-WyI7EN%%VzYoC<Eo-52 z8fhAAnV?1pc-wN$L_{5U8D?Hw-`JT%7?6iSKuyuWTtfWIeTX?aS6vA5FA`d;SrOmw zM4zCG%#4DqLk!=5?GOAUuk!z>*}ng0UAQZZDKC(7trA;oaSySe7m>sZjOE`@=s#B@ znv%@eF8tXZM6m?2OoPqR24XP9*zsGK0Z?SsVaWwVJ=(D6=X5qi!_-D$_GpmqOQDzx z61p@H=T$A;x+bj<n4Jpr!~%P>@n$~dDsKa^BDr^2K<G{E%?WI!E|6XtTqFjjbMPUX zR7oXs=3eLa%nfC~Y9B3CC%z6dML`%H0Ht-P!4o}Ust$GuuyDLnx=1H^0>9e=pm&<Y zR~#JXO=i{=WN{-*)f~^92AI!;J8QijmsWp6otnxne^XB3D}z0v^7t8>_RzIzTU?om z-AsJ&`L?nx{ZLTz6Px;)Y6cov7&>19?vHT*@PV%9wNI>G7H9;cG{aE?3;%PH`Y6Wd z(O(ibbuh7b_$0>6*Y8|wu(ORX(|3tXxZ}BQij&X3DmObZaJiV98?Q4XYbaEhn^mIy z<GgTh9(Y5FtX#UKZ?HQg*Y%VN6wOgB?bfn*S;g|7>2Pb>8x9xQxT+Cr?Zy?R5=sva zZ?d%T!rFH2v0qZdWk><K*87n(#8vC!w($n7`@e$ES(`%tTHW3`84|_{T=n-ipZkh- zi(U-2nFl+iI*B3Q_lwE8e^is<pC@~>68^8w-@z<dMZ%-J4q55_<)N8aZGi(_xB0W| zSPmAX_l<emqu5SWmyQ0)@t99-wCXWlWO-U(jj_QkN=bv6N+R=s+iPJ}siD^@c9_|) zsu#^2@d`ee(N3>AOZo)cmXBH_M_S(!yBAeMO5&;>ek%BN?mwT&@<7K<CB1dFwDs?h zB3I!T&JBAyM93#$6*eYi^JPbdoI%!e?Wa+~>=%Pjck-6@h^@0ep%UqiL<RVps@|Hf z_=%4x>PH++zHU)?fqszUdE4+_k@!^6X<d&zOn-i|RrSuyWphj-JIvFQ&m!#L>z8`Q z<`wA>tF+&R7RhnSVf~^r6ysb+c6G9&-5d5yij_4{qa4Yvtp+vxbXrBvDskMu9-O(V zfgWeX_xb9W{nO~nkJ8`N(Z3o}=ch9V*^D0+PSIP_<-0n&{lKR9<6zpa2ko9TD<&+f zEjVvHT`&VJWO5^ftE`_zO%BJ*@)t}T+A5nUCRxkAvme^me`MgvO-LNchamxdhB@rU zI}CUm51Uj;86L5mw1y2i*%X}dncy|hmCeUAvw60LOwo*wJ@pdqTG8pIOD%D?;X^af zBS91apvSu4_Qi#PgG8t>B-JMW{>yaSm__8^m=FIH>#G0f{k}IHv2t?c1l@F*cciJ* zRV*tLk{2`6(?}SRoJx=0y7L^70T6;_2ug#HPcD-iK!YZ6TIE(+brBIluSlyt;>66= zL@n0UMdb67r8P_j1~1)n#5#`AGKOjX@tD^(bS%_0^p2{keKawVY&06HF?BSBC%ll0 zF$DroNur7wq7XQZ$IBsToG9c<TMCZI)@mGsG5y6DpT*Z#4Q2&=Gt7`BA0G-lf=aN< zk0Rk8q&DQow=1+!WH;s7#VKOSy0dCe)g~V=*NihnIl${v;>gn=E#qtNpRR1tgn#lK z<??ZyDwoDhT@umw(apC0>&z8&GO0ys!gC}i+A}sk?u@QqWsno;Ido+j2iE!5sQlK* z(J<A?<&gD_*5kE2%E-85Ak1`Rz(@prIrP`I4_q@gApI-D%~kQxiG%A`2WTmUdj3zn zoOsdt)LYG>p1Fq0br8b_Ms%b4E!oi>i4VFaYHc_Aeiy~K_gsGOh236!^j-{R0?r`6 z@_-qq;Vy%&ckei5<vtnF{q`FN@fhw7>Fv`1g4B5cuTY(Xo>2{5Y)3IOy<gk-lPUCP z-tJh#wg8mUxL(a>jel!HZjD`W<<J+ddWuj(BKqVJ{Q^gjGswUMm6`*bv50hgbve6s zi}7SD*7qQdZ#yo2*i`SUDeE+4yn-@~b`5bMIO~T{i9Kg0z54_?&dCzAcY>REw}^GO zMrZfbZI{xIj8On*lrcVNJtKMo=EQYcsC5cFJ9WAy(I`G8{CrCM^Av$OC3|>Ap>RfJ ze@64{?7_P;{MSdLYey+-%WeiW^zti*M4KP^2kq20mooS7XnvC_t_xr=+tPhAqi3#7 zRQ}Sd6pJb%V{fGew~o1#e=@Kh8oQadudOP|Z*}RBb+6%I5JzhNkzgiZCW1IHM>xh0 zj&ZoO`3|#ay0jp<a{7J=Z8`J!e&+f4%IoKqk3OP(_~>yXX%rHNt_Zrfy4FfKZ79FJ zETH#y=RjFO7W8J_+mB*mJV>I0+~uDBZ7TUO@%ih|7O}GYoG0sN;Ejru-&`%fRgq7M zNp3XKpc+C?N}k<Rzq_gZd{h7PrV(?~{P4df%vtbf(o}g6>%;wrdi%FFh}=e`v(LZ! z!7AqV&7tp`gsVHeQxhWo3{r3_4$tHIPv?s!tA$qwlwtq0`hRI)Fu!^~Uwmx*eZ-HW zZhgP=?0)av{lVw^qo4ODnETU*m;=H6_HoislH;kOwWsS_r{fYpdY@t(4ir!6`XypR zA)e@7+6Rc~Q^M9k$W~jl^r<C~(2CSwpE+x!v+EYAyfNC=%3-H2v_ZCR>*S03uKk~& z8J}z9m`BU*WTt{@nC#7z<76>A14rmh@voV<hYxKABPsihGYPw+VJpP|Ln;4%g{lQ+ z$5tJ_tG#h_<|j5?p~u)S4JTgUX(pd$&)|@}fI1MB*_;B(^YvVkkz0$1R;@~<0{pi! zwB?iCZw38N=&de1rYq!zqiAQ!y=EGWC2*y)WBPG07@_&0YlB*o)rXYwC<B9Q2o4FK zN$6LgJ!ppzf8gKn@MXxsT*L0R@=HN#fvElUn$ysKLD=^%eDgemE!6}Biyib$!BdxV zk`z0VaoHW8vcG2-93k|+#?4m+kb0{QcNGV#P~Rezk4NpWo)ckRgMrAHP|Ju+voeXo zn0FIir-svW`mr=*4B=-bofiBSnSJ3@j;-2isN%Us>w{nw!~k6k&%Wrxmu#&g=@!lj z;<HGl>5&|fm8sTczAoPy?l}U1&T}5F6RCj<$c*$}d2p+aC~VB{Q7=caL(CbPuSsfy z_=}MoPi}^W{12Dsf5zT?vH4b-3pJh4S0*`b#)zoIZq}B4yY<fM#nX*6Y~fP0nyMpu zdjv7mugPS6DZa$VXWV2K+%iqWoZr&RByBA8UVkB$a@f*;P`pV|c~f8g&%NdJq&zo! zvlh=&h=3)3(*c=u`kIa2*xqTsGQqx#YxRuGJVKL%yZpM;I53#~L#5b)&rF@<6Im^$ z%?a(_A0E|obCvOCW`xe4p<q;F9HUs!tbpRKrH<uc1Gf<^Cx6W}L6S(Q@xjCm?rWNI zYvn}AgEXZi@o5_6L@}sy3^C>WUMYcWSK20#L=j5Q;SDW*wjjQiIOW`+iMZ#+2v@9W znK==Kfd;d?n#_Lo?Kqcs*?nk`MeHx<-<ZXptpl&LHz|UzSUn1!_*pG*-K#e<O?&~7 zu%|jGCkeC}JWpZ1nT&;TPDhj_F_+UoQaG<Vl=e~Ib#wP^pM;s~$uz+m4<ehoCCx?> z7>zjQHJ)1qjAvHLPQtkbm;0WxCr!F%(f7`lCJfi6ZoWU2+DH^@>)d=N-X_ID$X{En zjMo)7S@t>&qX;<>sttI)GX8a&b+$mXUHq$wz0G9_tu;&M*paGz?~~t>-d#W06jsE~ zF*nJr7Q^0kOw6wD1sazGKj-9(&ChO@rAnQyv!=>#8ayXED8{+pC?Sbjf4JIfjKfP9 z!yMTB^RJsK&SI1<JCVkZPxR={^|3=tpjqOSi;+9SGj?~)ZX=>SwoauOEJ0nSowY|% zA!JrT97<!w@UoIT_lTz1XVFWW;Q+-?wdN&6fYOaO%E)_b*yJwmLh}is#`c1?A;CPW zcm`ooea4-bwBVWLmQ~ujimrNUK|pM_>0a0vn(leouU~bI%6+{^lAs{#uyl~1s=onZ zwHJK|Uyw?R=_K*~@R&YIW4KHxwOPhKWVs1SDJO3h^w>121Yh;n7h0YQQ$rVx3ck30 z9Zf!@N+BK(|B^Z`6KSN-8@o8O%dh<NJRXesEQIDCM}NzuNNZ~wVYh>MMdbZr<8^W# zeAr>nqnY4!Oj>_q@^w`7pP{S{CTV6K_pzGm5=Z(+!!+lCgm)S_Y5BWs<Hdz-a#oHR z8UNBZ4COuhspaZ<rJ;z27l?6@;~ASLHru3`)hZSeQ;C1d*{>b;Mp_**GP_jVRX*di zKm8~y{(FqzhQezs!qg*W%qB&2BZ5H=mz0Ea&Yj^x6Dfl@Ex!$}Q8-&SlD#b>7F1<o z^!xT%rj4RfP;Otr?uH~EF8+*DoLk?$%eeT;ge3BMLgx%I_jHG%#t2r+_~K?-X8l|K z!56n=5e<#a5QNm)Y$l892<wbVmS(^~?msq}g%X=tgCm`<Q%sSWHdcZqS+(v5I^uNm zx`f#p6|wq%U%r$&5+qL4^}&Soo-=?C{GS=TJ<#>ndRdSYQk(nq=-%(fLT2kXQJQa! zZfNc2fqUmxC7mNT>Cw->kpb<2G!FWP|1Euep7Xx&(u)@-GVl4fMB$FdoA&?Rj6_V& zeGCcR>6%w&)Rp&a(09a_qHRUEaT`aEmp>E>Pf(EG%Y25*_uKeUg=y)PBg*J_R`ai> zWR6*AT@ZyAV@2&;75p_bE}O%tSJ(93<nd=0Eq~K-y6&n{$tqA0>$6K*2B>>d>dTv2 z(f86Ltq(H1F1{>Cg@ZK&ylBJ@qWoUT{SuEZS=8a_)=7Tyhifsb(KM?yMg5qTE$YFQ zfPy?z+Uj%lcElS2H7b!MAq?LS^Mf(aP@Lh`ZRD?%WirmcmVU7lA%@gA??-tg$ds)$ zHbdjsEbu=0Wyfv;=^iuVOyV1KgO4QIt3Qmu2SzO)5a#}wIOE$^ZMFVZFwB&c<P<Ft zQnI47g(S%5k2qpgL-W`U1WHA-lxSEfAMxa*Nq70*iR7uukyC7`ye-+uO|SiAL%%Pc zS@_01E1=A|?}|o2U6slBP2^k=2W7P`!#em}eXjIAzfPR8lrbP_dYnbPrfZ`8acJb+ zo1wPux@>>VM+K(7qT<g!Np$G_d(03cvBdr=CMYXYdwb_*YmRs@+tyn4xAE&`9Vg<v z?dW}RDLJB9YMZ*)wiO|a_WQu-AjX*i`7cIy!V)bq6%fDBQOoKKiI&&Lm*F;}7IPBx zn^d18-27{o88@lk6a4TTc&KMNM27ffZ0oCO&wD-=6t+bCT57;uduggvVpERYR~MG$ zNbstC-RI<0CHt^vbXk5^Ur<R;h5TE=(UrkJc3CO2Km6<hzYi4`hME<1|GHevpV(9? zHb{)*ziJHm5=`OsjC)L><cnO4lW5a&Vy!9kyVz@TKmXG;;yt+WHOkc0Kc<Q&ugXok zC#7lsF&)N!Ah+Q=xn4Iy)yO4C^sy@c7j&j8_jXh8wqb<tCBLzKV`T8h1fIOeM%g>Q zPR6hHL`bL9A4@yW`!R2>HgvD=GGwDZiRE8=zF{qW{e71?(|Vetv8_PRSLn%EqJbF) zMcd}GSn$x=e@sD7uWdJLOr14CX%jD<UC6@3Wl%?~!k;`}_}ns6e-uzC$NV{en0q%` zao%{_y{RSn!$LAOfGc9O;y{GrtnS0_U^EH0jD9Rt`TFYzj~?t>S4u4RO44%oJJm~K z{iTFX#E*BA2Cc+_42M#RUXOcAljODO9uT}pQEM%J`UFj9gQPkai7fcw5Se3AfITir z=tq98Fi@Z;f3z9!*^0N~OKA?)gAzydiCaKqEFdNQiU{rxKuGI#I=MtrA%0={41~bi zN&G3T0v!5<&qW#YrvOO`W+1$6Oasfev=AeC@%B5r<+l3eFZvar1IP>cQi3|_tlo;H z^onZ5k6!(1A!G|HeHuE-L9|L#G2+4$_~ir@&x9H|=^k;|kQ$T8ZyC!gYs%KFC_O(= znle_}BEyrYOIY5c)G=g%MX693V_O9VY{w}3r_%95#HGcgPL-q{@ujpI^m>Yr$*K%e z@u^hN@cKr6pfy3*Zw-38^e}EIYS{Gqm9tEh4AB-6@q+rVoT>C}l#K9IIb|O$1P*V< zsw>i|d^a8pCXfrcP%*#7#mVbS$s@Azlw|Sj@nzF6=^u&>QTBO`>(G{<O{(_OyUU4Q zlDwPs*)l6eu8=Bub|iUgB;{fx75eq{ta6gikaww=hiq4ATHmuQLT{CkT#CGyABy#l zXqw1}qhAnhjtH-y)kC5btZdX7$a-Z72TH}hm8odC6?U1hHJT0#zkQJ&?W3`}B7+N6 z65mqGo7F-EYW~-$iHXo4VrwCmRdc<dcyA)CB>Oc?Q<E@VaRexD$Qq59>C-IN9O(Q8 zYSCP+6E-g-V?X*D@*<CeLhIinJ_+0p)0<h3q3Fmcst^L5>TdirA*7edTU5CWW1;5r z!qJH=TI!=*OWC(;<l5=^qWwAqcZ#uM$k_SvFXFgG5m~xzI>PPsa#>mZ-Cde1GxFar z#(f69VV=*b+1dy*tFV|KXoCk*(6=g~V+h0U{%j@Lr&`|*+9niS#x{7AK}VWj>r<Lc zh<`Yzi*6-;qL^5}9lvmq^TGdqx2UVdJRbWCJ(Km>4<wdO`1N++``zsKRGp^8dR=!L z?TUn<{X<#@3Vjjd@31&Le=+j2m9hE|gL7!*SsNjAn`C=SbLaN!If2$g<s=s|3ZOwZ z(nsrw%Y-f)GVo&Z{8zGZOCnrWe<OJkC)5DWkb;$y80Mx74_hT`TMROlaZnmb_~bWi zL@rz1qK4lL-|K3A(WNQxWttN*hlnx`8rn_`#fWK~eloP#8l$~4<YuAJHZe4J(d+Bx z#C-92+t%E?^ukzjTrc>^*puY3=CUy@AL2jtQ|m7#yT=q2#;04+(@LvT8A2v|f5dWB z@U&T{r|Xr;_>(BhC!V&>Y7Ne6n>HVA&5r)p%h}$?HHiGc)<V&5lqoc8%rINDJ}uNR zML(deI6gSKCI9ypp9nTqbTrxbe4>?)dO1p<@`qlP%CKm*YBZGKz=}w?!Z0X(Ql4SL zbPmtdHNiw~mQfear(s@;jQh;TWdDiDKiTPZQJr*jtRz!xi0MM8>q1y41OS=sg6EJt z24It~oi^;=gJw^A%v7??%osjD%rX@^p60h^887ekpyjgBov}?(u)o8V+>0S8Uc|g= zUrg#*WSj&=yfqe3nHo_M026+9xnqA*onU#_r~l8`qrD4$w=lW5;B&m7a);|BH=Bsh zdmcE;vWgBAA7V2lNE}=&VX#U`nfXYg0_xH2py&~wR*!yP-RV@4XKEU~y^tG9<R_+| z)u7$TPu?U)8P_vc<!fOOr5DylTyh5pX_yOPWuwWMq`8>R_QjOJ<xGT`=-uK8wnuK7 zB15+%NyhR8(QGV(1%A&8P_pFPz8vj}=WDAk`QV*DLwNxE&_A|?*4y`bZx%^V)(lLs zA1W*u0LU~fb_ND{HMck*p7=P9BF1C6;qmg>o0O-H1Ii`KZ{}8qDl7|JS24uWKWMWD znnLHuy;I}Zt%=30i4?8JRS6PZ6TTDKid^G#wA*#)F1%`A`RSU_9cSn?uHN=%Wto!1 z`f+04Q!_zb%jd3U`Fs{9a%pR;tN&CJe_YzKp0UhoOm<x;32rU5s7y~Gd*xAU2fiyG zRBfl(A+x%xBo?;Ulspx2MwOQ;OWCT+1!AJ_RUgLKq_5kqy4noKIp{AfU-{w<j9YyX zU%Qhcw5(5P4b|J>*V&aLD7kw{B85jUZ<{{3MtWt3aVQltWuU%#wac4zw>a$qTZ0p= z<uGi#*>`w$=isesN-Cdrdn~W#l5lVO1tUH_23u}3uzuC!NI$grx_S|V6K}teLLTBX zxQy(oTKTZjp8DVA`oFt%-??9$shXcu7CFo|#(jAGXC0^{lApwE^xaOLDfI>fZv{LW z{CVd%NxrEoMo2YZ$`<{zwNr-NZmDbQ7v-x>x!zygmG<25jSwCeBIU08OBKP?*)V!} zxj&A0#HRRuRzh0?K|#DS6G^p$zZ`OY8iWn3Q!cVmZRH32G=<kWZmVpkY&3hU332oq z6uF#itq|Cz&(dV&tZuo^S?T+kZL+!H*!;+++zF9)H=4i$<Jm|#zPC|Rx5yc}d7*9< z?;s)3_2}vDT6rQiaxpU7b#U7ay3#=s@5aDpE<^L(CJ@OeH&yu+3~l9(<<2i}_)kvO zw8Aqh|A|orRgYLWDOUp5i1>CUl_M&3jwf`Rv&?<$Zs`?V#A$w4i(qUZKv5UGBd6xc zqqZGNwXbjJNjC3t<+`+aDMArUF6k*OH=dPXH={~?Akw$jGrr>sr>eB`YDhH=q%!e% z%L~mL_3x!D5I>B$+DF)Vk~vT0URi3sJt%qa8mT*#Q0VaH*t4zIvV!z*o~bAH$9}n? zN7Knr!`gwIxJxt2i_zJb?_hQ~-g~^}K&D~qynl;I)TdJZAdSO2sO6VI&J-_rr<>7> z^=W2D{A^_EAxn*C7SwWv<H3J(hu_WqC(K>xIG&TodzWg7`K|c<YWygE&A1;|2Ntk6 zH1Esu#-~X*^;<6o72XNV09E1kvlimor|BJ1=_}uRd@|(wyVth~@Ar?PQdzswJtqK$ ztMef>2M{PtAMO9j%9NZ;-0LmdTi0ysbzFu9E_bY9dzNZqzgZ4Wp3(Tn1HXR{`L3Fw zpdP2*PXmg3mrnxi$96>Q{D`9+^?upec~<VRY(m5wV#Phi#ja_@n!oUbK(MzuO7}BL z&e#Ggb87puk&~kB97cjpPhGLEti*nR`=+4kgJP;Zlc%S1dZ%pW0qlSM&Q5$v=1)wh z%;y3C%#ivOoKEPZD6o&Jfs7?nOJe9t?frxE(pTJ=hRq<pW&eu3-vw&F*}ZJ~K)>I( z{9*razSaBdna3&a%K+nvb1r*Eznz`RR4M_UlV3SrR9fe%3#@A47iupr!~|LBadLLd z{CV|{2<4Xua!)vivxAE^<-!9PDMLesf(7f&O+K81e|uNFIpu!l$oov>a_G-pz;9!m zG;#j~33c^L0n=;?)X`8jo8&3X{?ge$)WP!)8=k+7J)V4%nPG0&G_gl1)kQt=__1-W zd(kCNQ;^C#5BCKn^3a{(*)#3GDmoIHV;!gaS3b}0_Zi+^JvR47Qio@1T*2JKoXtbo z)dQkA{q=Fu>cmHy6vIQBF5Rd9P|7T`Z?oDyOTb7dMBwDfaTAAe|4m~Tyo%DlN|8KG zQ4e#$T%&x$Y;gW$NIf>W50;bsW4L<`dL6_<f)FS;$<JL@QYU)#_evWloYt-)K6gf| z^kP8j@7t<tVBvLr<G%|^#5v>fo0QYXubuwQnF0F$o_tTt!1)(V@(-$hI_DAALiHr( zJ6;{pm12xdtYoB>zHeT~+4#n1^-)pD@%N~FZ;kYbvZiY)ZB!EV)j{WZ#@^v9&6CEz zH$Mb!(dzj`z<U>*0FzHQt3|$#IWG+#?%jxoe$}s{vcB1$_bD_deyea@^f#dXcUsAZ zke(*f&Y;YR&)Tg&6Kl+OjXp%>{dTBRe=N6fhZ#}GqPfQTso-IT!A<>rv-vl??;(Ym ze)J;AhLYTWy~Ac?1rZ%DL#^#2W~zu2{88QNe_y@4-~G8tq?QPNhu1F|{gm3j@8RR4 z&v;M+;P3aRSyGSJhM#^VIr>)h^xM0u(VvG3I0;Y;oQ%)ow73t3p}040MwckZ6H@8a zYXrtXl4&TV3{WMYFV6_oGWeE?fwyV@8)!CN?|ELSC5xaE<FXXldX7USL$<A9xHXta zK+9)ydRo&T2cr}T;XW-!*I`=yj=x>jEi~g%xUe72@h!Hw)3usT<{TqG@NaL{TZ_i8 zc1QkwF#9bRiwT%k;S11TH*a7D5~z9oWYd_zU-)UuZPU=LuFo|kMc4P<RKswQ{26Wr zOcM(7&&=QZ9p8u_J&RyW+lr!agb=<{SaItT<J}pJe#&{;(=5ChYf3Ase$xGK{dqd; zaHHRyj1Kprr4i;On*aI(es7XH?ftEFPBdOEe*x98+4b>Y>u(u@!#~*hIeGSxtP3~V z&~lVI6Z2N4K4(Q6LoAWZb+NY0*^6}zB%Wy&N<BSiGTK0uGh68}PVDCs`>)}f7B&qg zR5sg#b51%TCAk1tY#Nt2Rl2p3<*9>o9*xqh;$Ql7Wn$^cXK1|KH`YDu?FEpMl=%YB z>Y7T{97`|H1)p}1N1-C-qoU_*E{vPj#*|RU-5}lfK_b1<S7|qfL`Up(Rm3~jS(OrH zv}^WmuY}qt6aLkL(N-v3gQ|?Xl*|5gx{)g7Gg8A^1d5i}!a;)~quimW<dsbA3pqoN z4FdzM0ZW_QKY#N~Lc6H#U$sdrdz8zrxj!sP_;T$XVT!j*^=@BxVK=3WC#kCb<MLPD z*i}vHydXcT!?)p>)t8mXb?H+YPiHl5t3rDt6IZX%+D`(pwyCq$8bmHkewmbsDrpdR zeD%rvnVx@wX_0>WW$(ROo;1gf+|&s5KZ#Uljd()5lA#oPbK?}jv%gH;;4W>&JHh}l zuX%}ZttE|tM$gt%VF*#LgvNx=O>3*F$t<#rU$e8DDmTi{tu;KPrr&SGB`V-jq}mOi zobp-fockiK#9+~nKN=P4GcNI|&J6xYYB3o53|=i*6lh~xCL!H^7f+$c?fTKAC`VvE zbY(T;)6R3tv^<)~co);$z;eO%y9@@2B|L5__b-#g4dPSb+IHr1hUTe!N|G7748;T= z62uH-AxV1{zN9)r3yevoB8Q~97n3RlwLa^L{GXDiw>}=~o!127XN$b?do*Zr$ett{ zGNr?LcUCe^_bsA?Mq94v%Ugw~AGeqO);#(frg-1;tEOq>EX;)AL!t8>W6qVkG0~Q! z#}-eOWS4o^Glegh$NfnKey5}D;mUso`K294?f0FNQ_)q(n{qvs>nH08<(EPS4o%OO zN7s@Q=J@|u_^|IJ>CH?8Q)-x2DmNW`$6?MOU2ix-@;{-4I#=_pF^{-$pBoq(B`DqV zy?RW<ZHt>Z#C+bsmOu(wMZR+FW0yH%iq2rBpuFtl7HEzU2`sjqHb-9)rLp3k{p_r~ zsJKyWNw%7{e{-!am<{0TPAru|>D&ilW>_9il$Eg|i0`FsTB7!gW$1TNIiesTx%_mk zi{jyK)r@UsIaW)PD0uo(%b2my7%K;zit@X~G^Et5W5qgIn_-TgwAvFpMQGwjzx}VT zpLVZ9-y79qbfz;n4wq;cY7%6J9Z5OUxYsw}Tv8yBaesW&%I%h0g_Ve?gl!NRfWuN* zp!ijXP;<o<Ro*Mr#gV%<>nhq`lY88v?$s!}3u7J9N+50Z{Kie%c5|*_prq<bQq2}8 zz&-KwKvjwVknJmSwiY$Nn@ag)ZR!SBJVazRSn+^efwe2&`ruE&IjOy(y^~bGgE8}f zSe7t90wf$XBu0?IrRDov&5Rierji20lcsaMOSu!r6TdR>)*7F_NsQsXs|oG=IB701 zoBd1rz+j1%>mi4(1(=`q)aI2wK0gyoDi37#zILu5sJ+haj>n>(XTBw)z1~fZ*J`GA zzI_4%;P45Vj&D*t&|eeEke$&o!GF*eZ~47Y<<8r%KuTT$)ZQGjnFsmQF*B$nkn^N` z$|)yABEGuW$ZrWat}K;&MN#~|=#I}rnRj_Aqob`-j^E3;Zh5Y?qrLGdzmI}9;ITHu zWCUCDTNFc|93^^bUF_4-^8Uz0&NdGX68jV6)mwu*KE_n6g_AMas=ZC=nyTaVdx%<E zUYc+vx)zA&=UqF?_|Uy0Cm1<Xw|3e3q37hOVAL<(pQmBw(tofe<@-EkMj}RC_i=s> z5TB1hX8cjZa;JR~R5nRQ!cQ>MI<AL!F+@L%-?y#u#S7MN5C%u|GoA<~DDZ6}G9v~s z9Pk!J7VP9By3L3oaO>Yh)%Ymh-vW!rRL_I!KW$HlB$@{br137=AB3@g{`VAs3o*su z@_qcO6Wy9wM!3zb{qdVgZ)^7Z<ZXWMkE1sCt-1Y#JHkmH$6Vy!zxl)$!=`{9=~OM> zSEJpM7S)jvn-?zfw)_G6O_38IL&#QAi^Ay?1GC7rm5`_Gsq%JBB}ccFu@dcTYIjX% z^|n=rrtIr_cg+;uw^b<<d1<LLvGNNP*;M~gJD#KIOc)of|M+sC=k|K&maI7?zMEHa zml}jCg>H%^I&viVv^XH&(UO^R<jVVLX)L<qeHqcQr}n4i+1`%!_bJD|-Ybh3DU3wZ z`ICpILKzd!#AouI8ct3q9YDuJsZNG}y)4ZH^5Q}14jMVX2NBhS_$Y2PhW`}x_sRN( zywn%+#?v^_?hWE+QUk04fp-6WS_ggZL=*VYy!5dty7nXPk^9gdnn|BYfIw2tqXCFd z)x4gVb!&5mo?5==ro?CIiQvZbx98ov@~<PJaz2>Hap<eO=9iv+*a?6OnFtjpl>qtK z;+cP9{Lwr=90%YYCa*b#;KNdjpZ!kXW%eAoDf~Af>=)SblA)4e_j(>rreo01Kle;e zX3g=v;d@(k5O_}s4j|$QDIC5-k{;NUf1)Zc={ZY%CcDKd_}GrONj{y~zz73NTJPDF z)8=#kheSSOh$~jaS4YN@z?m)$YhX1mV<~sx-?|3q=Y$;J$({r^{kQtQ=P>T<PI=F( zn~jD4P(7LcxdMh{J6v90$u|Xziv&oZ%(%i_0LUT!`i@5`+wXqjZ{U9nr{}%5I|`Vk zuOzaUNl#Q9mztDAZ*O<pgZ8Cpl&KqwVf@$wo@R6N!@xA_@`9;=)uB*^8}?$b0Mo?w ziecYs?=hXCxJr;Ffe{Elb?P0w3l7D$=FkAR(GIwgOnA}7csWe?MaB4)Oa${9KynOu z8bDBub#>4WT##1{#l#&<BqzlrS4@aTCS2kYoSS^o8!OzK{BU~A25E)^sfZ(K*W0E! zM#@xsO1lzDH)blo5~?s}>gW>ccxIZ^5}F)l+M*KLO6CWp%;aD?@>dRIy^iEV%oJoB zh<heRcnRYU^TU&phgXgdQ<-r6)<dxiuCgcyQz;7v3#&jWs{{+1d?}k63#%CloQI^w z9<ImrAqbb*qFLCVmvY6kaHp2C$pb8A0DEmIPw6Ie*CwRfiG7HLpRtsGo<(4-RA7fi z@T64mibd$YR0z&0Ok5^R#VW#BCc?ogDo`dW!OG9$B%<cTms2X9zbWp<D&bcq5ymQ+ z&%$h`j;)BGTI^#i#DZpJGL5W{I?5h(I5W1zFqA7kIKsrp_Oi<Fl*ym4DqNK*+_NI# z<w#;SMXGW|Mm8mmawP#aWr=d-2QE@p>Nt5wyjdik4V#)<xtbrFdRV!-p9@hQ`av@Q zPmZAoL8(TUYc;ZIca&@Qvgr(!>rAle&X?=1vFYuU>z%OaUzO|Mvl%SAs4$wDaWTd| zef^9d37EtX0caYBb;FJaiPzMo4_r;{*v;H3%>3BR!z#?9*)8HLEK=Dmb1E#0*sUrn ztX@@^n^c(ex|$4aQxI)?3#sZ)s_Ac4j2>0kU9sEWSJ=Zj9R9e1Er5IOJ|Jqr0iVNJ zpwd}_!$rQ*MUBH%uhP|w!_BVJ&5gs|uhKmX!{HHK=@HN2nOf<Y!{Jp_=~c<$I_>Hc zLhUnD>BE8LK>BEC&^|krekUCMSC#(v90BmE0AkKSs;WRn&LEDeAOX(clS=Qdp=X78 zAz_P}2y}>@d!j36m|s;`7-x8NRd_sSL~2z;4(H>ds>hX_k$Stq^RB^Hl}^38ewF5` zBUL_sR30x?MW1j!yQ+G2&xwM2_<fnvZ`<_}0-%%MRm9MdwYxO@ToG7E%>oH`K*BB1 za0@QDiw9f-t>?1)3BZkwtb!Ws#XIdKS|Rnt_CiyuM+=i;{dN;tJ(B0SQr4<dcDPc5 z;z488Jv3bQ$tut`9V~hSLM>=)VO;HbI5O@l9S+<aRFDpPt{Ks<vWGZhQeQw_JThqW zGYru$jIjJ27hD!dUULtet*T)|=9qD7$|4IyP>FUPP#;uYqh;KXr_UG9Z25h=KW_Qc zBPzJ@Sl=wXkFwOt^PLE`R1;NDS%XrmE!X3zAm#+WK#^T=af0^k3{;-yn1H!JauY}p z4FIx%`%!JwJOHj5Y~154AWSHn0c3t8Q^5lym;xDggC@mFE3*lWR%#oTLq0G#ZY7$4 zg3*sd72*TL8C5sAp-G`2cr}`I9fjji4MTf@x&dOWdo_kkS?9qrI4uHrV5oQF4GL#0 zN444_&I-Vz$0$O}(e3$M@F*JBW)wLth=2l_vQ?XZo$q;V-kf0pmg<8uq2U@JHwML4 zy#ZI01y}<`A`2RzDhk;@7?O!Y!{ZyHnV`);v)vHhQFUr1-?zs4Zyoh7<&Ymz`_lbz ztL|Z@mT0;cXgp{PNTZLY90ilb+AV!}xQf(cXuM=aN<QR_bd1K>P6fW=>-&B}ToBxV zpST<Oe4-N6jK&s!;f<jcut-|<BEdC)#|IE#{Tv}|{UXqs%1?~ll{P@eh3ye~DB@lt z39r%1rN?<3mL)7BQkzI>WF4r`7t)NPN<-uE2|x+~Xj;RIO*Gy$053$sWg7}PFiS5O zV<;SuglQ=97s&Pe8lR#UBzcDlFHqZdemjhc%TAQ=h`Ou^xB7S_Wr8=pR3Bahx;+ww zV=}i+CIE)^eeFdPI-m)!0cZqzDH4DbHbAiwj#QIrIuh3hO#qGA4+9b0DxaD0{L5+j zcjI191`xbZtSRyw?{x!f^gResgh=(#3;++-e*@*%`p+1u2;jgJM3BY!Aj&tcMWsFi zMFNfgkby;i8ek@UUwQ{Lp&&e5D5xzP^4AY5|KVx$;Ry*&HwqAl{k~+}M=mzNERguu zsO{D|@GufF(zxn`x@{ZK?94`Vp5W2PEcl_wWl@L-H0B0rZHw{4msJE~O{8w5q7eFp z9};@%i--WQG#$C@|H0i|zcu;Cfxo}kMT|yrbPc3M1RR~xAniz{8$t2I=#&zXcBHhF zh=dHJOF&xDfvALm3W|#E>>KBt@1Jn4^XsmQ>l!!g-uu4q_v`sMh#DA~+M=*Uf1yh~ zU^?-WL}4-VM;gV$W=J1BNLxbbpyr@;Cc1k>0g3>okFsz+5ZWdLbV5L$>T)Cz2HYO5 zmV8BNfKU#kH+7W$Is*KJ!0JrkyfF0s>Dk5d5ll4U#lly{vze?TJkTT(I0E$VJl*#T z;pwOTO(sE`wE=bts%?mc&OoKPnY#GxFZ&>o1guveKxc!R1$5X6D`*1!!-aJKKqm)- ziwAT0gmq4m(v<@SMZHZQ68rZ?PAch*n;n`+z|tkC9bYqUfa%&p_UHqa8USPY22iG* z#b~rKI{+%300v1~NFfN)AQ?`Chf(ntf(aKMIu^5r7oC2c<N+2{zhA7OFaRXcKLik+ zuZljaBd7<ljc2wULSadwYy`}>0`9q>&WHj^nX;PFBJ_YjhmjyPq@Myq7abm8>5SOY zR}4U5Ld5S9zx9d{&^7U_*M>NfKwvLU%f|*_JrXS?-mqGmJ8KBi9M9RT&5$)Tm`(q@ z451>l#Y>v3$ERys!_h}=m~$j7mGrEntC&dt+sI;y+F9<?Gc9xjir`%Po#o^cs-Lis z9b|2Kr_-%|Hygm-Z%3<vUi$f))wl8sYIFVxL2D2=^eCun;~Yd9rT;fTd`kfs+SwQ$ z22&1-f(V+ap_-R>mxo8DzV5q>0~joYC2i>uI=+jCa^;Wz#fKxtZIs6)6cz@8(U$<A zpTzFfWnj~Z(x9+#6Bt|$)H(skPUQEe1T=DJe?>{;s_LLHiLH$gijTBJ08sJ}uMr5K zipLBZG)sSH5G4iup{VuBp^N|_iR1kr^>3uF7nM;QB?!nG%0&XOxY!hDYBSnFft{t0 z&H{J-K3i7*Y@bUqRdNIaJ=UuYA6gHSTIJL3>^XFffbnN6h?Lqoig^-cnJFBuOd>r1 zl1wS!SSXYsT$?HbC;6r)G@KtF0k?&qqX|$WS_4c2pnqFp(hQ!e(qqdM-irp;BuCz7 zuqQbKU@GNtwwkGtvHyJl#s164^%JTL|DxifAz3)&J_*Y1gA|RvS<RkxlZ2fioz79z zp2d{CfM#7UG!iBJuu2&-;WCP_ujB$QMN{*n-OWCP20npiF;|iMEL#7?2wMEsHrl0= zm?_d{?&<yx#;JRo88$nqzZ6~2=H5tFmuY$!qWlPYo87Hw;#}j|txL8rBjsa;e)V)2 z7)*c6E(tkp1)p}+2YZnaY3gr2#bjH-QMU2yM)9n++8j{r0;NA@BrfgwIfuA=%C~w= zda_QkZ|-jST}tay-Wuz^7}y)mbt8`ky~LdwEU97?@`tStt6#8MJwD?0`$zBih5U&> z-$wh4Pj41A_r>>T4|rav5TgJ_f<IV*Dy37ufHCVNCTm=}ndInz5v&*T%i1MrEGKp> zF*DA=A#FA(cxmNzbN`sL-lu>yvyWNb8p{Js8g>E5p42~cuVTlaRalozPuplzC^Rm- zc>!V@a9hgiKD9{>QIJ@kA2a+LN9kK0w+lAcT&C$QclIqI`U84@Tnv@_Fx)ql^Y?}B z-#UBb>cv|D(wYgkG+#}RxC#txzJR}eGw}L@<{PE``1$?`=YG>A$)2nt|IUnPuzBhb zH0o*6=rhd2>*&lmdIzC@!se-27Og2Z_@6zs@k8*x52;$aIsfgNZU$s%zJxr8I}{(} z`oQ*~ZlhCcKlRpugv5I;dza0BCi42IA_C*7)*)i>kon?QuDHYNBuH#*O0ovmovT}S z*0!!nSl28Z`E$QbeehN{?z^YM@yqFN2U?cJn3JXvHJ>5AGEae;!QT%r{&_t3XOMRO zhBiX-cyIN;kk+R`et#RhZmq9!5l-3Ea*5h-1dF(B&mmDe6?(=X;3RkZVmg<CbaPLh zr(uqub_)CXd@tiW5>|E1+*aPE_s+U&MSMGJG?RnjrY;qKf0Iz5aUEXULr?X>^zu0M z4=sGHA6%-`(%<-g&92&j=D2(#k`9`+UKvP%U9b;u?6^8xr{8BE=-eI5;gx)0HPE&9 z`lt7!eV2o;JdOJc|L1on#QhnwC!atO0pvM;Tj*jT-+8&6<~#hIcV&7Gd|FF2FT*u@ z{jRmuoqwT!$tiNbjXd2NHG3l}aN}{{hq2qvp}}wD9-jWO?g5QLt*gZipSr{>Rm>J& zxODg>`WUv-er2_y{7=-E&7n9h!HU!9@9!4wU%p@Q_r}jpTZ8um@BfSabNuzq>izq) z|7crr7)uH$*oi`buozhm!OjHC4<UrIEQe8S8lNc`g&E6djORbjKV#Nruo_`8#xIPp zS(#alaySMojB>eWS&gxynis}EnKY4WAP6h<{{+p1^E9j{McEwo$0RDVtf!<Jnir>J z+Gnh%!7MfN(`Sbmz7JLV;9txrEtuKNs;mdRm_4_p96EizJqh=qtjNXMLbSn|HC_Ys z*T&-hE`DiVm*tY}g8rGnrMg7n9_;YgKU*Mvti(3A{o*;-`9%|zOJw5-v^>??>a1Pv zB8Xl?U4mjHiAxCCtQRZJp|f_Yt}&mMFSGJ9s@B1H+H535G4)^&hyh1(1R;^sbS#)a zS@%H@?Hj<zw7aCBS_+O7#743QSVbiXfIS9DS%N^RE2(lxX)10|bQ>ut8lgs*$Dugv zsqrY9+!{5JMciQ#jzLzV#jx0I6sjzDm?UF<SP9~*xQ0uSsByr(jB|)iNQP#sRgvWI zM%o!zbaWLOGqzg=NHks}B}*G|QxYUX2-GzASQ-f?r6^A%$t;p^NC~_odB`cQWn;go zea`8i<&D{ze|E;-y<Q;<cVd!E2)77SBI$4lB{6TLovcukyNwoXqr^kSaJy9**n;`0 zOk7QxdzJ+J`ZkogF>UD6nX;bYbO`;zK10D4NrX#ja6e0zM{<)685R#g5XWTpKXYXJ z;PT^D*Bt&I>)sE`f4mHQ&i`{W@=N*8H@BDtPPUTIR-C-OZ6WaM-QD1dUmr4QG^ZOm zoL>9)JA^E^k+RTSj}*3jH<1+Xr$zC}GI->0DmG#Ma)$KBA6p;0u97s;V7T0bWLyH# zC4-HrjU+Ewd5g{mf!@FG*`^ZEurzJ15P6cgLamNgJJCWuTAR@)H<9;<h|oUKW=Y9S z5>a+XSw-t`)aCx)pxK$R+!UoQI%pRCzd<u0)B~=OjH7xSEH{C(Yn~(_N&q|TCO{K% z<D~-#sLMn_xCaFcFwnc*^$E;4;39oZ2iBSgW4JAo<-7>6%Se&ws-lE5Mxp8MhrH12 z5Ew@h!P8Yfe#V?YO5ny3b^agF%-md<W(4ll2O#X!8|@i(o#G87)3HVc8jeDLb@Gxp zCBLxDOG@JW<bnG)!P&(fDN}F2!aNlh=dts@K(qXNvY|WHB*$E$`bZua^<KW^@{G2Y zUhzQ0d!<S`XeQ863^B$Uw@#Yv`-Ycn9=$&|bY>3EVpZ7T!jJ>?Fn40DDT8QBu>65q z#MIf~b^>ZIe3CN1_4&^IzeiV%1oX7gC}kZe?7a%}6fRMH_da9fuCCCH>BtT?%bOk7 z^c5OKQ_YmC{wHYGC}yf)V<x7uM@XJr$ZajCm5uZ@`=@7|>QYd5=Fy%$M#sczpx}Y# z@ty@gIDVg{Q=8po*O<oPx0uYzLEq)MZ&S%**I<6P(eBZ{U3-aLOVHgWG`P`204w^o zU#a{|pjhs9vHGLe>@9jXkk0-*mwV>yS|e)@TtAgu?*DA}@YcJ7D}Q+$C`|Tk$&dCf zGmF?h%#SEq*V|P{_MP$6S}8JkRA<HYa&1)cQB(Qx$E(`BP7B$EUG!3#uT`nja%<tE z7R{DK7hdP}x$Z}3{Q&pjeUUwu!pA8p%}b=rvs>_cJ<n8vLi6ZbZ{e$t2O@*QEC0Cc zq3!KylI9R@lItg*dwnmDgRT$tZFc^v2h`dpt}pPq9oO9(SPxvx33BEh^?Bi6`{>I( z1_}wG2Y^qHgX2J_v@0M)5d}gA%}@;Sa7l{o&&b0>p#VEaX|+Daw!>tFGIz${=x5(A zVW9$KSEl~~ntcv|r0~2c+TpCYlKDCFLFogiJ_XE4{(3vG%#-hn!?@=AuQ|8)ym(9j zaDApiR$i=^n8f-+tOFsevfo7ta&AyxytZ8Yytk}j@$~p3Ht>AIc2V@2h%~>4xqgSa z(!Cwi;)L8%)BU1`4D_7DT@q9{_p0WX;^()1e7_IkzozkX6^y+WlEhMeP2a+(kTG}J zo)Npkd@=f|hns@ax$T;uTS)+d+o%~C1{51~--U))gHA_T8te*-j!zc`qm$Ib7^Uhu zgIIHkxBXpd7p5m@zuAhev>b?hRkx^X+%5l=d6k!~c%6l)3OzL2(YaW<p<AKa)qX2b zSQmJS>!v^iNP#@`+q!0M-=55t2Swaj6ebD;v`${QqRY0odM5I5#b?HPIB{c9&MLr= z8<&eMBagP=?+$eiCoqnDgJSNRKgAJ9snv3YENR*haYs)p`=8W3<qW)b`BZAPl6_mg zQ^L1D5_~QX4U0zZ;X~&E8|Uer)YeDM_~HZ!yvrTygFI0TX&ZdRw<fk)Aj(L2S}#S& z$Ededvn{p2&yYc?E8mm<lwL)#PlH)^Z?p@~13cF?$KB2<n>V_7K73mYihWI5)@_T2 zN8@O)*lt2OSNZh;-J)FX>%F34Zoxx+#fK;AG36qRH3((N{6wx;m`sh-WU$OP=EjJ@ zD;+-9b?80|3BZI<6YU;{fdrxzA?DWsjuRpv8m<GKIZrxMLs>xVo&|B|g2G-TK@%8; z_6{%a#2Mk}L(M~Xn8{yZdL&S72jP35pbFHBaPp2(+iE2wLE;?w2&G1EGgC<_X`0$X zx$hwOL$A7k`%soR!Uv@`xWtGl_)OX|SSR<6@=_AO-KGdp4#FXEP%m@zFp&{Y0KNq; zA9};*3E<WbP*F-*GYZ_w2o51*3Me$VEd1M9iGnmJ4}ID{2lO%N7yCy++TxhI^o%(V zmEIbk$CE+Xq~D4JbO;W-;RFAXIYF<FH=@2X)zSU8JY;&DImOu=wcBcl>!~gHmJHIt z!5WisXu@l_6g-;<XRydMlPai}gYi5^naTm?B&ZPyM9Fd1V_ZTC8zvo|Gm@ft83Tt# z+fM0lM<P5CKzI-URUG}K?2V^C{gr|z;W9KRh~I`_4;*qt41OaR`&0i`HUZ>A@)Rc9 ziW0Z569{t(kWFIY0FFL?fF@AALIA|fmmBiH$qJ5fo&wONl^Fxf3K=5+FxHSU(0U&Y zfN`FT+17W(6S?h3K4WAwK*m%6^awY@k6;ijX(9AAz-Uf_CFMc4pNAu<l5o1po(BcU zz#0Ke=T*i?AL@e`UQ@URshIub>gJ#W4;-UcyJuJcBOTD`C17ww1|K419tW);V9co~ zJOyP$4pOC}775@PN!afY_BR9+kUNo0ft<*|LI6lM1=l3^9DN)7R^I)$c{!YdkYhra zEFie4&{KJ^HC51>WavOa1hF1*QcwxRV2@ldTaKXseK~=H*}g~86(#zBAsPn_p@8La zM;Q!YI-jZ&Y{)>!rr#$EA)suD)Gi#jbppKdpce`Tn}3tHY_V;fhn#xnr@$exWGVUt zC!dkjEg}#KIMK{;;r3r7=;P}~B;m^nFed{kl?UIERH!uoWaH=u9-06E8xr<L6p8GP zI5ffAfdFGSM9S0OOaq{(;8&CYeHD00pVC~KU|0o!6*|yDViG1nx5?-g0I^7dEz&t6 zBEv9_yAKC0BMGkJfMF`KfQ@k&$B;y10Ei$ck)a;T7^cX8Co<lEf_ioZ!&n$ALK*bF zFoxuvcdS)-0no4R8RR9F;U1vRGvJ$wYA?tbgKwZ=60D1gtN}t7aSZbmNH+1zBMPdE zj9yYe3P^(I37Dl6K_MLDM$Xu^kOOXt2p0jCKt=vG-AMA29Y{e!vJDSMb!jjhu!EF| z%ZGW;36gJjYN#N;Ludg#13`tF0S13qjan_WmpTmVUm(nI09g^KLnnv`s1TC&cq$A^ zlAA>!6jPyPWT{&?NQ9zkGRZ&?$KkKjOtsW=-$sYyK{~{r|F)2}WCbQs5D%GIm*7d4 zvs4L4J-Fe;NrIUY6s?qr1H9J^Gsmvx7j$K+zRxJ2fRQ*b#R3;*L3f{!s>EAW*T8Z4 ze>}p{zrBk<?lEQ)8Fhek0QWBz_h+7pUP@t%wdS<}7<uS+5tXhS!@v>n6|ydbfLSDf z8tJkV4jvLI1)*wPevihFLsm%nNHUs^(4<(QXgXBD5dfc9IbjHx`ghPZ9E_a`ZKN`y zKMU@E1yxybCX!`jse%*V(FJ6*Rw_)G$dEwbe}sd*rpho&z+!O>q5$LT6lhpGsI7Bf zlnO#h!tn&;FpR^IDC#>iKf&&9-JxS22G0_QX~-WL0f;$E>uHQ1<p>!PVQ)v06GOgp z2>8lgqab8}l4O&11n|Z<xH%vV!9napA+}V<RdLwbRfzQh0#8L|sDil*VAelMmcl&T zhXEV~B2R=&SQnIyAslei336;wR3I!LswWG#rI-ueb$rPTF$;#r;=tfgxOpllElN7Q zkg6vSaiE|wvH<-CPukZoc1Mc&WfqWpF2;`HDYbVJ`#G%<2bAPHFTxR7*FcRF8Ce9R z3<s&8I>U(o4oDy449zA2r(cm+!tLLR{P*o(Kf*!(LP7tfIF{RiXbMn<`763q!A}n{ zL^y~kA5=!h!~$BkC&861BKL{#9>(XYK0d4wSsOV*TMu$HsDdBIz_vI=rI5JKs!(f# zk7)sPg$nvl2>Rc1i$2Adq<LS)6lC$RVPOJ`F(sZp(G^R?Fq5Lb9-7z@L8tQ&95MU! z9O{<s>!cBX<3jq`QTxkkL=7i|_#PCr0#*f1u{h7)(}*fX7?u*aE&<`|c}2Cob$><n zqFg!csrM2C(-QrdtIFCh&B(e(qo(N-0Qz@5Mj-{Zh1?|YrAaZdYsr^<lVuaYFmjrZ zaV{$n0F#d^^nFzy+bwyk>y4(vd|m&GPG=;#ingW=Dma;l0Yze&2fi*wzOGARz$<-M z2Qd(sl;2V0sQUOAj`9$p3JQ=MkRAtzA0*k$WWSCRGCb9@U?aWxfAAl(Z&t}5z#|!o zuX-5&e)}kR4KJrxM3i1>;yIgdO9DA~XV>_EtVzxqsHOhgckEu04-&tInS)&3q0R+K zk=u-IPn=uFomw9xAK>+5o|q-J73NRgkZ!t{CsicbR=mM<rDXoz{kI(sj74|WOK8YZ z<2oH2e&T$DUP<OKw&6@EmuG3id9C<#$zDgP{_{nnF?G%6xc#1NRKnN<2YCI-$CXIe z)ZmKMC*u=$%VA*fPe<9xK%6jV^7ZrX|23f8&uAGwFTS~6EP^SFdqPeuE<WQ_h4_7r z)ub4=(XngVQ6^f=-&Fm=n9MIzu2E7I@7S5}q+K+#G=H!9tW2lkMhUB5t^ZzoBdYx5 zeEzXx{&gPmIgjT8RS%Afpa0XAH4Uqjak5(R?c8rDRhsQEYV<X}^!-||aFKcgM6Y_P zu}s>pe**Q;Wws@Mr+Is?Y^||*)TA6g)pR?l<*TpJ@12&x4N>}{-H&1X+xc<YH^+R~ zaK*3R6<=>ueCL^fUl=#Zf79k<m6l(Slqr=k-R}RS2X~>EJ9jD;{2}F}J>Iw=H|9vK zwBy3f&fC-N`h9=^?iL%b*pJWT?8f?l-&NX8kA(EP&pOq)I~TE!K&xlhqi;UG)%Q65 z&*NJ+PZIiizBXrH7ag_cwW7>G+hs%?z`dQ*&!9h_sBHJvUg%>3zskMw<f6`F%FWFZ znU*!D{;kIT?|!+l>{n)P8k445`gyH9WI-!UPoFnEec_+FxsTgu8vOcaa3E81SN-V) zkA-Wc-Ip(zVNV}rHrBDZJVC{pmt}WLYIJ8b4l8Ipv+%DHiA`IYeLUYc@Zm-qZ4uqJ z^ye9^@fim8R7az2M}4N7XS2|F^t>>c+i$1|VHTp%Ag<RP=&TbJ+o;CV$agw)u4JrT z@5!L(L|kmOr*m;$zp%rr=1Yn#@6wyXrTc9jjJ)xk7W6fqYHU8|*D{e|EIBp$%xrr0 zbZS(3`d;(s^9xgtyr!NxwTw+SJ>hGAcC#*n9{js7wv}n&<1(iYE-r~F@^`6p+~}67 zsy6K{4&|+JWUOW6ZxkwdD(AYWa-&XV<KDv?6KrMkozP*9TOD2-HRlf|VEdKEfmNP7 z%kHjA-UA|*E)RYFn(USdCw&uL3J`(!%eS4b2u_OMxV2V#qq?jYx2==W@OFk)^mn}> zQ9(VSu)e%;AwcBD=1lXZsJ-*rozu>Q*e3g1E1UCoh}(dkthU~)wQY~L)OryUmG_=b zewk%q|DE^HNsRXtBj~x4sxPW@G@p1TO@IB4nOK2VUw%PD!GbGJZ}vq|o9z+*YuJXE z9^ZrR&6oZ=&jwGo|HQ5^QXqV{3yg>^#=?WGB2cw3K#~F}35HhSp^_w|A+ZWgf%pk5 zZ+z)Gl-PA4fqz_vGLfJePSA?h9Si{~NuaM}q4c1(9I$_102V}rTN3w7YeBZeJ-ZyR z3u#A+1UL})_-7{-<^C(xlrf`#1aONcghF=WCkzFuP6e@(p)_?0l!**70Cp4sA4P#u z)=O_6B{jKdzH0Yd5pq+$D-Ls`*jjD_+X=91WRyJ#E*A&YA%7Di0`hTyFcFoOkdFZ% zC1lk8Q7{w*QY(g3QGqG~v=I2gOM(=VUr6H6X0m83Wxu6jUkWEst_8OwK=p8F2N=xf z;*SO@&<%j$M3f}~=q7{02vDtbDI^ivNC5Q2?ago)KI)_i5t(8RN+Cn|C>V8Mrk~7c zLIzX;jFvGFf{W-YJ&ehita<eow0)m`>j=Z6ktSa`oXo(h9*b0{(o3Z;7P;j;;PL5j z4lH-*jt*O%UP+RJu)7z)BLY=+pm|WQ%*3IY^vK$Jq<l6AoRf<6Ca|-ZGU@qJ+|x;5 z_A0Er2^F5f%V!C&<RxYx*-gWGaOwn#ZKca?Yam27X&&N>k|ax!M)N>0w=8a=$5cEN zX5uAf8J-4#necH-QpKj(Vc14Gk4-^jgM!aHJ<U4b`F^(S!p(mS>Rr1FHKwInw{L96 zLqy6>=ohx*nQ)l=!@@S`)dVq-G*O&RwQ(ZLr8E~wLZSf#iqJ@rJfA>8iD|+VW%D7( zc)s)50uJD$U-`TUOFhQ~0Eu9cgNO9AU5^Jt__{;l_96i+w?39k`41Gc&q1OW#@R#k zkWlt{C?go3OH1Zbk)%?vs%jLyGd2;HiCnyH6MBpwK5d;q3xd3jpLFYl$NvGEG0Nsr zz+hPla219pyuA4643-W0=<5UpoT`vZA)v5r+Q{X+c~Nb;Z$=2z7FeNxT+qLOE09q= zFKxKwJmDUKI|e|>?Sv2@8q&V=#S$~Nb@!P2AMIRZkUYE!V&E2^_k<ZyK_KQN%hKD~ zT4>*zd~*}u+QJG0Vl^Txg;EFiE!n$>tl7O&zrybYfRkC5>T|2|O>!Gy{AxCVuv}6? zURU>TDV@~2Jbn-Qqkj7rcDQ8(bo_77tke>0r|Kw{x%^+D$D=m1EiLddn1w*`T*x+V z)m~Nq_58`A{rh!yQ~@fm|J$5t@W2lpCrW~jPlHF}O1u9{&<dzwA4E#uAXMHK5I>A( zI_)G>V|E>KDeP>>P>7Q3&%Jh3L@(6<nj9PO1af<0zq?(WC<<Yyj}4yrpP-ovZ`%+< zS1naH{ev5)oDLc(4@NkOJ9QKri`WvtT$+2&P`tOPL++v{Kr32~gaIM=G#)|G2p}}k zS(r`v2MB^E-$!l<u*8F)eC^sz7WP!iI-F26nxv&r>43T_Xc>>XiHg9zhLj&3YNHtD zzXMplt%tLPSF&T?mt5E=fzk9R6c)03?mUM5w3DX8h7o&Z3BFMO+Kc0^iex-s5q+5R zpXq71HoHFi*F{dSO06Y31hp&xQaZs=E=uuzB@+-D)MPGx>{2|Jn50#L1*^1qF5@Ow z!P@q15mEg+5I%+B_n!xu<4(VYD+5dy{=L<``bnt(d`*w~k6DT#3CW5z;t-JUXGD5k zuL6U$xzn(38IvH`lX1f`TrMN>&<oN4{P>rb99I^MvmvG-bWd^_w}bz~2UKFN6g@#Q zh{jb|x$0gEDFzGIpqGu257jyc;{wR&QY*q4R%=Lly(JDrs${#59F;U_S9%G?`RQ5q zB7%I9Y(7?T4I;<n#cL88wn*A8@>q5nK@?fR=71gj-=LYEi%#K>Gf>-cPsIdB9g~x1 z>gcfCB)k`YoIOwcnXtU9fEtmrspEzwVfh8kHNIHiNi)B&J7uQ~7)cdDo_3ksa(u0n zh2!|S*0e0l8L;#f)U?A?zFVH?Ha<9g+C}bLfO21jTpVhKIM$Sk(SGX<h|hRQhZjeT zh$`Jj&0aGJFIj4?Q+b#^8{ijS`s!odxk1!iNJe;B;r3;5N8_^|`Qhaso2^iY1haTa z%DrL*lKLPrF>3$&U3RM2DSHf7jx!0x7b@O`i^e8>4zHZ9;U48iFQl0$XM)>3^c>GE zWcd|T{+xMha1p(zCQhYA2+1}WTVyO2G)C0o0~<`QpkEYCMbs&`G+YYKcu}?=@j&BK zgGC&AiHwe{*OP6u%E?%&k&bLIWAqc1__p+%yQ{%=KuldbJbt#A+~^|PpmX-l^VW<= zIwv-yJuKb8uAJ8#@OO`K1HIbQi);yNX>$GRyV}2Rcg+X7>qbMbQP5FsNwUrONh957 z(oyZxSrVRtGSwqd@Kn68m~IwoeI}m+ety3B>e~s(&Espz`X|l4bkJ<6G3rrsV2l41 z%*(Z@sO~OVMq~fXm+5Yiju$3cg5xl+sOalG29K^~$@?{kvR;2O6WAJlAG5h@a=mw{ zrB(dz6ia`CRo}fqP`!5x#%)?M*Ug6UOR!au=|#U3Ai{Maa29hVk=SmKz04qE+BC*} zTlMMbz&hdm%QqBsMENDfYGfNPwco(*zSZBL1ZU^h2-E0c_SUxKvsqgV{?X6)KDVV_ zWZ1@LMvsWfwWnKTZL>E;kK%*cGp{hb<(`fnQ*Ld)9h~)+?;v_y<8ymX9A4xMIEFrb z*pZi$wIljQ5pELHapyk6J4w@+DcjbLyAQM8;r(N#T|Rf*8)SGd@9zWi_;-y!r;dI> zVQ7E`;JE=9fP_^4&!#sGbvjNY4<#bmq+KT3DxaldMNG<!+N(x0xt080O|(~!=iqcR z_>4PhChthvG`dW7)K1@%_nay-?yQ?FRSVyL_5b~*_gw#z|6ew}f9!p@PpS|bBCs$x z?Go5e*|ebyjDABGbA*-a|GOh_v|CHFZM3Wc8&h_*OW=NX5NvMaE`+5>+7iau-dNZ~ zYonq4-8#@-eo$tHB~m^Ar;>w9ebNQ~twRDwGCEjM%upj(_N671qitU*s^SK^MX&SU zoo2#)9_5ePPydAnbZ&ez$u*xd(erC(sC3e<hclvsV>YElL5*+aY8szNw*Oh^sC_T< z`C=dEpFo|LV~vuPsO70o!#sA*XZ2V+RYSYs3hJSqQ{tlXLl9bte=qjeA3JSk#Y13< zQulklmysV2YGSsvR2soN&&1a0y5ozU|L~cTZ<^<n#WphDHTkB)o8#A!F8It=dSWBR zxvhOd?$aRwi@n_$dC7UCzS$|x<j106qUrI_OSwNs6;^`<a!?}~<;cEOCa=y_br~8% z*Xv1d-o1ImvUG6sxvQ~$YwzTg<=$RW!8Y%>{nvM}DQu&eOPQ)G{nX(svg<d@`0F>N zo%z-5!H~Ap-)5b*j;9ONantsF`Z+JkWZ$+L)^_L@G+o9{YYwz@8xN(%s!zaqUp{%` z60ULR{Mf%Ma@Vc4RHg}dwjTg{{-DKjX!@Y>;d@b*zUrw#Pp{ZZmtSUB4yartYQN!g zpI@gc@14!1(EzeGo)mvg>@)6&?cRRIDyc^yEjlP><6%X2^OeBNn=TMRxIF1%A~{e4 z_`dcY{Yd*Tp7{pVbn_J}YxB3s9HB24-1I%T*^t>|@w#~~-weL>F>i||?d@~6(gF%W zsQLMe^ank#l(bHZ(Hs|bDNg7{Dwba$@1jK+n#nXpWojTN2<?0qB}5s5%M!q_k0mR+ z?{$9_f6Q>3tcs69vPl2K#y=Le{fk5z0`7p*IW~`@4dfk96>_R-?7C33f#D-DYlB<( z@?Q}u+DU=gK?~MJJd@n<Fpab<zcP;5ZjQ%rbLLwE>fZ6)yQ~+iM=})r`7BmAx=XZi zkQ}|-zhkOTu|G!c4rGYlL<^f0vfsH2&lCRL`eW3+-6|NHMgsVc3=i`HBA66vg{;mO zdb|tMqS&VKuX8=VE5s)LN0IYH5mzZDfOQ#2yl?h&y*eaDM%Xcc%yj2HZNO*UtmLda ziJ%!%3PZAsaql{P3^0(>*$*!@EZ7t+-adPy?m-b!NJ3xPPbRa_>k4<L*ac@_OH3|s zE>-lJ@hiu^2-ey>&aaYc<-%5S!aJb4uF^OA_q1&<DT#q)jgUd%(^&2!GQ-}QcEWyc zlH!tM#T_wBsFVJ<YfYVe<%h$$<@*mB80v7pxP`R0ts`H56CUYG(`F;ZGvH;w!LGsq zqF6ATdx^Z=1+-J5&tn*lO7Y2C4tb9k!uS2|o0jK89Vae@zKam*^yA$Irg9VNmvG=q z1Rd^q(zIM8nez~6MBiOxj%u?y??2&tVYq(TqvjDR-o+?u$~KuMKh;VzBKcUYkY4`R zNm7MuFZ@2gJl@NKpRvu|8UB^`X7X$G*P}IcE=5a31XZx&m7Na<DIU&Ez!`c2V99wB zR5YxGdySxcyB;h;2T5Ju+AE*sI$N$TW0x6rri0r~TG!j8+p>V5Y@90JvwvAML~L!5 zwV#qVzuelRzt*9VPQsQ^04Z-m!(neOWnZROD26xuAkEA{(Z23TyPaT*&llmGzOtXF zFqCx@JHPA@tTiinm6r;z%?vRG9u5bc2?1DVwwUO|tAvt&Jc_*%$+r9P>L;F!*9JH% zVUjjG6S4lZj%YR6{IH5sjHrK`+{a=x^bALAvAs>CK^f}{8=x93$?vYuoOmx4uWMjq z+KXpdxQA+#kL`n&F*Ba3U1MVm@r*S%D9`klD)}~W!8~V!U70*ImXdI01_wdyHV2={ zw+wZkUn;@#-@bpM&@8Us2XX&uhEaW@1r8r+SAD>s%ixi}99#nrB|+4ulT=Sdm?wO6 z5YQ=*9CC;0Iw=7RHHqgtr3xCH#ABFZut$wtm*q|j3kNA6TSjh(>#iIm`!I)5W9w<3 zQvuV0EC^4fB3bBD3paQv(FegWDF>jGg$fa5he8;3S7Psof#A{9&76H5wCH0z=E%Np zGnv4Z<rgZ#su$NXa1v|m{AgM#Fau08C$TkJCV#2R*kYI<F(adhxf&;}QPay{K7J7N z^ce*ETAo;Zvel8&6WY_->@G9Xkr7lV&dnjz{+e?+WxFV=NDO(Eg`9F830?QAr+@zd z$?=3z%(N<i&cI<sdhS8aGVFtOO7YALBMd%9I>X;(;^kemF#-e#XF^*FyM{K#oxV}F z)e^=GjfYCrgW-+TB$Zss7gz2A&KhDoOcVgA5#w1~+rG-x41rB{6PQ)8DIzBXj4O5+ zQZo<Zq!JlrimEt?abRYmHimwV;_{#-%G-j#lzYSU{V61o8tSnHeP3@YPI;u0WGlL> z^U09>m-^)&s@(#hamM0cDBOSWi8ll21WLlDpwK?klOvH!qkuW$B1}ikYxt4*KH4MX z=KKqTAsZ8B_wxoq{=XL@euwE3YvnGp=^WlO!_}EH0|7Eowy1e{)L~={HtMxL%qP{0 zz6TD44O)92rH=!n$y#gr343>?MTzjWF_;epHlRY}l!vog!qg6-XNlM0@^C2%*e(Q0 zk6yD<z^oxqwL|b+DvUuM&V2~gIb_zEzd<9%no}Y4in2EK2HoECq(VGN5O*RVlNzLr zg?n*>UFQK#vLl`fvB1Ib*I^c9=ou`W0SD6xf%%4jgVF#ydC2o~a6CDYUM6;;LWF2o zc)545KrYxxKFRJ7N{<Hr=7e*TVD!jz<~5LO2-MmV@Q#MLtO1??kux-$B?YfO4k%FQ z?*OtT7Exmmk#LvAe&_7muvSJ5%TOW-R7G-5cKPMu`L`yk;k!+DKHx}=94|yT;-b8` z5^Sje3k49SL`f7u%2@GXhSwRfiQ9#cn5*7iD=_JE5IYJu$N_Mtf&_A7N_HVgs<99~ zhD=CD&ciTmX#tW@-Ds!~^~UXU5ECpEnx3Y82zHPM%&|}w63l!ab`}ej0CHK|0LnPn zf)ZBt1FA#?xnluy9MmZnu0{m8%L8v$)6%%%^cXVzLFN@2C!F6gouLi1#|genhAIL1 zEM(YODpU#wqmk%UZI}uDA5$Lw`Pv;+Zcw5(%ePh2HE&SHPi6`F!BX+VSoxiMYf5?{ zC)?%kpq+IJ(hhnOfrlFIck1-3IXtk5M}}Tzv;@160%C{=ekxE_3*eA}*D0VEKL7+a z=pr?WkKzv53Y3q&t`dDdBpF1nXd51aU67!(HJH;OtlS=UcOu7$6nlmWN|Th+Awks0 zFgpVHy&YgC3FDQA%$<YNQ``>JSUXEV2Me9<0JZ)4&-0LZP68%Gp{J<n{qPjCYe3h7 zU~A%a2}-H^A=v2<>aGUAjD-sUH(lw!q{3meyL<&cq~hdinnhcpxjaOISo$Fb%0No> z#6m1c5c4*mSc0{6*U^P76N<gBB@Z!7&gAC=F&&;Sj$%1$F9*95p#;}>RA|LED&A3T zp?-W$`9+qxswMr-p(6z<)&~4GOrQZU%Xv_rw<Y?JS&n|I3?RRibV|;L(kL)>I?o37 zSr#VduGrt*1=T2m^>{#fX~i`iAbnd&1FsrQY2^$LJpmkuH5XhWe3kpqJHY39>I+vP zd2oO@5sSM98u5t}y%wMfX2Dh*trZ-u0lZ89Bj23Q298{ovd@Us_12>YsWJ3KH#y&X zNlG;DF1`zofPqA5lpG|^@AO>Zzk7Z=VHa9_>;{u8`10*}geoJulru%;SkczQVd|XM zu-EOdD3W_&vTGkb;}9ZO;Z;SCM!$)4lj{Ltp2-Q05GS{N2KN<1?t+AHAUf==$#coB zS}EL9aiL4{W~xbmfplh7^N=EOu^P{bs~gY<BUiouK5CxLCrTVQLq&*P*B(fIy+5qz z-s25mN#UQTumYT#hdbC$Z%u;UHn8<NhB(?et_tOi6bg=Nl)hEqaZ)RcP!=$875eV@ zm&d<f%$zLdlp^h{Ga_lVe+BDT&-}K%{TSQk?QH#9h2f4uYKNQk@>M*qujSI!8nKYp zM=WV2_lUG8%W{3QkVxCV=QJPK%Mq$C)v?RbHdviUJq%^q()G-SN385bJqE#9b|PAR z6ZmW2{pH&2?NadhHD>DG>_;#SzwadJp;j{+NnW;x59_hVzuiyJiqES3^$)r*MP}R4 zm1mEHj&|%m=(LS_$;d?%{%DkckQmt_YAMtPn%m{!#)8XJebFFt-lU!8ADN5Ocxr-; z4OjeyA;k*QCmW$z5>{OwUOc{S=RjE^{VTa-75S(R&1P8J6lKWE|D;=Fp&Q*qJaO{K zRL-*UH)p-!AM(=fK_6GJvSRjK)rcqO8E^LdC&QC#%IdYJ{e;)2QCYsM)Gl32!&J!Q zUt@0+4Wlcr)M$6zMo*7LZM8urkyqw>hB3mOy<HD8)oXCiKfTKZtowKd_O$L#|H0NE zuTbv_FAMNd%Py%Os%!V|n|5+v&s{Ogc4>ZC8^He2xXlEhH$#><2ACBF68$~ZIOL1j zeAb&9?!tPrj@iVr&b)?lRNWjL=;_<hGZz<cr0w@cpJ#zD18O*aEi8myf7ZqasZk-C z%~(9(o^SdPJyqG>A(tfjNXh;gw9>!vhh6Y9xmRQC8Zx}-wP6(@O7sP-U0YIrZwDiu z1-uM!j3HhOA&ligVR&o+1#xR0fwn?yjSl5Eng~Hjw#Qn}Ygu7<3mF4mlPp(D+JXkf z)OAAn*)NaL0WWEWss8f}EZjYy8vuXM$Fb-`SU4W*LmZFF8V7HUMdnVh3Ju<EK4&O8 zS|m2vSa?a2?>x13;#Zz&tjw5VUfZX|e&+TuBo$O@#vhFxXQR5&EXS{BVQ=u+O1~d! z3wOy<nb2ULk#w05*eZPF!n=p@x5(>CJykwEQ0RdxxhwamCfYpMz!rZTTmCvZnN`gu zKQ$XWMa!L1dpv>~vVNPOYS|otG#cfcnl}78Tc(fA{l&WxI}4anHfJ)|Ybb*OJ&|3J zBQvZ&`?<r~7I;Eu*m9wBs-T&GDe%{sc|I0ys-LCT>=FYjT$2L3&32i__F{M;0&|ID z%x2CG?=aMnrS_wj<?Ebu{P^`5m;n{LDvmY%%Y12eX-ySt;rc%V&3_l1b7zcQpVyu; z*OyJ4_A6oA$h0!w<35j?3u6{}jpFJ}jI%u38vVhWEbzZm?LL%R-Gyw(%t^+=sLRqV z3QTPZ7G{|^=Yv(;4Nys2OO;KewXH$om%J8=>~1X!@{g<kW)|IC{?$J&*}b@W(-ZF8 zE8RX#P+08-4O00yUX3*ryo^YToQQ16N@QPRoS$RRUXpTOiZ6$%NG3*0Bu0}EVK_vN z>#L+s0TX|jlVzuT=3j-8mW&9?_JNE1LeGOF#($hH|KVfdq&IyTRC;<9<F7G3oAz## z(O`e3YgvDbw`ucr`Npgq|EhR^meY)huNmdPmWBB8CB#?As_JH()%waN%MBt_4!2%< zYh2RRnSW;S_8p6_x9PdO)ls&EmC6mQa+BTGh7(`gL(SLop7da)`eRv^UdFX#{#W?d z+j9T5<ptg<YQ0r<d#n22TeZ1uepl)$<CFp6`H$x3-3Qn=msXZA7CfBOcftppW0l+B zZ<O;IWBd7iVPiU58(6Q6@8>qAlitK`Vu#BXUd1B}u!|zD<B{?KO#i5rw|3OKF2($b zP`x#L6v$@m{EmB$e@~_<l)dfXW)?_k8<VBRK?Oc$Z5PuXfet^imVaE%e!ZLfZ#Q3H zuRv?B&~2~izrB)*y|Sl!6%~8pLeHPJtoslUO!J#qtDUXC9j40{_}-bc1achkSDxox z*=o15_;2H7>2Uh-B~~}mm4B1~{QJ#HL@0i-<S$IA_x&Z<R+PU(WXlR?30u$8gTr>O zS3U=u&izm9Rb)C<o+{&0wU*MK?rz3!f<cfp-^;gZ_V=1q+N<1s({=aC*-|6E)K^S% zwjSUr9*0*v)+m3&rTH;#fHju*8E$pxb{kO*S`2IcJiM|KFxQ7a>6Y94qAoOMS-~H` z=#KB4-_SCBmA$f2rO4D)33lJTcZ!v&V2#p%U&CQ<(Ap+r$%tFI@EakAvjH#*5<=<A z@@VtnU7_b}<j)W>Z>$yJ`vpygQ#;K|(`H*=e+Ko!!Uiv!AOA7m09{dH>UaDzz<Qkz z?n%$h(Rb8f5wt_-_<6Vq{b}JmB8dw+z6TApgqgI#J>{Xn<TJRyBl`9JT#!t@%~#^n z16~@-lQ|sbwqj~rgmRM6!A(!qAI#D@FEI<>B;Ci|4`H_sVZIdj-V=C@V~i6P5%Rn| zm<-cCg!+=;)`unT)ZL=5lX4W0q2M=~&8`T;{QDZ$Bdu>5Uo#pq8Zim)-hcnH#B|KU ztHeZH7&<*B4ZxLfuz<Fh2r^9fkl7at52fY8Bjyp8Nr+n%c;p29G6~`<54Rv7$|@08 zLaIo?yBW$|!I`HUGA~7jw_G)za523HzETCDaAt1XlhngEgcLNtMs%+GmR<%2mmHCT z8-i<bYW@d36Xq_Mf9vRIOII<AU0sa!#4Lu@f=edaEaQJQy)|$BJ6&&Qf@EQCc+?+; zR8kOFsC5AGP&+XWrfEI;J4f2GRVb6Se1dqennAoB_5U`#GYhrtdc)r~*81K1JksLy zCnJ_h2E!}P@Zt{1ALK0ZW7W6yeno%vn!0<PX|^avB86h1uL{T>e$g4ImA$@v)9Ki6 zrNwnnE;BCzvd&0TbUVGy8D(G3Zpv$`#-j5qnOWr9NPS-QftEmNYOI!mdcgj&K3WW2 zC}CYoD^lm5TP4put!`O;s&?*C<d09AgTXBo!RrH`-(69mu?RzlFEEPOGiZSjqHR^` z`7g{Q=6W$G<$0~@9Q7AQGHp7Tvm^2ks*FTrn)f@V9!gWiS&?7_XV^9A^eB@ckx9iQ z1%sZpmzL+s@bX_9zLb0m)X1HBA#JqMp|mfvzH&#wSnOWF!-r4G_&T0u@G<07QBGvc z@PMNTDo6b&<fEV#ed)}sFj|1WG(HTyGpoSy7Q(Fd{NrxB{6VwL%-Qh~HZ$c_KAX8X zXe2|92G_6>Z9$2~XEO;=>bo>F7gEJ4Dq8K5c24}<yDpp6ju$5Q<C)%q4lG96h|Gp? zQW=HYFExz5vllULSKlY=nyc@hq-MK?)_SfchyAr?R!UqxzVH0&P$gS^C&J!=7_$s< z@O+EpT#W-mqb_U4&i+_&O>{MSm0b01d73y`-kq(+{_=Q5y{<3UpfhT?z3%~qjcGYY z`S#)@qo!C7_3?Y@MVntoJfDoGK6lnzQ}`&07iHP}XGL`fmO7cVf>eGup8eCaY?||x zqPv!pV>e^3JLpolntxTGz`;!l9b-`(9(86WH`(Kdx3_6))cp9-ya-bPqL%BKq0nZt z(sP~}W|~J2XX~_X)A>tl#D{T>-wux8bG9-aTk3Xt_7Z-N)Hw2{Cq}bOt4crL`xrD= zJ7(1D{I>VcT;Jz{6HbjUL&sXDhrP#Rf4+?J<}AE!4WGKcUz?I>)M!1ewI*p5=)Y#r zZYWVcO3yZ8&n;YVeZJMQEPbq9hGT8MSpM(Xnu?;-jlApSC31g<AF$2%4$U+amOq{S zJH2t-oOtn8*zSV|{~idNDs?oqeL{Z`c}rZD|Lo{{Y^`uU&;CcOr&S@B@6R^{Hai}1 zx5F)eK2MGNTasv?ZhrQi-WlM&H(nmqNHT(uJ&}@i$Hx!jKZg^6+Z>Wm*0zMO{c=Ci zRQ0KMk~C59*HybD=wrt8+8Yvj?oJV%>b*u5?$4_+1#R8^Yst6u%G+JdLmpq4KKx`q zP^HVaEsyug%XC-+bF!uuH3c8<pZ_?_(Y^8x?-I&j^<>!op}0<~n{j)_rH>x1V|V33 zMwwl{eY;!SmfYg!&B7dd;=sPjfxkKs?-Cn6dnjzz59j`%#FUWsEhIrDvtKS6Y3eS_ zkzV!+YpjW(m>77yFyfjU7x}qYVfYkr?wwbzqN~T7dvmEBaJfsKAU?6*+}G;gD>t66 z7xf0u9@S|D%v`;_f1g&kB3>7Wxiwp<3%R{w>Yyr3ikDt8jqR4T{g1^v+GQ5*c#=1D z3!7p?<8jw_kZjz|^UHe!l`xM;G(y{j-I(iiI#7H^W?uXZI?uN=8tqU#4r{F-H9gS$ zlJY!OaW3>UmXGi&iggrbPX62VVH=IsnBEPI;TR$a=KLH-%+4zxOqzaAxF?@&?p3k{ zl~U8Ly(F9ri?HXNz0$*#pW2^sCk(SEaV3l=rNW@3)HvgvG+0OKE~AV-Xmibk$EJ#t zL-NMgGQ&~TXTR6Hbq>02>+`iW&S*j_gxB2#-ikfUKND%gw3($hpeuET^IOS_gKLHZ zz4qNdptiSI7_XQ~<`*Vdlx=_C@iJmXsFLZhI8m49_2Fu_fw`mD-+KK<6#MgepPJ<4 z0Giim%p_;np?^bhlLG<LZYS&AtTwag9`>MQ44CS|>IM4Q^*OC{M?H#>#XE2;joXz= z%6mRaySlh;vwLZ-EFUK4C0HsIG{+$kd28?F+KoH9x4r6OZU#kEUU1#Bzt_9k5){G` zxyG|Kov7ZNQ8!k_|Ecg?PnAuRYV~-7wJ&FiNxSUJW}Xe%1+<uALZGwvH2r0-#`vR4 z(Ynj>?Y~y~5eD+9a*sHI1Xe+E-YjlUy6U-?mzvHkPkQKjaA6&H0#NYKgv+~?BTV%J zOeLmQL!I+zZjsNvm4%d=UGU^tT^l<$7J8ex|4Nx&*Py7A!po|XUf^Pv=G(4-w7aza z9b=CdIMsr)NuFZve-<aFVuruneN^Tx7rZ|0nBwE5@Jbu*epgzZ|7HHN%j=xF$N{nJ z=Z4M0s;|s#pMI(Na?Lo?QtRjX^SCJEm>4{(U{jHl^`lvvEK?zoPVs>r$M70mjaRK^ zc2ipiHU6&&qgT_X&GMsWi-M0fwLgosqT!K^EFXQs-OzLXPwIm--Wq<{?HY}#_#p8I zJEGj|&UlTO_%OK6Z-qf!G<hyCbk|HcjP;jt&ilapbjDZE)9MYf*2_DbpQxs9R9^hB z!`%)(AEcG{^3^+opHG&{KcBi4_5GZZZ<y6sZO!9aTCIrkciU`8QYn!&-+W6tt`eaE zZ`MZ(6BK&(3iFe}8(YlG;UTvfS-oyrOhm;@IfCanj!gQr=2h3|>36PJL#MaC;<pE7 z125-IG;W3ri9~q^xt2VC^?qg3IYeKUm9g|Zp1&k&(y%qSHbcVz{;y?xv(f5x)vpy! zw!qe7ldZ}@pKZa0p1V7-*P?08153J!)=mGF_}$|dJ>l$)8QlI-+pO{AY@BKM`z7z* zxb@GG<9&B!1D48DYd*OBlB%8dkIE?0{N#DP%euVfC?WmTY}k)__vWZ;4Rc)k$D85V zDuXd|!LR!-|1?^O*HA%lzc>2(V<JsEd*xV8;44fxR)2oZXY!o7JhRV}%k}+N(|*!k z|NOc1tM5*$L(I)u>4dWZA2Gp!?+58wYC)}o*%E=L&Dr1J<B$9&$PoFEH-Cr#?dQP5 z#4pb_e+hsF^!2{1>tuN68~r#GzC8H*`<02qnftfg{Y56%pJ)!hd9B1x@8;6y!;~oy z4FZ2|@9#fpPa)}pHX2Orj5~ko)_L3Cc~TbKh3sYIb9AL=oR}YU_P;dl(S#%lIHVo^ zL44~(@)se&wiJe)^rJ+{4U_JUB1~c%=HzClo{nhs9c>FMt<yW2!Y*k-M?6Pu=W-7R zr681dtP~DWi2Rz?;Q@$KbP#`v;C7+l%8-Z}ab_K*H%5)(i52U8gCa+1&%O`SUi)b> z35$-sEMPvm&3BY-9iz^gr7pLZ$aV^R_D}fSIV>fbC{;83>E$qYfNmaHJHuhnw3o3W z;h898Sfsjn+<9b2Wcbfb71da+3ti_lMg|^>wDhr1m`@PrPEw^s_2eD&>7CunJHuuH zgsnTzGU~<4J6NjHq?Kw$uQcaoXAT}U>P=IJ#1q-;u=*N(8kz@{T6_ds(Tl!IAaH@c ztxMX)kMy4%Nsk^`k{ZzLWfWCv<Nh^N1u+oo8$3PGW=LZB_$$?pWi-hD$!4{LO_l*v zk8p-E=4dv4wo5<nMO(x9Oa!jfqnXJ<PgmsB(C#gTwfdrGjh@V87G+J1)@=p&Ea}cT z%bimj(Sc6pvK!|@A!>d`8M|Z2CkDNMkb0S3QdTBo?6WkD$yL*5ou$aA0_?i{#BqI# z)#=5eZOu1Llb?7pK4+YR?c$$X-ffiEEwW|YbQpgxGgVSHSiFO)=QH4S<e%-C*q)e3 zywl0*()y-pDoi`~;fOkKk{-XUM2j+ihNWh6(sbv{NNLu^%I_ni4x|dNO4^iWZpit* zBo_H2B%hTD&iSrLdiUhKX^O4xaKTIk=_#_nbowYg+n?X)2|EHg{jt>Sfw5_~vvEDk z1*34y7sb;#_0#jBMJq=orDZ1lJ3W;i?Wst!l`g|ocI-3Jrz2h$Y5RSnIYlNaHM8$@ zbzVas44Bn;jEtOIDF2b6`h3ZVU)b~=dv3vL>RpYev&Q(65wqP9bMZ=Ww<Ig{|6=XV z-=X~De}Uh#&sfL4R%6S~kUh(cErgJLYb+sK_9V;L$r4Jb(2#wXeTlIo6+)H>jV0?R zQQ1o7%=bFym-E~C;rt16UH5g*{eHclugB9C_&rsZ=sx!D=bLb-ktqB7{SfA_gKrSP z7{<rAfLlAv_v3BtYX>FQ?wo!Mh*Nqh#mY6WCtPIOm@ueeTr~F3jQ^_ecPW$6cCvgz z(ME~V+YvIrac$VhlobB4(v`Si{Cd$+_?mog%d2bm8-P<sqmB|>zSwxHHc-WH28K1h zPdEM0ZSc_-K=^4P^@_e;`oR9mtkt(Su%<@Yk@<5;;oO4xeP9AG`6x9yvG92^X49fo zZEUZyn@vP7K%Vo#9@~xiI_mcoHX^i=t00AY^jc2D$E@*pd7Wh0X=Fw_Qfkp0c8tK4 zB4K;i&W##U)aV&s<CvaRee@mj%P&;6g&6*8F)EEGR6~@<X;8Bz4X-hg)>Zz@VUlRM zX*YSn$3piHeqs*)Qca!HNC(F;CGiG@c1n?+p8R0^F@SgC1=gJX0Lx(_P_o5I*w0Zu zZnkA59h_KNT9k4y4p*4J9|Kzo?YB9L6v);h52hy74=lu6j2=9k#xYtBJfBuv(A9Z8 zkwxF|J4;wpnn^&!f?vTxPkT}mB1->SBWRlU>}u7X?&x-rMOxlyprS3Ybh@r#`u4#m z$5C^?43qc#GPr-!RC%Y8M4idRKNnS;kg9sq-Z#5+Oo&;FkEBAc$Q(>QGO_*jTV;`Z zHZji%pYi%EVI;$KboDCJha8)6$GL5l=`jnr5Z$U<V4Fkk&w^4NPef+zM243CvwQsA zS}J$GV$@1RyaPrUt5=!DNox>9Dn%phXDFXz_H20>?fcRTUkTYAlIANp#_PML8~oDZ zH9iyd-u^Cji2jC>aGE_dBf^dyT$)YN`7H`_zs%TLz*KDd9L|xQ>=Q~eU%r0#zzEQ8 zS$JDJbKdcFx7GYWL3*3joaRm2ho$ol8S{tSbFb1gjf@yeg+GxjWj?l~(>^tZtFO-u z%r6{dZEspj9^_NAqb8vh^GjCe=A!8Rtz^dvQffyRTpXQ85}lvc&aG(JWh+{~r@ZgA z>UJtwf-5?%`c+IYNWN)VH1Du`o0ze-HuzX$>RYX2v$S*Y{khF)hrRrfo>C_N-1$`8 z5<26Ok7Q1b9_#FZJul2*&xv6^*PQpY)9T>-x`RW(rbWsD9bKXQqc>Ji5604)^I?%o z-HCRu6*aeOkz=)vbInUn{cg0Q3u+lZTWh2hL|HOwW(?k(=d~)Rt^F{t`Xxkf;KTQY zsSoe-&6Wc7)R;|ePZP80&#d2Ezm`x$kUU5g;~=DA2x+CuU1k(j4$~DV1zBX=tdZ8{ z_hoX_^)LN0^`!R8pXmkWvac9TGvTmReAJB(8p|Ay9o3V*esg;LH^l`ew!ovg`mSNQ z_@3C?X_q=Pmv3DQEw+~VX3oZu2Fje4(5z{(u+bGM?dFKjzZR@yzB|!G+^_?&Wsa$# za|Bqp(@FXw-ak!R^UG2Gw2zyW=y@mO!-{`SpX(>qu%qr!vC9O`btw0`H^igLa$fHn zPO|KVM<z$RiQDViFGtgE^S&-*4SKGbGPdmHj1YaBFnao%z|X|y8ND06Ov@h>Op_F5 zZKYjqU9@o-97zygd0V<6;A|4!<L-KKJtX>b^y4p7$F(h!5~rlRg<PwT>@E+?7OaMv zPoSQyq(v&6vZ7zyWCgNZF3|1TyMCr<$F9BXEouMX+J>z3*2DAbj|y)%`K@vmt}3@~ zD0$rSaCVE=aJd}4G4jvh`%MLd9gm%w*%W{JK<kC;aE^qzTP^eRJ_ENlGd!l$UH>L- z;r&#ZT$k?XZ`C}0?b731q(2)v<31^{IK}3iu|BV=IFKYm8NN)Y-@Tt&xB1)5s8q^l zu_fCS?&N&9{CeG`?F`j?d0j|-y~gyGE7Qtx?yc(Rt%%+BGAqxu-}ei8kXB5Nd9by+ zwF9I>pJvSV^)bemr2lYlJnTk2b~xNr%eEt|oh!;d2wx{k>univZuJ)uvWVYDcT?Z~ zc3oGWr_%9!GnY}XnWq0ZxY=aoBQ@klBJMODY`vM@lw(>HHg{=oUJf<geNXaR<@fdD zSaK`;hFjcy80|Rd>|vC2OJ(VMYQkLbjPsM%|NVHq`(o2K(`fr3+IQI6ciMkF+<!}% zA$4}$(}!(6_`Co48EePPA8$yb>YQ5(Va&TrpM-R8WU2Un_M3p#r+h1uY%*Q!%JgU0 za$$Hd`si>HkPQSeuX`!kUJcvs`hI)L(k=S+tt$VHL#C-CPIs20)DvqpKT}Uk+1HLo z?tzN8Ic{wJ7XFVg<9#+AXu7p?-hXd+1SQh?omtrjMZJx4^0~8^0=(;z?d`%Me#vqD zk{A6&y`=n0;mR*X*<dxCROCrAWG`@K%IV@2r=Bt+iQ7T(9e#aE`~8}hPn_K%A<JjG z&&2L{G>d#q>Fh>-4t_y~>|15=-B?_dx&1^bXfDZ9i`iGa%x^zB<ek02_U`v)U^m~f zNb*Tl@fcCg*gTy`ltISZl^@u*9XPx_aGX7G+Bk4NI=F#2Byb(Nh#tB!AIfmYOK>~p zrvUW80^8Fv$yp@xm4NI`AB(ra8qA^I^u8|ZA>@m`vao<3=YN#GcJt;$ty?YheO4ah z2SCK5@Fz!i%a0=3j_$oZikv-)+Bk|nI*LIY6S<CKm;o@wII@yh-1;RyWLd3nKk(X5 z>V`>B9cL=7gRtn{NczXaor6R3o}d(CZ+a4us=$i$0v=vDd1!O;$nzxk&dKBClP6D3 z^2$%1ww*kCd-8ntB!A<i;OL|f@#n>z6J^gZ1_SRx>)TS-?CLx|X4nkZ^@MjR&>V=( z+p->)FHWsLoK|b~PJ9cXFh6F3g?&W+HY)#pb>(l9&EICvzb$wEwkH2=d-Auv{BK9w z-%incI=2B786aDQCzY)|HzlUl|EXP?skq?2sPuh)j4)%o4G92H!$f2XP{jP_L)+=d z+tbn6)3J@yk4LBDh^U7f_xi=Qd-a^J!N0Y`{MnKtLZ-t8udU>tdJ^>SoIYGi?AfP& ziUCj!00VGF;W}FuJzG&eTfK6&W^?w<^KAVN&AB<-d~&u`9=-YmI8~4G8;eS6o6K?k z^ZCg?G~d?msHh3Q$Omc>u&iJI*-#H{995I4hYzR+PpE%hP>aiA4ri(VHmGL^Bn*uB zAJZGtpFqbY@2j#$97sV5SVUHk1c%aiCFw>CvR1(`0j^U?yPP#GsMu9O>@E2|tvnge z|1rHUj^(S}`T5`0FVS(5b~3B9_iwSuVko<?pBg(JTp@j{-`(EA!z3Ol9Q1wrK=N~g z>)RY@A0+|Pr`9g68R9LqpW1^qCTo3;WR|*3b=YkyXJs6oT{mG0o3r@VONB{TdH8nk zH@c<JiM*)wJ&|93pDhp^wqU;M`bPX8@5TH{4@z&<|1rH^&_l)UK6C}PKI=J15cz^V zwridyv&s6OssyE8UhdER^Ra4obF%z;y>mfHq8$4qy2133`0xDqqIj*lwhE&^MVP1D zf1G{&d%U;tq5c}R=ilkE$@Y)luUbSZiW?IP;k6~j?2Nu;cfFK2<X~{Aaw7+v_*8g2 zm?xr5Ao*Ox@zky4f>wJl9g+m22MkyefaR!gwj{Q)Bf$*C`Qc}2?3&5T85i!0xjw)f zd6KnsS2#Ezpb(ZJ4mU9t0HQsw;Nl>+qEP6ykyv*9uBy?ANHW#wemVEkv<&N|a9)eN z^{YG)s4{Qe_jbYs3Op#$LVY~e)ud;!g#&~RCqkIy2xJ`S_9VBJrJVl3^A~rG)V6ML z@^a)yJg}g1AoThD5x++9OXPl<`qYTEs=Vr%M0IuNHZ8xCUZls-;w=Zi!PGu4QQ!4v zUb3P0%zIp`Q;kGy<hkf0^=kC|--X7BI4-}&X&E2s)>-f8(rsTNzDT!!z0W7pvHHwG zrgNj}xlGr*+U4(E<AU`5cc(619XITUch&d&`}w!N7X(S)jxUXiXfR=9zySk{mrt>S zELYVV2Vnq3mrG(~ub)9YJzE=KPg9qFC-OWp=#5x)eh`QXZ9aYVL2f|3X+-f;WYehX zYIoC^#;?<+k9dei^SIt>xBR4>=xc>fCYS&HeviEB#|l9i%O#%+8)<BradP|DGV2nr z(fax3gVBST=;Oe*=X}0Q49$8y*HE4d{S?)<cz5-6+fvl8e{El5A)4)!M7HSm<y4`b z_LYoFXYH%mI+`6T*BuIRjCSFT9qR@6mQ^=jq@7pWdimTrV#D}R-{CoDZ0w({#sST) z|5`ppcYW_z?djTm{p+mjM;}D1d+!ZfO!xjfq2BJFqnD`Nzd9W>Lm@2OX5@o8x8B!> zi^0^_N6YbA(O__TpEh7>$$|r~rcrzT?hk17o*sOP>HSANS?%pT`}d35O9dmzAR74t zRVRViQphlghFFIDufNel0GtLeFt=mimn!-ggBs$`pHd(U<Tx1s!^qx%L0+%u=XlkS zC=)5b;3hV}Gue=&)GfdiTrqI&XG5~)e=blF8qz35OwpGTWPMOEC@deCYU(S<E^14Z zDOpBAyvS@#+;6148`B(5i@64nLvr^U)7{ly@_b4eQmkss@Qr-Qw~BnL`o1wUr2FN$ zFWkD7CJhgwPlYfL@nJmcs|SoYGQ62Es4f30J2O&PSV;Vxp~b75$KApgFIB!X33~Og z@Kjh#hv&V95&A({<ca_+;Jwv)c5a=oh|~@74^-R9pvSE>A~LrtKRD{YODz$;35lzG z0yi7Y8f2i8dyx7Frj7%1($v;M)aWf&BAA8yzI?$?qNo1D=N}VrO80V%XA;=NR!>FL zKFvLXEf^Nu^TmPet#zeXe}SkZQONe(2ZSz4EI!qO<=5P`7YbzHyCjN}W&UHrQZR|J z)DVho0MYwmz&sTmP$eA5$N9IJmVh8Q#gH}W%&q7sQq1VXQ}fgyHVB$nrvIUm4T>Sj zf~Cc^ujX8P^ygQJ{;ON2F|NdC7YXGI8r$0UDvfhGn<}sC;NZ4qmgS~Dvc!=(T=IJl zz!Z;am=(j}nH&);>;ZgVcn6jWh=Zc3O=WDxL=a~dU%sssQl&u@oc?GQ#xGwNrAJ0t z;68=Pvq6$FF4C(LVtEEJU}16}gAy&7YD*DC(NcSKB<nZFR^Swrv9p~8!0Ah=Vb1bZ z&>(~96UYc5qBsm0F^4(EHJG`SJN{jH{3t(Hls+#O#tMM=2>?h|1@9QM`f&LV1}Q}n zzs=S(+mka0=-T5zf*7mz_tW6uQi<?V=rzvtSm2Q1M;|W@Dz1rznPzDN9(z!fIt7NL zsb?0%cy<LG-C+iqt#HSzla~n9#sMrQ<hZItV)MNfL;SV91mp-A0W$#6pMhfG4rJPr zKLE!10{>WPAurLrtNP+qi!xb6TG%fxIx!$F#+LYMWAPn?juJ0(>IS(YhD&41ijy!t zydZF#j5rI7W6+^M`OtALl0K|n&X2&_?O<3W2`rj`dB($yHRUD%7rIGLO?H2x3RUBM zA}}xpWR3A{ZCzAIEDRpr$Dxe|iyu=;QAki;;7<$DK{D7c8b_cme`Y7<LB)y0EKeE` z9FBqVdBj37L>Ox%*XzPFGz<M+oD4r8gFpUVGKqy>;06$0?YVU0IHFa#0OR?tX{#1u z5>HkxO~#EiG7U(eb0ed~+re-(6Si~ZBtX|V*2xp&!j(+JO_8AHcj+!13bSL^GpRv7 zQRp}f;R`}jC5~D6%c{zkwXx<mG`5vs!=I0%<3obs4Fu4IcJ5cA725Csa-3#8^cj^z z16|O!QM3#yl}y%>2S7KwpoN;~e(xLD8zJ{_C@GaV7_Fa`hY$&2uMY>6e2<R{s{w>A z+=XVME1$Ci2mu_9WA86Gx(SEk(2RY1sUi3R@(bdDNi4f&CMf#_|Fr3oF|c+6u^Ntn z{udpQwXPZ;<5fg&3IM#BSU8a20&mX&c)?g27KukW9q(rZTM+o0rI37Rzz-h=Www=Y zfn^2K0%L#}GX*IX4gzJ816Jq+z_5V!v?!byg#S92`2mrcx>UU<(lrCdhxaKep0Wk@ zQjoIb*tb!@4^Y+|;u5zCoHgbcKngJMiIFp2o-m`-1(5azAe4GQ!mP#b?Jz-0q#!z; z9Z5l6e}D&|{x0E=JL`&ez>8`$c;*EW5Z$ARsf)g=&lBp^l=>hEq`9JU+Eb?jUXQ&8 zg)>ktXnT41-Jq@Jgp(1rRIOy%1z-Z6!7;W5AXGIHITK=;Y4j%vkF1Ght^qNX^aU4z zh8l1jhJC2t=S)>%5d<>10C;qlKU;CpDuK*qOC;a4rJLep5+*Md08A>gTAQ<4{7Z~R z1%^0au#pqRy@XN$J$XZB`S0BHF|>)1O6CxInqC0V)LsY!57es<-cIoQ2LTcCS88?j zb9Irvc0RD!f!qWbcG`3VpedPT4d)DT{M$q_3kHXTE;Ia|F#%>+{!2wO;Lr>DbkIIv zgvd^EF-_soR>hCP`WRHW=oQE;?ljXE<o+6<=gy-kK7O$zHXM;H3osQRiEYFGb<Fdo zgP>+hNeatiyHFZ>%VA4iZR7?)@f`m-b@C8V-A>?eB4>yz%XcV?9<hHEfVA7f8gX>| zpuzn?hinRiv18(EOC)j*G6Doh6Z=m{Q!GXS2cN*))^OSs#f<g?aY!*vSQhSzA5p*= zby<*HviP)JfJ$bd(VitZa05}{kO#i^289JsmO{95YzlghRFjDMhSpFL#V~=0p0b9A z6G8bvNj3?gKu-P6r&UZ5$OhotWOhNopw8x~BhLVCe?EuI178bpT7id?!L}u2#_Tm! zPN?tazsms1k(*w{T@qe;orYCs;bLk*1{dej9u=8cWPqg7PZ)6qEes%n4T}iwpVg=> z?B%6bY=<d!H?XtUs@zSC&79xl=DnE)vvb7R*|2ncvlpbZ-=2a#U4^@oolK|Px4!8y zve?ZeL<pE0*l{^j-gM|GwSUDCS2>8==g9pga<g%2&?M_p(!ANbX@OkJzm7L6<jPb; zs5o3AyH}hgloq}YxOoi=xN%z9$9b>_a38Xp+h&w~$Ob@S7vmI5{Z|sL5<%9Xc&_w5 zHsG88kUnnzIs|)NQ(RPQ{}WWT9A<*{PO`(fOhD~K!RkPqs(YwWdFW4$@aXdJpSdA% zLM$4%0~`)oA$qT_{03NrMPws1$1}*@Q}zwb{VosLo>H$ZkE!y+nv|RJm*b{A?;Nt+ z<;})k^a>Zu4mHiaHt3047S-4ijTWqk7~QzTDVjX?#$E<~hs86wHR)m$J0_Q1^WQgP zEUT&cMS)texG<KR`eJF?Iade0*bcH&XErZPRHQwg!hqg909R%%c?xHU<(#J`URZt@ zdhu2=zqu>g{E?EmA?)QNFf3QbJV9{c(UMoLY31E94qiq**}%%DM&eHjp(>LJTrfS> zS}~jA!CbmGxZJILy2Si4qqJhWXFok(+^={DuX^U6P4Z94+_q%x7juH^$tDVB=iDl; z^C}UnGGU)IGx9D_6Ur_WD@mFw5lp;Kw_0xDoyK{+j8mej%mY&@QB^8ly<|`^lSu55 zsGZkkpRV$@T~hhJZMa`me<;!LQ=*PZvXQg8u}**5y^nvb@BCV9lcr>|es!~{WQ)8H z=OeP|x$0Jb$+oa+Q(;fk6tO*1vg2`eN1<frV;@vXf@5kzSLR^XkYx85wYqyo^7T^n z>vhSV-Rho0$=<W-UbqyQsfNrc)px$8@1j({4DGg0YCyAQKwoOmv}Vv+>W#B+Peir( zo|S}J7Il#06|ro%PUKx?&AZ1^?+a_*mq~r7tNG9>HPTZvG9)!RRx>&yHMUeUwl4K? zx8~!a)c9G=I9z&ysdj=>dh&ej<VEREbu~krZ=i}LkpEa&U23N7rDmLKXFQ~5{cC5# zq(4X3eom5}%dDMyEIp&?XFkk+xi9w%FZ)7I?ZS}s;#lqCjP%kH?P&a+^pkb^k2K}1 zmI9YqW~y7}lvz11bH4KX(ED6RJ(!7J-I}S)H|x4@&NAyBb?f?d21si92Ght!lFVji z-R5JNt-`vkGMVkVy6sk(ou0a#A({Wi>i+vfw<>deX?=HTw{G`P=EqN&JPH35ruscj z+5PkN`xj+@%KVUAl(E3gI@x|T6*D@oo%qXH_R!-;$+00wA?5KPn~_&)d|oo=q~&oC zr`_H9TT_-mi0q3H*{l)Wpj)#4X6pYPrhsVTIT8m(6YUtuw##HVl*ma(wnpLpHR^$o zWIvhoOg#XE1hN^306Q_FB^?xOMbV&9{&pVH4fr{B_-fJbrFzs0EM2ueD538{=K_Ni zu3y{`S;Iji(LwHjo6|M*MgooDVW=Pi2_QJ(JOmBUGf?}q5@OjIfHn>?e8KI`2+_|w zmM$Fx@dcQ&pdgwy?#RtVzD}3i$o)Xhhn@J)eWdDy%t529+Y2T@8!V2o><O`Sx@43X z@Nk@xGe{f`#dA2ug4JT_ykc2Ph@3SB93dbmlFa7V$CVEN1RR$y@X#xk>dJsh?_*gw z&vWOMXiU)cbUfg`!~u{wvWU>(eLnSlZkjV-84JyGpkeLs3PA7%9z96bIwo@~xQ@Yy zAOrl{e`^8{i9p^*mH-|(r^hhOKCp8BKdV@}5QLablj4mgQz??H1b_lI(3xmdjU4JT zp9q+2JLk%gMHWcTM;PEabU6cZs6?tC5Ku*?{S`67e}dCvANt~I9bLOKKqvwO69W$A zc1c^b8I@LYl>>lISzd(G?TU~g=n}_No-jNSMG%3TtqFiQi;+eYJ2HrN6v?wO_-2dr zwub*M!M)F26?yL7QLjDQY*HTJ{O0=K@kge2ejK84&ILEuS{W<{ubc4!AO@=sx{24m zdK}r?n4Bn>3x%4tJz%=BYvS2r?OBh<>n%jIEX0K_#<kdf@w1C*`I6IOH!yA8*5cqJ z^{s4h-SuGYJ#CiOvNj+3?frqnQOgaVoq~~fcB82Uc?pD1hJ;zeYn0_1%B^l%t>L&< z_iIWKcS$8)bT>U)JrGoLF9BocbH6>3TfM#xe=%jW?}d3^GV-o(^=?!0>239StK|E! z)pu6O?`x~yhLZn}R{tZV+tk+E2;~6gwg4{Wzzc1GqRK(CZ9&S)zVSg4+VxWlilH`b zp*NJnJln!<E8n@(b|*$TJh?6Wf%4raZFhr}#k2s2ONS-H?|%G|iR^8Qe5)Mwu`Oy= zIr?i`^oDZGkG7a2Wg@kWh){{`{qD&XzU040lx_c!c_`|@m2jm!;hIXKO?%=Em4wUT z&fJ!%A>p?p+i4~3DG%CHo}{=wfo5m5-+yv^zfC3W&T*>GG504+&De(-%H)g<mCPUQ znMW!QsO=BFsNA$~P3NP+z);mJQPrHCa2O*zPLG&#<s|27$D{b`^&EG(uNNx#sXn>W z@gznyFIn};Rh-T%<;V1iAO>^iy@&Z|k?f5(*+RwXy(h-8bOi%Lkao+mf1)qi%3mC* zlBgY|AF5DvL|OJp(Zb2oAG$Z#+2g2no4L9Y^6f<B&SKHu2mB%GPH)QiTA#jsnC<w0 zE=J8fAonREv4TtQnFBFGpQzx(R^tHFNIt9iQCPhAr>3h@Vfjz3gLB=lh|PBq&~~-U z(w*kV(`F_zYe{XOiZ=YM@>ldrcVxTPHS-*f><v^4<Bi`~N|E6>z>b4>^`B*s(VeRa zU4{>Jjc(k%-q3Y5kCt0Durcx_8aL2oOTxjn#OHXMwlwQMnaGHm+s5uV5I^qpae{er z3L(L*=tpYk`9FnubGwFs`TX(Vm(FjuJmPJ;Hu0xLTI9l-^2_HttNFUjRi1lK)>hsL z^=nf9KpirB=l4h3W>Lx5w@cmeO}G7>mi+dkv98((r+biaBJ7Ss@!;S=1Di_@M^StF zUSbK3TMm_HRsUxFK!M1*m&nF;dgQfy?VWqsz~G^8E;ykpfAjHG{y8uS4@Eb?wZ4J1 z$h<f*jl-b^?fE@U0b@evgjzsQfSy(cU=T2Jssjto9nRnw$l`!Bb$w_a;UM*KOA%L& z?5TfT?<`O~Zu8)vSsm3rYb=B0yLM!VSg8TS6W3)TEI(SFkp(<RWLNKFsW{Szy$-Rp zH*~k})WE^j`xq3+9s5rj9EkbP)y)}lU3P5VhQ0le5;5InOzmVS4rvC>4mNe^{%w9d z(`B4(rZEt1<q@UTf4vFtCBw6b296Kx1X{X!6~X*~<{@lXyl=(k8$-oeRO%N1nh%5v z;=~%wh`3llF5x&FaDivSxp|e)<hTR?iC1Sxi5<8?J1E5|U};M~DcJ%64Ps=LD<D=C zSN35F1Oetyv0y*8!SyGB>1Wcn1ThAAa_8ens>Ogwx(qcx9R=>I$N|7$D1lT;y=pA& z5&&%e6ecFhxR|0h<C0*RDqfZb+-&f;M663bgDsInyf0^u!D9D@;=f8TM018?FJ^MW zje7XSiIf}P-m{!d`vtf%JX6r*wmtR)ndHKZ;-t7Ay5gTPYG(T8vA7JuGcWcxXe<x* zr=z88Ys|U(v>~E=Smg!umv`|<R)y=W>ID&@JF|_Rvpog(?)>=Lm&~PA*c}Fi+9Kry zp6b#;IV}?iL{MK+3{t&h@9xSVNI=CvB@Q~+E`))Kss{){k(Sul5_VQ15z2w4Ih?E* zgXM(3Ov9LR`owYB1PR_0Vj_)s6^MtFNPhg^rZ-R1C9*yr7Zq7Vr15cN1cQq!K2Fqt z1_FxOnz<6u9vHF#CmiDf|LUqDkjSn==L&~enrSBjkwRi{POupm%&(0U1jW)}F$o9; z3?@kkBSucWbjNKubrx$tA_{rfl8G@33n($paZC}N!g&Li4D^hOONNR8a+y(jiR{8C zGLFQjNfxRsGk(gneVL{RCSR3O7~+N?6jB@jMgcIlPO3yR8OUVQ<s%Wn#y557fU3<n zK&dlah&EE=-kL@-*a|VQhULqE=&?-{1?x|nU@%Jlst{7N=VxC<i+Z?VhA6q;CtV@H ztcV^m*)9oJ=)|~W@X$(#I)%<|kz${4Qpqk0(UK1VdtM&@&&$aIna5pFBq^9E7Db!W zNJkxSDuOw)1QUg%RDMG93~0nPH}bPgEGR$)L}c?o3npO<(AwWJE^`79ej;Z8z+jf< zlB9Z@ZaEbhNB(J`B9dvpUHMX<5DVuFCjrcY1anbNsrQ6<O+K_XjDx-EQ~Y~%@Rv9S zbpquD<NOXcjjl%aA>=(jj}OaE|29d{Lb&4ILKzHjTkuRAAu0Qc4$Tdpcf`O%7*r^r zb5uhjR>8Er_&$Jv8NoiXN9v$NYz<bS3Q7$tC{bPm5TkUQt=ocS3zASv%`_Mg1jdg= zi60+r3dSo!RVXjGBdPLMsce}z9g1RIfFKMUkc9&b8F83|>;LloK`3$yG1lf2PUrr( zumL8Wy)$n)MY2;x5EkA$DF|PzrfqD}21`zR<gzMstfE&DP!~(QS%`*k;K+z>L$*+< zJzSMvR{Xi&n1M021U6rjI7TzOB-;kQ7c}@3{P_z*92rde9DzzT(0W_Q=Q1c5Kztwn zU7{k6{W!@G-0tFMO4Gaf4PjF{xb8?yEJmGz1UJ~x(GIK3{@H0xzaPT1DY0l>vhbr= zBD?jWWSshsE6Cx`NG|jMXs;a8%S*hk9snMpkla;{ujpX|pbRNV?sB$7#!>}d2p$s| zBTOZM&x+(BC6o)7%<@O2Yz(!tal-N5)7<tm{b0-G3uPz>e256LaE^sKso=TcSscKr z4!xU7KX_LV22wFX@f=^_Mk*%7>@`^KpIqU^Qev^f{(uFD$Q=ES=c6qK*~`$UHJ%j* zlDf#iSfR~bI4SsnC<$h1H{dEEf{=qobX3X+xB44H=@FcmX$r1*s2s*Th@(elX>$`^ zLZ!ov=<Ej>MlESG$`P`T+%U#N;ulfI^ieU#0RbdMN)Y0fM+(P}N-GB>?nzTn)IQ>S zQwqqd5LYDqB@@Jsff9Kr$Sdf6fnQ;9*fMg8l-UI8z9seov9U}z1q7kGJ`^VTGlN!| zH?J4{DIR1r^1u8{Vuto6sS%{TM{3c~X0@j<OlFP!^tL54x@bg^e9g~<W>}MnH5cmu zZkz*HFhNE8n_^D76dA;g$$4SWTpe!@*iP6Nos(__QtW(>4dU|X6hmd{F{v|Wyr98< z_d(F%oqAr9Ekp`%7eZaI50wXE_eH8@<8fY>W;<?t|7H)Z7!N@cv70m$I5w8t)^m^* z{qNA><CYCP^=~bs0-y%^g>#CaKNkby0^7v{_XROnignpF^Ml<xeLLqmFA{?;3w~$7 z?p4QBkejG`v83q9sTcXy_4D`zgYD*=*mS5Vhv1GS)rTtdzBISxA)XB43?Nn}J?UfY zF}*I}`?AcsOnW&#AhFGxQf7bLe{QKERyE&Bdr_>PRVCKoqGSR4Rm>Y!Yu`knh2=dz z#UYc@#x#wQCp^Et^{1}xJKjrgXZnihKgwtX&p%rIwCmOX$(-o*-jHAX%2Sn4yYhbQ z^_vn}Z}UG(c*6S}O{K2bfzKkCT1OmBC6y=p{K78j`Q@*?o6HN+(DccW?LLR(%Nq(B zYfM*W@M2Ov8BI*uj-hth0J6Lj>CSs3{zWfC**^fZ!Ms@f+^s8;5t9Wo&E@!iTUU~w zP0_ceztDd8bTPVGp6t|8MQ!x9>v}fR<nLeO^LlZD>ZKHzba+tzQs28e$bM>iIlEEM z$@?ZV-RIGD*GzE+mjxq-dEJXaX=mzdS~u=h&t!(R))#o*PQKTFcTB0JCCWe4=HB9X zl2WJ=Kd;!6U^R!bpIWWyw<EuNS^Aq)(fiNDV*)uh2U9-2)BFc#AbYAW6V{&Sr{HS9 zX0(#zy5=V>xu0~qeVJi4{H<j4%dE7>X0yx3?*wLiJ{U);v3aV#dFog2q_<mMPV3-h z<-mV`EV|bvk4{D()c$h*m9m*$W*YTw{?{1l--bbNM{$wAcZp8K#uchzFWJhY_OIkj z?mpLSUv7hKTG@`h?7g|(p3s)RY2YA5#rMlhNBZ8a)K}JjuiX6Mf2aG0(~qe7d$(Cu z%LnAi-Vq<WI9X!C-v}-JNS0M!-C>$VswnQ})~gpa>fHVCVR($rfVhFD-knG;{QXin zYRfz(;u9awujhAO7b!=6hIc<cY-)@89vE|PapSCoj_}Lt&V|S&`WMFo^-+-Uvxsl9 zFHRVIe!GjZMV-I;;?JkH=!3?XsPms}zKtG5$ItQ0%~)uhIvD>sns^a?;MueI{SNi7 zVsG@x9rW2jOxw->UQok6zM%f|Jo_R}2mHGYlqQ`%{tk3~w9oMav6xLF_dvAWV37du zz*Q>cqnZ>JlAI1!ZGdR(LGW0pUI5gv0cx@bHOIoJRsk@(2AI<x?B9>i!#Z%)6!^98 z@TLKH1|$4#10o6wF7OncO7lLGI4d?m&JB@6;#}t4FXyDINoDvo3(--RfuwQyi}C$6 zW^^$P^so2mulbu{$VbCstFF4Q8>CxL*T7;V)Dtv43-E4t7ZwHvtB?R*GQ{z|yadB~ zSe)N6c11s3jmgI>e2vkw22dd}${DkK!Gc@?NT@c*n*@cI>hP2AvX1~pWRTcPK$`-E z17J%qgULR-d1Ie7j*j~l%$bNlLiIgv4?V8al}CW|DPSZK>_zyAsib2gAW|^kaUEnN z4Au$&x&)Ne)p{mls6T})L*${hRDjtf>m)KjYCb3!f#;w&SV63fiG0_R0=^gzg5Cs* z$uKw(81Vq427DxNAT(_jOB+FuL8drRRt<=s1ay<2ylFro2C_1UlE=_r4;0{eC7_I~ zr}5oL5g?QD_5CWXu?*%#=8(kz1_YP|5$;6>gb64aLS6(BuDe1TXaLS6ls*{*C8P97 z7!?W}P64-K5dI{PKN0XJf`bV3jsy^aLQkXsju^VfIPoVKI$a9bj0~$7;1hR4Rgh_S zL8u@Sl8FK?CPL0)C4(s!-~dvW1nh1i;W#)8hQ6Bwrz1h^R{(Dey+l0f6@iW)Lr?W4 z$_kO_!gK)@Z6JC=faQ`L$0hxwDtY26;|*O{%>ZPxL7rp?aErDMr6N;E@+Aa6{gG12 zg#2U51ygwdeiNmC2}x_llX9bPC8<@AO9NiXTQ<o<Dex6@<(O}5I;4UMH#%E)vpxAf zDK}(Jy}Uf}(a29&0zt0ml3M9?b<8I{v8~Jb#QriJuo|00UDIX#U^Uw&`H*0>_pjtD zFv$`FrR_RtA!zmV0JU$ynp;irMxUr<B+Y|ht&?Ey$OmU7@7FzqHUBo@7=Pm?WLa54 z@I1}<jUO5@V|bAeZSm%D=p*&?CT+zK9o4Cy{uIs23c7kBx|h8WQaP8Y!<p)zAL`mQ z>z&I%>H}4_pY9fu_56P82U@y{0b@bUSEAUfnvviB6S{m~*V~%p!u0D(Zipd0)5*M) z-ctpm(hwtaCfUm0MvV$rTSBgOG+%xF`>Nj~TwjRsyJq9j-^LRPCetA%QNIn!hfFTO zwdX=ix28sAejj*~Ob?o`@&USCO|W0V*I>DZ*Vw@#bo%@RGY%{Bhf}jv!RkZ7<|3iA z%%_DkZRbbvx?<>c)t2iT2iNh6mU^L<hAoyRE!1v`-eW-bT8ov_ft8D*_03T0TP@ap z2iAd#Hld+5cUx?t4s2o-Z4*OnQ(J5^4s5d(?Q%oyp0?N(9M}~p+Rv4S+E=#N*G^M* zf7`c&I&`!+ygqP<;((Jw9e0||-yJwkC^}7tI?c5>Egm>6D>{D*b>3=m{(j)RpX*?w zaO0%q#=nCbASD7UjDTt-Fdh<Elw3FtZRkT?sulm^S8^2za}{rOl|FQpvpzAEcT;V3 z(>Qd)E4k~1xf`~+GygWfFr?@vye=53ZZ_jyd2n;U?S@OMhu@(G&y-<cnCD$<Tjmze z*w*-0ie9O$UKxj8*-E!^!)`roy;X2{t4PVaG|aoQ)w}l4yHUxfCCsPe@zvy3pIimZ z|E0Y-(X=<W|D(O}8#MgCX>YMeO#c55?Jb3s&L{<gmDXvaO7SP$Yn8d$8On=)JX zwU-#Lc|40NCDX;SJ=axl*wbpwV3aI0?g%n?hvdU1L^gm|N2%%#=exqB`;ae0wXq|d z!Rv|7u6!so;VarnU{;x3a?0|X?*RvEb-y-K{;@h-ubuMmcEFqI<a=7XQW|${S1YTT zN1|1_e#MRSIZ!WLI};B~+-SK<;9vfWTSay}c_Mb9%yAq%_o^1tP5PU#JSs{dn&D^j zJ-)(@ziPobADx39XbjpVa4cRSn5K6OefDHzZKmLMOE=7kT#vn6Jy^25#)Ig;tvf|i zOJHA9Z3W6+geVubQljY_E6gC5CdJmW&WRhK;}T9hpSv^rCvqq1YU?gM1cxGv!^ckY z+#flH-Oaf_AB+5&%!c18HQOy3dJ&JOgI+Xc?7q96@A-!Fxe;^Zu~S6l&Cd(@oX<*G zUE>A93cb(*oB1ArlUtiF*&9{3Q$K4E@FWEnK>RAFt34Xd(tKw=r1f3LR^<%|&cfmd z=XVrR(oL!@?c4|?Z`;=B;dUZmJn(acF*zL-&ryaKU2Pc_ytAIZH`?^@L44=xgWD_p zeNxA%zGvr+(**iTW|H_UURghVR*{o&@Mpt2UY^_j&eVOr&$Nkk=l8I$Y6`Y-KMyan zLzoq+EZZbXkuNif6tnQp&vHa!VJD`^4MpopzWd>HaNo7YqRIsP8?JjdWwn>U&*x%B z0@XQ(1+IH?kWHnZyiDdWAl>>9=2Yd^oS2>Z>mzWc<8P(;vh8NT-Sbi7-sv50U%*<y z->1RMO?>t#45<9wY>PX77Wwv<OI}^g%&_Y#b$(d7GX@{cKm3AVl-|Vum9X4&nSXp5 zG9@BMZ6GcLT*8DKT6$ish?U5w<)#Ek=1P5F>O0MH3o!Cfn#W3y6A>BAx^d9xC(TNU zk2ZwwZnS8ep;ygg=ZGH%^}3afqi<926Ixer{gC)J1IHh99EGA?cY{^T--JG?R@ly@ zk21?Iham6je7bF^w&;1U^UqJ_e+4+?51z7rZ+!2f`@pyH1Z=yU61r3SCAFg6gpkao z@rxk$wp07>4~5q|4Zp^5q)S~13`|k*31cur5bo?`6vAqDqXHREHs6=Fhh&?lv-USU zIQ9^}pgRnc1;?UsKsekEcW)^f=qq{vVnI7n6E<q^)K=(yynOy_t+e<IzZR|8QHZBD zA7B$s{XnR29D;SPErx#rU>?SSS+i=m&N9FT?gdBM4UeBG5>PjW@sLf{*l)Ufa%>9E zo*Q2p;>gWby~)3PPmqK^I7q<;MKT@DTjVj>4@Pn{XMA0l1vpQoLlSQZA{a$`&#gRA zEweahMxL&+PW+x^($6==Jq#R$66o#@$Mfc80Y`GQS$X@wxmIEvtkVoi#cDH|k%;XY zXjfKSB7G|^R(g;S3t_+`=aIq?p5#pQFfLu+jGGx7tcK1qSFp)?VFnV<7*0rYSh5|8 zNhb$+4X(p`-aR!7Tu+y~zaBEq)A!YPJYUElwrpx{3|>NcjuBr*MR8LHXpcWa{P+r; ztr-zMzLU`RkO=+hUQyb&9xBjRAe8Ffo938<o&MlrU?lqD8EiYHz?jIpj>$3$BZC;Q z06V<ch)IlmTTHB<+4UBbsl6WK;CS`^eKRN>y8s=IH3f#IBnX{KLoEoj2@;v;H6;E_ z;ua2^fJtCCSVo@Ti)B-I%gKNxDX{M0?+cr8i-!XS?l;q5+&B<M5rEK&kI(_*Q*2(K zq=eYKkxqLek7FO;le+CK1qj1y4k9n?T!eH>DAW(3Lv9*h<ZRdjLxg7<cHQuFtXZ6w zgP>U&KOLYJ=s0i!1sW(aa&r7`xFDq>nyX-wsIWSaPsMsaKq=T<tZy}h(@bw+>09UX z#zFBxv88uN{UE_CB8p)UsZZ<!35z!)>TZIraHsH$U}NcIa7dT&IA#wroHJd3L3A^Y zvud0uL|8`h1!#k-0>A?NAV!P4KJMlKC|n)iO^+*vW@dq<z4}nXwgW8M1PTLGfI&8^ zpQAG?7Hrc8cH@TF8Df(pEn`8Nn{ljC4bH4ypnj<UT5gCK&uu_Kov(=Fqy>9oLi!Nr z&15;}%M)Z8W>GF#VCcnan0P`TSSq}q%>o<0rwt&soxJah8poZ;>An#2<%6&W#0e#| zd=NPP;vH$wlDM00xc#0%x5FblJ;#LFIt+64T^+idTDS(%8@vT!9|y%H1ks%{TMmR3 z8%cCO0*!GXLtF^&rN3E%5w`td84Zj40oEAZTrj*79Vf$$qf<N&0XL7kgQ=@9^d=bE zOaV#LI;8AVa9n3{@C)g&&?~lkTF>%{a=s*b*3EvlI!vMjf6?r|hBnuuDCl4L6zC0G z9G5E=&Oa5wz!=`oB1JRINO*d9xHh^y1H^AxM0X7x#8p!ONF9>^@y&iO&+$YU0fcZN z<G3yMpcjt6pv+7^#K=+NV-&jR4|3x`LswYFi?0O0RY3HS=mbV?N?>*33m8A)qJT3r zC7|r#8K;GV%CfcL2kObSh&=bo9;9iNUqgI=kC`LH4AdcGTL)r2_u;}Ce}GH^CRk(? zMwb%XWyxj$ezpjhCc6MudH8OK8H^wDlvcLV$KfvR$4tTXoH7pF*P;AC6I|dHVnDf- zwC{xm9GzU25+vvxyebE`fFhES%{buB0~fe90n}bycgRC3qGt|>V{ZTVKtg4ie1)5w z(S-)Yk$r&FrZxzRg-8Q9I()li^#ck-9HTf06MJ3#Ai(MZ0S{IQ?=Mx1yBW<S13OQ^ zL#oj0Wr7L<H$5u49xFz6cJPS5WmdJkf3ZRJLaHuC8S_JPB@m$~`VqFZ2F^1}idpMp z^7bmCQjGRs+I+mFzN3B2(FADWYRCu2M*#RS$?1}<nlz_v1X>Wi)2sXxcFPRrL;zWt z`3jK2uLOW?aR5vO@-Goa35H$4SXo|&-L?Vjajr&~aN7W|DH_5+f}t@`^*!(o2Ur#h zr|5uf&46>8(7~ZN1}s>KGhDj?eD0XpevjEK$=?(UccMT=v*5N^VwosxI}rq~fbo%F z%;bBT0nq<MVB#34(>ScdlVCx){Y(jBN(2~`S(t33;w{Y_+GAoM!uJ!<EDeD^@;Ifn zi`Iv{7eLqv1a_=E@@BS_$cB29SCFud)b=ZfgvlV}vNi`6W@iRrLi0IL%UI2DSEE1c z%3#0*))1cwKn{y`#K2{+3L(F_Y5drEw24<6$Xx^^4p>=X!6oI|j>7ld*v%#s@N{}t zisX$2%x=nqCFrIBA%ZrV0%~RzYWKPpaFE7LHtw7R_!?9xp8(23;NLokzJUg+iI3Up z3uRdgndy^$ax*r7t+D_TIGwKnXTc492C_b9es51mC-4=>d{f))v6+X5y0WgkaF9bt zJ9}hBa`e8+G+Wf&&q7ax&8M%R6XK#;e=}b%(TaBi;5fAWZ)SE><ld}Z(z5jyh=-yA ze%H^5ZRUN!2IfIqLD=!PCr#X@u5AC*XIbM7R8TPeW>-nw<i0fx2xoy38$kn8nln(V z@8QDd$*QpHSf(UzVY#GI3p{+>tDe<hVkJpND0xFrch}96JCTJ;&k6ia{j?t~!IkV~ zo$@*~#o-b<?x86BX14#&i+KhTjLW8MQ~DR!CAOP*1%8{pX~c(vxT5Bi_;k^{Q=Gvp zmX|8eZ9Kv=7GEeTRuy8wUwm{EikEfQlWESC>Ilr%FEKNOB;Py{GL(O;v7fBE_P`~T zr9u^p3C_y?DcTV0F&OLVBF3s3$|s@250X#*{ZJ<LlIpIjRDc+3H4Atn_-4^(C7*T! z{wInOY}ijWT3Um-oD<Kg4SA|~bWsY=wtt?xoAX$P3eph{xD=ps|Fw;SYzTTM^+A!H z$jk<B*;94AxdSLCa&8W7smgk6nEX#whR*Q$jOTMX0S|DWYQRI#s5q<NaemVrdS;Hh z`sa%=9S6}TFBD@7D#1@Q*3{LD1VO)~;{{&4Nmf`<E##fYK0aaTYr_cH=hqdRmy5qV zN-au&aMZXJ1@fqlu|zQ}zszntH?VbqsYC6rA<L(?>N0C7?Y|zgPLOUN2f9y2veP|R z;`Nl5V8_@OqYsL8+*4Q^i*4-DTvyO=Gl1UQh;^bE3X;m%FE;%2pe(rPo^BCucCni` z+iq+*^Fbu%t%5&dB~V@#__K190QjC9TEZ*<MU8bsnrWDIV)7cZV&1=;K6%Nq%@*BM znN-C_{8S{r|Ev%6^5U~A;QgSznM$MpLXRA*hxs2u3nc)9U^RU0r4Tuaax7U)ESO09 zWE*?E+LsEd_8L=9qd>gLdpzgjx6#S$f!IC-6;nH<Ry$)~`#GX^{#orpXYJB_E#*(` z3UA$-THU&REw?~5)eKQ<gbpFqZF|>7;i`kVEB&6~_#q`iD@7_1RZ40>y>zURybUZa z<;%CKrl*0*s;cVwy6;aQ4ZQWxeJGSrO|nx67ZeTSWvS>W(84!32OFr_b7VE=M*mR{ zDz0aE>S6P#<_{_m^rivPhxkto<VYQ_(%-9N{mcAI4LI=5J?ebrQT)m~tct$B+DzbS zTtyX5`6Wt$t^TeQGX)Se3My!BkeWb*kYSErTAcs3IQ?ZN@U^-*w0hiYr8UQRceVOD zv<6^m`2-NEgeEE$gyyS;;Tt)-%<i~*@?B*SqG!j@dzwsLj_+ct`BjN|`6?5iGJEIw zk0%y#&s%&6P{TcD10u^M4sJ)FjThe(>;qM)Zh}lSX?+N^6>83#uZ~G$j|^{@=VK$$ z@tt~`zm{mROlzo6>yVs4_!6NsM3d%R^<72>V7omq=paltmDoKhiFnV~J#e|(v7y7I zFItNLFXU?r_JP+%wCz)?+7hbFn8w?t23QQLs~gie8XHL#%Z&!lvwV{3Gd{dJU4F%| zU(<b$wdeV3L#&r$gVXp2xGNvo)dx=Pa)Q%Rh=Gn@63H`?oLb`@=Ruup1Ze1A=8`Xn zYm}yI+ewu^QIq8!pj$;-J{+>YA7AP0(RwD_Alc9&dH!@YS&pIoPfnLsNXuUz)}FLJ zm<x1=>*~h?w5Bf?`zcG1Pg5{`4;9mcHuw1EqwrraTkKA=lp~8WN0#d!_DB_}u(%-q zmGk_$=p%;``l4Q$2}C&dweP}^|LITw|Jxw-w;_&i!y?~?j|^SzVo^wI;xR@<lKal{ zvm6>#eGxDWb>p6(LX>>BF3K{nC+L>j_~JP1*>x@{^ca<kN)242FH-4NQ&WFOmp$m{ z)7DVcR*QOrwtu#jQ<;+=WwJjk|5wv0lJj1W+CjGR@x3AJj={YJ7S0ja_qMvLSYTw5 z59c$SY|gFrKC*VF^2*w9fcX2UV0Mv(;UL4utPulNJ2<+ofhl8j$wIW=9y6@r&3}eH z4<Y8~`II+y>OZQ>)bo#>6HwM^>c1ANzRQZ^FzdPNI@I^+!==X8jLRL+sEeW4HlF{$ zW(l|$?#d#&=ivqe&1wCnYxTcRS*x1fU8)j%+Wp>op8o~EYS98~6bTU?fQ~Xl6n0Gp zW=*c-41)W{<*C1ut42Dn8wbf4zvDi~F7#vqi#HHoFwBUYfHb`qg<kgk)qYKC{PaW9 zZ46934G~Bh3M3)C%n<gYO*##}_D%?U2LzRfaD6QviXGuT0hqp{8Sg7FD(dnr(zLT4 zoHX03)3JkmnOdI7>t9CUmXmgW;WnfpwLCc78kVsE)uBOCXsBBN)Q5&*5k8xa4_-ne z%KNL>aGx}yhPI_<RW$|*9B08`iz@@kA^+I^q>D0;&n@*U^}@z^#XIcir)ia!Ux#SE z7R(0&vqwV%X&k7ZU&QzqJOM^UyTAPh?@b@qBZ41v&M;1p#sWP;*k)zpKbDNL<vC83 zQ=JA<o{J5Cn(d_j{MrGr!-4pkgm9tQ+|HWzC4at!9u7pqZ|%Xak-&j8v5SOgi$mau zWvh~)v&f#J?_*!Si><MaCM;|JSk*FE<gfWPpU(0n>)umSze#mTbkAk@O(*m#-jxU} z+y^~8>e_kX)S+*G<}7wG>>*`ka!eWT)YARZ-Ec|ubX0C)ayw!iv$Q(1GPwA1Ec&l# z-Su}$6Iyo|S2ZVem0Luv`gdKutZV+?h5jRE&ZVhlCpOJYv{R3`nCUQ|&7zbhx|idd z5XeGMa?!Y_3`iXfHj?@~Fe|i(?)tJ07g!rJTDwEH)Eum!n7QG!PvI_{$7k@FQ+>Jr zuAH}9(%|V~6+6dzLz5+f@|9I?%a&ywjbD^>{w9(6&E(k{QaCqmtoS5fM(cGoSGH*A z*~|6O-U!k(&DDz_Bbxkoc-410#}HyBJCjvA&6+b^&IotLPa)WyT&Dk8GXLxE*?Fb5 z^Qv%i(D}b{)0q(R<fqKZx4S#7bvvJ!{u8g=Y0TWZT(t4$-NpqQwhRB*=NGa2>1@xp z*9t84@;h0BRz9Nl9HvdsOccPc;u{<o6P`dUIwNMs5VN~qWt|XtCJ3VMUdQg&Pyq4C z6v1o!pW8WvtMqr-T0~yP+y!Su#2y@sN61Q75034D1!`TTXP9JXcyG*zQ>FK*dy_lf zKf(C_LU8+*jKdcnAUJPt=@f0T%CDcEiNemd3OhfQMzemuJMrD0eZT9m5KBW%otbK8 z%WKK%Nb*iZz~qe|U!893bklGn=Pkkm#FYJ(y~&>Qk3&(7+T7g(Z`s4p8(Zp^kDM<I z2VdLs>OG349#GMTz0rqGy+`q~$1bwRdM>*sX}eKsg=+ug&A$E)t2K!Kr77zx;mrHe zcJ~LDCfbXE{hs5W(E@b&h5Fu_KP-WNkjsD6@xOijek1m`tj;UYqNYE`aF1iy{ug`i z`4nXo?Q6arXrM_=MnFJvmK+qJo1Al&oCHBcB?&6sfPf?skR(ZRmLwnob|X0>2nr%O z=ZvJDKIhDwx>Hj%bwAt>GgbF*c=!A4z1Lpr`DsKe8s*T<435%^uP$x_mQ;Orc4!(z zPoUIW6N0BBZxIpS4jw8YY$+T4caMMJbIyd65H7P<(07%yRM)@yHsPq9rB^iZyT75L zA42pO|LW1>W-n3(=4js4()`@T@2mkhEHXNTh=NTu&2V1%^~<Ai++nr;%{xQ_6aO@d zoibx-@97Uj6)${yL%nDiduHU?edooQ&z7bJXVx33TMt{(X{d5C0u`>u77y(^B4su; zz1H99tH!B2m)U4P^I(rKtF)8;rO^kFSW>H3&&}b?i0wW}Sfb5E!eCzbQfU^89h+vq z?Z2HLEOzbMo-<xvT%2-1urDcCcwd}sw|5Y+$6ih5f+lJxxizEu(T_l(k)KX*&kVV{ zMtEN8FL_XN_kQ$4M*2VZEn!R4#|y!U`d008@|moh!_$7Ocuf$cCLRgUaz9*Z^SE9V zke1R@Q1r0i`<Jw&wUXVccuP!vC$!(`)`$0*&uh+lVpxJBLu9K_xc%+f?i_pkt7{l( z{v%I`cIXRF#qeJyQJ6!fr&v&R*O*uCwf|-qRV4pbzA}YKy^k!V^gx0N{BD7u%GwbL zbq9rr)Voe{dtY%idZCVlu3T29QMEOh7d72%0u}ozik#pl?V<Gx4@IjxjCDop;pewS z1U~9|iu1>HNa%<(F8#P2ejW6w{~D&d*B43>TVC5QF<l`kJ}XtxaapoJqX4bpGyoq~ zYwz~moh}#DmAlCJq=+I`lfoORG0qrhqlmsHwKg!=l;DU5wRJdT|1E~es4KbB^;Rue zC;pJ2Z#Izx6+=IpS=hh!6BQ%VDQUCZ){fPcyprr`sf9cJkQf*+eqTpgY7L2#o^VjH zlKR^uZGE|wEM&lo$81f8pW8eZ6Ds`d*`|WyX|#DZUvZ!t#>>(_u6?r}P}X~^R@PjI zd@5l7@^rb;J_JwntMJ(=tyypNpL;)RPC9e~93t5x0^85M;+Q@@p?`sFsTG7YSU5~_ zHw-$9LnS)U2I}(5FYi?{DL(8L+MV>L*Y5#&i+KOj$$GZ(<v~vQz2uoE^tDoUx?F!u zl_&z7t@VpPM4Wq+<`)IwH%k33o_`9}y7#NR<65|6zM`A=>z4I5o{ACo+bb#6eR7JQ zPzkLJUzC^!c`sabo%PphLhAj<wrn34%6VDut1CRo?zCf^?un3D!{jZ$AMviRZ?$<+ z*AQQBdQ|3Q^K4Xu{TH?!Zhy4UGj%?_A1ClW*s_^LY{L7;^NDF8&(D4>r(u>4NDfeZ zikJS2Z{Nxsov`_A3ii$yDy+-DENBbb{M4-&y!8(6Rc>^5m$`g}QBm{x&aj64s2GdM z2b~_gXO?r`Yu6<I^+PhjTbQvB=>Ua)@vMWdPTOQZzqPnjaR5iAGHKk~5eZf4ITS6t zTM*}EHRPmH>p*zbdNPC;&W?#Gi0VesoRj+%)<uKv<(JnJm58%keE8~Q@oj3q`&N(` zT+=^Kg6(9)p64<WUse0H?X&lNZ!5CPBWHfQQbd$Nc-|}1pV>A<Q4&dar&_!ixtLJh zG0mVw#!e=6iTKf2SJiwb`8Cuh^qw#YO{`lqV<+7YalfPV{CPvU>{i5@mh>UhD4m$> z{?EaP)TE@F#5^5z;5`mWmfXfAeuWWnsGt7P4IcX6IRv{^64Ac`)E)UgJ<1|&5|b!s zoH|N`O~O1~g@dIA%s`Y&^Wa+EQGk|4+tz<Qk+{QIl*_HTm5C%&g0)}^?(xkTSDWhO z#J$FP0}K5(dcPJAUs*r+B^m8_kRA<p<=gzO!yj5Il40t4l<{2Mzi2dTJACynhQGgj z<VVV~bJjmOO>M_llFtLj7iH)thpTI<qoj3sDRu+cx24BFQu*;C@;!PzVDL8{5VwCo zw5(IJ#)s=IE4h2}KcL#{nHJ%83__DRcL?)>qOaF=T$xQWnn49m4zh6%OTPltroII> zB=V2T<UjxOecPzOdOvmp9Uc*z?jNi|r6^`rX8yCxY#T!vF_rp8G(3u0cSJ3z43V!~ zQE~rgre?2zX^S{oYpsJ*$fB8D5vfyt2fL|MpFvo>1;h@>a=SGT`e1Xl`(!<Q2dZ#w zBUnl}le7(9qwuHE393{$<MO`A0}GW<l+LHypG$Rub1i<H9J7b`dD%5<Pej9RORPIN zAsHKu;)*8XXS{@mful;Cyl9r7ZOO}x^S4xMX!4LwA*O3MEUh`2{1s8fqfLolWppRP z4(Iv96N0w&#{LiLuaegVFH-t>yFgFrxNi+R^$gKWHsLwK%oi_=&mR6Pv{n-dSg)P3 z{%npme+YO<o*VFH>{OhK@EB^{F@7SGQkgro&A!ZtYg#A`y}D5q{Mp*3g;%!i`D@Y8 zWo6q4x|D#3i=RnS&*m(p&v2Y8qMdWa9gl0y6l?C;u#!Ie`$XKV)m*^bXK^gDgeIUY zKkFf?1fP*m(Jm)?d6gJa`tLKfXjhj`eSyrUEtl@ZAN_D6v2cUueHn$ORmu@mkJG-o z$u#~R6kV1u*K9%1eyz%N^<Z+NmDY!K{~kUVU5QnK+g*2zD!~`_FQvZf4hd4^{k*6% z%e7Gy@QirAn@;cDsjAScJ~b9R&!=pYd0#m0_aoQr+}HQt%m-%dkCCU>DZBsXczso- z{ae~NO|5nA_P41?nu{vgRq$_g7egzF$4K7f#khT#=Z_<g?ZRhf_c1}l`DWh!4PWYi zJ)ABUFII0zH@j!?=$qgKY5M1Z*fa)(Lk(QBXg~|9bDedvFsFOx{oD6nw$%GsOou7& z7gD|Vz<a6t$KO8*XtyQWZO-j9rDt1sO@CebETof=&+s`5l)w50|F6?`pwQtC1rLhn zqMO0hznhWB2TPJ!fwn^Te7$=5UWgJNr3F9~DODp>NPd>H%4P_ysN`+-$GDcCp?<tX z+<%r?bC2&9n1SOsbG2m!#q*i-!SYWu96lQ|)~Gyq;$CY%>?O=+02Lcb>r-Z!4qwT! z4rqP$S|>}<|J#poiYlxfWP5dEoHYx<dB(>(!$F+@bUmLudU!k&_^a!#LxKKrsm1jM zsS#oBQt4EYJ$&afN&d4Wy|*hQy)|(0jpXrM=}$(e=lKtnw)mZay2xT{2E&UtRB;-O z&Um(Y=dfnDY{<Wdw>Z2^H8huoPoEdzAD&^K0#G#DzS$xL)o?Qhb3HynE*C@T4TPM1 zH-ITLVaQhkAbMCTmW~^39H~YMR#|Ppil?Y}SL4^ee4hdqENT^pWupdy+iqXntD}~` zkE{A7SL33hP-Bw$>u%iJYR0va_^6WjT#jgXJvJ)0wWX$YAKUs_h<#8_CbXZ6h#$-F z9sXrg9yG4dw5jwhttCXPP2ae!qx4(oQ`}0DB337}HkiNj$+r;nx7c7@Edr(cFTJNu z;i_DrMY4^lMO<W>7qCIu_22Q9$ZQab^`BNKdWbCEkQErGsV74{@@OOyYi~)a#D`Y5 zM?P=dZHF`dK?&-jBwAwlrQ~o;I7}}NP-y3hZCls5^@dELg+pQVMmwkPcgAtP2u<`| z(_}t!@_T=j?scdPm#EB?HqPgNZyJ&APGSJn(~Gj+gMhxjlx$7z?+_MO`CR@To4}=) zq$*6>sTg)A{7jXxqq26Y!`y{Vv7jT&P*HcB#tt5vr9%dEG_gTN9mW&YbQS*IXw!g_ z6D%y(O{$K`3hp+^?}AYVrtNv~?x&ZXLM|1>_p4DTR99}|f|eTbkvi9NH6l%A8`=^g z0Bb!?1}<p#h1P|gbvUs|eUj67e5oQTu0B<Jhq(Zyor$wK<UY@japP9SkBE0X=T6H^ zBvUVl(Nq;Yv+Rkq(ae(68s^e+V%Cb2qOluKkEiKQ8<2P^m1_%CwdrU#%uBo7uhx>A z=FiHk3t=E4`94T<C*>$Mhz@5zmHslEDq>MGYpKQdp=xnO4CV!@%JX}rY9HY=dl}pl zzNVt{Cr0d}W^6|b>IhfWLFJ*VTzAHOgDmwnPW65bDypOZJ*yy<A@>IbmZ1I?ykz&& zB~`xKURiQYKUJ+yfi*cTvO?74!NS_=ceNXq$O`MF^#`<>Y`Qy^2IRR1yujUMB`Ou; zC5@gPWvak8mt@8>;>mj58w!e11MS00m7aeFtf}dOeY+%M1{;=o@J)L?)D_W9<XU|1 z6s9_qUR}~PX!m&O0MMwR^<;hLWc}9;gAX&md?z2gB^Ya2puD52hhAzR%(PXbbkT{r zW~yJrF9*M4bup}RvI-w<7PK;<s%`_kR|7FWSO>-wSSyzFK@~%51vsN-eM5}i9h%P0 zan@>bUR}Cm&5kDc^35(sL87(6++c$XADtQ658S>$LUR8ina)b42zqM-B0_R0IkFk6 z|3twcUDp72G^}1P4ms}y1_%G>0>R;T>0;&Syt;9t-2)lAugVALD`U<I=<CQ??$>A= z-02BB`sUT%GDv5T(J%3Re|Uhb7_4V#BsenUVqDhI3>##|xBTHbpRO5bF0z{+jHxe( zRWPX})vse3it}VD%Fq-O$<$%JDLqp~5Pol{j^kYPLdT^dN{ki$Y1|cNYk&^`3dUH% zDD5u=5V!UTdG?s3X{%vh{Ajn%_UJQHH2Y751gK%qhZvBE2IQ_>Ia7~>+W1B?Su43& zTa$q|7h`p}p;3}Cv8B3`YqPv<zpYw_!g2Jy&uNVna9cA}88;uDnR%<F79eG4Kr^<r zWpw*z(Gi`d+8|kjG8P-Fi`g=L-eTUu^m73<S%(@cN1KhkkPjLg#Y=VblbaZQ7-D!i z<iE_F=_O{-Ic$Ie>b!c8oI)-y)iJGP9tyw=iv@m|OD57rF7&1RYPhA3mZA7PLo+=y z*-Inw)}JDUy`dfYPiNGgmW|&zk2!XkjL#yI3<o%t^H+6#iiqfH-L%+gF$=?*IkC3g zr?AXueQ&qj64$KuNI?&NbM#f;2t}bHL=F@dSX}W)x^j7{@_4F>X!;ZVbT!X(jr9E) z%MKDb;0Y1W%h;)fcji9I)<g>yNk3JZAtq0=M&tS{&Yh>V7xWBV@0w@c|MUw^av(_7 z^xOY(I+yvk)pq^uL4z-1)?e>UwM%EqwHS2O4lB@^%NG1{9yBFSNQH8M-Xmwm&1QbO z&P@2tOunA^^?v4e;mp+MnQ5~(TpZ|NV-m7JH2(8zbE7;ZoP(LuAF4uWgMnkde(B#I z=yZ~~M?myeSspgQHUMG5FrO1Oh(zxk|J@~;-J_q~=b1f_o;_5XJu;g;cAY)(n?1Fi z9VNR(KBCd(XZn%(H*}5L(#*)oru=QC&GNR~lC(*Api%5i0p#-Zt|}UyJ9bA+xFNxT zF>j8vVGiCkM>a7>zA{H~GDiuUr(&2#@Xk}q%+sjP(@r?N=!hl{1cJ$Rq3*KtW)6xS zzp}U-{Eo~(5nW==b__&i>^BR$e;NpU)*y>Yt)2SI<F>%-zrYu<z@M@pP_!V}uprd6 zAUv@kV(0V)i|+VtwaR0aIn%;EsK97zjgJ7V*wm*ExCLqzZt`BT+zWRk!=g#B!k>MT z?@cT!t}H5@EFxh`D263v-X#^8B~|q$HS;BPw<QgK7mbr>7#dApjXq!g@h{5SVS85J zZP6fp;t{>3ao_agp9)N`fV*92Gq+`P|7DAaWy_RhtD<G=hUNQR%Qh3swkykaC(HJ) zT*=%4riONHo&|jdS3~oaw_c-5v{T5>rgS#bL<yM>8DcyeR=m1a9!;!xudF;iS@D6b zK4DmW%DehZX4O}H)z5s@-)%L(|AD7J`t$o{e_e~kdy7)GEA~RhQ8&hHg<P#)&qI*t z&pc~kqHE#mYp>1MBHY#@{nw%**6?pq)}o8nVj9+ByVl|+*5X&z-kz)_bh#605;~a% z7+uOk{ys3^LW8O&oTW?_>x`lL`lWZ#Ax$2PE$hOS-!t8;L_Sw`Z4Zyo8RjZRWr=ow z`1_6Xrq-Pz4`SPOO%ni25+;N|rw%2$_=_dO220qIuPXHj&1rl(0Ej76lmtTWvmQz6 zUgv{Ke}%icAJt?Q^`XHtvuiW7X|r`grtQSD6+jkFd}Z--lPKy-XWPsbMT-N3=GHI} zV#A_FqcWwpqmBN?;Baq|XFnSg<cxS2wmm$QNQZ>bM`5I~=t0<f!zom;onC|Opu*I* zuPf_0RTk4-+tVpFGeg_>zbo6bC);x{LKo!2Oy2dr>G7{RJ73fdGI%{o;`2sQyhl&G z;<$PAyLMD~&;S<07YJq`0l-mPY9GCzom6rwTg4q_O}r+Qecng$DgwH{wY`+JvL0Vd zND#>ZtR!KAC19bEP%#G#*r5#EI0BI+q(tozS?s|c>=6g-kvz_-<=-Q1+=C8RkVNi% z&fg<D-J>Mlr()bk@a<E}?$c=O(^~A)J=muY*k_2`XT<MOr24>D_o%-;p_qKayt;q$ zbf2wz_k!W+-9PGIM3WUwzYrQ)zzzqz0SA1M2mGlA0>w`u$S`U-5WOLYCJiKo00fB- z#TXC8`3@yy3AQ(lLn(_x=?8~00f(}YhjOWh^2LXD8lOq;D#1!H0zIL^bB9W&he+Zh z6yuSi?2(Gbk*bBSN=~SxLzpD`NXj8h!XZ?x@kpopNO$r`Z}mw3^vHnt*pTtqi0{}~ z_Si(@*wo_K?7^`)qn~o*F_NzhCWaPBgWSdbkG41eyY3L_YKT%(n7m<_49SV>gA=!a zlLwI}?x`mp#U~FNPdvL%ye3Z`t)6(Fo;)T#eaxrWk>>}|1fFS}KC?LWeQ@d*aOxj< z8ju<Q=6J-uhmlSIAW^3;Qv(RLw^zhxA&h5ezB7#MS*XTYn8jK6gR|EGXAzNS_{h|= zsN%CXjc3u_XEBp!vBYNz-HU+{s|k~CgAQ8|k}yah`8$i}3IFf5x7199NVI0eQr>MB z9*a=H5isj7+x&o_yvXz7)bo<!^U}uivhMTp$@7ZU^UBlnD&mVzj2G3!!4gXgbvX;2 zJE42Xi-v%U#>k7N)Qd007tM_qU%M|_CNEmQT^zCDN`(N1lM5W*i`}Lh*T3xM(#bk1 zV~C>wk_3RDdg};#(MMH{!T`NFmwk~yS0j8_Be@s2YL9%M7Bkq(j|L;Cdfp{BBLtf) zFP~|kM<3sh2n6820P<e|p6nNz91D=`0e4qk{;4CIYD}Yjh&CH~IXer$_pZp#*bH^i zVC)9pRSc}@&#-yG*Pd5DPRY9)b+_=u><*aUO8t2c(fqn0&6>+^tls~63owv?4*9Zy zuh&>Cnq2G(GJj<Tiwa?pxFn+vZHLiti#hZl9C6>GX!wj{`9bZW#5A1Bmy=JN!id;u z!vi&IKq?UoG7e`Np&Stu2*DqjP002)v}}q&m#Mj+?riBu?GAtr1S5e7Th3|KJB88S zDmbANpmx%%;JTHG{x!Nj_FuNQ6XB`)hm*CBHqG-ebhdEd<$v1Vg1Qx%@_FLuKnNKQ z2gLmB0G^min2uzg78L~}Wr}^|fDV7#ju7F9a-V<j8_JN~B6pAngp(vu;8g&}{7n)< zt{R5}h-*12Oyn{j2_}0(tDhO3_QWNEnCyn|IQ>N~no593fdusk2ONhWpYfpq$Ad5; z4Fz<H`$xxJCNs{ny(i&?2Y;MyFkzpBcalP>++@z;KOX9ls)~(Sk^4R&Ohvg<x5LcN z9FVpLZ|Ff}#;os@!7POnqmDJ78Bpd3OP_Wna?NUjyKS$5F-D~Mj5Ahz<tGw!I~<i7 zE5Fgibzim>qoTu7fQg{H6^lYLO8R18lm@x))M47O)aoz?3L+~va!a3%*LeQ<Fj_oc zq8UIb2?bCjOspTnO*KfwRiLP|gq4h21=vs`WoV6wsx{5gTOx-D1eCP?OC+Dp4Jp19 z&~4Lq?Mf&GL^$FWe_%T~LT(?Ryj7v4Okz+lB9OqIMeI(Z+@hfjU(8AcsXL!1fYk*Q zo`5N}1LxQ%DHJf@Nw>|kQd|Yj(BHvKXFg!4@PH4vKryWo3uH0Og;TN38LpGs)S@w& zEP-XJBs=f;GZ9FCobq#p<_po5{VtttB}eiEbj!aDGA;-?H?p0{vm=*?0a`Jy!VHSV zs4(MIt6>oTs(C200b&nnrN|A;kdhX#gaP`2Bfl+)ppK!MV1!_H4W1}=6<Uc><?T=s z?pasy^LrEyBASNd+B3NZ?zF$Au2#*pM9w4Ihb5Cw-qJEajnD|bKX<~YxC=;p0hBO_ zqmhu>TnBlF5w=~GMOe^0=~<VUN{`&U7!pz0RR|@GeE%BzQr|%gTML=%V<VNDvrGqB zDa}D46il08bqlZOpl>voKJ&mZ%tBb|8_-d7_(inho%KS4qs%gHjtQbJno+MiTQy_J zTeJ{E8=_6mx#}*6Zaiv}`9^N5IzqbuS!<a^<cNGJP|d0eHBNh<i-78W-hwC>h(Ts) zwxYjhK2cx#UdR2S@btHw4Mv5$tY{BRrV*QKqvMK71w-)Gmxs!zJ2z1PS(FL40}2@| z$wY`>MGODaMDs9VGZ;dNN~sMAA*7_XmYPUFqA(YTB4q%TF%U*^IiT7O7*J25umE%q z{eu%-Ljn{P>E8CFFjNLr%Y<=^$AUDFNgkoq7?LFcaNl_(l|mYZYfaBz{{<)AaXXsW z*OA;=^E=5TL#If56`2Q<3OTbFOiJz};7Ia)ms1nq$#o>hFn?E4FY3(TaDW)dffHzc z)!aya1aWZ$qC>HT2qao3*9ipnnfv0Z<&eOuiAz}tSAYrgK^RFf#N23z>0q=#6mHJM z&Ib&@9YLs)X|U=FhKqZSgu#7@n!Fv12hX8RZuV0^t(`z{BpS+s!@#){FauWW+QLoF za7}1d5qh178VdsJaug#t9O4br2T5T7hI<GNjl*F8FIV)d_nklw%1P>NwGxdu@||*; z2`m%Qe?t=s&P!HqR*(zp^{L6ZzI>o|X@&-T=P3jLpbaQ93;@*vG}QxO8xsJwrXhJn zaAhM1dlnL%H&H;!!BWjmC!hva48*M>t!R;MQF;7*{2U;yAJ7(GX|gpcB^{~G5Elms zB`YUUgjPqkF|tr7u2k2kfEgJ<tfub@K!v08a(W(sB=^^0<_Fs0!o<EITNWX{%qH*V zitKMZM}BSp@u}-Io=(l}5%Oo5yhvl4G`Dl>dVu#7x?Rd!Mi@bA64yL}qmi)-)<ZEh z&vgog&y#izFfzcu-fsR||3tR6!gjrHB4Oxr<r3>VE3>AF4=HQ4&J^qS1y~Z_90`G0 zN{fkv_(9p?#0jqQl~(sIOn>gk)V=JBirTO;fID!2si?iw{DY^8S57KJOsk%<BiW`E z11j#kEVI-qpYAH<t?PL&9Qb{clayPM=&b@~Bew*)FX3Cc^YXU*q~OG^aYyT69KU=q z&+KW6X2oG)?2ApZndOz!hW*!{UQ!Lrg6&hW10smf3%c2V%yP1%JB((d67%?zfNzWw z!Y_XdEl?MCR^SID0dSfH6HT3*$gemLkIGHcw}z9#l5P7Bhb0z&oRogQ`B4-dvp%<+ zlE#Iid}{V;+L@a#phr~kQHaMDJ<qUTFO7%iyVqb>-szKWJIALn--X@k(NzO+ERq>H zBo03+zYH3QW_?h}T#+C9GW7UKU6z#%hFA_g{Ax!s7cabqqzxJgO?j40Te+qt**qFQ zL=Don0U(6lx#YI`Ldm#wJ<n!<^rcjZipYjhQuBDBtMZNU5twv!(9bG!=?Z(1P0O+K zpOu8<;32OK+r#F`w(DaCp0EuW#MfV4iZZoHm0r%0IFMGhM179Pw!2C2)I^m`!>7t^ zuV=y2e|PXQP2WUze3F9ytcc1s4_EH^)&<Y(c+0lTitGlC1^>m$WZ98c<6bhNXRmi; zv3QX^G~`7dJZcS0S+y4~`C^{(v0Mkc=zf&Riv@;Ha$UEp_G6#DSY+Fk>roOtNJx6I z#Cu!5&!Flcx$ecX=wtZ-d(p$RvCH|>h&o4xIds-x%c>$?ekAPgVLbobin`LBA4ye5 zG`li+q$B*}IiklUCNDS4Ki!%5RCQeO>}tc9?Ew9q@}wrFb<0KR>+iAnlh5U?+g>4G zrxz(tzx226_<s93a~OZxy4kw>LgVO%y_72vNA6yPlEMP*r?XDNXN?bOncueE?bT^J zNdDHcjF)`-Z_u;tFcaUhszP-xK>W&=OblDh6LU_N(so=Ga&IfgGLWf|P2@9sjJoru zi<!f=)7#BgN(z=qU=qAQPYektUWs~n(gmoqZ`;kkeYI|4e;ei#TO5XetJB{RmK@(x zAh3XoEA-(@?wb7f=G)a)i2a4YmNq<QcK6ug+x5verEA<Q(Ltc0Km-WMn1-CUGQ*1_ zLB6nkX(A932_Zo;x&R;tV1Gsx;75^@qa6`we+3PYLI+?2+Og~a5uiwdgxF|Y7v{pN z9M;p{F%YzZz9{-kwA1ToDg_X1E*>t2At)1x2_dSQIQkAWu{(yr3rl_Afat(GFqUAM zu(?iI=;UxhQ|SP`C7PHV%jAHibw|-qW9bV}B)+J3bnIl=x0s7=l~N=3eL<iB2bd|2 zmN1<+fMw#x(VAk4S^FVuDEb5>LG?rThohZfY171{3!~{OjL8)M22&6j6afA>(!$Vm zB>-swK^Ei)c#(m9QL7~%`QteSrqX$@Rmgo&a4j4y6hr3@;=We->5db;NAj4U+wjFu zxnmF>7<f1e(K1L+cwtunk=bBqSTS@3NLWeyYbhjE1bPGNtXz#`QZQj+#Q=c4fPcR1 zt3{<kB!Y>O^Cq@|4!d6sKuZAHcK|dHOJ!_b9tij*<D(9B^+`q&X@rrv9Ox&x&X7Rl zt5_~@W+DwYnvRl|5LlW!hX#dmsj3&K_ECZfr4SON8bh`kC$fM74YK6kH_9mXpwr~U zsxc!ED8@mQNWhR;y_Q?U*!sY>Knsr4p+N$OoI_G1hy<;nII9XPG^8wySD0CUlx$SR zX6&y%{tvq07Xgy9-O*ZJ|Ez8->T1mS$3)xKloLHx!)6pwXc@nJpTka-)y`9u&4hD! ztJKxHipQjF*}7=?{*S_icRY40g?5QVmg=hZ?VX0`Wqb1u2XK)+Gp`!mik&F0vrLha zc#gArk;@djON0g3XVJy2$gTaa`s*8DI{b`VM3Fn}uSLXf6V6PFBHo8pMGqTzJ==;r zyLi2Zio7OxAN?(Qw8HDXQ{;WZ`}n%(F^tcLve<`#?+IJ+6JEZjqQy^T_?{^idnFbc zceuu&vi<D%{N0NEz4-$CivwQq1x6GH#`8T-DSn>K7gV(RJkfP?#0uWJdeX`Fg3zBl z!T0iS@yivyS3AY8PWVEui$h@iXvz{a13!kX1jEZ8Dq0dM!yl$t5~j`{u3r*v&i~rZ z{pEtIYdo)Gc3R{s{-}tOsCfQ2Pu<rO_@j&5qj-y=8%koLOWs5m5zF(%{U|!=ENRg- z4cX#{obbQBE_n+RNI2j(WXMinTTkG`mnQPAzx~S}e}{LYwM$e_fXJ})y}3Y&U1^G& zK&p4?`_P`GcCv5<z`Y>~tk4mhz3$vgVp{2u7Ex&7gofHcv)UrECIqtomS(RA<m{B@ z*g;Kvx+2=v?OdSXzzkzvL1RI|e9^M}JSOlO#X~RCeDjTbyRt%=vUtiemjyC6{ctCl zsbae#D}E$6*+VU1!$h@^h$;1n7P`Evtm00rXKz_$TT11MU`1Qm_sj29=NsyXvRKtZ zSMI-K>3r(XAFB5j2FVbX#!vSmghm<rQI_jxwz>U6Lyc-z!vyk1>rGX<*~W$l)mWi3 zOpZnNaznPK2Dhmy4`XkO&^{@C_G=KdO}E^lqx_(7MaiZBs8?^*R{bXKiWRjt_JTeh zfIglRd@Nj{&JppcIpveS@UtWSTwURIC*clnRY+#8rlamdY}pOCXUtLme&Mg4?9Kv# z*;ue^lkuhrR#-3BtB<CrIHCx|kM$D<&NSx+8PFOq`vL)M1%e%NhJ^)Ab!7rDC~)Ax zfxUs`5?6=vKKe$D?OJ2mq(_>Fy=@~EnE?M$e<^~+bv_VAG72LBegIU>T}T9gq>zkA zB)|>m>rbgURT`*5b!gB8#Ud~VFx%vUGhM*dE(Wz&h?g^Pxv6o!RD1(TC}sA?;>I<1 z0L}0jQ6#w>ejDlP?GzpL<d!;AxPx?~3z9kaN(y1(^4^J~ON~PvqO0cP-u;LpqH`kx z&Q0j{2d;m`5+g{c&3JluG(ieTSm5l$k5$J+`@PZ5X9=BM{8;@!!!siG^IL*ESxh!A z>_;@JXQb?hbNpadtoDc+=}laVeg<&|+A9!iZ}pan1Q{)d@uDNJ6iI&O?TI9ttOZDY zmg-2bkQXsX?j(YXOqCuBPDAcVqv0i3Uxx*78E{V&4M)OX2b%2NLz1upkO~|vn!HE> z=U|E<=EpLl$-oI%PG0m&7ZaRW52@)#S|l1ENE+)4f(^;Ya>YnnP)sBFG`e~>+3=CD zl-rO5J<1v^OE?zHv<QODf^BdtP#nRoN!Nh|vF4yFqKIBQGG$`dl>r7MEop)V6LgP3 zn+uACR|Fzq9oU4lJyJ0=u>t^#y;X-Wg2-WXy+{*Saik<T2rDea=i&ZB=f@zR;S2yB z(K{IysydKAQ~&^h4qgF?GZZ$J9|X<q0_$c#0}-Y-IUt$9Lop<y#yZ_F63(sR)}#){ zQ1ab%BV(}x=HOa^=uCz;;IxD%BxvV)7$rx{scP4?XdHZQz`hjt3q{I)j-Vp=?D#Qo z;aeXyLC$p8r$;Q5!j2#Xl#GrZxdMi003eHvB@$HIBl<*KiAOP3fS@)Y7A7iYVJ%oL zh#7sr9FAiyz%su;G4mt!0|C+w6ukq%GmK*b&Cvn?OCgFe9Lp@cNP1ZZC2XgD`m8oM z^4J^(m@Wc9s&gTk!$B-Ib0-2=`U)I1Kfn@>Q!Zj7y%|A7xD(bJF}q{b5u?oHAL&85 z^sFG}a3p;!4&e(T^#xJpQj-oKnGi^-zwf9Quq>>Y6jjw#F^74&AMysOTcWkGzqSL( zk>;d{4QpB?<Hj@sSn4w*LJUdnJ4B7pmU!x8NscA&0Duncby**z13BZXBTRuNss_kN zFf?N7ke*{xZbQN%B6UaIVJGaS+CN_5H=NjVA4sY)KHI)@0vyWGI(rC5E??(M$e(O9 zeCuGEAmsY3g#fCF4E+%;C*<K+LNY)(fF17uNR#WS#MH_1*_^f>qhM&KBptW{`uw1P z{bQU(5N$64%VerazjeS&5cEnNv7`}#3vjgDy-eXq<`N`J9PU>vj_@@|B2hp%E-3CD zy#j_d90bq-KmmvpiZ$v6SU-XQZgy90EOQG7r6$1aGR|UyG5Ihzp8;T!dYMddXLf4U zLE%Q<-!TB4Z%lm|nfl2RZ!wc}zZOC<k<2shaZ+y0GLP#(6aqo9I5iGE60yiZ)mR%7 z=#K>H*rr&bB^Sc~|2Ff;m>kf9Banh1Y;6xGSx0T53-&Ui6Abl+Z#|W}jjWafJ?cQ~ zVD)mhPO<=WCHI%}E~F%JpAsu!ej4OJ4D9Q#bR{PctHS7tEg@*BU+Pc4G<_Plbbu!G z1G$53^DeBV`tu1`$UxuAOO<l5IonMsLxN3_bxa9?G{2b(l3Jui23#P~yNPJf)~AU; zB%B|`r9rsI>0Y~|04XeEA%=*2huI5Yz6>kL1r>N9M!ZSY`Wsk-dbJ-XhIwI?h5?`o zC%Av;{R#Krp`(_?D18FJ+!06~fuj#cf+}#H!AQgJ?-`K6_MC5@IHDP^D7#*$Gnt|g zx%g4?OO@_e4C2Koy%&;Iu3yRYD^)lSeD*ps(+F08qxMzJU!-n|A}<IhOp}Tx^lO$u z24OwDi<Xo$@wMPspBZlF<l8ZD%b)|F$`S>f<FD>hIarXNw<?DQyZ{Y&^^y;WQ(|MO z2B7aB8xL~Nx=V04aqo7i#_H2$8^O9iS_9lS1qo_g&{4N$yo9>1mvafgk%fgBnmPwY z1_o;ss0$WYcENn1lSKrN_Z^t(Q~mmgKm%eYu|1fu>&Nlx+a^;oy%B;*PcjKbu>>R} zFll_>>(iP4PgVyg8B)e%K39{&HW*1?Mu6#^woKqLcOq5t4!PGsjY1@R3vcG!fdm(z zqkZ=e-e`8TMZmGqp3fs2>S@VTJ7Jmx%mNOQce3ex2FYBIU5Rj}my&sd>nhk={X21< zP>cimgW~1=Ts!Bvw?!Y&uvcUN5#}!&=C-stn~HjfFxo3z;k6~eqWnX(5E&vh1W|Q` zDj*lb4?uGr;7gsKskQ8d5?Zb~ZVYTig-j-SOR$@4*WK*P59yF}{Aer|2_>ec6RQ@R zN56*Bv2hzFU^_72dzWP5BUoGr=`Bt<M>G<g2<6TbMkI15L!mH)AqN5#3I@aSd@VW9 z-{0_4Gb7L@APm4mP0p0-fE~>P!PDqCOt3&GGKrbB`6=GLyGrXWF9*jQk0~LbIZqmk zRkkLjW<~~H+*XE?kO>PraNH98LlVSp>43oOg1=I6BQ=4KAVR1v^8k-cYBf=x@2GXc zocN;$!#Su(hI<*l9%IEu#pbOUex8#BRMA=PCLdp?l4uGeKVU<VHBurB3ir<mWh00< ziEQ;V$L`QUimELVqbB7<GUB$0|FXTAeUM6TSh0fO$+=6?+ls7@vxjpG$`x_nPWMO0 z4Bn>XA}_NBO*C6hj)Z)^&1~HrR=7HFHfVu%N;+VU|JFTjeS5&Qrwm?|e5`!ztFrqY zDhaJ=9r6mrO4OTjSJaURqtR7gOp~d*LZ<LRLR~i=Ulw=K&m?Z<bVP0GR+nIPjC*;~ zy?*rmq+|V5RPs<+pbf$wKGL?=S67M^(Gc2eKVp6HV?c6L_fT@Ehox$8{!d4OoLuik zPod1uyF&W%$4gZD_h$ao833C{CQ@%<()Gh~)XbGe*IR#Re`wshtEpDMRokz@&V}_d zxp8alXiRS%{CUg-byM2Z#9~mlI(|IXY{JUJPY**3=a4cS7R>au7(t+cTQ`=4>W#<O z#_8*?qAP#?e(*8w1SghXIZ=NE599!obB_#6d*iOm|M>LYoc!~2w3A>wdHQ)`CSd+$ zWj>6#iT`8p_UF_57yH|?vmtAPp8*&%{w#7f>`ISm{`JN2llH({@s<l?+*!Yz?%uUV z|BaL1`L*~KMQODJV{j;0h%wT)8VqA|7+7v{cxAPc=8^r|wabBrU-X0LPWo!j%lLGV zrJ3l|TK+r5B;D8PZok%x(!FKYOG_t)xMk9hBouGw_*HFu!cpG$vbPnS-l`kbzyGMN z+k5&EFd2V;r*<}Tdgtq|!oTg-e>-<4&N<05b#bKZfA-o*iN|(3OVuy;x^LdTtn0b; zDf4OfjbWR^LHXT3hr=i;+oMsf+cQUFMh3RWKdm0m98WsFwLSUm@oDB{`pK~E>CE%p znbTPemEGC=o7;cS7T+1z{aa3d{P*ALNBmp6^YzlVSz$vizLhf@Uv~cnj}x8QUGDeZ zp1nLAHDJHu8Gk%`bvpmn{`%kgr`hX^{b76j)xX^k-_|QeB#4rb5+F4PqE15+i6&qu zeCHsym{6qpV$Yztb423q-(poaiL{?0VJIf$pGL@V9;ta!qcmmus)W}fzVl>`Oe!~q z5+bDQ=P8~<eT6S2MBYobg#Q>vu~WW_+P;gTewWtK;EH;qmuY`O$*lmBdlzk%%mh@X zsfqlj?QMY($D}SE|1Q>5YVpQsT34B)Ufd&AF6xXqb@`!p@qYD-H}}&By|3@yzC2oF z2i?#_Q6?t5mRh<+ovx`Sn)oix7r(@H>xPz=eq!SL`XwIm^xjiPqok~(B|g**Z6ldI zSiaOU5tWa&SykfuO5bH6#~V6ULy0M$>z75Ir0dx3B&N0=E#Jo6&~>B{d;eW(Mf_d5 zuB&KL`rr%Wlgu}oH0ntiKkHYdYtr=|**y!JK3b8*-Ozs$pOm>Q^+2kTPo`9QJ!nRt z2-oC{dsh1tm^Q*H?57*N3?e3q30qMFF&knilXE}ae}JOSFnleV{E@<MP30D|(VPFU zy?tI&6VEV;^G?pcdAz1EovNP@pIpEry{=`HVf?--xlqJ!UB{8xBz-8kNc!`--jfWI ztexcId&lbr7-rLtl<!N_q&JKZ?=nmaMc<d|-D4)p6l_EP50Vr{07{UgwEU+e<?bcR z|Ewe>iQlB`e}yEa&V8)Rw!firy3uE`FH5JfYUXR;;l@mV<0pb71wzKA+f+UOJ&IPy zZlI}Vu{(iFhagF*UG7hl^!z*UrEYaNS0#o`uepAGti+_;Zm{|D=47=qL6Y*dVSBpi z+2-HDuZ_F2*f277{g$Tv#hxS~`=OREhpQv`Iyw5S&BvR+>O5zMTECv|&V7#|NK)Eb z{vEE3mD>-uwO*X=E%xUad~3V9I6K^&9sc$Wj|X7<b7&}o`y7UZw`4AqTxM-9457|H zA5LfPKL47@tz<re)qib1k|TnDA&NW2ec=s%QOQEIaKqX{j93@{Vyx7J`(m8jO37lp z!pYj=TO>?iDM6LNW9gkHZ|PE^uFU#UlA*f5a<Zwp$MSnix6<Vl8~^p?REG$Gl{A+W zkCk-yqSBQNuZH!N4?bN2tC_wN9;;b_E2XR1FHY81bI>qr3n(=|H!gzV@>xl4tjxv) z<gPM+$xk+)qAg%H%grsgDeX{d{`z6iNZu0(v`11>&>fSH>>h#-(Pd@$P9W#gl*hxA znpe@wr8Yk|*grMH-ft#jr+y<Ljhwz-wGVihh5hS>qLYd{+vK<E@TOmBp;J!5v!DMO z|9q4<5aH>qos?ZJRKD>eT{LEwf$nyCced%{uS_%dtHQHGH^-X{&+n&TDMc@^t!FDb zdq|SUO=31lLm&1!==k`ym8dK#_Pdnb$lrI{V{8^Xm9+m%f<<cjYrMywLVYy+m%<^s zl8A7SibaL5+K^CA8b<wgV1e3j!5iVUK3QsHy*&k)tgoR`Qp0Ujjs7-AFK%#vbAtMb z$b7%VjkuzpOwaG}7C3!?p8O~(96Zs7eG@rFxxHPJQPukp9FQ42jIW$;e=e)q5bk$Z zx@i{8FqE)h$M(u?j`-M?wl<k-XxD^M(%Y#vf%un(&y_@O*;>j2{^x1&<?@^B@@n^+ z)oi#)s#ZituY<5+Coy?sji=WQJI}A??mn-e%5mOz2HT4t&`!U~KV+AnO4{rq>(Mw? z)_T0unXUZx%GBdUPWFi@5oUy1Fz9xhrddVEjek3vC9hmPTS%0`54&%#O_BU73yJ@C zkpmDj(I*onph=F%+3q;kPJG<bBQ6*?z81$pgWNzAfgBLAwc^-EKB`oi+EBB}_tfS* z;Y&{diw%IC*4ogPKRo7Nu8IU>TY{i?)5nUIq|k61+zavXc}u((zbeW8Fo&ve9!;dL zD#g9IH#)JLDW**P6-43&rpb8>jXi4noqN$r7*mF??pzh}xo<eM7qY8L)T8S6wQjxO z$~1(jQwtz<pL%KCTwf_3xC#qmoZ`Actfk2kR}&QKHB>=krCBak>+9lPz|E(nMb%l8 zD65UM8j0$i<==UyJ<km#ecDSiy3d}$+9R-@tdUt@tX53tB6RmRhvAQd6nHI<sK}T8 zGqhf6Yb-)6Ol!ai?vo~)Sty>`JCM&mCd?nq^As_nTO?<YG|sIBDKBL+)TT|3`(317 z+dEi5c++0h9lF{7hR(LCR$(=n_wK4dmY+H-^N5>Uk-iphfVz1Qj$d0vZhb*u`iNhX zT5>Bha129>4%wGnsK7g#BgIUnX!>nUb^7GNfR!;+z>6iu#=z02WI80N86$+bES-YH zEuZj`tBZPS9OEvLar57UWJ|&1bVZ&>`4<MNTzO+}&AW<`>7}T5{|0V$B1*;g`BihL zl5#mCiq-Y>FEaA9h;-@7FUd;`)PoXKCyq4dk_EYp+zd+1k1DL<HZA>#EZ)?cRRvP$ zAaK?RLfP-jZdxI2p9`3MBsUWzIvaF245H1x$(R4)CW$5JZcC4wL`CeN*8^os%P>Rp zx<3Mf?oW=aZv7=!i>b8q2uSYx-ZflnLiEv7W0T_-{>Mo})8MwAIT`C;wvNUmQ^5E^ z`7{*7c&Ga(iO-w+e^&A$zaXBkDJPb*g(}PHL*z7_vUI4Y;~$XN&s9CWTuq`rGHmJ6 z+Sb^3kRXtI%CQr-8@#GBdp_03DgE^}rnY?c`uy}8Kv|6@)|~^hoMB1y_qwVs7>xwa zaBV2|a6a96`2DkXrlINx*@1b=;Ir=>qI<O0x55!IeD1uwR1DYD5p-YAI>q8^Vjt)_ zud3<^!b)o50|pk^F3!4<l(h+wx=Wla|9Uj_YZFrkmU!>}>ovS)BhAxY7QFwjZ=ISi zrEy?cG}uaUDAB;=o9>Flhkpa^`gIwT11mCL|KSIH;_EV3Sy@CZmRo#>>atG<9z?L_ z4x=gSbBXoVy7wAKc#WC!9xND#dIgNe$v;x2q*!09$o=txRI=!w@{C^a`Iz;kWQl<D zPovq+Av^$9j&^vs&7U!-`0HW$1HDb_>GO#sN3p8u#Ti=_4WNzk#DM=Qot5O`SC9I; zlBB^cx4Rd=N8%gmi}ki2-oKdoHFOgGv|_u{CwH3ZBhd65687Z7*E@-dvZid6JN{oU zW=I!7R)!S2LDMWMacu$CLHFMAuLX<oiIIH8>+OZIT+Uf>ni)xn&_{4x&LbYjw{v+X zk&SoY=!ToRWUJI(J!|1%izIEt*KEa*xBTYO!#DML6#RYv^>VpJUVh+#{$a-S<%-<! zm!W{6!|aR8RU}pONTmKz9?R95W`KWB($G=S-K%xOx6R|l`hFLGn>H+mn<pBpvUPIg zIsS(e1|<Li{(-ChFAdw-E(jM!LMv#~Q~mLKB!WvjQ?n+oGlog>;h&zG{O-3LD$%T3 zwFSNZ`-JiT#S=ybALdP%HDc{!6mJkUG+Jh3Ek7ZT4pks8A!tIBVqCWFPwy3NT9h3j zxRIC(_b@CV&n#nr<u_~yMkW>Ee__k(6MthX>n6%Jt42$kP0Lzfp2o$Z=YqnYu-DHv zYuHmZ_#p$z$-)I$G%VYnf0aE*sL{IfVY_jTGsClKsY;I6NISWFr+KU4?npf?ZnG-q z&(Me2rjwQO-L}=<{@rf?vG5)i%ILL+BjL+rsE5mLiTRQ%3Ga8%S$K&*r?tr}{#L18 zvER)RIgs2P{!aLym%sSZmR-=q<!QfIxA5VB)TGzppxkQ3;gG`V*5NP`|Gier7y9UE zRFkiDzF%8bgqiIXd|oO{QaA1vgR$hJ;|ZI9ZD|9_`l#JWmylw=-#~WU$t$YyuO}hi z-|pp3J)L}M^2>iUi?!Z&6JI$2jyc|zoepF4KAVr?t7>`~dVA+=F~NYbF^|-pq{%$) z`|~f6AGl1PXD8_p1+FqAD%P#PD<(XLR5b3KZ&r7UUTl#Wp)R(+e2l-?X*m@=Si|R5 zeckQgtH2_=lVSq)2b3}u9EW9ZUmcBGJia>qqh^1#r|A}dbxQsuhk9>rQJ~Xfij4bJ z-g+w4_4!WsuG__dtPApL$Pt6TzRcGR!2{$RvE)2hF!LUoL^l`A*n{2W20#@5Y#<?! zZ=}|Hq4!HUVBZ4TC?;Nm+5W_xDr>gWWbB3W>wbh=^t3ZH@4Xg_{Yd^m^ZPlvIzsoI zgHy}v?`-FLkx2491U^!;gOhnbN>ewFCbg%7_s;$s!`M8!V$DvdcW$)hz<-=DIz@x_ zV_cZ&n7TE)Br^76-F5SsCwsbNy4IlHvH7g4n%(Rh)$xG?&V82BIV0<%!U3209K>2Z z%FG7|QMv`3jJ-YTcb?vJUW|sbY4zq+03tdiE*7v{trBE4ugqEjzsB=yWa2?`Ff|}} zA)#DOH<!T1K>{L3qQ-6B@!lrs#Xs!rFMLs(iY0dow-XpBnafR+ePgE9fYyz%k>D9_ zf%Dz(2^+T*dJUIDN;dWmdIueTn1l98eV6aFiswyQ(k;HzsXXA<JSKb^T&%FFH5@c` zn0+=-tawTq(q(^OBEY>?z=ZEjWkDR}TJ~bK$fHLh?i_tY_zhEVX^%!*C-WPB(4iLX z8;uV-%AYoJlO)!rSG=wv<~Y_RHtze8vH*=2CG@~N&>mYzt1FUI)8T&BH<o>VRE(r3 zGmO+8&tpC=(bOw5PVE~nx^rA=7*}Rmd``>8EcX9oa_fIHdH8>p$#=~)dut2(Q^lP7 zGPUZ820zF>+xXL4S3I1941?d)t}hwQ*Gv+$?W->xD>ls6&eHx|_Oslw?%_<|=km!< z4&S41>NHgR{@=I0|E0G+LH=jdx$d~!DBd!6bqZkulkd{QOS6P3rPkx)+W7^vscf`= z79C(V1dP+;A8wSIrdV@BOKSbx%d5NaaL#fef5FYl2NHYes-}~TO}~^oKhb617<6bV zyLj&|R)hD;grhnXnYZiU;yMH-yOrDKkMVkxH_Szp^FtO=$X2OWivEMi)-I2}VmQej zhs+Ln?zWz#oO-uio^1XXlT&9X2~2LHk0s>M3Kjc&M?CgWConm)fQ;er%i}KAfUW)R zViDk=hdb4ajh)xz$fr-ZaqHl}nQYrC^IuGk<>*r+7C9PGWfyols##}FoQvYVav;}# z9H=&?q4DVWr{#kzx*_X;?c+&4W@rP3<?X$>J~v{1|0yprHScMk+k8)dKEX%&&s?>} zo&J4sir+q+MNbC=%!M<02l|Dv+ok`F?oP!vJ(u`<wv=q){cl-RJN`?M=i{A!tGSV) z=W8Aw`seE<#dbAdeDzTC#(y%oer!_S(RZ@yKbX98v5Q;Qzu3ew8u0FOeDS`_GV6$F zDQ>_0pG+Q}JM^G;xO!^gwR?3s7nwtQLUW7b`k$L4`ucpUargRygL6;rvW<sBDV113 z2!DO3R0#ZoinCuew<}%y5uqU!(N_#j-=Gr_7z8UFIDPzEJe^pmBMnCxq8gy&BqZ4a zw@6;f;GooV|G{L4KoU`c%RGU}^Y91G#CI?ABjhsYy~q;)w)5)HJHCSuJgZm-=U>sN z3M&AT+@m^n>xndZloMT!+y@@x8X5hT|7Nnd3L}#W*X=Y-hghT0IW1-}^xBixp6+zo zguqaUP}iswG%$=9k<fJ47zTz~LSQflw8Z&4Niq&3Xk_Fyhb0H_QlY?^4iSND!%(=B zfZ2I^(_w%Eg^Gg;`x!R!j!#0;2MiMMAw01j&A$&6!z$HA_4Nol09D+s>}wo=^#qMX zV+T&i{&_fXc98nk3JK_oMTmD`(|Z2sf?)s}fMVlD3v|H@d*8hNgURH@a@|@(Pcz0c zZ!~FN5A_cDHy>v0#S)mj&Sf<Ee=@ljKm6+aFbAM0K@w|^gfbuHS_|G%X6!ReZH-oZ z=jCoS&QD<SQ6AG^iMs56F`0v+^bNVdkHn$~qK98FTHT!J_tvgiGU=f@1SV%p9ToXO zoUBOZMk(f`cy-Q7ofLfDbHR^GERFd8gUN7QeW@9tH20iFIGWC}Ozk<&_+@nlr8_lf z>U)`GxAsJB#&N|x4*}~{d0=eGq0%R=+-4P?UHs#?DsZse?zC^R?fm!?y0cUmB1BL5 zD;XTlLrzZ9Z&_0^%pLQn!i7)gcOOkuLCRo-n=A`Go91%bjW^&28ah)yGGr9fvNlvI zYpr9v=j#i^1-%|@((>Alq(JKjE4>5y?=Oa%aXsQ8a}U<}gDGfe>e2JIfR+DQxpVqu zB(BQ0SZ8L#`n37iV3mJk|IAL%>DM`mU5hPJ>gedxmNmUkL6iM|Pns>hynXrU#j1|| z-@K!jAP{itACw3V-~nM)fCzv>zW(Qq!}!1JjQ{_tGYatR0spr;V@44)l;PppM`7s^ zATL&?nGXs>ZLFD5Uz)6=Qmy$t%%erWtQ8rVWvu(rBcY%YT2#>L|H0i`M@9Yr`@Wwk z8kwP+p*uuUK!$GV6cvyz0ToFdLb|&hy1P51yG1|+K|n+WL_(1{qu<{?d+&44UU#o^ z@BQcg%VM#B1?%;Gy`Im<^I2q>+L2fWF2HIUml}<a^QA-!?Jrfd5;^hLbZ5O#s2ijv z-Yy&FB6dw~;`@BiIIGJ4rHNIvkH4ARTt=^PrR3bDb;fxjp=~40<ty%s|Cu<;B`%$Z zU?;V%lV#k*ar9(Bw4d*1Z+4!0!9+qK_%R8+c-&Qo{>yA#9t|-0Nj3<%sq4`Yt(vN* z3c>+5aggBxqTLKLpAJWPOjkT{6Nh98D)g@{;E@XFd)yXK`EmS_Pv9kq0S+eZYM52$ zu0EO9mi%(Epr<DIW6{X;@5HJ8vjxP`&)o|b^fp$EaXWouV688);@GNF2yq_?WL@XY z6F7V8vs?Xd6UUk9E!$f(O%Kx$C$TNg8S{4wP!qcNXX0cy)LiW3Jgr%1&igZQiqhTx zOq@SkKq;Zh=epM=Z7u|ZHOzZ0$r=h@e@#vQ`qqape0exX^YHR$bY{o@cvAAY{?>}n zx62c(y6*2EZ#5LUz*vv>iDx81EQ#kU>F;?ic9P?6)vveeCjEFwmvHsSZ1N%Y_xY|o z<>t?``x&q+Vhn(f^LGE)0#a^+om&&29ETF083-<!Y02>n>LjUUb)dqdaQth7A@K5C zf-eQYS5B)SS~_dRHq%bhd*LtG^-*BkHX8iZLl&f~m5ckR664RhaMWc!92=rO$oc^e zBGzUjPcIwf5<QB%9m7Uh$}_}gfB+Ho6;L;}0Z@YNXo~|jno2d*>tS=zW(V&;!+Sjv z-rr)~W7rvYc}8x|AH{i3vNNBRjodmuihoAJfyCz>l`Xg)9Z{7>)7h&2^$Bi|P~K)^ zi5!M$ibk7EZc~Ymjp?`_hpUU(Ac7nLhP309Lds&Cl?McEJ5H^ODHd?hm@xG|PRkoC z7J4+M#hrGTE^5gp5{|nwUXe$0D(`TnI!)T&{GK@*QzBNXG39LWJ!@qW7Z;JCt?Zqg zxoA{y{i(+Ey{yKZwyNTruX(i=#Q^Z0Y^m&)#*FW(VN{YO8qC~|n>fdYFM%JW@^k7M z&zKuAIQKn-vTim^^d$dUERQlb-&~ZzNdff~kE&$FT%6ZQAu}njy8O+lP_LtOg5RYy zF#1_^T3s=}cp=AUjRpVJrjip`QV6Y85P>oPmM7)Y3+G!bApcROs>5fHUa?rBiUQyI z!E0E$YE)s-TwxYlVbVIjRO9!f(u%b5-zJWuPNl``@#U5d@iMFK3d{PNuRCxPM=KT3 zD~@{IGycN`Zq)~dYOVCsx70<*RoPHXtPI_3sZR*3vSrtLGiK4!kkMUbe`Dg!lwV6D z=698&lGf^6R!dWvT(z^|#OhK<OLHC5fwQ;f+A4PS&z<ql#94dy^R%^(w8kS`YyAWL z8E)d#c%@JL`^3q<bL~G&9Qq2^cY>rouZVMy36eKvWoqwxnUSw%5%In6Sf%m~G5gUn z+;VD6`rv!z!v1l(Sn}^$M<4!;S>?1C*wthZ#U)+Z&*XlL=OL6ehK|R;OsuZ!-|vjq z>Lb+FQ%Doe2YGJSN10B3p#GnC#x44_^I@rJ+?~-9Nq+d}&UpMgf%EU3ag~WW>FwY< z&Odj?xQ3L{f9{NC(+z3doNa>s7ZX-B7I?34cgAmyllHhfW3~}GtBDRf$!ylBlVwG& zICe3;@rEfcHh4$w*ToFT*-P^s$zJsaW>$|5tk{CyODMw332p|RB6Xao1(QI5H75o{ zZ~%Z>0a;<1APHPDu{sDp^qRQJwrMg9*CFDvr$|4G0*qx|0LDIwG{^+!blcTsM0vkF z*aIwv>*;E~MN;-)J%}}jl~h{_s3S{q#W4P45wBCEpSB9QXJ|*bYOHADj0tsEL#-~{ z)+FRh2zI-{`c{J%1qLus!6IwqUYMjlB@)eEr9gxWvj#z{AHGDQ0lxEK$`0fU@MXt_ zoWf~oI_Xh?&vnq<D%_oM`Y6u-atlf3d&Ml|ReHWM<6S3oVeO7NPV41_2;plqKlpQJ zl$E}PjLv&F{k_tsb5}6(#%!xWXui@AR8_ZQK7IOeE<5K(Lw&D>(%V0>;qCj1FE!HL z*bXZEe}A?Lzc!XH`=~VLH`m401<t#?9WWBQp|E*><(ok8NYT@;Bgr!F<h{H<lm&i6 zlXY$2>z)rVTpdQ}c733kIUkm}I!cJ|+UC~17{7CMoH5h2BRO+1?SJ(hL)N{g_P&~G zMe;wc&4jp9Ce6RZQvN@Wn2lb1y#M1<rgQ@6zq2;a!njC%{%vjcG7|A1RjMNfUA`jM zuUh>_EIqS@hQJu}&UbCMtwLCT^8FP{I~fRS>N{sc6kB1h$^<Uk{)(jwIY%=}=%Bkq zS8fEY1u0Pvu9y)2h^56g(|^U%c(Rcb(0?VC5>u7^6-%|euw;M5Quvz!oLKt%3H0lK zA(rATS^N=8ky=4>T<gJS7bm(z@IPWHQ=<1GNJTCJCzjq++0>(@gegSul$<jLp!7@r zilyvE0@MGsSX$&yju#pJEI{BwkHz4RSjr_H`HxttsQ*mkWtxo%js1TXOG_U=p8Q|L zQocP*=$}UnZf)Kx;7%OFoibJVc%#7Z?Y*K5`-)E`mv_fMm11zG%(9}iibWjuRZ;PP zv}S+*&)UrQxvFW|`EzyK4(^oMg<G3z`|$V=aE}<5gZfdf%7cbUiGO><ESk9dU7NqO ztb2dPoifAtzqW1veZ+h?rw1vBger9$4)cHOI$`s*dd#@|**W&-KWlRU4Vatg?<uni zw>C>29KO1!<_glLAfxPehUf!{uwdsLy&<x@0rgr){!mXPM2dhLgi5@xK~czm@OXlC zZXKZ*9c#)s%{xVMU0IeUbaocIqMbOS`f8mV3e)9K7}u+P+~AAwFm2Y<QCk#SfO3+O z&)kDdpk_&9@9IsGit9XrklTNmUt}pKp;{*h%k?&Ll(&^o%G1O;Jyi@`J84yN))G5c zzZt@z2ct3yY*u(a*DbXbNpbR6F^2m@N=a{`I%${q?(Ml9O1a;UKPn`~Caej((UG`) ztNOR@hUHG|+&dCEOz~7WvAh0Gq%Pxy-m3-D+#|f8yi56UhZCC5)iiILPuMoy%X7RJ z+>>4_3orgcaX+h_-LGYU{#Gn|&?KesD*OOGf)%T|aVhBOij_Zmsf<-I`PSR3^5w>x zy*`J8al5Z<QX%M>vJrUE@2!BX8|oM2Y_|-nzt}B*zX$VgX#O;`tqiXsIF?{bz#2z9 zJKI|Mi6_b&6eAKy-T&shWkKiC-9c|VVhg;@?c|<%ZGU0jm*?1lU3iw8U;tT$mC`ky zM7X!Z3sZ$$3I>}-jx^;6_#31SI)Z~lw2n<?aV^pZZvY=`7q!Q~k*|1;Midl<!1R%8 z0>MflZLY5V3k5n-5Dbfi2lv}o>U1=t2_?Msk(3IB#>2_IJ56;QFn=_gocf6H*Fl$1 z+iBKc^Bik0>Rp7D?l4gqv}w#IAZtTdHM9wme%o!Z)W%Hm&)Ec-lXHkBCK3?o7!(AZ zc(LhmZ0JS!wCLu=J`HCm=6qPB8Ry}dDY%)ZUc#gCgRn8PD8LZvQ_?v32JZJZq>n5A z0^VSE%(LsdaN~!`tGt-xq!Qc6H4gmp<e;foX}Z!MF@)I0x*rKT>BrUv@1)`ECdyCB z295BxC77jlYV2t9=@cH#7d@}Jp`p;2&4cwGi8M$+4t9;bZ+oDmWIg!;>DK2g+d-a2 zbzld5LbrNeF3G5~DfLavkuJ3*0psb06c98LaTpK{Z4=`4>q=sIkZwfOpc5(UQYzy4 zLBbWU!Z(GImoc?Hp?mHmo<=8mPV8qg>Rmz<EH(o5ftTm2$W#j4_OsH9`Bp7)ad`!~ zNONLEu9{$SkDmc3NJJTmAoK~xnyqy?UiRxOPTQEvsx8yEpX8L@8W+h<70gp+v>4eq zSHtW0q`S#G3qkuY>7iA4zq6J?r?-W9V%eLg&CTqvsuHeM-S1vr(k4z6C}*jNYxFCB zCV!ta(ng=j;iW@NsU6p%*WN8CqY%a4j>nlRE`5-frbSW4WxzHVOJS0^@LFM$q<JCR z6=L@jUPDdISG5>Hn-;7K`atzmnZ(Y+jxB$9y1by#Mbqddu?|*qsDnenLvuem)&3`q z>+_~DmG)m;{c#elV}To1<@{@a?ht`$pE@NHOoP|<IJ1#XT}bkHBB)Q70N0PwKdfbi zH+bfX$TV}IU8f7VB_95Au&(&A`i9CIV^*MKY$L+n>P4s|+v=CmPPT#C=dz#?ihf1m z`-cgyjDnE7S84<`hw-$up%YlMdZjo_CI+V#2*EbD6jf7}%MXki6{9gvc@HMpR<9ds zf7L)2R#{ZLwWZXkL_xI4?O(JJJfCrUeTQ5z{dM06#Pr@Mp^XxPRvtRN@t_|?j)8@Y z`m#P|jdMh0v=Z~3SBidodvbojt*B(@n9NaAEf=gy)-J`yFA_oRacH+s9X6d70DnQG zcMuG<A7^1#FCk^4(ZF`Fl^>nR*PuWwT_y5+A1lLaTR$rdxq93mDm1z?{4QS64s<pU z(W2Cvz>kSS5+fTG$TzMBpU4bjBT(=FEBi3ZAgCsiAQKnNJ*Bq?v%NhfudcKcN~8Rq zT3Vry82qI|_M(c}_@U`*H~8Xw$8s1p`P~@VxFyloW_HEA$S^6zt)Rsm_SKqTL2;We z^?iDE8?vLun*8nth>MprF+WtzWK@0JeZ0Mlan-1d<jgn1`e`%HY$RNb@Rm=zsSy_k z_Z;SiQr2$e<~-5wxH=APx{GV=NqoYvdXE9m>m$+=X#u-?!uR4Aj|OvVN51wkEw$U> zyba*MQg$9WDA)XvvZH49*V6)$^CwFIyCbA3!>&;aIpmg_P7Cjz_E2_RH}~i=d@SkS zLlfKijOk!vyW=9Qj80w<uS;#Q^5pYaO|O=D-<yw(i<v2{C(gTLYg3Na*D9TpSC%4Q zk29YOvK4Q&TBA>W*C_WVCSOtv`eTc{f1Y#~LXXge_mVxyALf$0y#4_z2-*6U=uAH! z<I09kVy~qXHGX$aO)fPciPmCuL34T=6{&oDZH+PTf8nj9D{fd_>Se$h0I3IDm7c%P z4`R{3C$<&jlI{rJy76t-%<PnH^{Efh+%t9S8=UF_*BsRXhJ&gXI5_Qtt{Zqi{zxfC zAULO{PeIH6NLh|+M?qkZ^5(f50l^J}r<^KvRP_#2SLy86wo$@T<j+n*o={V4H9eEG z#-r|s1$n(dDuh8l1fNUXfH;O-io46La2bhGDV~P$S=;cM>8Y4;jL?L>5qES>mkUs5 zVBKMH5T&+gqrjSS(DASeKM1nGdWCAv1-PpR1sLCQr3}#rh4Fo`N{}>BId$ih41L^& zR7;D{@r>}}@^w0b5cNkPHlt{QExVP}OIE^AVo{scVN&WEu|8BuKEV!#KB$iYhClei zVCDf^3ir;bNC0XJHdfyVE@jCe*S5!Lq4z=_N!>LSU@bLoqt*XT6Jf;4T8tODw5ftW zAG6;UZG2rn&4=5QfTD;-afwID`<%>*HQ=c_HLf-7-KJ%Y8fEBX)3vgw)#IQKj)AH- zVtqaRs9Bvy6UAtKd_G6SPf1Y=8}m@qA+F78-~1jcrhs-Ijrbu&%_jn<PG{tZuvPKA zUFImbz%9qgd*fwL;9h><G&V!byDi@QD2Vyu#&z$+oQ8ys)R;gM^5zvf6BL}<A=${x zOC`}8NvKCEf;NtfKle^NkYcfINx=g6SUqk`Lzr!3_>@$tYjDD+*Uwji(|FTOraz{w zyfRgEN@UBV@Jpw0t>f?-lT?a$SR<J%Z4>t^{BGbI;}y0HAH3A*;ACoEcS$pf?vNYN zsxgJ4w{JDZFwD_=uSCaWa7SGrjA`Sf64NJ+lXlhI-w$Mlk3GMpXK++Vp9s!Ye-a;l zmL8&*q5mmd!<SN0Qt+KAPyQQ&T&Iwtr$JP_6l8jt<NEmbc@es7OcNvIw&v*_yg9+U z;j-tELy|dti1;X6y%N@(YPyU!_YFnCic)k&4!}*G70L7Mlh3XC=qJAX?+Bk3jb&G4 z3aO<%tCl8L^LYvL%q0u*^z(f1Qa>kJN{v%O1{#&|0FirlK6=#LaB9xg5acX62g2I~ zGpWY{XBZ_`84un(y-!NmNJ>96(gcdQdG2thjivgS^9CfA%{Os~Fk^OJgCjF2V7Ksn zVv@}DN4eG^=*)OCC+a*l%no7U%ZSjQW0}pKNs9BCcRqPfCKWX07q?u030kKANS9!| z8Tm_EZZgyHh>m-LH#nwU+j5nM&|KIli%*+R01GX-##*4AC>bYO>ZO=z`zq%eI$N`% z5T#L8dz^{-R8WC6FXiww%JEWn=_m`>Ec3A`-#RW3)-2ZzD$gO}dq$L!?WggSQUT*t zLLOQn9aQuQ-)hN$n{bwq+$KnsD%Laz@9uVl-zxvTj>@m4FKIH0DE2BVBu&!EEBxmR zo}Yw${8aow)i;5>vNyldvxB#S5AkcS+&8F7<fugbP05*Jm8^A<k423cZ;kjq@46;W zvPHquC;HuVRO)`YNF;K;Be-vqBDK8QpRFbrQF%sRrI*G^oBw>uGqma^)w`$quiHy5 z{kY32vcIpE6pm9(S)_ax0}~!S<PNf51l2(ibp=OtehoEFpaw`3!o&eCr-opzMC>PG z`YLjFf0pxNJ*({uON#8ut~5EUf*N8J8VDZMQpnUZ);F+v@e*cJD`s=cY2^*@IrhKd z+~liLCC)(Iq1K(?)nQ1||HZAT)wr`y+2h<GqJW3RKr|bgWjvc*i7Q#}H1_{CCE ztXqQTn>i7cgm;>Joo&Ts>a9DQH0Db2c==>CY}8nb!7gQf(VWljz}d3vkS?vA7a6|G zlq?(U@tufNe#Aot-tM2xRS1gE$kxE5wjkP$rL8tGVu3*ZRuWK?xeR659f7oLpQv9| zZdvfE=<1&1&K}~fTz)=N8RsXR4?Uy1M(=cT1~sk+*Zmf4uFlGxu0UuJ<rf-cw#sx_ zod`d}uF*IDYTwT8YIi{lWOs0T*1pVckciHBF4-KK)|16n-@s7v)4YB-8X)fLy(Ff8 z=HIh0&>D27FZ46B4go#*vga$lGBLk|;p<-V%ies2){gn^_(XsN^@Km4u4{*Zt+TJ) zvyV8aDcm5?R<YMup-FZvPdCvYV;v$eUv+5R%I8XbeFFXBI9pG3AW)&7J|<p#fQ<w` zD4b|R=*l4ABi!WD<H<kZ3wkIpCOrwtOZ?Ckw$Gv=D?`6Nq#}z^uxysp&KtVJX*$lJ zBEWhtXNZTq@j5ZJYd>{@V}Il4K|SqqX;+4i{Ow~Ca9>OK^D6fHuI)ESSd?V@qx$25 zusJ-wU15RNgO(&xE|#q!mcw5*hlvm)k6ik4CVOtjQ2!$6jv<kHeTRChvn$yf8GT7s z8N-?Oc}SIHjApOb*0Z?Um8U?qPHA^Y99-u_GND#5)@s>-)`kzbPLAfhLTa^pUydnX zpTq-Ag^Nxem5gc3_3V9qRmC{9_lv7%a)?@d>^{*L*+frT0CxaGt%yQDA!y=0BR8Q( zS0)Mhsx|`3I51sB5h^|Go;1PANAXdny)zpg#MnurKhuznygbnUIyphbS>2m6Ot{%g zF8k!rYnaRW)!i<5gexy;;IuH?luQ5c+3`qd^pwrz;8e^M$L35t+te$Kf!g&EVyx$6 zrNF#}C)7!=cpGoBA)qK=vWszQ`gmaail&k>caivTVY1(e!J6)65I~4rG7@Yz5JX5# zAs+Bojl|UQt_=!&8DI>m5US=|30UU)-R^U9CMaiQnWPb!KWWx)C+tsgBZ|T*cUkOh z`FqBOUTyfL!5l+Qe3LA~oQY40sfN+gi{<TW>a|JY-%MK707zyj?QW})+Z)rjZC;nn zS6NGmom07TtweRe{@k<DFK_NucYhD4!1m>oxXswOtrT=m<xCAX1+K6s0x513BI}4J zcPW(j$!92gD&-c;k7jA|Q)>zU2fhHWs_Cfu5i{SB(V%>Y8|aQUc^2u)S8Q}@tYzcF zgOM@UHG0;WSmMRQ)ArT?<asA=T<{p9T$hLC+9$X7MbU^si&?YWv990mJsD?!IA+=$ z#GSWY{JB(SvO{Oxywkr|-ATKVUl5?!+AlP3;Pdp|a?UAlH?enHnc~LZMZbsSkNqH> z>R>|L)%k!xWY*^LQnw8fA!drJnIFng6#i}{VEVxPZVTJJh;o0c7tM4!G3ZxKb!7RW z?B=EdxfEF*)rZd4V_GBG0o3jM+e@39iliUrSGNpbzugIZ|4{B7P2vaA+wYj|cX&po zPIBH;d2TUyE*Ua4+^YFVWk#>NI^7n?LJ_@e)>A>6xJ|0R9M87revPsj>$1)pJ?q!+ zL44$PbTk5X-yPE4B~E-3?Y6+tAMBjRL$>+}r87Hf`Jqy07MSi~__~G4dyna%N^L-p zp({b)rkLqIfBp}P`Wwo5+qc}|88vU-cE4f0v*dcMqX`_zrj0SKT<g1ikjh-A6)1Sx z3C~*}tm5Ab`?^6^KmPm{Vli+BlpGJf^#*bU@4vM>U$F<Q?I#|OR13^c#eH>``wB38 zIbZ%l_NZC$S#6l><ZGg}FG7gusS)Cy-Ignam2)dkH1N=J%jVf$rsB@j+BhUW{>1$o zel2<a6x?VRkg$X+2O7V73-8XEVR(7;&14l%elFTzs_^P9&qHbltlvWUouljT={lyq zY88B!loz44-jO9ky1OBMzx%HG{KQ}Xu;<ncBje~r0XgIG$@~0IS<K`T_do3jeRMgt zC#(0=^8C@34=B9kw$f!*!Lt6ociNM<biMLaf&4f-lewse(W&>u{XL7)C7D(23C8n` zw0`{X`YDq99E|<`D30;T%rQ|g+-5T#Z}WWIddr4oN38ZNt(VKUwov+V#EARcB=OAQ zJ|f}aGfDEF=`%Fpx(H*{^K^HPlKbqg3g-`A{u~=P$IhO&zWg<v4`kM!d0d@YGw;*n zFAmE058uBWeSSIq@^Z5Ga{B${EcSAq<@cie?`hp*eDGQJ%y<>{8{9#D@LY&KCFoZn z3v!K=0uBc~^`^92yt3cEI>cTbvtUo;v8VU3=g+Y}Ut%wNvA_{oFe(^AO0DdpXRR1U z%p?(du4khhMImT1=yS+26w4&{3`%FPt)9fGlSe{ly@g5<yxWs<Xt1N5CGPfaFw=1N zcAi||6_nm+Pp?2FmRTjs=#xQ-PVTK2^v3%}6}U!;p)BLiCN+1vpTQVR4$K<trt(y> zO}<#PxV`Op@t+$d0^e7hFqj=$4ZI+gFZM7yvKfwLk`EIQh0MW}D3phD%x`R6*Tu^? zK{g#v5eNj{LeM|j+KVM~|3E-)HY&f&fTar%>oz}gf2SdM`CVj(#kr(6aM(LCzbJu{ zNpjtF<H0sb0(V-+?ay1Iy*u6A&+)%e^s5OX%MG!wH`;Wzv9}7>ue~q)@qF2QFJ{xz zd*o}ALzdo`vh&f^+Ct!!l86E<{4-B$+#bKy%@mG|Dt3XZ_HXP24y$@av$w_*UP0{m zHds!sK$E330sDt9e=mMlA4niDs~c|XD4Qw)yFr~uHf8BOD&e<Q=SnVb9q<fgMIER| z#%rHPgeIn3MrktFx*muMGzKGzj#{9EGCA&zyd%$>Y>B55I-rd@DLLw&2a;2=iHRhe z*%~?Vzil__HfR@82qP{@_;nS@R8FvEcqE5$U<ryBVg?%A#Z3lU!b4()I+7oo40YvU z;zs&voXtjtx+>zv#-?_E8zsbzl^zr~o0!Emiksej3i})+;scW~vo1|~WcDCl#iSIK zY}aD$;Ct!Cr~0zE#iFFns)-oyEbFw~U4aj!<1)h8T1%QBwtpvUlrf>$-06hibu5^t z^`3wKLK?@`&l|OcBsF{Ls?Q|pMF!)xVT5n}Y3ykm$W@5u*}0YIm4;*W41;f?6`X5` z5?5WMY!gWtz#LN8H$Fv-@dR!g&lQn1?C}miJ#Die3Tay=hWgZSh%S*vYUG4-{nW!m ztKR%nNEyawQT#IOrgM4eJ#B1oMx;TIb9L)Zhf8fQo{Ve#pGJu)RWTX2=GXR}ZmsXb zWZc_#!<L*nz75Mf?0$aJ?_s*v;+yim-(2fEJ;cu$tOsfC?;m#HIZS8{a|;u{i(3px z;fJaF&1j|E{1$O9;gk|}ve>lm`*qP}{IWD$&7#Gn$zl9w5yIg&{$AeQtFngV;uD_G zanZW-{!B&>_gCkGP+s};Fjq~Y)J4O1r*Yj1x0w<lmm`+Wd}dPo<P2=7+`IO*z02g; zM^}z~ycu)@dAXS5*YWSpO9wa~NIJzPUXEyl-L~qbrBm^8mcbaGw^o0CG3d$C9s@{t ziKd{wvMc#PU<ygJNtc>fB9Z`&o~y*Lb-ItH$j_s-Eg@MV5r;NdkEuz@GsI_|>Bo}1 z%wP3BbTv2$bC5$dKFbbdk>u=g5OR#sTm{J{(jIZlekK59j#-c1hN77@n21zF6OP-8 z<bJNbQR7lgNIds&Llj2#r-@$g8yt>QZp0YhGabO}>ES~4$K-w55|=Z_*tfIe)Du=v zIcOnky`cHk9-0iPBv^c?@;HQ5T0_%hKFRgYHfO$sQiGg9@=NF)E(K{#gS7dSQe`_n z<91Dxmig4$P&)xTX)TN8`LxzSJE14-TK7(m{qPU%M4}Bc-)wFJ*$f(ZQNDDrI{SEr z%|7`AX>zM9C};tDIeJ~*raiHWfIErOUMhZNG&AFf<<Y^Y7@bPUbIRm+hVq?OAt1?l zdixH~UIcu}Aqiruz+p<^fXerJRlIS7=*C!(-Yl<P*y;@qejXxa$${xK)Wdu`4nnwP z@Jy_S9`_0(yT<H_Uec8<R9M<vT*W+v6K$)<`NHWQk9ugXN0KN9YpM3|d4I;~V}-s6 zd$pfCYA>n9MK%`4G-Ep!Uu~z9>kdU5#<OV@jVot!w(}U-nX^4~-!4-2jc28*U@gN% zaC02(s!jh)42;sROy9<E2Yr}+Ig74gJ>t=6b4qRwE+Szr2Z_2I#&`FKV?vZnwO%xI zBu*M~a2mK`)%WSBwo@nTTDn~HR9BN=iZG0{G@8nGK4^lzg)ld_%7SB+!gW40viOA? zYvszD;jhY$x2zRipJ<gYeqC;Tr;yjt@bk`xcSUtWDqk(bCh8w0LCaLGqmAUq@5b|p zx2IZuxxM({Z5k5Os$)IniR%O;j#}c1>=NRs^htiW<j&W&P^Lw&5gf|g%FVe#;I~k@ z#O3&vB@Py;lW!C9)osvg=WVTtlV)=CwImMTz;P>muQe!5jgL~KfWg5UIjxZ%hue?R zP{|K3k{|01QuWvxSFc(m60|ArXHh?uY_KezKJ-|;+xMB7R*>$7KB)W)e-vc=Lp*Xr zivii^V~Y)-U@IIPg^7sj_wd{DX>o$)RQghjKj#XXN~aQvc%{8^O&5B<UBGvGTs)hT zEKaOqIZ>?fnAi#p5%A>*2|m=7a82Txv3=y$@*qo>%J${#GP?vy!{Ujeg#-l#%H)9p ziWa1UdnjUrH+j%XhR`m*B0yNML2J^ND_-_BJLA*=8Lxoj?I)ilX>Jh}1_r;+?pkKY zF9S3+tzL-X^j*$~mCuZ8n`wFq9Qbe55yuugae93)j<GpX%LeraA=_`hUf`F>6sVdc z6O9|jX__sxORIEpG($3i#VQN$_qp3<u?^Rf&cksAnjjcLX-7ets3s1MTIHZiu{qNr z$My9=-!Oby*1~pkWk2@mX8Ph?b$m%dzR<zxfAv6XoQZt?S|1+6`_W;+uLv#?R?@q( z!Fzn9Itd=D?BDVcL^zh`ff@)*Q9CwHjN(cUFIv3?dOD~B(~nT}<Y{Lz)PcvkB^UvB zKizIBkkJbUg<6wpq7LQpYQ9AFiuEvi=0T~}Zhey`?F*%f1lMJXf4cW82W8mTN+43^ z%=MW4294j`J(`me;6~m8)mSTu6&ftHL4vIV#cuDv%o4bi^Kf_X{c)2Wf4K-)XGCRx zch_VWMgw=%UlHQXIuwX7a1e>eX{x{cIrWl!0y?WmZ-72pu1)&3iE|w`p~K(=SoDu( z?vLMy4bdcz`-$@EZyXvrJ%-X*kv`Z1GX!t=e|+WD5Y$4r{mB50l<mhi9z~y4#*c5i zr~<_lsJ3COCbWzgUv^JJ{h|REVu(8bJo5bNNAL5iv-emme&6k&>xp#?1Q{eFbFv8{ z0QE#HEk+JT(r5g$Dwno4fwpGtS9oyt^-zD>BN^_4Xq3sFIufNQl13T1Wbp*6pekYo z>x#alI)>jjfjbLCbKfKIUHgZ4dmE5^rDh0ZRwiRn5lvMjG?b{T5yiSLILZz%G7@sj z67r-FvKtNXQONUE4G5f23)<%7`bYixMR41oqH&=vo(DbG#w9eE&7>WL1s|dk(9-!U z0^(I1phm*|vizHhgi8EG;(CzMKGe;obiVPLA|#M=qb8HKEmlg(Z#)V`IauV&US*|_ zY}P(PAIWeoT|iL7ArP4utz2d<o`qCMG!uCSiPB6~R4t0sBx%pX^y@)6Q&$){H#_G< znu}=3bouId4<dNCl*~hm!}|w}DTfJc(L>Qu%(BB1HiQIqui{2=pVn+2ngu~NWo8VQ zW+=-g_NLLQ<kg`an^bcyl8hE28#~344_TE530c_G%qj`DtXjPmv&OtcYA`%6t$O0o zb+yTaWv>V)8q|t?r7$aMD}+&eE2=NchKtnuV;x6>T{9l~zQQKcMyMWe#p}gR6M^98 z;Y91emBL7p&uF24WI}L9NRfIAT{$OEw<<jpyEl?%mbbh@$kzsNkVGbr4<`cc&k4rU zia2iS$4;^(6O4)<=L1A_XgB5b#W9uSOMD_Unlcg%*&j+GP%W73O*$Fx>>sG(&?*C7 zCGXvk5Qu6Nn80Olf7^_zFCtWj61n~qYEd3aL^hmK5KUw@#sZ@)j4{IPB=Ac@Hvd=O z6qyMjLvuF?i~P~Wzu@#FV0VVds`-|<jj>#$T%u1&EDHVFTD6}eCHWwdqH?0xV<;Ed zQkWr~OE(p_*B&d?FOwa~AVNX9P9PwnJ)aUCZmxzcL+K=0Nxn^qG+U48-6v402rB*@ zk<URG3zeFkEK3Gjmq;R2Tw9*2mxT~d#)?c&NJlz$bXFMAy;n{dz6=iwP%3&wDD0C< zem?B|s4VWLRBTRK_(YJ(`e5a`&@p9Xc|hs&bMVs>f?(yD0owRhsNfDOuEM^TMT`3) zY83Ya{~(FPFXQ6EXpQ($s<P@LFo~=AV%cWO^jnfvKeb0JYN`}Ur%q^mydrBf^?F2r z2LX|<G8>{@33mesJ8}pQjI<JGQH*YpX8=9ZLgZnUz9Oh`zk;xN>&EnfcAlANyX$;G z|Ga>B#XDT>8f;<0U|586K{S?^T`-bQd?8ZY&M-`LN<xsYD|A7+*w8?6Ar4N#T)iOo z(XiJu<yN&ET_!1?05z(*n^oK>sNkBg&f<?>W2%9Ca!h*a#fzHFi&}Ej(nCg;tMfWb z6#<t7q{l|pY=A10@!NsvILw@k+|u3PUXvf9hA)=Pi<c~#m+lNLB|BDHeq6fuW9dF@ z8P_pk^*ioAqWu53QyTtSY+3%gQ{?}<?v%+D>;K14M<@ZMBHVnV>K~LpIyH2l<?&yX z|KU40(cEajht|I+|IGSElE{!4HihROlwbRe)juddOE~(!Lis6SAO52Ju^rF<p!`z( z(BVHQ|0?j`M)_+ekvNq9c>3G_J<7jl!a_|ysP@00{Mrn8{~6^Upj7)mL;3CFpfUdq zl>a}uQ*bE%Uw6u<q7)P7PsM-TDLLNzpGv)^fIsdO9Mlo`;RRpnMfHE}PRYLK!7W~w zP(Khn2B?w1vkw|srTynEX0zH|n^)f1R@KjUC|Bzus*L)bH^cms+Krw>?>6(X$|Tgk z@5tV5+p}Lw@6vweQhWRBsZ4UmFL%z&^q)OzynSBo49No^h9y_XdBxt>285*X5e81V zE}~B2*yX7U-}3WRShPRz%wPW?Evhv2?$`F%L(w3nNf!Q#!*TK50K~xcBUg?oHeu!Z z7O767+UXkV*rsI7LS?~DEj7XBEWKW+0>lL*hqKr+IJ-`aIp;bo$XvL>-`o}c39LHF z8~sS0=&6RUab?Qo-hF>vmh!ExB6hM>ne|opncs6=sCR}Y&Fy4V6wPq3kz$iu+B(a{ zRLe@C@%6clVe34j4TpWf$GYBkEPj^6K6vb-XezvY^hw3n-3BsM^K}h;rq7(Rm$Xp+ ztF!z8$FBm6VTH&y80?|J_;}%)E*(Gl_e;dMlHg@XOW}$Cx88xg6ZxwTpSl;*<U0Zt zJo$^)4oft3lYU9#-IFaiU?F~PMk3(R<1@<L+*|Tvfw1$dY1P@rSAJ-yA>bl`3g<X{ zfb~aw3FAt;8shWs^usu{^~n(y*M=nWSwgiQ;KBXuL%AsFPt7EHDETU0+`nn%Ib7Uu z+i5mbvMGk-?x<3Gf?zm%CT%Ge?ZZUXXCF?fWKFi292~@GEup*~L7q-q%w%vBrIllo zR8y=XFkcjX?~;P{mHIGIY<<j&0_4xDdNd(3EX)xH+D$wdl3qQE^QqEcIvyRlHE$R6 ztm%#XH0@}EV;r)YNP{UzF=$K#?X53h>rms7tokhMZfHu8b{0V@vd-Z->FoVHxG1?k z9uFR#K_M5_t1(>4KytLDU4kebr-8v(ntx=mz|#vx3vyUo_dKU?xCYZYVWVl&qiA92 z7g{!dEVh@HuVbVu)$MIF=O*p#>dJMlvzCfq1MDSJA8SX-_JPKV=%3VyOe;q=<{lQQ zOK&+*Z3iU(1KM3+3;mA`^}b)05<~cA&jg||cQ@@7Cbni?^l0ELwq-brEsZnIV*3Z` zxcg!@_Fj46bLTSeckOHmekVmd#l*@AJo72;ksv~JxmK^O?nRT)lMt~84Tp|I7_zUl zureO3YOoM`kWwl%|8~uWexV5tEmI#NFk){oxH_mSk&N9}iPL1u@LMXk7$PvNT*c&H zQ%)Dv=4W_y6Va$RmSJVbpA@!l^1|$Kp=GN2-H+q13lEyg0^dfG4=3ce;Zbv2?-4xU zNqPM$37T5AJq9WX$$3dH!A|5@^1yV#3^TjLPP})3I?dvmcjp2TpxjK@WZ;bJq0QIl z1niYN-*jX3&_!DLg10_rtS&A~NSBCD-o*#6Bo%P9<=x~lNmxTH-fTs78-IEDkbUiy z?Gsf|+Zq*W>2>E%5)u{j^G`=KG)`mA%3X?g?l#}4n4$l{;(wRJAK&ZEC!tRr^%b@E zIK|)J&3oOm*IsEs>Seggh5~he5k}t)eIG2gqPKt7Mk(I+E^LOkqr3Y-==-8K_`3@O z7T}{`HSG`N*?%myo~AW=@4`s5heRY2pWT3s(yp})iZy9i*avL=zBCn={aXLOL-}td zA_^zj$jy?*`Ej;6RS!D>e>!o6tA<Pg<o_1shpnQ8CNmXHeLmz;DcgrN`OKibcV0qt zib(|0W+Rx7DO_^)R0|_-#l<~V6-Iv2G#v-u*3;k@{K7Qt`Evnt?TKO>*S<ma&&9Ia z%@w9o`zD<~m&%BQt2Q46<1!aHd@io*(&jqrrmZYgj-OO*J=%+1@m(3c-O`Xgbr5~p z{-06)mX_A3FYf-o)@t$&93K&VT^6wbMH*=nj(<rUQ7N7{c&3xF6`0LA`|I8LbZd_e z``5sU676fes5oJ;$MX>=*fy0Ek7Sz4lO|^q9^W>|efuctPC&`;d*dMG0G!2Eww*fj zsjh@u0w^GWQ|60QdkAxlSB+2G$6S5XUFmB$i*3MYO3%eZvv(AUpJlli4=-lkH+;>H zFX`Blxas6rb5cUK|MB);l>bM?o!|eU{L?>bOdU4wk#(+&+&*o{{(a!6+qwFh`80*Q zWZ5;ob6r~bxLpSJ&L;7PnrKgg!`knEEVg92_d-G!uX)OB;w-kjZ#soVWjf#MYy}P9 z$&>Er>Dq~g03y%V{W3B|moj@UvJ#%L`U!XM&ka5eE_(K(F24J~LHF0{+SO^>O!wEP zGr!*bx;pD4yVV9k29%jKo|9}!AE(b;?#N&-X1VLf<eA|A4jKIkGa`ia{e1!b_2**# zKaCowY#94Dto5U_)xWS-{-h~T%Rga8Uq^8k>6L%NjGT3V|JTBduJl2F!i-)DRQ?lY zL@bQ_6K15yV)cGnPWs2!|9^xTvC%622Y+tNd>Yz2R+aBRzJTa8Hh6LV+zNe2LE1RH zyriUq9E!zM@Ws`XU@1RWmOD%GSChWwvx9Wx4f56W;Z5w-4wPu})pIFmeuRuue-@~o zN?ZIKO&37v7XA8`7G;B~PUV+Y4pG2e0TGj}-y)LlBIL7Q^SQ=)y@!Dv^5rI_u+G^y zE^6TPX#6kMT9^Lr+GJrb9z@%@=?9l=?JJc?;-lDA@q>~<c`C*{>N!?fPgjKi0Z|RG zhRU~54QES-M!v0Vu6no_{810jYs&`{JiZ4dLlS2s9JM!}QZ~&f)3`nMJIPz88dfWf z{2qRCT+viv7&0X0Wh&`rvE1ib-K>d{)cX;m``YOAHN6npTkC^g_vxBglHch|H|&<g zy5+lnVXaS1{IIb*>+<A6xTpdDZRHO!l7FHGSQv4T(Rcgv=pfTLtDReS<0N+#lKjLW z&J^42J7uLknJYGxf1?I&BUu_=yZ`zk9TevuV0v(kgII@9A%!^mdLIf>JmVYSdjpl$ zW!#ZY*KN2^_~OOklH}Q?vg|LR^-~u+ma22tr1$LSK?UFBly_#{{QkMLMB1yoKZApe zOq=7eSI@>~uvnl={WoP{FQ96V4wq&IlhR81NuxDNv$em`5^!Yom$<`<Hnc=na-fb0 zJkG?M^3*;Y*Pb1QGXA{wPt*Whf-J!Lu?SD<8D~_e(lLg_+*a}C4-Z__0GkTd=9~gc zh>IFvq`8(Hk<W>PjP!EG$O>sG`SgxlZg<((m6Q$rj;M<kJi@F#c4Qzbf`W)q0IkXZ z8rpQ7)qMRn<Ld~FSjimHQF%*oU0wAivu)h^#Ro;@h`w8KhY9EtcK?GiwaD%3v2Fo{ zY!D{|f*zlp?F7Smb{?-&Bb-R?oXwRB9@mKbm?VBw#HRI$wb?V#q_&HU4@;Y>Of;YJ zO`lVZK2mFf0|n|mU>7kTOEM2rPVY{M;f~~`l>DlnL~o7~2rnA80VT5*QmzQz1y8yN z75ipe+lvab!%6{)%uz}Q1x+W$2h7vC5WeD@RN^x?5)pZ@{$2SKX>5XD%UJ4*O^1-A z@JT(LWImW194wou7fsOQa8*R~C}Lr@5suKO`b|WgQaBNQivvVFx_8U4StnZLaSmaW zW1^;oj;l8X+t_!WGUcfG@3`bmKD%VkebbIKcjx?DFyq@Un#h3hMO8JqbskBL1-iSG zPc=AkQ3IMw6&61#%%=VY88r*rUpk|&@hvx`m08;V8)Wq3FV@QK)ZgB~4f9ToheD}E z<#W+U?iH7N_*yFi^rv-d4Xida6Dz|vPwNw6|G`=<P8%}*V678xru|MEF{EGaOCWJr z>uFP&PPMb?#OiX#X>(m{wX1{H|AdUJ!z%7vDA%=Smw!f8d?aTC{;!bHzp&ON8wEM@ zG*|k;PA$$+xgo8@<Y!{+6shWdtn+F+wl_dGLmzVQy4-VJeq4a3m#<n@I1Hgg#a<Rq zKgTx!o^ti|6481n5QzYI?5I8hB<dLgz6rYA>Zca!3+??*y+d*?h^OzNMW}~{6q&xD zm$(kPVzq+k(GKw7)hi4(ZxUi(^-}y0zU`?Er<3<V-o!h6F);u@8PS0Jm0E~!mn|u_ zb%>rzBs!DAh&R3w5Qsp5h!Vggl$dfneKd&v5KKR71?9)|6A2}N>EWzcFvLuOfM6D2 zp#@S2@jwVw6u|1!KEgZ-B5_B7kOTk$4XU5CU=~0qD?p(hVno+Af*JY%7zzVG(I_;7 z7z(%!SAd`~1JDy+2z|>TNIT&Ly_6M!`Did9krf1=5&&ykDdIDVybxH~0GR4Ppx|nN zA*GMlFhdbv0vSproB`I~0EmQ;Zj=!lEK(jp7;6-u?6Lx+?w}~GfDmGz4glH)lw#|l zUWJ%7Qd%@o)JAYd;xD{huE(Y6xYWru08a=Gg5$vt6>DkV^PqwNDZojT-U_6q-skt} zJPpj)53xfG5Lm_}5>#3dk~<E-vQQyhp%_9^?8*R)0Aqhsk`;`P;>5+#LfJ@AgaYtB zFp1SZEoIO<$`wUO0XmpXY=fB53{B923W9l95i_FuXZV>8c}S2%l(YaGU3UUHX#$Mv zP#yQ5q45_nBqKuoHN+b)=q*=>?WFoBy}rO;DJVkkvw?b-jThI9P#{Df_=(TGwAA<L zeWP#?ej4Tr#ByVw5z`2xu7e?He}nOT9z%!@J;Ap3pl~z_#LNUB*R5~`f?$%gX8@7F zPXO+rfC$cml->9__kkI;!&?{10BnFW9y)<U^k6VuQ4ow47i64(h70t9C|-_&=&kJO zIr{KvFhQV-_h^K`<_D<y4eSZN4M4JJ35Fi_A+EGGpQBLFZ|*3BSD%xXa6U-L3|y*@ zc@E}ShcV6qT73`k(U5Fzbnx(fGHS3I%7z{Pk$3{k5OA$u20`ILOd^1U6$CO1y0_tS z-2r0Qhigs%w2?v7KF~*L0I@N!>iwKX1kHx@*Xje|15oJ=FcgjZ{{XtuLm++N;8QZn z1W2AY==ug)Isw8c0$i$r*f8Kc2T<@1nAig%jRfO+K(r3sCHp{X8=?ArPU>xTY{(Ey zNk~~!h=2%S6{dWL%jyo7=dX|VZ@1V<hPgxSZAym2Q6>PcpW>b=Kv$<18XjQR@6SPP zO&|i0VeOqq9h?C!YtKEKM?T@sgO9Lvrb6~WoFgFQ4HTT)jyl)~oZf%9c^}_95)TDr z8CkVbgD^avS;~<YRDci~3|NKBhlP8d+j4qGk)1vuJGI54Y<zvJy(4U~%{Eg$G1UaI z)8|a|JHA7-Hng+Px|OX_D%JvKc5#ETAI@Vxti<k^#mS!8d|Zho1VH$G!2)Ff3Ksv} zEPh)mj)p6aemM5HEpB@y{?^CXkLvN;5djAd@x<cyl^)%LD5!2OC2W68Kxo|mZVcae z0{__@+q7pB7J<lWOGNrcU{m9o)Sn%y`;@FiCXPP3?;RmTmn3qLBubdXPMDNCm~<Vh z5iMSx#ByO5b{@gGoCw8>t7*2QEQzGQ9=D?&Pq_@dcMO17+x~I{=uqLmGgOZVj4qbq zVJ&)xA5($y6pG>a%k$XVpKSVyVr9dfuOa{<3_!I3P?iAKkntzyX~$Cb_oyQd!tXFX zg_5EH{zEceAc~pSlVs<<TDu)7wKaQPFrS`{O-mHJRUi!WjAO?U)CUSPv8rjaBgKHh z8#V=z0Z<Wu&^zmb)AOR)?$fYS#G4F~Fx%UspqPvMkl7a<XJln~NgO*--Kqew9>A@a zUSkdz>Ve&*07Vb5`YF^_+?;R&^vndX@P=BXA@J(}J1!7A90bO7*I_YW2UUO^1tHf1 zgl8dQb-oY<fE@*uL4!aZPy;g{YYc?TRmaDGf4>2mcft4o<USJ9RT=``b;9;}D35{| zffpvF06rWdP8$lGk<nnFlxRCi4~VAf<I)STA`-YC8Gw*-;S_;#nn1J@te8Y#%@R;1 zJqT4DU<}+Zr-8Uf+<C|f+(Lt@BS79Ixi%)5${2g{L$FH=SO);%c|iF^fa^XWO6o_@ z1l&i!99*zR%NpiSK`q?wox6@fyzZ2TzFJ5ylb=tTDRg-`e_0ilx9b?^4VvS6oLTCT zY6?xn2ay>8tVr0+U0Z(#5WXJRyiS)11AUHt?M#gU%xArcPyqwd0NZ{<dny1yLp+uN zDUqCq>TtreKo**p;xu4~Whesx2#bJ0vw#{BD3F5VrWiZQ3xb4k)Y)LnfM|TcsP8$r z4tjgnAJ*p&BmnvVAOv>@pFK`Z$1Jx%fxapf0L1M2o8bef*--tu7YP#4kOc5;E9)%P z97abQP7xT`BSvZixQ2o54SU<^L10MGP&xocLllsJek%N9gn2;(NcRv2sY7p}z+Zh4 zWIKU;XfK_<BE&3|y$+T)4^@U|DA$1n9E({o4q_s}jSa}nkw>3eU_yP4CtQz}!oiNp zkMXTS=e!|@yH14I*AJJ6J$Q)G`m;WA{EvTTLX_}p)Q5v7>55@>Fl9LIj~S+I1@2q+ zzUJYr-REMs;cQ;_w4D!>w+Cevu{!@j78(w>_D`0`G-ri_Nj5+s4UcH88SzBG>_`xy z6^LXu#MK)_=mElt-~va;5D8$Jry9fw_VhdDjOD7g!@+VqZblXW4F;^L3QCH`%~Idw z*MNB`P^<*xF=P#f<O|jLG9^xP<|R4MCxKkPxAA7xtJ0dA~<$Spuz7yzfFap|Q$ z|3MbN577C5`9uJ?mF4G^XCsxWWBy$kb_wdI*#z)FME|3!V*dh103U5#-~(u-Wj$Sf zu!g;``_-0+P_-!;dq(1IO%fIWLFVYDb;nD^SMvaq>IGOhL~J61125{KLh{^NxPWwc z!Cutt=ld_sqg2!40;G~ja+2*flcs*9?kcAs@>ASC#lBaM)Avo8h)#fMq}?-*2e-!& zTctZ0#ng<(QM<<d_OZ?#jD>zmbMlS9@7q7&A3yS|f7Q(VPD$h=o^H5jL>NJm5@SlD zV++TdJ`#b13ZIm!3p;_Gs5G9MC7vN}-z0j~=&q;$tW1&(e+&PoY);kWz0=;%vj`!l z;e?ew@i$5Ne5SJDAe$Bt`yrq=Sto2_70J+zwR2`p$b*UGteO=Ij`c_JroJ<?;lid_ zA-uuUgb@)=pc{HNi(D;_KLJ;%9xy2<8}9^ORq$xK6<b|C;bA$MJ=(uZcdjyyV8c6O zawt5jld3O~>lENTj8n~w3whdEB^y(c2Idd}$VJ8;GMdV^f(?+-p}bI%ghYz`$nuFt zO%VVb(;6fT=6?!OMuHxePmrRYWj_Vnnt)I3Y4=qDYGm}0#!VO!#?WCZ0|))c1e4%F zwJ`oA_z-+FI8_bcJFLcogEC63X*^2i@B&SD!C!un32d}Wp&^|9Rs<qXZAt(eQ;=OB zG|&`?ANR)UL6|la@cMvo3ozj+&{PRXZ8+oUfdsmN=Vx}$)vU*`U3R*M4r!eBQX6)7 z8z9*}0CfqsQMGqI1v4W7_CxS?c_4Wm^ifOR7mZlvI*1Ii6^XXzZmq{dE#aPiNCuD$ zydKXAG^7TI<9_9LU=6fR*O7ph<a2KeU)Uj_wc(2$cC+Nc=qEr_01(t6d&{B*%?IPh zyN{2a^V<dPZ8S0I)!y3xv}awI&zp!mnukxFB@X9$mO-3)cy3PtZV{+=DYV`jP&y>D zvw9lZ4S<o*8+C<gD!?r(5UdZlaacYrfVh4}woO+rre`020oFl*z?emFA0URzTyt7B za(iSg2sqgTxYz^pRVX<MTJ4($^2jv6_%mZ?p+^CLDG+FILFSMV0${+9*M3jlz7#?} z?xyj5pVj+IY6YVA%vi5HZwx99$9*?JZo5s@CU}Ok-sC=D&&)Z(9UNf~1nfG~n}H7` zq1O@$66k|mcLA;qXiZ!BEjZBi(HOP?VGx-IA)#fbEmvJoc1bVJr(UdQK4KzWq_a>G zv?dH=PoxYLZk=AxfsVWa9!lh}qM-D6AY=F=;yREyJz#(a@x}xM#5Nr7<k!)_pjIW? ztuu;}?-SBgiGa6?vpwv{mEKtQN0LBQ$%;4z3fXA#J9`?aW)qMOV>%?`5(#=7>6&c; zd6*Bx-vxhLbq+jRVbTjA#)`~Po0zMb?Bx6e%Zg;sS=%B!p!R71jT!|1v;AAsM>Lqc zFHW|ETp*b`2U9_iX>2`%+LEvpfFxeD9|j~H!1rS7$>G3tG(?5LdS0RniUMn#TUqj; zMUYJ;yZMqRrxrpZ>a*s+og8Q#lr<XgH+^H!xx!8xG)`S!Z4bF&0U6n8`s~*XO#oG! zxQ?2Dd+i}Z5->Zf5k7TXyGm|5skyv{^{X*Yy15Z(g4M;44T;_gc<g?GpLLKqwc4_M z-Whce@4fEv;IHW*HEJ*^+LmYogzuZeNEo%gk`&Zs1DHHm_i?zdWz9PKOm%F;rbU-M z)9QK8@h=X0T-4;0%nMETc3r#w!P=XLCH1!LzxP^z45EUf;*f L`jxfD@VnnyHm3 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�ObQLN&22B1EO(-*4TBq7mg`_{b>$n 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 <><c7Oakzp{5u^_FHr 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�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%0DmY{N<j-nZ#%bR3-_E8g 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%0D6p2#v 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%0A?Fn`RSybr1fG9>MyX08&EZ^eOTi>7rx z`@9%)+@rl0fvkgob`qI|yZk7HjWkMKfSKI(zR5o)s)Qu{0Vy>aedJ6g>lvlxdvT*f zVj5m{_wPQrou2)SH96v!T{3~OotmS|OOoZ!g$8vK>AgX^XqxEH<~WsQ_i16VBJ1=L z;dwU!2Hj+(5P(PQ37dwGZ-vwO6A&YXYA;^<Ys=r&DHxu-%B=d#$Lx8QZ61LuVMwep z1Lxa1@+1$)WSe{PeQz~sgNI-uZ6^9Wn~y4xzh*k1mBNPMkvr%hX~7uP{3#v~5SN5h z$c@JyUet}cYpfdINsbr<nT@65A@GV0j9x_*M<hd6n7I|MY8z~}M8pf=akU2I3a#V< zCWl2rhPhZYl0oEL@d$<LWSwB!<AVHkyuqf`Wim{>h)dqC!*}Ib&cB?f;H}TEd-8mp zp56uNxHR+qoCofN3i00jw-cqG+mq%03B|xDXFvqBVDYqz&)WE$YoCy`(e7NqQCY-Y zdN%R}s0(s`f#u{NHh1lNy}ZxFQ_B;6_50Ew>mzp}u(wSqbhgPoQ*t!X^!nk|Hwp!} zf`7d0i{n09`ui!3tCCZoIZ?l!xxA^!p<$g-8#{()=ej6;fq(YDy<I<>D0K@W{1MSM zmHWl0G)k+r?HzA~V>ajszvsrV15C;r&9XlUjAnzZhH_gE2Vb2u8{!<kzoGt(m~5ur z;o2}gv@!d=d-@rl=VFF_lP#n9h;V}3cJt25ljfu1e=^tPnaelQby_MK%#GUL_q-gF zZ`<&fljvi#7*~9wlQDjBviQ5+F`ww97J>P2_6y3Z$tRzwe;Z_ear$s$X0kWkWNT6@ zYCO@Xb*vvh{b;O^@rnMV{nx1nkHRviF>R5%_Y>L|UX7Y)3EpqK@Y+k((p+EM^0k$n z{L67`XC~GW7V*ZM*-KYT_T(Lx7Tc8U8*j3Y5N`?O+Nhlk-?4FvkWZPrlA^rd?dW7O zyI@OmqTX)Nn~J3P^fBcrULKNvvv||_u~7o=l+T-`;FT1c%StQ<lDPj65CQ-_0E4&v zi-4eF1Pq!<eNkw383(B;U?2`FYE*3Suwp2Q=cL!-$ivFvG@MSNfMHA3XqJ>ky~F=K z0%EM~{(lh=4fCxYGxd(o{~G~OV%*WR)DyDvW$E7p1e`(0q_cTtAfEl-1jKN<sBx)D zSIfT$h~;tKmdFW`PSW)azyC%+lyn1M-!xx&UV6T#{oC8ln_rh-^mP1qM~-6nhk)4n zFp@<hAbPuYR{wVhh>K5p|BHZl{OjlDhv#J%pFa8X>tN^WyUBkD2mmGZe~N&>#Y+8$ zfOwxM_rE3}QZ@H!1Ox#k{V`pa%k%#-0fD&!W9j^#2?%wGzOvgW8L9J3a+YhP_zM9Z z70IwRk4pJ7M=bCgxnj~)`R6!R?-jTYN*6K`rq*k#atqUItE=rT?&+Q(d(~G|Q0u=m z&^`8gS#!)C$ZTvq1<B^Oi0sMc4ZQ3w<JMOsZnRw88ruk*I3wF=HPphf@kr8qVY=<a zjihfKl>OCfogZ_reed$OPEttu(Db#5@P(P<TaT2C@o~%j<@+whJEi=-H|+)9G(CBM z)Y|M*vLfWPqjwG-<UTkfkkw(WJp~PMs5IQDQeo=d8peHHy+16JA+S9vRik<A9^?HD z|M={qh3)6RrHhWguwS@!a$?PB{AL8Boax%cS#F<z{FtNg-IpdR-*#tARg3~&Im+Cw zcx`#Lac|Zk_}ktaVqQYvoNM0cg*mPZK0$ZA*kkq=WSJdJrx1^selCUR&jRpUtJH5l z-$8WC$BspEUq4tm-Ij9D&wwYX5^dy43zwc?GD<!$$q^)`!;k$wcv+Se6Z5HDvgT0l zkI@sC^-nEN?tML3`n`Ii-WPG}Tc?fNO&jK7<6Ga!bS$&q`nl8Ie19hSAYA_`!@1wv ziON*&cQ1ABD&Kqj!=P(#G5GG{&hp9H!vm`2MbU$mng@T6HadR%ot}UC!1+sL;c@Dp z;L0@W-`~C*)QcluX-1&|ZMS$6Ld&K7W%J;W!Ebu(-z@7BGU%g!9|Pk`riZgN_c1E4 zfDC{$OtUrveNI2Dj2C@qVxavidNW4UTR6mZSUWoXc+3e`1197nLg@xR&b6=Hkm|*w zgX8)b$E;n!dQ5as^mA1Lx7mBP8Y!H#`Sb<rkH#OGMus}lFG|oG5O`8fL@7KopudQ@ z!umoLE7c;Iv=aFtcM;91E@5;tu~n3RbVkQwecHqSk&&mv?$ZJ12(`O|1|ok(s+GUr zI3sETz=RA9pEj7rgdQayUQjVKx&1kdYAaR-vl}&6(9NzEyC`fiI%eIyozt9rPwuMW zbNhwu+|DXq)J?V0GuzvFh(rJ%XE^S{x063&Qhg$Cbi9Aa5cZ-s{?lLZg-2Mzo!MRt zXkcpWTsVxGXIw2bke=`_+$ml&sZoD3IuX>pQ?i*{qq%B08Md%fdLWjLxQwSph9B*e z0VVHIFr%qRK1<QN^%BYq6{eAdopMOqKu05UDu!OSoW*TTPd3c7*0!OL36emG(W+B) zN##650wQ}4B9#PG!FZ)n+UjPR*6h{HLu9=`BP`>iU2rNIFw_$VosCGKro0T|+!q;d zg@<J+b_BX=)2NLSQZQ!33*(gz%+nrt1&CTOT_Bp@j|iev9bt^=w5|<e3d4w(Bwd|$ zoE*@I2nAre#926jfD}$9pmhi!eKaYHwl9OCPX{<@6NiGYQs%RB0CEn;!0ZQM>W?7C zd<tNZ9|<!8j>9=X6wRSy_Qyps;0Q=xJsFxi7{fp{C0H|2pzG|kd4TJLJBC&>8*&SL zci{_2htpzpz&o(g#C#6h@1U1#q_`3ZM%z?o8#jXFJ4tA+oqMhpEdUFJ&`jOTftf&d zbaP||`us@lF)~8JRhU5;YY%6m*>Zz4#fvt3;cH%yQX(TSK_Hz!5Ct-bJ=CKy&-CH7 z2v-tX4gZzPzd0H{m;f02ML2Q)Q%6BS@K^gpI|FczPBIc7kEbVpi5y9_kzyhc(0;@S z9$G|F5`7OQ1US{t66sCy;qDA=5FHOO3Pr@zdB{Ti;|D0vfWX@67Xde|2jqx~NqIfd z42*|>n;?P16i<-~Ii!NP(k-sPS`p${LJtR)z(E{$S?$k<zZM7VJ3>B`D}4|6Afv_W zwVB43U5+qt@8|fNfjn;FoSFZDAN(5u)8f`bm{A~x>!vgz4n&&qjDWUeBA31vLfCKd zEH2rL#+kKW=0Y=^DOtGd9RZtp+z0*zX^M5{YdNkUV>d?+65`u@&8?u@HHAotd=f&u zGl)r@2uJRI@8Az;fbozcu*V=ct?K~p(hP9K1EAVIg#LU!;tR~#H}w+4;O`f~5KjW- z$XBNJ<ze*MswlM7Po(=L2Xr&fl-%;$@}ajInX0Mtup186RA-=lS-C0LjUajQ&Q_E9 z1rSLMq21y)cS!O>pVl2itv@W>C{mjM?p;=cmul7(oeWw%>qG!`g&sA%FaE5<LL7?H z9=K{zKgw*|K2`nqQbaP#&6F#=v$rlhCVgXiXJ6Jidz{&4SpL=qOTPO2rS6VLXK$_R z%=6B#Uiew(So}3mQe%1j!glY^(?6h9jm4bpAdi9PU%c4uSC7uEB{01B@=5mC5^8&Y zWM*PBu|usFu^gyr{=_#bP2&@WO~=~MYt_RCm~hNmHe{{J8tIvz3b0O}f6KTkmv$}e zimLWf$DPcWFf~UVr)*Ln1%Y$D7B*9O*-aThS11q|Z5bmFo#*TXeF5gb56>Y3!WU=D zil}?XNI-U)5U7a12A)X2j_@YVJ$c=Dt(y=2nmT|KsZ|_GD9ao_QI7g*1%LY)fEnER zqyu8C5lb<5nFyf5rZpSIK>&-ybV&6p`_fUsy`N!X>DM_3uyk=Oizy&30TY<Amhp4B zguhf52#3!Cyi>rfXCNIBf&T3L`zO0J9)6f<_wy6rMnd@zo$RJiR&K{-n*HdSot3$e zist~8W(N`qt^oLI#M$$pyuctpKF;gez9XYGz=`uOcQ;2jBLrh%PMZ+_XGgbogb3vP zz&#Smi8}KTkS4>@Tmb#gK)Eu~&J;xlIpO2NyxZLOxR3xA$>9e-Nd*AvCejIO$7Bj9 zjJSZPD-(1sNN$(!=V+#|BdR7|%nt#d0%$xmx*5sv88#aTCj|itQh-Oyji6fg=u^_# z?D691NSLsbMYBg%rW$Q+XW$%&q>V#O5iLA$T9mf<Su&Hb`?Fj)^h`^@#zk)5C4wtl zyxn)e`k(Bm>;Vzx?0pFbqXO`2v4DASl7?cii91Loy3Sd{ENDY6;w`O87#8O*Mw62W zu%<nm`}@|5HJ6~-OU1c?;TG0RSXjF_Of=iK$pGXwwVu?2so)$K2<f!wG0TYiL`cx) znvTkhs$ibAKmf3@$MTrn$C^%C(#DG);d_JHrWM!jgzL~k;;(1Y1@I5jI?n^`;%@3D z+|oK3pwQuO(3R=Q9V*G2rg9~S86SN9)b;kx;BcKF=JlL_INuPupisIX_xT*xpMf6h zVHTcjayu5jym_?tAb-0&zxg2lLzbI|xnZ7pK?OH%9a=!^c@YJ9F`@a<1^Mw^`HA!S z$%px=yanlM1(|jQ*`Wow1qJzC1%>kk#fJr@yoDr8fl~)RL$f7+dSQK6VZ(f3(_vvV zZxJuHs6nmh!8%y)S=3Zl)SOWCNUi9JVNt(Y@t|Gtv(Vy^g5t5R;_><7iNoS4-jbJU zC9mvC#tJ~*bj4;6<fnkVloHBe$$Khq=|{EF&vvCkM6ffV^g~@KKUA`@UQ%yp{{FC( z(gpIQm$fE<Kj+Kdd4lBmlFtbsYkJ|=!xC5+i8s9r6IRO1SH{9uj#V#bvoGfeE9WXK z=jkrzTPPPeDi`9bz^PY=*jI>!RY(+8NOf1BzkqMA@P79!L3M+tOkqpwAkS3EL0u(} zX(cZa{-(XMbF_?~;z3nGp4u#>rMkbYgUh2Z87y3Y07J}|@IWNm$09?r{gFVb3kBr> zgh+ZB7mj38Sg0lgQ^a4<m8rabRPD!C<F8&5U|$myRufcM`Z0i4?TDp&yXFpGEu>x> zX<z$`w-#oGvcSTAQ0rjJp|Df<A_*cq$sMLjgyny!E&WuhcjWQI3Z(;hx=qoxTUlrk zdi!+vdcHFUR4GG%xgFI{(KJOOD7;y}D}|+H*uhi2=3bx##dc~0#!HF?xiX>)8)CZ~ z#uggJj~XWU8mH77U)ndm3TvD#Y@F+ETv%vaJZfC#Yoe$(y|-`r7}oUJsFs>u+L>`* z$oaA&*+O*z<<;!5qvw?K8L3P{?S;7}S;KehAN)RgU_>tCB*KlRKoeT@+!S`f2t0%L z`ZSxt;fG*rN9Yj|#5SZLFOn^Y_Su0AYmUFH5$rt9lD|AfLg8PeRW<blmqHP$cvDyg z=tkXS$(=>*h<ol>d5RN}uyO><<H1iWxHZ9^>US?y0?Qza)eO7G)a=M}cumEx;Z{4K zV35kr1E1o7^&~oTV-fXZsUO#1F4!w#1dwqd_sj|iTk+@{L8KcwB^o&qu07go^9cOK zg6OeQdESI@CJ7O2jW@m6JAD=R9a(sgY7j*FY#l!aGLd4vYCC1~Q$;9M7YYl#FR^bQ zmcUm)OJtRaDeCA;(gA0DZBna=X{G8^64DHQ?-J^*iW4G&B)rL@igi|KPEL95CEJ-? z<8DnLpNBhJ3(#W4n=HRki25*4h1~ghzKdJYjK8mt3RP<qmf09pA9&LK{%(*fz4Diu z>186EY6_E~iDbZ&R!_Jxsc`;&;kq>VAqk{h0~>PT!s$<WO{;;iuJyXY53(TdDDfca z>71<UcYFR4Wh|V=t!VVIIrMRu^mQimsdtz1_jVQbfXQQhLPVG(p=wjDbBXuKb&bBS zM<r4lRc!MS0+jw_zW$}ICR{_MFus#}DuO#5R5oel_U_Zw96aYRXb?VVR6J<XJ9uGn z(De79xxkR6=8(0+kZt&oeesY(@6hGNA>!{L7lCJ-z2Gl>UhSJt8M>b>J%4t6@tNQ6 zXZ`}i0l%LeXbfNLB?a~le@Gg>)%%R{YdCUaI9hWg)?p+*d?b-tJd)fylDasO{(B@- zU^H8EG}mD?KYX;Xc(izY*u|6IZ8fA^bF9K)?1KK7Tb}Pzx3ScYvGU)6iNirIt78?# zzO}ts4dKtbi=X#y1odtNJ}rLUE->EXFh1xo*6ck#_WSuj_>KOJ@#g|BhUH$o(tI)N z@M13f#X|9m#qqH&))0!o#LZzXSG(Yk<64yQAjj9h_23(7T-q9OH|;*<^v2}gw7KJj z39-)i{OvvIhMBlJKY5rN;4Gb{l#uf&dFn=tFUDsQbPPU}OZ%=l4LcvK`qR}BbN!FQ z1YgNC^S9}OsENdy>rA(AZpuwamAsUB{8Db|rNW<=c)^(yr)PqxHT+8s<5pIac5O~y z9kL}&LHf-ZX8cXfQLRL4tFNy?W<Mt(38jRX>l|44BCS1l(-ku{u(|K=a+NlPy{`7t zdu?1rjxdEdJ*i<6BqFGUqCBsY3-C(G@_0SLVCsk^W%hE~2xJF}qA#7O$-$ZeIXTuB zB$Y(hKrws(3;yO*yOU>|(}!ns6%Kdoe6qDZ%u0657+$?yS?s&M3JczIMQ^5sHv02h zW?zm2B8Rl-DXA{e6W8u#$$QSxY$Mw0d|2n~2%|Ohdi?F;Ta|Bb$$#GV3oZ_xUd&Pn zfAmme>|5CLrN!~nVf)%nTofOPDX`KC{_zc%8k=^?6lA6n>IqEC^rrAl<z*e!WjjCM z@c@9JM3-^JNnG>3`WjFqWKc=4FP$26&%n*kw$Z0jvtV9G?u93Tg@3sm28MD!bONVm z2k5Zi6A=@#8~8-rK?nk9*od&{<iLTK1NxFfe!Kqwz#Ol2jJ7gEPW2Uch<lmCc&e-1 z8bnVG%#EmER?}9`!7{}hu#h74AVMhJ;kVC822%&$Jzy{PeRJRktE(qJO16BTg~UwX zm?r@oXSA_^$N2e6f(d{a7B*RXNoqNQ>IZgPy-_5<B=@~A&F;L!n8_vJRKC6Z-r~gV z)u7VVkSD8Q%d51V;5$NV(3!Q!%WKhh)?%rpYvFg)j$>VUI{+`dlQ;#rBi?g{e?9H9 z2NVDLWm8!Ga`UED+EEywoWAVc;dQ7Ff_`wt=6LWKNNv6fZ${9dg8j@Z)2}^~lVF^l z2?_*26?+AY1(Kg9^V}yUUvrUH@p{A==M;Zeg#g^D1lZ9@!iQesL0;Eh0MBS;p{7KR zX8U!t<d{fHrfl4JQR?)N^A|43X)DCvSZA8>vi;Y6w9TPECt<gV*nHsfal~G{C^9?K zR&f@PswO^CNX1(tUg%>PAjndx<-T5OSr9n7ynOt77#r1AC<z7z**{mk#2RGZM|*5* zj-}$_1Rx#WB_~BFC0JBRm6{Gq<2GWv<l}>LYT-|YLI5Kiwp@LkndoUj0gNa>)^)qz ziFWtygoIfoA+auAsK<>$Z~~rYX}O15xs_PAiICJTxL>=EOcnm@s7CIU0f5>zUm44* z^6qXY=3K&&b4);t0v14#ZJxVXSEA-pD;*^}ks!qj-1HKqbIJVbURMpHEvCpcBa#fj znv=jIdO!|OWIX5YrFRLBi(*7wX}kbjpg0f+mx6PNYLsNyv~?}gBmE+H4ZT?#^Ip3O z;7(6<Uv@Sl00c73>#2i;^(BO<v|lwspgF$lxH}&3V#)Wmt%hmgfxw`vb*Q*|5!Qlv zR?8hZ*Qh5$@$(v4Pnu02p8(mv)>F;YvF6LTzm-Qs2|QB$t;Q48<irjYvoyCs6nvu7 zo=XA-Y<=p7p^*F^p$tl7(s72rtW}%haTyF|T)M1gAN!x)HP*!vSU<t&BB?S0om=-J zlEfAKJ0Vb%4opQk=&lfi6O%;n*W(X@qX_U+0biwfHa0z0j!U|@kj)=jQSwp&B0e|~ zqgfIA1THzhE29x40e_Nhzw?!8v_Sh{Z(q4q@*}3yk=`47gzUQlBKU)0s6Jj^U`l98 zIx^}Ks|z2=6q7F+cb8isWGT|$+kjqR|FVba)W-;M71QPT0(Ck>KmN*RTu)A<1%gVI zlG8FHfiM;ohu_imQ_g1Zhf<E|mpUB!e|}MNHcrU#DB#QMMyKIY$6rC;mmY8<CNuhA z{LB{uYPWoi;-sl#Cr7u>&_)%K0=0g?yXQ~&+>E58aM5gkw_Ki9kl7hQP6Jg4Nt<&^ z#|h{HV=*g#4GBn$8WDqxqc_5#m{;v_v5c%o`Z0`b=&fT63}Fz&Q^7+YFD~UlQetHT zd_n$SGAVFQ^$)m+3a(C{s$6F5N^HM?7ZJ>R?@~T^mk)r&!EM=ApxS4Z6cmSosdE#Y zctD4&!w&+&0&Xs*4aL}saa}RDZc_VQEKQd>!D4`mzDx7~;<UIaL~6p+;57;=RZ8k) zEE0#^0dyQyaVYu_M#h1+x+7asoKjWIO7y0<oR(HTO_^AfB@cRlDIBh#`Q!SKvW;W# zr#2f})$6IbOBlZEnkejC3dqGoo4(NM{m6D6ta!-IHA5VKn(o9JIYNrvgA~miubex# zgf=3AT)a}`c_h7o&56LbRsaDx;s}6TJ66_qA+JB(0O5ag8Y&n<1VVZvFfuADR~c0I zZDU7c4(#9@gs)O7h39#|Acp!=_VDz;c-yO@vF(oV_$xo(=VsjNaEngy$@>_G^~l3{ z{87feD}I;rvplEdJU19gKh*^w#e{wcui&_N-j~kYwx!ah7pBCOEBCI?+L9Oa_?j7F z#CyD3C(mj4w7rqIq_l;I(opL9P<`vWlx!_TLcLcW@w%k(jbE#aKVL&LN;~T9H!`b9 z@r^+>dkXjfbGCTv38v%i=5ve_31r}sN)R1i=kneh?yJ<?nK6Fa8!*FvToXU*tS`8w z=N7!=Kgb`<AN<zpLC^MVu<sw=_B8!7p`Y@uJ~{j%Cd&NIzb5bUQObRl_L=w1!)Nf{ zKfNdo+e!#5Tv>nYdvq(@?%Cx|(cxoM;jLF?$M6UD;(p)RnqDpYv$^x2^u}(@nFDY$ zd_so^<Lo4$PT_6#Z}EQ@8&M^1O;|tHNTtXfs32CDsbLVq_;)Vx0_L#vNH)#%&ze$% zUv|u49Nx~1c4+Mnj;2b9J<jw_wf&go%_!d}9L6zTfTw;cM$o&QIc1d~acVl@VzkS) z(W$dFAl~S0(#wa;Ri`UFe3R1IFHVx&pE8Jl*AZh(&VYCXBE$(7_hcs+k~q8JFU;<Y zJQO{w$a|tu{Ugq@xI*Y%-dSzyt<>0tD^uu#$2t;h(N@3T-7tDTY?vz-o|FA<ZtUl< zRM5+;GK8B{E4z3wP2z8xexoCk-oO!hKZTa{iQRXvS|NVBIWS+upbA9=*b&{RgoU%` z_KojhPUbLGkU<e30u}-x5onHjo>zJzNA!^u)Is-CZC&TD2W3StnG)!{aZPd|<*3h! z5pZ=%j2vxyK|(4GCWoK+rvrehsHLt*+vm0=oi&jHJ5$?`+^*FmQY2K}A_8MGG16u5 zk)neLodUWb%;->`F)<yEBa9avLwXwMshej?_<?Mj5p)Wc7mpfR8BMT~8ecsx(9Mw; z1*IamtI5%S^RqCQO$RQtPF;|gyGclo;$*<mI_Z^2l2@g*El<MW1G=1&(S2r?$6KfQ zQ^w$PGM=_W>eel}uN$5lLjN>gcq@~tziC2DG*X|9b_wbx1u&ZsxKOm7-AxRn6FU_F zW^2`0m_p8in`y$ob-=?b*3`-CaDZ7?n3fe!$iFT^GnbG^z_$M^3X0;PeJS-5`oS>w z*4Fmfwg)jj-bJ;;3hw_j>fYxz!pHof<aWT-X_tdjWxG;Dv>ovx7pki4W*As4&-enK z{*i+oe-GWnI)l7U&K3x8H9;)Bv^GtLmxM^)XwmZxd);$+f7$CUwO0Bzd5Gq=T&-z- zq!s4v=fv*X_i#h4#_<|4l0JZfpqu+<wlfUTNqJNxu=Pc8wWfDE#KOf?Uo&mLuS922 ztVmZ}Z|P~eu;tkf8uYTkcCFGmZDffPY`l+31Mi(m^mh8PaA`6KUFoGrzI^7H{i|B8 zj}eMVj+*bMU%FDSx=5(Zk6x5mj~N%|iPbZ_ZuMOt=fR@r`#^=~=iygIgCx6VGrDfL zrWSuv!nmF4n1A7WnZjVBIw&gga6;U5rDV_Hs_M`A$-AiC1w_{wc=yGzPhUT9*tOTn z!B1pq{Yw9cZCv|=cGqysW;Cni^|%ncFe94V8j@J??DU<7uLh<0^cQjjE<E}Au;R(* zoK&4LC-a%v*3!0Vq4(Iz$6GT`Q9;d*M@OB)eh5=wHfBQU7y26HXyv`9^w~B6^P325 z(Y0a*LfdIO{<<XF9sv9C{RguwKAE49IM{_YQRi6fH5((F8~fFdkx~>8N%n)C03sMq z*Dmy<LdeMP1nN}E3y>MF)lp4a^l>AU=ycY=@uotl*pL!@&gxwm643veTr7w!0nvp8 zQe*(FdPIk4665v@<#E88J`cR&2cV;IjtpoJsjeUKAV|W|7zVRpAw)*th+;izVcdr= zz&q@za5h_l-kHb@c(OnPd^l{j?MXYr07CMI1j1+MU!Leys{Sdb!OlU19}ggwOnh7S zW6*skJr#%X@u<mo21l?0E5|59M)sXy>4~N5@^tb9gqRW+##x3=?;s)ix?hAmhp@@Q zazBy?u{L78q!)yY^RI6nOn5tMS5jeg==5yZ<{y;JyRZ$nv%ehV$uKQ+U(77Vri+=1 ztM-b&#x$}G9G3#lz=3hBk*RHvdmoq>NX80~Z_MvCT;@2?XO-#UZp2c=-=svY(WL{8 zz0str36Vfy3@ac|E~&I_06;j_HZn;vN3RdGOwWF6F!GlUfH@{c{*yghi%-L<sIc)c zRy;-pkm<6Sy+qJ-@lel^?COWc3U%mkjf-WIC2c_ZgA0s~LfDl`ziA%H$CD=)Swy$V zSWQOPNF`U16H+!)V6+7y2-xfa=<)d}WHgLSdy9q`rJ$E2OgRtmWF+Dt1v*ZMK!s?t zhV<5x<6E&24@vYL2Xqqi9HXNmXpR9zF`eAL)_n6Gx)B(}Cqo^Cb=@Vhl+;VFnnT6r zeg5?kH^y|3o1J`8xk3-m&JYuN=cI6RnF9C}GqaB2A~hw&!6KUEGNpzhWbsG=Xm*ej z&&QUY{)7<UK!``0(y|2+8B%JMNg(G8cAGxwbYJU<=pozW)7tzj5XkEmn#;}3BzT4O zhcg$K)`_Qf<f#G?_Y6KH4ti_aNVmp&%{kw_x5GVw3z>h)U9IrSsA436%R#dMH=sAw zr5L=<=T?_H5s{ygF%)2_-_V1bS8NSNqy+~6JPE^LassGdI5ezudbD^2BgC4>|F*8= z7Gh+GRXD<x9B4Tb!`Ke`8^HR@zJ-n?h;i?(3sDmX4Psx7r2K9@53fMC2(!ODi8C5W z6By0fEl+b0&iHupx!tJv`;q)?LpBSZ^S?xlMMXDPj-4A5HM=I3@TiJZthC8$w4HGR zFPr!CVO5FPIlcFz1<_-*uE+b$02bS{AW`~2Fkkr^f8Flb1BYR+YtY~LPWD>h&KD?J zHlnRqKMnD`Bl>x#cPfe)!QPpUkdn!lNpCNL-71VcWeQ(8Qt1*K?-w&cks~;yQr9db z7e(r&(Ga_bjs(Ot@M!#bxG}SR&2?4<YHbfpHRAIXnA5=cOQrL%4I|k4Iy#EZs&?n& z1!$!{0(xIH^XSFfXtK>BKUR%b0G=P%_kv2{m{=4j+9GP5)VL5JF!9Ot!hBNs>H9A} zXHTpn+N+huOw5IhPqvw5Du3CX_+eSJ_9|6sWo!*7xy75hU6s1PW3m}A`O~E6?R>>m zi^_)}H<FSYI+$*@Q}JCX6+s4`lV}2#Kz0;c+2TdB`zb7i9d}36#-K@b&Qwc+%6sVE z<Y*lmMUrujAFJ8PJ~c&Cl+TPu()j^zF9E*7yb?6uxF@sMOOx9VEWrVoIcO;!peIfW zoCnbHfFGFR83p9%&<dNNdfD2Ef+=ygmkx#in`#8S&$z^erT0E~VA>?-5p_#M;lmZl zv}^EF*>yqY3d$aE&R(`ZS!Pt`&6Gq6RJz89*-B42N*VqDu%=@g)9bfH9+dfUba=lc za9Xb0Lfo6+dpz{Sq$aTN3E!G={`P&*wuqx`7RI^=IVp&ZtU>MUVLOoJmx6}2OK%B7 zqWNaUwTX|h-SQp)jLgKXs`kq`C4VhJBp!r$<Z8Ws?U=)ij;F`_Lt%V<cX`tDPG}q~ zbPCrVFLVKXgcTTwP>*>}S(w~$*?4*!go8j*Eo0<%f>1BLO<+b5Wya1eQFi{sWve%V zoH%v!Tw|-Iwzn+H3uzrkab+iJb~hia=`<aArE&Q*6!TfLXlD*vFk;rVFkp_T2V~M^ zG2x|Y9spV%#!&@E*bT3|Np^dqwet|g&MdUWb1gY<#~Y8mujl>h+0p^m*8sk>t^6%u zekt4z`<9#YId`LOp6$$B$?Mm)I)cOVq_Wo~W#XmF(>Q2Dzg%39<HLNlqfPvv0qn~~ z_=&OFdqOos_JOa9R~gfmSPfYUi?A-ryoI<7xdryIg-3#xrz^x{D#T?@oZ42*9ERCV zOD8Ibob!4wigjTPxNqNvbinKx9RFGzkU^I1$_p@mdDoaWe^+Nbh~r<%ssLmI)!Kbm zIwPY5ri9g5Az+Vjacb|v%ke2@sh6!)r}{QkZzxKVYsaGA7SY8gidsdaM1mXy`F`Gr z$8}vf&NKqY2SOjz7d{8zBW429<}6q!vl4xQb!qj_1X2|o5@>sBsSqA$c_0PKKbBNB zg)hlSZa#hm(hv+n&O1WlmkJsBbWK>i3~x%k;=HCza{b6xdXBY*^AXE`?oA*<K!G`> zXC@6W&uInI9%c_Ym@~_A;**uasGAinO}xOdkjI;{YS|%AA5)<HnRZbUV5j_Mzfnc& z{W~_U3DkkrmTk@F$hzNB@Q-|0CQgOb6OuQ-JiosyH2;D_Bs@NmaQ2ukP&_i5kb@~8 zpkL=}dhFS=ySpr!ypUC7`LwVc)B@h{m+UcTQQK98WLWs;E{1yozjhXx>}0qP=?vu{ zs+l5Vt183qA*X$DZ6UB#qWa2=Lxmk5OQjk2{dp#_OWeebybxi-h-vOXE$E&wUxHfR zJ4-$;Y1bQaqw2XI`{gE%zr`6V7$DTfWGogGbQbPfP8f21dil|QO~CM^(kIJ1LuT%u zp6ia0s!HYPNsRRiEUe{U2S1%RVm?1JVZHD6pja%7U-^9D75l&RedNL-ex6)KWnS2; zn~H@lzdm`oj}%6W@9(x>LrJnsnZ~TdTNsIk6se%D$u5(yg4t%~FN-c0i(4jfeXGmk z;bpTm1F2P?Z^aU(x-K1zNz&mIIz;hjc3JN5)vUjT0*<7a^g5%m07NrDM`^qsYDPUq znyE{KA%znVoij_FGs3sy&kL)&MgVNk;+R*8ys3G(^*YJ~;vj<3w_h=LYA6g1JVn%o z`AaT$OUl1~&h9X9!V0dm#KcB^$G~&Eg90c{pt(bmzmE0mWn;co_RbWcS*OIgn^$vY zzcgF|xbi{EU(%e(XS~XfxAMbaogId!p&}XJ??@zokC3;5?dC_(_%=-esOL79t1GBL zLBG(^Eon|4bNM2^d3LL!9;`}CH3ebV{KnXgIb#Fo+h;hHtn=$F=}aT{{F<0Upj}(z zl?6%I1j}(-xrdmPEMfx414ySQh!cPgqF2XSg9tuy%O3-30#y`iYFdWER`LdgS?Plz zWZdWy-Lrh?C&%f*5>j%0Z))n#_SHSVw6>^$l6o8$J6qZo5DleYRAS(<1t$2|_c?v( zP3t8C*&|@rSAu?=5v9E|68w{MudckXJJM6>_Pu>$-UGwLHUEf(m1nzwH)#4p1}J#d zuCSPQ7~#Qv!Slz@TtAhQ3-``1Fi0*?*7+@COI{rcMs0i)FWqEaRXQKJz#cqux?b#l zi5pw+mQ!oFXg6ElqJ6hr3nN>F`I&OTw2$0BZ=5Z<qH&^q0lRIpd~v@w@8g`S4!yg- z@wQGy<*_{fQ*g^^HB)?M858!ktTuCgE2FM3M)5<ujj^d*#Y1ZU5O8dRQK4-6RB&s! zF!RG1`I!`eJ!bx)cMqq~4r_^iT)M!*H%$GB(|YBA;A1wH<`XPa7u-B)G*YhHSe_`) z@n0JG=-?gWi^q$T%%=^3ukv78tF!*nvb;R_<I{7+$Cl}Di?CRBOWvecSqT=7?@B!~ z!&$RxW!TgOAJpSq{tWFpsXRpFgMb7x-6m}I_hp&eb?Upau=(Y9p~w~Wnf7tJaN|gk ze5t%<%}8yINFzwxG{wA5ogN3squFtO-dOm4pyWfkcp%rVh8iNx5CT<1u5>kd^R*9D z*r#2Yb#7FJFsGivYvZTt(L9s{!tlF?bBT|6ICPXwQiJji_C%chTzW1}a;c6VN7{CN z`xAGkO>&RO!njo^nj=-Y{+(=XtNJ%i;zopUovi>Svb?>$plvr{I5e~S%7F4>B)nwl zQ6W*c<@Cgjd_DI{>JK^omav_N#pk&yr{|0F!gfzw*ik&TLhQ?udsP1;qe*h%{)4c= zgzY-XTW`!iS*BLDp8eHw^;UYlzoyq)nSm0ZuthbjxZGi^e9+(V`mZOe)gCvQ)o7iX za-F!aDtbZp6RW~QbvQ(f;nTR^5}B=TqUS>`rhEsKbh~I@TS%Lm#rN%`C=;#B;5QwV z9@~95V)Mu6rGw`sN8i3;<ae%ker`0GwqY;HB%Vm+k?xZ3Oj(>`7gXXC>}BJk0Ir5R zD12n(cINBgzs-pN*9dUphxDc%<!?w`7+X_uq{cvDWQi8wQ&gMR$@7chYyqjsa;bLn z7e>eA&uSc1s^zrs$YZ5#RivN7M{`&_EyE9whgsxjZ}z(yF&(E9_<fB;=!3zGO|b^e zp8!T4GiDP;U=SH0#grQ_)eO+Y1*&z6_xiT@c>am2FB?2}Bqoa0gSR)<cO<7s+Hq|1 zUb|8+tBmqa_<VWf2G3U>6D$5g9Lr{=i#54H7BlXT!mwz1jF7aVU{oT(1FNUY%<Wrg z>frwYGRQ>pRXJ?#9;c8a>DU##5Ag4)gNfWH&lGNNjUmNbcmnW)#$0rQe-+J|51r!V zs9xE4v;Nq~oU~&+er8o@dRDXViJcEWmBrsx)1`P|KlDcq%kZ-wzy4cw`{P*NN#F09 zC!#2Q)O#kx(?@|Q)X{aPX5uXv3e&5f_SaVn4*xPFizkux&(eSEh*CNGNA1585Rj5q zwY?EbLl7|{ZA)ChRpwqamlLZ30i<IRBREE1y{GF435FdA#|tN_iX_Mz+AJqXS9Df5 zNwma^=pHw+5lK;A2oX(H`%*g-$;dWBiPdW2u(D*@GZ0KabA7}-!{jBRJVQqr^Ez9H zcEOhVZvx_P;H)uqz|PY-ROb8}f}gwkT!j}?N*v^b;vimjsxQ}HDp+IsNse*hBRiXX zsk>L2#l!sOV>UCFXJ)=ECy`K=<d2q!Wg0?r=3}J%%JWLXj-+eLn_QPdIjh>qA@^j6 z&KU6ny)Q79jlGNYYoTwZ8XjFHz%bkgpS3NEO1bCHqN{>R16j~T)(_+rNRc`NMz>1Q z3P4gnQ}ExzNges?m*g5fF6WakGc7`}n#yiJIC7a6zrrLSMw#km@Gcah+dkTpsh_+| z>Tj%|*TnZB&*mu@XTGKoFmCwr0*s&(5oX1#N!Dfhkn@>fC9AhVK%xw$`ZzAXB3fTF z`v^p#sh7y62=Gt==rdx&Q9wF6JfQUi=|=%!R0pgLh?2nC^sth+!7RN_;2ZK1>5%0S zgM;5*uZ)r|i1BDj&P9vZu4*$QHmyLAFv!^ta(@h0VwBipjCgx%C<s7msQ4+<p}kl7 z^{n_bRaav8CtkrMo2RN^r&JfUn0#EPBQV)HWL<s>&8dh1x;e-WW09S~>E>p#Z>7cj zph}KTrj`uS8~ZgQ>GcNN5cbCDf-wwtRw3AYb6-0A+udrnTdV@Q56NB6R4D$8OgOAw zkD9I1uWJIfPm8{(C~X#^IT%?Gpop9q!IDM5PlrPQOYXl$+n<AD;e+WqtkkxMA6y2n z-cc5=nL;q;PUw7`1`ftvOD>{4A;cBhx^dtUjm1QIuUah{+9f4{Ujf`q-<>tWN5fu` z>AB>zm_D1rVZ~$=U3_vwg9X45E=)(oVUQL0-kf;_(McTu46Du9D<{Z5VjI<W0HVYn zT{CDF*3$WV17Ho0@aFBRn7NY&@4!+Vz!CCh1p%64g2ZWU(C-@PqWA-*k)YrF57$)~ z4na(XV@Ih?@o-r9>KTULqByu=C-_hdW)aF`_176Gp{bC;u&Hg+i!Y>8VvMPVzi?~u zgQBx>GAu4+I6a{qV5Fc_4u+}irqQyOA()y;lA{6;LH)fHD~=>B>GI)Xd$MEB^8n>& zg{d?2i$4;-4V-88pBoYvAox({v=3`n^VXsvn5ykOlR|pL-A<?=XoU<ja4|~2XDO)n zieN{y4YXQXOTI6@Otyse$!QWn<q;UYqUgg1zXuT1O>K-iR6rMUPZm?qf7Zbxir(Sg zNk%P;Kvis1Xi9W~5HW(@fZV$zheOd~J8Z7Q5x)M3pzF>u*gn;PWAeptt3vdCSI=<A z6CfE9VZ&ic{hb(4B}F2SX(j@=Vt;Xbn-G!@ugSLICW7TzM&2=s47W>z`$d2oUPh6d zs%s^e|H#<tDdFhs;_hRBNxSKrvpWq`IxBa*Ya#nB+~1;ylhf2jBNq~Z^PY6(3!%wj zi+c)md#?fXh(VLNNR5v$pqU<qc6xoXbkjQylsKFSI|{3P_JpC;!OfC54A1y6zTO}q zO?zMBoPFKW-ZrsyCE&n(61MKyPGU?Qdg=N$>=drUBT`Dr(Oe?_%X-$+(@Bjk_sfwb z=xpf-Ak;n^_leI&r_9x~f#Vf7ywR|IA%!_O@6zJiFcqCoH{`=+?qB|ZJ!Sa)_VMrt zu|@Hr;0D8%uZ|eIcYkJo>i_=pBXd@k0<wqTS5LE)jEPjDhFbNRQ%93UypQeVBl}+7 zvvkeBMO@4Gv}Mgrzpbgca@%aKpL(qVpS0n+!ujJqS>cXiaz@31886A8j?JPw_Jd%& z-&aQ}luaRuR15d4Um7UCW_*+=_S#y%+xQ$;XteIfrgrJk17*?7ezB@kFI1mh{(B<- zYG&=U<~T?{2j~o0M$&gi!)z+aXYE&IOC-2ttWX@r3IVM=<au!s3UtroQ}-^?$1>zS z@PY^fSvq;0o$n}Bi8kh2ihIk5`$6yve(QG$z)ZDHlG&B1$MbzS6wjy@_*pN4)TS4P zjVFij0TH32O~U-mSY$gc(pQ*>k&PmQc$^-aH#mVAA;)mxz^4b*j`DW^1S15?=_7k* zJ~`Fi`YoG11dw6tr9Qfcq*sq}y(dhE0~tLQPH;q%uNub}?Csh_hgfk!&FnfS^zfSW z*=$HUsmyo39ieNVfjNcK1gv$g&R0$X@>M07bsR}v`aOwUn>qFDWYdk(!7(~HDQUO> zU@FZFM!8`<Ft6}&%&O$9Wjn%vV|ApWf)-%hyfoHadyWT4OEFObx|6U`C%zYot2{4# zPK?S^y}RPpa)SY>?cdhxFdeIILC8~S+H3T6gjxARY!@W7B+!;5Wz(oL{F&9XbSKh< zBh4FyHBPraT_jq^#s4nToE7c(T_I#eN#0NY&F^{b8>tJgqZ9J1SXyu2A2(ozZoX}} z`FK0`Zh#XNwxO7%xKc*rT;Se>6LgSUVVWTUefegT-NWaxut&KJvF$~3@w8&}bOz)| zE}Tu*0&!e(lF7RR;8=SGtEehvnAHYx`LaLTE6GgOD9vkT(EaSEn)|Ik-t!hrYpmEo z@W`mlt&_y#Y+Pp(DVBfj%Bq~u#HR-{7A4!0*B%&er^al=I2`63lmC;bZ1nqGk*-aG zXBj9&$?LL-bv4Mm%^d~2fmIs@f}<I7cA2~Ju*)Pr9FC6ms8EMSSKI!Sw?*gTFsXAG z+O}XAj-j0x_BapeC3Hv7?$(}7`kW2?$RJmFq-v4G+>OJcgl#iylQ_#w{EpF=zAL1S z0ZU2wV9A?^d)8j(6FHjVv6r255s3dpg}4C(&DZYuS5!#$|4Liz|MO9yu79`13Z3u% zKW>Zt|6Ww+e{73&MHBp1OT+iqSIZ!j46T%a%WJJXUZQ@jBKgEC$SCYom<v4Zua5M+ z%>T5-y4ZQv`kqmjsjID~cdKHo?Oug9O;Gdn8g%st_jQ|>=}Cm{{V|KCCxyIq_xiRm zvdu#h_vMmC6uxe>3Z1$o^XQfJt(D3b_V>TFF9vDY-d~QD{r>N$&?%;*@7){qc|JXx z&t!k}?#?E0ckZ*P`8?5j|NMC7-@n(E?lIvvo5*O%hRuFPm5t2-tiIgVAcu|j))3Ft zhOK7;!5g%wP@LTMh*+NYKT)BE?J>EIjqTE~Ub&rdr8nVbeN1x1))?@IrtpN>m+<S8 zXSl!RPMu@;LU_rc@PZZ<s?iO2WohHH_uBS9QK8^k1+T_j!5|1z+_=Bs-SKVzt>3V` zN~rtA(<<Sf@4gAWgwInOgG0lqe=bx06%|@wO;rs`JpNrZl<sVk7)PefMEkp3$-fsr z6!2%aPlOuBkzwe7@7UEo=_%}&>Z|(d>m1@_!kX#i<zrvzr=J{t@4Vk|E2@(2Y|ppG zyy|YFhOdlAXP>T4gl|pGFZYsLDr>`ja9m_L9prvDB>cjhXw~oiUeBk~Yniu9ZD91x z7jOMqd9(Z2;Pcl%{bzs9<OJ<(9k;sueNgmRz`}6)pVJC=GuO+2@+)VMrOcxBMekrb zAIO;R)pw8?6dfgWExmh8)S(t1s^FCN5snlpF1JDmKxs2PITynjRUYHYqj8{B6%($# zaG(^a&3$e-N<+k9oyzzAi~t|P^IU^D+j?9&f^j;ovs{?N`NLpB@??Tl@%!sRs!ifv zTdJt+_uRt<&rTF>C3~1u^1T^(cB*?T#V@&1VAWt)ePJs#WV}-7=g9Dxqb+^jgDcmy zanV@xcKQu<P=tGQ<ed6;MtX9Un55yTk^OdN{&<yy%IN5Yu<a}o<2@;T!!h&1?d)2U zdonhj{Ffe{kar0ecM_3&Zl4<uw0kpRZ;o<tZn7z0(2jCfBD<XaD=O5L?{Z?NU@Ezq zCc3@wvfn9m8w5^u917|D6-{5PGUn(voS4CbBFa+#n^B?hnlnE~|4iDXHkJjb0R%~S zRK(cFV$}KCU<H!t16@Di9&f28F{A0k{m}xh7q#b9#->xlb}MmAbq4x;oc5W!RZ{2c zjBM;5NVe?W!>81lTs4|0T-dEveNlHIcx<NhXt##IlxHa35<%h%lvPpn(jOzes-751 zx{y+DS#!i!Yra=+`=Z{uW9)TP*xr32lWbS4^lYRpseyMiLdz6jWh1rWIvotw{8TQK z1W_78_7aTk*rt1r_8ve?4MaNQxqiO==J@jsF5J)OHU}xOC;OySX6mxA9D!naJ{$UC z{4eZ0_gnc^I6d@@7hV?bKdRL;G`D!ZFw51BsQuLN76$vDPXs!6&%aItjsO2d_<u)u z^nW}NN<u!@{r3~$iz_0Uo^~Q&PeW@JC`GadDUtaVV3ei3DV3Fa`9J;PVXIXYxn5p5 z8Da5#bv(+1`g~3)YL3kPN829jc^$KfmQCGH*1nwW-S4ihc<@r`elyo!J}bnCkezp{ z><K?P+KF)OTicxb{h~(;L0{$LCYL#A0jJdaGgY7c6Pog77L=|xll-5%RBN>vH)R(z z6@5?HjCA#UDkjY@`dI1Ptsn72Yz|)Vm#4gc^kFa6`q54VxyoLye@=waE*boPod_H0 zy~m3FeIlGNPQCDZn|302@4Qf5ZP=NRRwUvl;qVugliJ)qyVC}eOIhPaD&HPCo1}G; zXSV(q*5322iSS+5o|zOvXrXru)zD)>x`f^}6p^YyigXcC0Z}K^(4<H&5_;EwbWuZ* zCMqH#AZk!R>?jsgG;jRvwT`{khyCsS1M(%wG0!vieVy0o*ycLxTDiV{otK?>dXAD> zA&%h5(fqy;)bL*?Lb%&)&9gH{%S4l+`SN{!EZw-nE`R($a!mHD*Wo4Ot*CSANWB*# zT3T<HGp#?mygXs9^>fwSF+6r9-|yqk*UI7izt#hS5Bz!)dN!iyRU@Jh@Qv%yx^cMK z(Ek^y=fTzAAH{xF<h-eN5jFY*-ip{Zx%OIbJHJo()Ar`Hwf3L)cMm@B{BYUp=+k#h zw#&`$tZUyQw^lBv+{}I5GrOHPc2ueN$Li+s*k7L$$BefTT}MsMU%L7aU#=bh0ojo5 zi!z7^BYIq31L-xutAsRXLbz!r%^@=3A-5btv11T>r6CbrBK7Br?$9gJfr~s~71x~_ zv!`v5hS(Szp3gf;Tgv3%U9LD(%kE)AWqJ~?&@(>vsk!0el?~Fbck+k}<0Hz@=j1m1 zmu3fOM&fS%H1ZOkur^^Z`TfQYk!=O8O1+zWIIDDt!I$Q<?t<tJ!T4QU)-vEL6NX-H zf~7YNlF6~WMt73uCX?_FhDah;)KV_`+d??Tc=gmtV{Rs8$604ogU0S$t`aGQSm&`a z)b8x3PRqPEUaLBc-pP5lAfqVRl&c%pbTMvMz+((FN&0;9Kt@=V#7+f!sRJ|esOe*( zCwJz0D%>e>+O6Vo6<>Zx?0ONZNp81zor9d?X3<Qrzm9Q~qrx3x#PmqL-VKGj2eCr2 zuREO;Z=W6rmzs$Bxb4b+Pk&tFr1q6MvsJwx6YK{U{=uW1t}3p7@aR`M#>cT$sJ|j& z_tz?1R-?sE&WYgpwOWF6BK!=t8h1$dkggkl_7|MViD6;nFim!^_rkbxf26u{me4Uf z7h-Pv|2`3#$*Fd;)l%OYZ5*4Oi_)ceMqs4FzY_s_i<kWGL{Kxw9Gc1FA8A4Q7P|8k z;204}ElPYXo`YEDtEGopY}!dkjg3S7li#i$xub6TS?vjRqoD2lA8X36-IJSAN!Jo8 zTHHSvJn2{Yel;=xi%>CKpt=@z6f0u_b?rUwMs(v#zAc(+d3oH6`rcV(86K>to<EqI z<?CM)w(zyE$ASH@utQ*DA<VC(XFlXi5A&PciCA^-o2%cuZu*eIcN%)ls~zqM^!spd zzu^MfCa1%sRck>A@S2n&foKX0VaWiB*m{FE!~e;^+V$`Cb2m4#N@93&e2~P$p4fS< zfHtpve^Y+c&&W<hwvEF44pnG=@<(o=0obOHj{g4mDMV(1Vj3`l1aKOLnahhQMJN%> zrwBgc;6QF~_oO3`RwOYopMDsr%K{)NCd7Z3!=B<nBmtN3UXDZ2S^=D(TtYso_;USe zm~Vh-Ej-Tz1qf7beqypJfsXW2Ckc9QBqO#FXhJWi*CP{_71zg#xEBOSGeQ0&I(tej z2sq33ea6#B>J!JAKF2_Z#2Z;V2qX|9YzT<I&p|lZkWgwlu<}ST;02os;#t#*sU!XJ z#Z=^x*Vhrn98#CO`*H&rtxcqIdyJd$_1f>lj<Ep!`6vV>Cy}rhK;?>=@>3!c2aH)` zmYD9Vp~g8}cnZRDYmCo=oFt<$cvk?=6#9D-UgBQ?6z0wNrEtlVVF0bb;X;*skb>lS zRO|Ildodie!v-j?eEteCKw6cW{SPnO$o&%jbm{C989Gx8VkD7X;5lUnkhm5Zu>7<2 z^u_Z8o@t{l1dD~{4Dhjq%y4bC`6BiC5J=bv3wFW3dd2?R-8ZHQ@oV@3Y$DuGHPfzC z<!Crbk$jV6D1Hz4qUlNkXtR19Ekb%l)P}H}2%`8BzSzrZ)1+E9(dVKeRsjPJUuc8s zLgTqbXhUG_X+SLh98b@4h+`aGM-Y9U=+e7*S}!EFXP;OrH#+^m(I-*JX5o`8V^HpB zfRCs*YX>&6k0;6@!Df^+E^T#%%K{JKGbr37MrpYZBZ-HMzn@(>ix4876(PfO*UsqY zs#1<)mhhtrTi>sIz951i=H40&jr@x{=5xKteJwLOAC$vy-nVjILla3v9%uN|==P4g zMXs9x`~N)r{X2EG=MPkR&|%54==*+oBX)(R{ogObwKt;oUkegeY5IIIEcAAq*!IKK z=C+B$&fglYzgXd+Y}6ooZ;8UCdnhA1aDbvG5`<H0U~YGBWDp!E>^-=8(X`5Qw$6u> ziD*W7Hr%0>uX;#G9Q{y7-8g-u#geMG%ZuA)AJ2xj0Le=YV<j^RV5Z|AtR9Q4Il?@B zM7K9_YSnw7E<SFLpH|?}Cx?94cYtNlBZNlbssa;P3dFZBQDe@74@NAX0d{SKi@?Cn zZs65Fup@E1D1Ogca>;Iwksn8cXdW0GVpkv_L5H{)fCS$3<XoUaAt&b#EU!Y2J;2!~ zNjjea2QotU_zBSs;CrE00NWfq%7QFO0IULWjIUbL$zo(*&bYKtVo#-YEQ$qcFpf`t z^HU=SD&dZE+2AyPq(l>-fgZmlG>rqm65%s{tZ9-QOqGbZ{E|?$hN7>b!l%(LIjB*a z3w(6Q;ta4@nC65J=EyC*>O+Yv$mA=4B1Pyk!`L~9Jy!9jiV!d7!nBC-e5^B^MsU$- z&RhwJgrVFmfqN<^DLu$3u~3V^<2Ob!_MC*Y$*0hfoP}+`ggg3(8-f#`!P0^0pg08_ z3V;K3aR?AdJBmNv7XTdi5#GKpLctaIWfP@E^5t+FyorEQBuFIXD&^$y;8BPiz>6MQ z&VB;i{T_Be9C*N$qZ)(r$T`(ih;m_}YEvlJz5q21XOOrv91Qlc1Of>MIZgO1ZN=e= z5aIiDmTW>_oI&jT8O^s*u*QMSX@N^_{t7z_*J3U^?Sz&JB1o!&*ey7w$r}rU6G0~g z*3Q<tLGgRNxykA8BrYqE0VRCky~bn_y1vYGRNN?scnuny2T0SQGOSnyqTi83pd=O) z--sjR_~~xMatK*DVrdD+FZ;F5S;?|k{jv^^vd-AD?vk?JzOw#>vVosvw<OD%`sG6& z<s-4>qb23zedUvH%KCh%(@mZig3if^*{F~*tE>|2+<kP$eXMD~NU8@PdyZn~4p`WD ztlUYkucfXW+P8wb@~W$1&wRYSMdicT%B_;hUwxI^3zdI=RsvFV$bgRYq@&~Lm{K}6 zy|QPp9EtI{QJ~wNcFf48YO)TF9ZnoTC5iV}nKXJy&3peoee~WNy7GU+qiT!Q8o#Qw zq-ux;HM{M+yLMHp6xS&B));W)E3bDMN!9Kzt@&nMYpzyn6IW|jTI<kXdtkAa{HxYk zs?OD*&dsyVJ+98Pw9dP~?#N;t<yYM?sd|5ddQxvjp}c0`tdrC-=%#~nD*z)(olmJX zu*nUl`@yLGhKOGR@%>;#b3@Ez!#TCaB&o(!sfG)0L6}|IsJhyaV$eXk4ocv_f<np5 zUmB&`!SY3?@^lcMY|2z?u4rz6vCXxm&G~QZh45fadUJIMC<!!6;v1R`n&n_ng4rlX zY_3iR#TYGBaV?qY;PuHyv&+tjjZ(>X1Y-<va0o&L-`Z8$(j^5+GQgQ%0yA&xAA7dI z2DnuBfCaluF;=}i%T?h&kZgu(gBY%*vKi8dyxM5jAdW+j@DM%jYI)q%jkll-4zWDf zdRkR@G!ExNfh0M=Be9L6ea)9@4<O<=@T>C~NFD}NBB8!Xr05O*03s6YhLZz8ryPWC z38JB|{eDpEeL^V-h9q#18k>1d^|4d?cY$|tppNwQpCMqcSSXI(#PwT9nuX9{)=SdS zAvvdxYzPEwoMPj;M7`P_HUz%Ap+i_G!^7=J!DImnV$U6<lRZv^g*fm!s=*etreqft zg|V5S*L0{CF05ipAg~j~#-G&P5O8=BeyXfvRi#iD4_X@vqFV%`;*k3pEoVzXvLPy* zg>os&nRJKTrq9|jx(pjKbtot{&>=|y4Ua?UwSTB=v{b7EDM}Xr#p!2saiP9kNX$kY z9|NT&jxbVT9Gwp1@T_XT^KRS?$g|@3j9aa10z1KGWL4wLyM|fAn{)4+(YyKr7>s?4 zo6qke%h=NW4TYzkm*wlwk+K_oJ6ifxfChvh<ohEl+VEuF8YCoshI00@6YEBteUCT* zDr}$#cyt~uv^OvU<$Lq-4JLMp$-B+uml?zv{RbY69~3Jelo%M4S{jtu9+Z<A!W#`K zcn>MX52=(75xj58F?!pVuhmHn?=~9VQ{GlF*=UYy*P(PDd57BXjhI~TG7k>naMk8y zXtMZ};n|P_hA3r9pX_vt?t6|E8!^}&Hq-*CNe2z4KvHNVX|$08$;(HAT15zNZls!F zDaV<;cY8EaW-Q8REZTeQO#E0(`B>b*Sp3r1h3zp|W<0@YJjr3aFRrOb@LD3ffBe$o zc*gtY*J>@F)i_jnvk(kkZEm?CH6cgOv@8b&yr81^tDG3;rRD}vTx;F${zGF0;*k^m z1}!&2T1Ma2GebB(#V8Ti+B`LW>-{)$`|gm;)QHj4sQ1)({M2Om)YQP#{iUht?Wq}= z{|k=}W%hPG1gaKWIPmC8qx&n~_gTD+uQKni4S+i%p{UZ9w@WQ_&-<Tw?~7Bei<2L` z4!hsdm;Q6=0U$dK8BZg9rqSo8F%{F;o723{ruqL&<76KS89x-snwDg=HV*>*c1<#T z&2rBk;{QBUkeyL7o>AeOxoX&w-#oKJ_S(+ynL5K34WAihcGkq+KQp=&kMwRnGI;jL z=+C45va=-PSu>wmi}SNq6|*)sXYHQNI{cYEAp4m7=TTj#DqBLjpq{8e^ITl0ypnw6 zTdIfBJYkVL0UuLYkE)OhqLw~>Tv0F=r0IF=5A}G~oUHqkhYJM7(kCafp8T>+kka#1 zq17)?$0Ik-2b{Vh+dn^dhp4$8dQZnofLP2o2UK-?Y19K3^v-7+>u9?9AnU!Y8@>4T zycP<)>6%`M!YZZy#T~yq+uDxh@;x1?JDQ>CMd;SKiMm46^Pc|pv`@3TDQiKm*qebW zlWC0KsdA;&XK7<IQFr~w!#3)`2cM3vgn;WwFUI!l;9N=A_1@dc$G;coVi^?OCm{Ek zMU%Zc`r;vtEr6Bn1#TiF1NiS^K}Ml*e8+(g>F1Bl0%#H>U7ut!a-@O})F1=mlS!I- z(HGo3HO6z*<`#eJEF<@OxDqtE0ly@x__)hSh2Q*qdMhSHuRQhe<lX?Rjvq%dz1gcC zEFBLlDM{eK692@pcU=}o8<Q3^7j12b`^`%Tq<so&YI_2gDM3dI3jiD`akTKLaP7iq zck0j6VM^pwL8grcY=pbyAySwgy|6oCh2Q``=jU)jkpVgz32)w^lyNbaWs`%oy7`$o z-wz>9F_F$nG|8fj{M4Rg6+avdRlFfoHtOTp0L|Rm7j?iH$C1fTrzvnEo4DiLIPk9x zs6^2T5C(BMz*!FHOAf?M1KB@4F~n3H0H%zs_{4fFsX(VO{!1wTu2mfo0GZwNMkEK| zC=#+K-cGF=^TDGcU$bg{#9m2TvP=PTCu}OY-t#fuKDt$m!DsMaGLojm1&Dp%0sOfr z*R%g7yf_;}4SZ{m0$dV1CP7K#!GXC=-bY+ALU*zf=K{Z7JuWgGSozm=e(pm3PG9K| z<afg}R_1;?>9O3?T}H2m^^3Y9?r*&DLd#Brb!%&NZtVwULaZlpNbwgik=M0g5Qxkb zoyhLe10K2gbFv-;5}<nS0_U+@h-4(+>kfCKWV0E_aHHI1y-O%ow32S_8X<z{23#I` z;lv1I14#XYp{rK7+x6K<cr++w6!jTM8@qACK1@xWGlmFzlwv3X_xz4Qi06boS|jLp z2e7A4dz}FvHHIytk>|@01mamsQYx|v%9{fg&=D8Ckm4}3Jidsm0<QA}MrVxP@Ir<c zZt4S@Hv-eMj&40mf!gOrog}RX=SCyAIO{CL(VW<Og_~baAK?RN*{Kh;hXK7DXnPH4 zE<-s?qv^j-JuO3V!M9MP4(aTCHVfGEZG?;A9|DAsyu&{ns<5NQN}i3AXu1ZHPp4eG zfWQ|nu(Qh9fk08}Xz7D9-__GFIS3^j(5H9S0`cBHC##?YaH4!wognV{1Oco+bL-K| z``G?HNMNvPPz)qeECg|uNmMki8n3$oagvjLvRDG(W416sTxi>m1Yoeht_botScAz_ z#_z!Q<_MYQ=W9_$FeJPJR$N3yZXQy!&P4DY8I5dDP8<b9ZuO4K53Pw|xp}vTCs{9& zH5K$CizO^;(*d<A=K&I_#k@jB=m-!xO{Woz`TBbWNtQXFNFi_W0t=lE@rh9^<GYCe z+aEq!?y(tozry$;TGsPx&`h19$r(D`fm>T=fT-$J&3k#_I=d}8$7lF->RgvBV?RZ~ zURs+!gjb(M2Vbu8ML(CoB@a77`cWDT_$3b)QsA#n5F-jii60e{kz*^T3NrXa#D2z6 z(l8LgAd0ljV)E_c^44gdP^rQMv8WLJC6J)t?fxbuBf|atj-L^9npQuV{8q6w-fXae z`TlomqQbi8#~V<D`%6G1q8E?-t+l}-w&GcMf<y#U8~x_5zFFhtYIgtx^m9m~REu>x zMJWCY)>iOV5b1`{4l><}UkiUyLFCXtwgSKZw)Jgg!oV`Rk9U%qAcfi+bUU4}p003P z?AJ~zUj)-W3CT2UJ7~g2?j@UYDR+|11^!%Tr|>(hGrLsnC<;8%2DE5rm4V`Fw6F|$ zkZOOE8O{m*V5*R)fsL1(Rw}}-7Njel3QOS0pw_#>$-!jfEHhHFSCtt^P5EoeL1Ddv z@F^FMt?SewTp1K9;@J2h_ipdvMk>CLPNynUFlXG6FpZYDOCJYn3AUbBO^gDKSk=6T z|8OPeTae{FFn_@zl;~@7O54RX3voyc2kc`N9ZLWc&`An|w`KH5+-R!1J09do>ZgD; z^^R#)qCzB2LPiQ0qF=OeKjz*x;Ft!96<WdxgZzNPlVEw^I#|56`CUmcg~Qb23HbhX z8I0d@3feu0?&d4F0k9toN|@~pZR=U<550C9{rg?E(D*#i(Pl<JaQ*QC`UeAci9&{y zOe8abKVR{8r4WZz{D9`A;6bz)fev?EJH|^LO49*8kBIeRH^!xp1E8d|b-5iw%jU-C zVQkRA<BL*<fhdFs;XH`))R~GLl76y|CR%eDzk1jXRh&V|oI3v_Tj~i;{m}!(^U(;J z?snxfPN7ZvC=X?Sc%`(iTpWsiqBU~e@c1nlDaVwFACt1d|6CHa0nR@vILNLUlB~WE zrsybO9QOOun90RIKVHAsOU?4kIP1-kgJ6m3{BHmobWa1SRV^|xl(*RZTLr3j%5Yfd zIZNsbjKyZNV?Dt%Uki6rw|iIRs}b3ZA>`1Zw2y|M|6@<@puwU5e0U~^w~6i@0u54* zu!r%-GV?^GzT=X1BIVuo6^kk#h)gq`dVni49}z!rGG2IFUdZRnkm$bG7qil;cz)|z z?Jj(ndEBCgj_DoMQ6p24{zuH`G1mJ&Mqc77SCn}+KWaR)EBoS#pZ~~w1AqO)oKy>c z1<^hmE48S|?62-h^7^)r-Avx)%vxW9>KOLO%;n<QTBT*01!mtre|Uh}p*}me#ZQ;G zqUmFE^JX4yQCT}%m4SuE38mevX!sFJ##VBah;GeGSrGoYsB+iszy0A&llBQoF}$4e zI8>u+H`;$sq`N*90T$ic<h>-HusLs{fg^foF*(X~H;70EPGLV5J=<HRElL3p_jo}Z zr^U>O4ncT4k~1mehW0t8?3=9;NDi{#c??SD(-9t9)_ii23Buc>JW;<>xx-j6%9UQ- z5t|Qj#t$fejxmTq;+v%FDoas#RzGJ8$>R`M4N8y_$BLa9ASg)4=M)rVp3bSyL5*;l z<uDM)OK@s-d)$2Zj+(koN+OOxf@O=}n8diCEf-id9iJ1v`~}tWhw6DfV3FqC1*pCW zR~jcs&*jRxuSsX^aKd4+=|uN_cL#=L&Vj6c9d`}m0x$DdFq_q3;4$eo*HQFs5mMq1 zqw@8LlP!Z_7$p(NXQDj_i9zOfjaG=hSTJWAXNQA#Q$n!Ks+SNcIi+qTZQ&O{QU;JC z#Hlz?Q{a^6Y?ui}a8r~3@*rPe6!6V=uK&qDfB0`nt}vjBtJjsgexr1Dv<=Cx2YPU% zQYc<|p2}qPI`SPPiU96Ar%>(2QiAw38+(oWOa<TH$>aa_*hIAba7Mb>wGaE|2L)0h z17sr?rCcMi4qIXMQpKw2ft*n%j^AEAr-}QnCMUiP$Ji4MM+UH%{S^W;)2G1!@|3y~ zotb`V4%iV*Lpt#sNlG^IR}k+jaO+$8G{^p)y;2}hks>Ygz16JMz*s*4$1C%-+<WI! zF#E1u$`x(JvxbwkE_?C$xy;Ogz<==Q<z19=S-3#&^-lHEV$X0V8?ASK2~KDI+&sIb zwEjt?H0@H;D}K=m3z_}(S<$Xv%ao0S?YxTa$W768cBop|Uzkn|ypPW?;kJ@(j-B-Y zT^b%DY}d{cE6PUY<H%XI4sMHcJ)=4nh@V!Zzk-Q3KYjyKRmYqWWrtY1_AyqA!*II| zQ(~u1ch(tya5>}osC&CsDf!Udut#x^^ZeviH6$m=A=7H`yIQnm(?@He>2pgec<sA< zpQ5#=kMmf_Ha6WnapA|gi=XFepb4>0Y~$RlqExUw3Oan?^kqg~#op@&wdo0+eUxjb zL}b7${oeC(-|P##YF5>n0BAR^M2JMi+`oJ)1=*Ch?q4&gbAX9pNvIeNw@?1LdFslK zflytG%)^qau<Cl-4GH>F9OXL9n>p(zw+@^bNe6fc0#ITG5E@B?%OXHf=gnL@r^stq z14gc9a!lt8e4q}giaNXt)MQbSBs`Mmn>bFU3=o<pg5r2n7HbB$QZS7WSwDa<i#%Pq zod{s{nJ(Rtu<5U*FGXY9#}zgp-l>l@IyqTVBL>ei3w`$qi?z(!XNx}BPUOD!Kty;E zc2ZUWFbbr%j+){q`DOO&Ye(7dOkAO>S499wf6Lmw_0^V)2xvWSG9i{83GR`91F1=R z3NjSj#l2Sm5t57GY-e)g5^IND>_Ad{q~Lbo^FN<b+5Y3HRD2Gz<;AjNy+vpuM4tV} zZvP3TzodzPK^)z48`!AX9|bSIg}+yqarale`pmOcO#6w;$aha8FiNCxKxK7WEvA(q z0iSoq0D1|0O0Xgh1U5iLIQt!<l_yqAoGQt;lzmnxgG%H71tg4{Rp2vj%PW~}h0;f3 zRA-$zwc-XG2ajrT!i@>|@jRc4lL2ZxfzS#(3F6}-LzcdoYe4`%0RS)a*O9T}Q~?1! zLAE#n;O>Ptm||EuEY@VMEf2`B!~|maA;M)a#;DOoQ0XLy<PfQx*-&p&qq~%#jo^<) z&I1Y%U2if~AF>~@*a`)>I6DV(7`s878#hDsHueotvr8FI^nf{XzD7{i<qj&M5$p># zQE}$R{uB_4Rg>8gf8z`aZrxf_#D*<f{@y5(V96{?rz42s(UK*3?flpDBn55KE>b`d zz0zLFsDurC+^PAGJ8kmr$VsI!Z@;~*__A=tvP^kNe}l~K1>w8C^nv#BO?Uk-?K0!U zvKD*^w2^_J$slc{XLn_umyykrltpgQ;*(^0<jd85^CufsY}%AXD;2U;&4IVvc{Gh3 zt$MO2HO6v8Z1-JOvJB-Xzp9pfSzTbHfRC#hr&ZzNN;LDTw(};+-YfIOO^8oct9_Zs z53>dHn7K-m)f&5lepepeJz3{JSwB#@z^!tkMyH{6vbocaWZQ`gkv^(ee`;Xz8uBh< zAk(J5g%y(@pk~O_mv$7o+Z}zk$3Js3h_@t81lIywYX+>+vNj>x-miCW%h;l0sKO-P z>?*!_8+CF?!ftqIUl5|B*^-$*HK8<y9ioa9%RY+&7zXfMWE-Fd_D|-oR&n6bdkW?9 zjC6wz1$BZ9AW9My7%qKOdv9@e<RVK%?PQj~9#B{h=AGtaPv6-4RO$Z9rM_&kimzm^ z_VAAL()aI^_gs8u|El&tYd_vxz4OgLrq8R)!(Z$k&<=#WOL(hvaG!eJ(AQ44jJ*e) zAGjsjjjwk*4|jgg*J*Uvb6)+y_UyrJZat%@ZZ@)3*K;5ITk!~DAL8ERAJ=KrJ*f^} zou&b$bMLyh;*|!e`o(2rOmgj4{mf7P(*mf6k7&9wYBzMgNPO{C%yt5Jd&`8nl#itA zItj_~kZ(ksl)&Qgd4~0=Pakd)dc3fp4);TOWoI+UpcQY)v(ZRA3G+&nKV#k#CV<D% z;2YaqnRa}<8_irZ>8i!oiSob>2ERD|5l^w807eGG0N5#wC74G1NGJ!&hA%1%WVQns zAib70rLg*F|D8+}1{`u#K=$U_mLx2kGR{<^E))8{LE0l53HvAs>NjUBEACt*C+=$m zM`FZw-!T>s%Dw2$E&qor{hZovS&e8a^&&lEu(^ouByMx_kw@L3NgG&_NfqLjS=7_! zBJiUcsdq*gt`7xd=-1}-u6W46LdC`%#}f1jphtNERNR~`0V}R^CliUK<J7_`ERB^` zBYA6&$A2JHa*HPi9u3IkVo8o-3Iv2j=SCR2W8hlDIVmFVlP$iE8RyyRYc@{6>bL-c z8<L>&1P(MwSD9lPF+X##VeR5CcVpP#WtaE<PcrY#Gf(pMIs@0SZmzyfkE-(*XR;nV zY9kEfJA8JQVP-wC!9V0~Ui*!G*9+v+u;Kb78It%)2mcjTT2;Hp_UwFh+aa1_<=K_p zUxIgiU013<FTExyor4?d)u?!;YWR4W-uQ=h_N(&ac3HmI12xKCCdLXX22a2H@AbK< z-o`1)xuISpsL<``g`H8z)O<Q1J9CPc+-Yg&Y(CvZJFs7P>DC9Yo0dxoqB?v&J%?KA z&q$NQ{JMC*DR~<_7`fw(dZyzAb)VV259Q2hiPSxwvE<Vs<2Si9duZBIsQS}HZ>D6` zV3iPhUIcCMFnY6?{tK)Bp->O$#TLK!ELjmxiKAnM%JT+=KDa(x)wvg?HsvU)j%w@= z^Q=Gz88^M6tJIb0pXY!8g$<B+LkR|hr|KsI0+?cS<M8JVOpmz{CTJcp5A)IZ3v8^` z?!0*E01MlI^2dOM;q-&lG8<~yz8Db>d#dd|+toi~--d5KNzEVT`4N<R$TICB@iw86 zr(k;jTNm1z7fuj&sHvAWboYgD{XG-~lpzg0Gk|-B^7+>x6?e;(AZCV?_OqF+J;h~0 z)N<6gId+-ET+HVCDg<B>KE5hES&-2%NtGrY9y485)w;(;l4q1k7q<b6u=;}gy=P%r zbM8}wy?av$K#05`yOOLG@fq``cMc<lZKTiZ-2%8V@@k`glLLESky)1K?{G^m{E*Vt z_VIZ1YhLsm@B2{T9l23&Kd^%iAODOMVZoJ_grp&l<kDuNHUG)II|F{nR#q*Jx2NBx zmf!waHojG-?FYmqROWe&cj%XCDT<x+=BfU$;$3g|DX7X!*v??Mnz&#)&cypXuI>uB z<bS35Q_?=4Gl32M4-S`+T{k-?p6wm2P;$($$MipF`Z|3aeSC|jcL+5db+yLptz96` zlC}Bkzr3%{UNGT0t#crucE@>r!I$1=GRTAXB#K%pBv9)@i?t4Ubze;@v$q0c+}10e zdI#h^i`rd}UKD1d<^dNcmF!qxuus>f882dKEg(^<r{wZwS6Rw@gN&uF*D?L<UG<P2 zh;0-Vbzd*JaGT{TTCgaxF4`j8YhUp<)z+3zSnrx`z>H%od}F1o`bODB7$(ZP3>sj1 zUR@d<FUlS-x^fJ-@)L`Ql=$ljF!XNMlI2TP-c@+P!o?*cc;hF2Q<)0JzK=P~-B4%$ z%mRzg)k7U}Lv#prBJ~J%-Qw!{w0tj|C-<_lM7Fo!V|Dr48G0rw28A7kVHfTH0jWNY zu)UMW(K@Xs1~=t%njr>Q=$ychhmr2H01-sEv7|UmYL2BehYi{Gg(%>+-aM}`L7yrf zw!a7Tj`mg*<bf6-8a?}b>HC#6-C@F1OgPE1DJ#zS+V<w5dE%wV<9tPVEy`aLuy}Wa zN7-z^LX}7p@wmL}y*fWXZWZF0JSRX|@?R}H5q!?M_>gLEdj7*sD&hUSTkG9F5h4yv zp!C*!;|)gf&FiI4TP|+E=bHQ_B!=@@hE2U5CA~mqQ(y7m>d&<euSDxttJV)bmt6f; zo)XV$-z7b7xvm__8*gEa;FM&fRc@Jfd~2_GV|#`F$;n@V428G}nU__Z1|``LynyDK zOrC;jHQmt7*7)h?ofog4Na-{eUP2^H0ISz;nC*?)?@jpeh0t>_EYRohjX)>QZg#BV zW}d?-a-3)E-!Hl*lP9%aXYzEXs>_Bg>YWl(5nXlG`?0BTO7B3Z?rBBcY<=xG^`471 zhF!ly=tC;P-<<kdUwdQAi{@biSK-w^n~t|zSN(Z4+6>i9oj4B;^qL+IzPEV$NMd7d zgfYO&01}@9UxHze+jSQc03H;fgF68%yQR4Ll`^JvOA%xnyDs`=QhZzyqq9gcZMy>L z%w{?Q1FqWji7Z??^sS|UnO#7+jg-i|a|Cwz)^aPsuT|`O^zEytVsM8|;In2}yilFd z-zFrHK-EOZXkC(@=5zcL!O#SRY!Vb=b~WN|mw5tLH^Td9SZgHqbuYx;*rbB^J*RtO zrV`-uzWfXW?c(!5N!&FdLb%5LA>vhVk!HpnO_MSLK-{C+ty=^-?kf4};BHJ(NJ%;Y zcry;--5D8Nad#K}uB(Asyl&~G(s`%vXl#f$w4bduUm4MFMo=Q(>7@mYcpU1|!^Sl0 z86{-yDp4SVhq!-rTx?9T+B@$k-ES*>rrKJqOiInXN8P^6xgYD+bgtg`ibuq`=C;f2 z`+hTvRL*wu&c#;wOx_<kTVq^S<?p6&Cv|&Fe0!on<!kgQi{E?qKH3gxUUPQo@~qjO ze$Y&s*@RGf&RB0$y7#R3pSf#lZo+a8>by_vS%u~G69Rh%7rNQjQ29p*uP0o8k1LR| zllIdUiV=t-bB?h3&vwJCo~%78&8A1gn(5I_1V@3t@2!<7M_U^2zBTIrm!fa-+rXIK zvZDSn{x~BEI@V}Gt|L^sLt4g9u$(WlxS-gm^U2>oCd!E*hL`8>AA535rj)jFNA%WN zM&|JDfa2MW-MQRDs@ziBdst>8S!jK42@+6a!|7a#!qsjFpr{J^&d+h+3KNm=|A0ro zs?Ih#H#oP2d{dii_3VlIwtxpy@Jb>p-sGVSNZX-9k6cYjPvcZr&k~5qwp?8<YA^k# znM@NTDvIg-4_#$**wq2#f3vF+)4Ps8`7eL?p7rT!>&sf<rRqr)=)10AKBI&As{A6X z9Ajl3;hXWYkt<s;iC;oQ%0h5g2aWa;S-7N!FNsRHD09%|TEriN@9!6TPJQ|)8=R^U zBFg(Y&(idW3fKL)Nc=6UG-27WoPq;6rjR(nDUueY2-<kja=iH!My5%;;`j~OL_UKp ze3GD@o_w<NE(#}x9$x^bNNP>PsZ?bKkcN8pLjduEJEaQ3C;==!dpHP4;knf7lCFon z17s7{wq~>S(6PtJ=HLDOlWo;F{%}Wwre}~9f2~V8Z~Xcb(uJQ}2Mdup^tvK8!Ai0& zTj1-~stIS)Q5~)SC1~|L!f`^m!X#^AHCz9AnnHo$MAOdl3q!Ul6&Hmp>I<l&9?De* z4So@7bL|X*os4h2@hdnH(!W|?cqC4>zBF#~IE9{G+SF7jB-z|pTe{d#*ZSRNwW({d z`E6VN+kW+HH-CjJmb+dmS!dk26|7M;uA-)reKcW9xt*FI(bm5IfV6V<<L9rRlnLOQ zHLgz{I~QKf8zZe*I9q5R(SCp5FZF@XlZM(i&BOaOJFC}PRMYOw^`B_jAGoD}KuK(< zF#oDewH?LAuh&4lXVWVOw`5zdjdUCQt_P+2Vtqj;vl}po4I9{i<U+BU5L;ZqLwjo1 zU87T%&#C-6mjB!;Hu8Q{AsO<}`>k^fq3M_LqDVI?7UWingeknZ_uGg1w67Re7og)k z;72@GO=hM7VY38;LN9LEo~<k!0P#lCbnef0dw+p&OYl%as!%in#iPf0xo1aGm<Wk4 zG#!?LM0miYQgb9Y|LCES{%V2O6`!=`0!jixd3!hsAzD05g;dtR!hFiL1AU0L^AkT2 zqDr{I_?`R7FppEF(va9rS*9rlV}T1ma(m<A5dx8sgP-JNrU8`3n<SD5`>W<)Dy~+q zf=6R7b5INyqzBRNo}(|9@{$>W(4grwjFItQ9}+@soq+||in(N%O9l^<BC$E}s^CXR zX5NNZM4XBq&_;-FkPzLh1kIrJD6s)NdQWeGFavLi(1-aZiOKx4biN}&He#Hdm`W!V zFI$Yka62ccb`rJO<YAN9YMeG}!w!*2#d7j_%ADrU-Bm9l3t3QMFAMOJ;Kp+N;Uca6 zJOseOI(<W6#byny#i)!<2NDrZ+B*7rH5bz1@;#i$ioBB|*WY#_JdT9?rf7r0L?#g; zDS$?f0zaB#+Q8t^&d4;8I$_lKv{IH!G{^-r1o@mh@(Kt1$^Q(!U+cj-m%Cvp#4=$A zst&&d<cDD*RR|<*Q3A{<#Y<v?GPU_8W#&EyC<vk)7UaPL*jr@$BpHuY=e{Iu-jR&t zC1s|iLEuL>;0^f%cqDqzq>v@_W-lc@^w-!ii;ZMumHKi^_m{Y)oi-vE0HID*!A6ka zH!LockdY#91QF2YXQe4NrSZT34D-`7R+B(k!-R?C-JMku`QD}qkvZRsXRs1YgFH_! z4{tWs87q^Qt?j3;eDPlfL{-7!-T+u0jW0ctG>EKFmBET^?%<-_N8!okrxrh%xp_la z4)?lN8>9$z0LXHQ+b_w?oK^p3&KEotq_qs_N=%5ol}P>}s)OVM%pxP0ATKLomtFqR zlQ?X-j2_z>x!ZCboLZgko9VjxEd<`_$Vyf<B5}ai1e<$^&MrODHS7eB`E!M`bcZVB z*LG7b%5V}&kFwKJ_$7&eQ^ZEXDAO?JAxjvq6?}$Uh6S8j`H_7~OAy0HRy)AoB@`|P zBX>(3b0p&-Q8I<5)eHYP1_M~&kdj|?u0TYNE;5IeIqbpB%}-jQU$vl#NZ`2c>(N=f zK_sO{y3ers^Unv;{U54&KApNDC@xs*_rdtYSnJB&e9;wii7)9HQT}l7t@T@brD)ph zD)^6>|80|BJXs=)yw@K_D35C0t@T!_`ji18-2MU<U!h!@rrB{5i=n^rOl+aU2wP7& zH^uP#@}*o2bDXkvrk}<ujPL0FBc+c^4m1eInen)Uo6TgL^Yi-+Pwv0TEp$X*h>F`( zn$Q>el3NkrFa7HD<Wg8vL2`V6rgW@<ZTFYVVU4w2$9LLXG%GytTvW>_SlvC&ZqLE{ z8p>Afk|ybS*DGk2YsQ;>4>n65pBGALj$h93lD02y4ZG7UC;rQ2>C5K^OjdL9&%T+$ zTVF4WBrB9tX%;I|(lzgwy2ZOR{TG~zdZ)WM|6QJg5^8SAP8E%Jx_IuijqbgAsx9;* zlGj29sDSs7`h$1Tk^I0RB&UFY8c9NmlXA8@bUOU9GQCH>kY>Mh0)L5NoV7L^?7pPZ zflMNu+wKrT?aQIw`q2OE<At-q>-KetG50|=;&(`a1#l5oe0wse(t}(Gv0^1I`NS)8 z612V8&Q?&61Rx!LSMiG6gT`Yw5D{<pBi&hDO7jp(X0C@2{K<S5ofOyh^%j!OEGFVf zS<9N6C6AWWc4AB!<A_cv!r*+sMuK?Mc#>d!V>j_}8~lA|!bKcD@|;VJ`{_I@`E;tX zJ=+@ny-82o>ob62n%YO$Q4xUY&VIkpyQ+~?MR;EpDvsASMC(W2BV$!gPL5}77Puh& z8!%@!VnwS{^ex039?HYmxP}D8{4T&g$2M{*c2s)l9_q`i$`iJVMB*w9$h^i!mD1iw zzD#H8zmVQ3emCaPs_p2iy06^jcUr#}9v#^!n6r3b>)92Tm#axf8cogSJ1%qid!we` z+e8%(>)tEe!=)S3Ei|QaaKC{d>a_?gH24(Y7I8JXFScVxM(+TR1vSo3z+{I{C4zlt z;5)}3zO?!4TxKJxBTIJqh{_vfBzy~_yM;StA>i8!V0)P-g2k02G2jY63O>Y7kloSc zK#`$3;7P8wkL_&H`oVK1jEW03kA;xdpcwwfU?ukz*3|hsBt}}A#TdyV_2AaM13*fH z&ZS|!%${Brj}{XVG=5$c{wrt!eWg%r_#X!GnI^eEci1zL0Hh2v@mQ-Wk++K(pKS|r z(huT2%9iFwlhQ;}xU+R6i*wUgf)*}IN)|g*NsT&idY<KfB2id?4QLnxKEN{M_aBbv ze@f`a8CCyp37yg)Qo!N=4+)*e6``3c|5rkH?mGB?By<_GS}$(H90^_K!-&cJq<<2+ zt+p4V|64-$zsXXR;(>epUH?ZycXM-B_>g48JN`*vSK>3Kx)~+J@IMkd`)}3%k<bNS zy>#H_ukkl?*F#@iir4$`i8b+^UH{hjza(_*4%3t0|F?wh==I-!|CfXg@06;!&Pq)D z!?m0w;uf@=EPsgnI7Z^k`f{q5;}1ESQen``G{Rire@W=<Z85Jh_s#{q%F=`8q*L|( zUlKaIMID8FSGVBR0{6hC)k5zxZ&r&aDZz^;jui&4l>|jt1eS(%|2Icu<Y@bv!x7om zROnr8dR=MsvqYp47PBkzN!ZO`nq)}5U9ZXUoCgq>twP?^75^hkCB6*4X`rX5g<MFu z6!NyIaZ&{d^O6^Xni&S{Lm{mvZvGMxYq@V%*(T&`{qCCO8?1)Q5Pzsf@qpY@&-TfE zUTY_&40t>{X8v(R9miTUTc;!5aU^tD3r)X=DP=Ev)A~X__P-EnR{2MkY9C*{A9}4f zb1ma)-nZxPKHUbmG&Yz>@vsd?ei<XiHS9mK)a^SDhb(O<Wssk_{SUIVBS9$JNLo~- zfp_7S8iy>sOSHB$o!Z!y1K-=r;fM+}KE2<3K;q)_d2m)p^XtRUQdtU+&5ou{3+&$W zCm?4NNgeCMhh;Y*<xu0NkB*FW5$5r#Iq-sSswT=c(B%VeAvlA(=fSBl&DYg;0>gW* z_<Ul2(6vVo#D0Du;QO%ZdD70STQ4(pKkD7ew$_S0&s}cZcg6L_`JZd$XE_`ZJyq-1 zdTmj}uQ!biSAV_Lzc&?EeEzo9@AsWgB7T49ea+#B27Y|}{fYUgBo8_0*Y(z9MEu(J z7b`&$v}tDm{`op9?Rxgx{PAmlzAv5q^yddFRr~MOO3{hGKiB_DLU(~GG(a5s{q@NS z_8<KSm?NS4@rlC`@zOtu=-`f=ycdUDSp)^5ZYB}Pc>fSrB)1v!B0=p8G-BT(w<!_S z)r`NKCsen;xBi8Lnv<A=4Y$Bcx!XAtiDK{Z+}6c|6B_g=ni){tTL`0er-Nvq`W~B? z4D)Gi=$bmra<i$8RKlb-55rMJm;%T?-=L<yEEUzH4NI$$!2PXNm(-N6@^9Cm#r$FJ z-d-4$Pe+E!*gzJMpeTm~*%e7e2~Mk7%Hu&bm?R?~bI0xT$rRpc-<AlgdM-SS(CY;t zJY@{&%1V)=1E{aZZG^}G=i)YqvLIRQ`m&l3FZ0wyhLT7PV<B5Q0W|+cwyF#r!L^q| zf-q3j6^^G(58#%<Sz;pTpc5THrfiPzcrzhmB~$6XdIBbgl#0WcilCwZ0giA@BgUWi zFGwZy!i6>7L!ca)iqIHDiQt)H-ejcdvFUvO1tt%k!X6q^YAtZuG?OeQ-&LK(r}L3u z9t!~JxyD5Cz^44w%udY}5>mhilC&i!U5dhU=})hp5F=3)R#<2m;v2rd?NXdOu9MK8 zRLrfM#FABJZJdmawIzcrjuWnow<U1L1NY(|Mq!V(!s1s`MlVkJ7G&`%h??4s5qK%w z1k#`ogwxR?vw+*G01t(j6Kk~$MIeUwFvOfOR~T?VZ7RY~qV{1|AjB3I?{_RhkWRX$ zfEyG-GhimDLlg+gKPN&-*qzS=vpz6IikV3hfrC5_Hl(_3Gnhc50K5c<>p%1d9bnG~ zh^TQmj}`b@?Kk)+KRqFXZDrbW8uiYEAD1W-N#Wrl4Ti9N?;~==YIIrZ9*#He51R#I zUDlZae4dFyu03d31{HFCIfNV`At@rJA`y58(P<$rKKDjYNGhSVnFS5qG*$H_dGgZ% zXjg9uio;xpkXiMwIgW2FRss*}^X*%fpbhGc_qglF9T*@$;94)?o*Xh0a)Lpq2ax@% z7>OpohZfHaW5oT3jWeYlVLFx@1#?5NB+b-wz01;by@NSbBErGrBXS3A$95$Z^0>^q zNqw15E0~nXtNI40{Lo7_#L8cCav3`3?4K;6)FIpxwyJs~AXQMr6;spr3j3EamS#XN zsUQscSK!zu4vu*7j(s;BD44mM@J3N_BIY<=tQ)k@c!|*sve7i(NFtq4$Pw1e;lk}o zSBwxX5v3D&q@Bmm^p{+pWh5+5Q?mAjD$=?2W+di|y0s#yc$D!7dW4eWx2LQ&u`x(Z z#qALy76_+Cf(Qz0N5OT#J@w5LzB?Di*DFc<F#cx1zkO1tkqT*SjB=5>ktWJ-#3*EB zcRzso=mhTKB!q=BzXRg1nC-puV1F~5o3a9MuG|s9-EToujyl#Nhcib#jP$|{nsk$3 z=_P!+h&!ymhYTogboAZhZ$`**%Ea}UJmEnIVXdcVr80vCfv&rb3%?vQKRzCgV?Rr< zy~8tum{$ge{se^V@PzY``~w0(OrbOH61180THTv1BnP|2^JA?0f~j{QcOrscijH=% zk%+!dMx*?fcX;reWKB(gR0O_+6CDQ#8_C*m-a|GJ$?t$UEJ$Wm{EkqE@=6jfB4MOG zr9}k8+?)B=yhgpEWzaNqzV_2<!oPwZwJXW0l<%34ps!&Mrz+hW&tl#*<(&?{uh6?a zj4o=l;EQKM1l`A;0qW}~@Q1svc7tH*ACUL&v;vJ%bbBx9GT&|S9~uCHLvnT2geM4* zWwR1INxTZc@?td|P{V*ey4eUU-2$Y33yr(@vl+cas(HWG!#*knBq>L-Ap0%l@Dn8J z;T9MH1)5+Z03?!_`6G5BTA=9+AdGwg^22A;1NWdv!Q3ogU6+`NHOn1t@Xi!ZI?_tn z!UFmngxnIq1^Ml^qHg^VefEV)7E8c4`iqPJV)Q@-i3Hq80C{bv_E&26t^}>U{u;Ax z>Us&Pv_ymAM5Ers{qu>Wtwb}4Bn!PHEB7Rum?XR6B!}Ll1M^Abtt4lOWLLdpx8j79 zIZ14^sn>k6_g3-|iIjba6n{cWpnFPCOiD;`N?317#C%HRR!WpaYP4SJ8TZtfnAEu9 z)cD@i3-hV)R%(I-ElH1d4kL9wpO)TB%bcfWuxUY;^n!95X^vJw*?MVdn6%8swA}Hu z;;l5gM0&MedaZkUeN1{|ae8xadh2}p)va`fL`M6%WU@`F+enI=QpmAlOL)$_sylff z!YZN{&O@gp*U<vq^)vlxUE`Ve=QF3bGG`>RX7xDxo2>bmtVK*prF=$a5CpEP#m!ms z0GBd31zwmF*v=Ro7NA3cj^?8rU|_izkfTue0M3hwWAzzR?o|h@MPQzrHMefcWiv-{ ze+Q1|2J<G1|7Q+PGFM1HSHvS%EH+odHe)WvTpS4>AtTzV0ZA6XLk1&90DeYHb^v01 z9q3KU(=PGVVWC1Oh|W&0H1;<DfkP1)|BQTkfE$+X!1;@ebOOIettXKu6b>UNqd{3t z$dj{!*syu(hD4AY7J3Vw&KG$9EI1;`aiSC+^C+Y&WVOdYi=C$2bo7+GN7`WsS%3;u zBFl1!ylL>XZBg25lq@6WsSdD{h2kP3Jm>&FOO6XhY`#9vmkjKhcH+d4byv^ypbqN> z98}Ud{O8+YVh-@;F!K2iPw_|ufd$zn<^E3z-Sv6N`FUVJ6OxTRIXZ?6kBm=I#fdc_ zWg`K*4XX<iG9F~eE+@~vATPEFNa;JE=&H{{jx>!0JYhh+%gbE{;Jp6DemkSU2Hev2 zo|+sB#|C<HY=mFG9ul%C+z2lGB3b!Wzw*0B<yLHE2(6HT0n;9<DZOzoK7^h>1R)K` zJAzShO~}Wm%N;gyTRLNU_LBGc71OxW`n!=|k{x6KM3nLoHaRl1z`>q)<>1QYu;f?* z-t)>K<Q5^VL$YSKLCs#zntgFK#f`asl0N(JMWV;!P2R>trxgtyM=YR<E(Fu(>d-oG zfFk7z&jsm$$4<XFzC}E=B<60Yd=%AvT)O!bzTgO=fqbp5@@H&)U}=3&e|^Yeeb{93 zHg~SqddA`CJ(ImQkM^cWA4dQ&kTU5QFWHB0!FuA%zN#~@65a_HxlflpY<+9qIyK*h zlmuKwAp}Q({FIu~{-*N9rYpai>ejXL<qI?P8q<0Kb_wl7Qn7BWhwzw=d|-;7mBWYy zN9zElTeReiCVO%R3sAC$k-;~A)kk=?j>NT&mbQ-fw|Z^)(rkoQ6*L42al9@87o6P> zp26MO-KP66fPcA71-vRqHN%=F>`}OSRX$j~_iFH03pID#z+x*(DL~#eFgQOvty;^s z^Qs9-|9GMHV*k<A#lR%wwH7Bc^z5}KlULtikH2(Q;}L1Uo=3uYk%W~P7}G#QB;##h zJ5t^h`c0BABiZL`E7qBLNa*{`(>}!Q;Vz)zR!nE}!xSwXbJ<*W@twZE&Nhq99WQPM z6kHQ>(t~K#v^$?^y6y>DU(I%R0<GP_b$Mh0A$YIEb*tK=!Tvb1q4}p@rpo7n&gXYo zw3r!4oBu9IbF(*%bPLRL?{pRlKB&}mX2v{qR_~7ij@9UK*tIdo?UHEZC1!m__z0jJ zX~nr8NYmxBj=P&3ipY;HrFJzIhfo|uj)~+0GJx-nz(C9bpvL6LHm|o;pWAWHG-YpV zx{8HjeUI$iwNpw*y%AO;D;Y0mfFUKV#EfRQB;TfUfHeMmzO#OrnB~#Emfq$LLi5RO zJSPOoN)^Q{ZKE@NI|)}>td0ElSnK!GX3U|`i_y*I(d-*G&UbP#8#f9PTX=~MUjDdf zB}cxMJyqY$cs6ozaIy3TfaOd|DSIyd6j09bSr5wF`du`VWEJj;kZRCvoAK~ShtyJ? z{@&5~?WVucqw;Z?V;wb*UNOZ*=G2@9_lBO}W8`pC9CP~t*(o5y4wPdY(6lg9HgcHz zYOAPWtL1w5Mi(FtxA3t*)p9El;GpvRVGO;|sn(GzKkS^Sw>=5GZ8wzlW#sKUhl~D> znk#boQJ`cbAhThsWC0GomE+Kt7!uT53V!bn*3iMlt;osegh?4h$S|!Hr$D77hyBSM z^JzqBKG^FSp=8PNP==`yPrTF_yCMpTu?sslk=~bvp->B(h^Ck#9o%3~40PHmU_(Hb zj5c{YaiPSQpNK-nT}BRi@dkh(Jr>A0qm@2}U^r`$RM;^khCdD?d`mf<hD&o%Z;B8f zzdF`@^VAIn>g!I`JU+@B4Zc!_O6)zq2Am^&7C52of+QVnK{<Qn45|(Sz*%rl&nZg= ziiLJwc`VHhgL0?O=>tfN)sdxqXEvoJ`1MgImX|Km#lhdH!J|Zd&U2}o^C>6YNSA#D zh*D+3p3QKCc)fu4;cJ#rM3xyx2RSB+x>A5p`yrtI)?OBc7(IP}h(~|1j20&aQ{J6d zfD!SXdQM3Q4T|~&)$E&WTYAAE`_v}n4ISi(PCGW)LzezXG7xcug|hi3aCqlg*%T@} z#{~fbTEG<&<(zNJ<<`^^g~$_V`k~<0kUr;zu5+-u1fd21#uMQwRlxe|s@B7YiHs8s zcPyT~hd>ITfWHgnhM;o?y@<fMZvuv@kotEZ{J40hg^n%&c!~o17YNVOAb<&NZvTJW zz4ud7;p4V>&PgGJ79jK%q(y2_5Kx5BLs3HS5RfJ!A_5|yoP-v7=wKr#2qG#fDo6`e zR1i>9R8)!}c2uN^X7l;JyZhaFXZC$(f8GBeGnsSdJoj^7_vQO8)C-pgc7*y9ZhINy zfWz4knUKQQa`<a%DQxXot%bTea^8kBv3J9x^-|cMiuP7(fG6Gx|GV$14i4EO8$HN# zr1|gBz#VxLbWH^Zv7tl1k2guBXJ&?Y-wi3al>&h<w8?f_K8VO<^B}#m+!1!p3!Wr^ z4b7rZq^iR+m4+lFq3!^RUEBMnR-YPM5p^X9C_mUrBq$67Eo+8WB5X;%0|_Yt8^^bi zfxg=;f%p4^Sb>)|sG;SEric-f@!rK1-;HSB=-b3^@1bLBE`4gTjKk8yp<@HjfW8DE z`>a!eD}X)@T>9;zOQK2B?n#ir*Jy+h&}Te8Aizcjj-GO9@$<j$te<gWwSK?xejXkG zg}`%N?&O~GqKj%N@A&2)tc(x@b-uPDg?{f39Q8682YMEukib}nZd8f&g)t4B4BJj% z&|s-)Cpxswc6aFm6I6kQkL}4y2`@zI!-ky7O2Zj%eOpM48w=Q+1akN-(Hw{`@FZu& zMXH`Au48w5!7otA1%*VKmIn&(GAZ0*r<%RM3_>K+C_@3k)1C2*pAo+kkLbL4t1*2t z6S`<H2NeS&(+Mu)RBkNdwNn@W%(L#_QA-O|eB>Y^aFo||U9|zVbzDA_iFFFQ+S+?O z`sOFK>|2+CC@%#GgQK`C#P!>(GhRa<0>?>&aTl7_kqB3**!T<o5=Zw}e{er}`q)dg z%|yd;k3U)dcwm`Rc4|}+A)6U^slr5&<3*$<oxK(4bTMCPHKO`XV7a*Q?m8=xhYhS} zV2(X`uo4FkS>=lvqG$kZ;3}@{XMW#LvTA1;HyqB&-KC#q*fa6j=~i$@AYg|7#gRN< z+)s(l@|7t%iS}}EM}|D!40b>E<7sWM%dZvbBr8;Jqr{kj+4qp@OYOO0Aw(nVta^(3 zijCtt&Boub<`EcjvEFa~%lC6@m4gkvBaQ67mS<_5HL!v!qFZM?Ij^E-c4sJS;(*Z4 zJIODJ(<x$qVsL}XYV%&{#Tpv~>y7*iMQ<X~3(eOVJsU?lScjflrjJ=OxQfL=o8?8D z@+(U6Wmk)(HcGjhH=J=hEdQK#{<*7h^J2}_#v^|&Jly@~pW;2}hQy?iM9LlOogaiJ z=?*_EeJ%~X#9H}zG75VliLI7Okyowr5=XdPsf5LA<&ET1H*8euV~&L1xDH)u>Nsd_ z7|D_hO_Ht8iD%K$?!M8JlDQZ&SzT3_yc4)F1EwQ+ZN2puGz$g_lF^Q25$Kj^tQ48H z{{5Ymq?9))gT`S~&{)+%e=>;<q50gY#?)C0x{xMj>ovjB8iN!v_=l8rU!q>HDNwXI z?f%jA(!O(MnX(?A+?zbE1`eL~`0RNtpzBn?>6<i%0<7j);w&MrGELa2Dt5g0QJEOm zX>vW{xplTMw`$9(r8WZ+5SI5IXBsIZkbeHrCh(k6c7`TCZe|7yxsR^W({7vD7E&lL zM70(@3fL9PTf{Ij75rACU)|;&em8W^Z!P9+mthRXH~gV_dsx-V?~;0J89hV!spTiN z)^X~FRWH^*XY!YB_i3s8(M_0zq~t>g@DCe<k7?U-J3ru1wtv=KbeU5>MWEC*lNc)5 z0x2fE{J;nyVokE(iK<#G_>?*|LBUjv1)Wdq6Cp2c`DSkxxVy!oANsPJpr(hXZOa3E zHybj*s?YoBJ6>%@VEDW@FT*H7+!20&C_u>GFt7x(<aO60y5;`ybGpHQM?pX$hRCWt zPZ-$YsB`!IO-H>R1KhSBuw}C#{^A+Sjvc~F*ARCfHrAr`92yTX@7!cxfz&%AAA@Rz z2WB*C6oJD6!bIK(>0T)sNeqSkx1Be{U&-rm>rjnnvea;_G6qq&t%XdoQ@ic%=4@m5 z3@MlNcn?ysYR=fSno6+xz&<l)@>Q7FyNB=Im09G+Xk!lYyE>Fh=M!eq9YimXXU)zT z$13xQ8jss&jBj0J(^W3q&PUyJSG((fY|O^!O`IH=ye(6Z0+5a$&zAy|R8C6;o=}U5 zynsy7eh47`*|XuKeXcZRgqUs8eF*)p0nV5&@CwM&8!|pnVDzsE3^UwZ2l;fTDJn%) zLio^91)@pqVE)gfi}YQ&?H71c5GD)NM;6;6YSPfVmtGR$UTR#-v)zoWFAYyV*l<P? z|EZx8?ZBP9TphFV>B_!}d!HNHpT9bEqhCEG`qm@cKhd|JhNm39`#S5-;r~eJVmdzm zOLnR~atJ^O?ivPSdl4F`vHb#eTd{-U5vfP-%Vo>QifqeH{dr%3d*<gO@iG4&j}7@w z9-FYzI2r%c(e7{jGq;G72`~Jz|0cXV&~P$wLI<WD={8!XA>O6&nI+9;Yjh{QrGI~u z{x*~QdTpUNP4UEg#C`G!fhLiEC%%@y<1hqExaU&dmh#oC32v#s+gKRPHcS1$4dfpA zQqa(IipLQtrLF$@(38gH^3ed4F&UB^hxx48zjgt1(T_2^BuVeytFG_G?jL7J49uX^ zq<gWR*SWErjck+=4w9&Xk1MvG{Z1m9;L-b0+o-)L-I;XhIBJ{>rxy8F9U`!1Ajana z;mbzt9DZShGLw$go&hoEN!il43&Q8@+HhOxDCIVQzhxK_ZX~1!O%kLBrEPZ<PUMG8 z&WMe**&5uOC^(!kFSj6VxBKx#VZy+?!tW|Ovu_g+?iek)qKZ6s?mCmRhtBtpj`*Gg zBUL$M{wz|aY&4AAMFeNWd>}R2Po{dK;#L$JDG^$7Tyn}XnaDY<77HZ#Oao}$nZa#l zC5GG|9Da5rs1ry)@UmD`+{e3WTOTmreIS%O4(cf;qu!*b{!IGlC=yy+{evqyYA*j9 zB^^zN%vD2;`Kv%lGAVh^I%4;;_Wg->o}PnN0JN+$Wr}m8C`J_&j;}WTJTkcZ@N!|+ zO-{xRj9rPGtXfjlIC>uEZtS)sZ2f_)@Fk4KuNzsPOkh(UlAACtGi2dhc5w`LyNf7> zPAT2~gv&JGE7{&BWKGE0#$;C!DP<Iw8R$9n3NQ2&L{esy*4Z<Ab=xdN+t?7snwQ$L z-GwKo?3&)*Y7)!umzKpr!hz44f__JN_wM$*QBmF;VR!|}r8rxhFJ+bP=@s{0?t1(C z7FvPRi`z|u<VPA2RxRNEruCxP=vH0LMzV##X3^mDLFA<s1up(?;%Vy>;=bG@_v9xk z5SI)fibTbXRLXJcyTd_8+Nflz7~;s$T8uu<!v5%{JHdES$%Rlr(TjbmLxvF*1-wlo z-r}X<k8}5h6w$6Yv|40B+Hht}eEpt)Pxp47{}p=0>r1sKDQkwIzHBLzY}lZUX%LJ% z=z`u4XfP@O9S636-`hE=dKm|slr!@KKDb?)z37^=`LRCG)u}da2D)r5Bq(IVTY0$x zI*>>Cd7CMkI?B~T<9(?Y0Ja|Q9*?-rsLLh1ifErPz_06^3L*3U!;%g?+s|v-EQUUk zj6FaD@)P9e71pZmo39>ay=!~^<y07J{Aw?b!%YXpF?Rb?<F1#Mn`)>%wLuLPmmbZc zBIL#g(L<tvrXCJ-IqTjY8%lUuWh_W&u0no4xIJ?_kY43V=HJ$Mo<au*k?kD5cmDfC zo$~!emks#j0SH$?fG#T9qwLrKDs@>=Gzp8cyY_95ek?;D0037C0=Z*vlxyXy$%a!( ziFut8$DoaTvj2sx(?%5aRpDIC{NH~<F84|9Z%J|5x=ppXH{gwUeSF~BZ!tBTGmTI9 z<%|AWS+&;#zkcjSjIX}FTEEX<<{fqTUHE+dAyXJYDhtXb7`8n-7n6AX^_#EP2*qBb z<!E{5dmr5t*9Pu>pZ|C!bwe@e$G>w&xJnF>cj)iOdwwV^pZxIW-TbknffszsA1>@Z z`{R9UgEJLnFful$#CKxY=5fzk{n)pGAN{_%$8?nMIkTX5#AGB)@z(&aQRJBf2|vft z$3~|=7;sOF)6L>*rOquGj=g!%%P_hzA$Z6lIC=8>u7t~8=RSGWoCeRcGYtr20SUnG zN%W%r%>!?~c-sAW`Rsh+o$GJDaL3O)X)i0uW@cy`i90(CsjYQM5CAjje(4=BaM5&N zIr&4%oCI%LTH2b*Ge`0R9=LRafuHdaTVt}z0AihhLgAiK1$QJriFmux5R}@}<XJgO z<RG$+0!Rlc*zL{%kJ_CalBNRVO5BCzp8F@iWtyk5QJN@KzyZ26j=tBNX`DakCO1jC zI3sQzAcWcLLh1Qi=JW2)yZh1zQzbm#RHJsZy$kTK7-dQ~XK}b)e-_NsJc84l=p_O{ zGe`}l<P7qG46*NGPt9!igd7K9O?C^GkV}Gh219pA^pKZ@#-beLr1ZL#slX&hXg~}s zW9CF+@@ULY^W^yL<ojB^cz26;MBLfS7*<ZTL}yht+|gg!D>u-4;<H)#gWe_*M-kaa z*b?h{ZPD0>=~A|6q%yxe<p|>YG&1_8h<!@hGI)2HT;ksH8+`>c)ip`XM}K<1S@r67 z${?mK7z8HKz27j@irc`nU|lxN#fi_Pn+gIQDqDM>h?mNCcA!`=B^~%8Zr#=2H*v-) zoo(7LSCs9|9wYYc${3)yTQSDv(py+qZ&>iCIA0^cSdy5s%6okXz))e?;quoigV{tT za!MFAEGkbB;wi*NHu-ob1O}&@vBaNv*%ZwN`sMZ_VYnhTUxy%TZ#@($*oVT<aZ?s1 zH|WCN#P8nb3&YT2X`#tW*88f$UB-n52hH5HLBq)O4hJTJMwer4C#>_Sw)3v_)eCr> zCUY=qJLAuKwu;5o({s&Fyj#`Cl41B^x>N6ewQQ@=BzQaSdfPGsOB|dX$LP^yP#ln3 zz&0xwX7KKoV6p3&O<>_!2Hjrfo(imz)U?`G##<lr+zsm`;SX<S@4a|Sd4qrVG2Xx$ zKjZy_^Q{~V6Rv@oMkhGG;(&Qlp)jcwOBM1xSjb?NB3cS%IWT#<9sU6WBFL~V!=)MY zbz}HlNts+5Ovz)U5n!9r!ODkrw!vkm=ip!`%bL1J_pH0JaClGuJXtER)CjJAE>#|e z4r(_V&kps-I>l~1>UlUckHhlUwz77&9&fEcdo$3+fYJ<rpSqk}HV7ye2qZ~#sE$5C z_F!-#Hh5dGb5D8_e4Ze4lMG`p_}m<(&Prbv4D>xZm*E2l;6%8f_5<FZkV&>;9E8~h zqYI&rrv<vzw6W^)MGXYmA4FEWHug*O<FD@@k38L9Ti4s!kG1*o_@{w$d&&TtLaCSD zbHDU)pH{B6>DWe{b4~Bw0hPXrm&}<u=HD-t1-QHtazCT7?=RlLETaS2)ideO-`PCI zmpLAP!a}dP(`2P8(4h0hPNt=x)w`ed=(fQiJk@$7M=!r$ugq%iG=O(wViG2#49l|` z$;_%ku_b`#k1BQ<M6<-ZBMZw2f+$|%E6)sbq1Ql~77uQyjQ|KH2EzuJZ1_C!k(Z1O z0|o@7fsMBNx%3G=l$#Dem_d?RKs1W6N`-1wxrai#kGdla=r`d{a4rSLwSkY%4vwpU z7^V$`+b%tG`Lw0j<Z|OrmYsMyh+Td{3Y)aGVey<n@|eARYzivrY5S6Z@5U7bdooa_ zu;&$PXKdj&Ehe}OYE}#0A1<reEL+9FY8%-+``c+G_W5$rnf3j4yur1C0zTq?HY=}} zR4A|3*!y19h%WxMs&tXixP1x!oC=5K(B;W^<T9ST?~+9q0AV0&2{DzUjw&ab{8F6* z4PP9q7aC3%HdqjMLyC5PDf}Tj60QSA)aThe!<ZG|u>>K}s%P@CbOZ*%5`d|Y)>G4$ zGwPkh2-Nt5sqAwFOk8QFoCTLj7#CHo%CDE^%@ufA12<!BaH`UIe=P&tfvk_-KQgAu z!+gr-d!dACXrY>m&*h$d*-Y;pB<zujetG`4k6ydaRmxb6+N<;R7Qd0Xou9`p?xX${ z#HvpFG+eO&bRO7Eca-?|@$0<0de~>@KxY|foAajovVxUvon<B|rwmsmlwgW)uGTWJ zDzyNHXoA;n`yKmgcCUXBnFOQ-Gnq?%!)~g&NQ*%02@||PE=F)<Nzzt;x?8AMbl{bB zG)7=MOzWHO>UceRazd|JmTz5-k0ma56%dc)Oc>@<Rr3XnOZQC!{Ym?rz7z`ZmqD-% zoFF3Y%|I;IqFOw;!n8^O;H|)$(VJ(PXi{J!qwK!1?c;>En7usdW8V%;bLNG-p0lM3 z$DS`V4(>f@c4UP0ew|17-H-bsFro_jOgl*%lO9r9ROx`kI7YN_aGKv;CPYZIjV`|q zMa|Y$oqP+NANvmuM4=!E#1E{zQp3R-X^3h9$nmPPIK7h(7$6B;{4>mB$1b;mR|U(M z#y$`ge38sgX{W!71Cg;s4nEM`X%e2`*gDB<ZRJM;s^IhBU#Wl#9rKY?c(K)`&b08? z%`W96^4FHVpJU;LMtUDn&-Z0%v5#|0KM~?d$f}Cocm(r+P~63xDlEK=Zqb|Dc;UwF z+`iWj6~gDg=65hz;`gX9x72iX{t>QtDDj-|LXvRA??ByKlx}Ha1wZy}0iD;3u1vmf zEwo)a5|E$<ozf`~Fcv{l>ErUFyPm(_(8iQZi)IeY7Q{;BNLPvA7jmjzC%aHm`G-S) z1QaQU<?82@#M&g=OP}1}E7_9rfBQbr%-My%JZ;K>hNcy?v1n$pbuF@Wv!}z+v@6@a zf+`mIMm><vrY~b&9ef^cr|{}@*LdZR-srcBN3S_vlF0q@bgYbjxa~}zhjl;M#ph^@ z%#TSwf?-75&<FaYFRQjgK*;LeG4a#Nr|+Pu`IxQ5QCNU&%H&Xg8oZWTi5S_v#1%;D zPrVaqU*=L94GhHtIBg#^tFE|Oyx4nRZWXhrJye?DSlJ9?C}A_vn3+_}jj((VPbP$6 z-1+h(Z}B5#<OXhBZs*~`9(T9SrSe@K2tz`l!HuE7YPUpXkemRX*#`eRSL7gC(uNoN z`#YfeiB9rBz&Xf0YVgJRU5AvNcsVxxOP;W!klq48+j3XF<VMcDDOQ{ywxVrXm3bN6 za$i^S5wfjuqeZeH>4Ct^uxd`#A+ygz!hINEKke}6;FG}TVTt`a1b=L6UZOoGJnlv$ zRiFuQUTQvq*T@ra+`zco&W^k(fJTtprD=BeFMTEYPomC>oA5V^wSe4i{Ky=|Y1w<^ zz`@=yWxAX(jHJBhl1dytzt{#g2_%W+dO{<e?<pp5%(bsyhb%Z<#e6M$$JD9>Zm{&C z$!*8RkKK73kS~Ru+BZ@%Rcib;$>&Jk%(p*<eUkBu;gVJj9*dP%M>U-m74pNkb}eg^ zMSQjL{c5(1{@yD&7>)>y&_j;@tBakEUlw$>(6_d3vGFxlwZdMVewc2Bb;e{7`%9L* z1z#*nI&*fW!o381XL^sZsx?>JF*ggIGZ+xaWFi_bP2!8JHu9qqf2c@xXO8>pjZaLZ z2+NTK`M&{7-ggXnv{V_`SiZDp9|p++^4bQosi1JxYb?i%Yw<`#)$7=13KK&C1snTL zMTthdxyfh}-cuv|b*Z6vg&)!8=AJ;$oW1-akzUbkFlh`=pWZ3+_?zMJ_+>vp&=_K) zvAHV(bF{oPW3cecSJBIQ1sOa+j#&CjXk|&S(3%dm(a)}^7mOF*JhkF2)s0yW{v12E zNK6l+|CFtUP%zPCwy;rq98Cn^ul#=icNU`pY$H}|W!oHcMOXel=-k=n2b+$SD^m)G zp9;tHT<J0ZTU$V7R5*gYGx9`*nm6!(QWkM}J0TJv%mCgEtI1Mk5587r$J!LMi9K=~ zucb+K;&aN!--SB(_gx{Uc&&r};g`I_GpU!jn6|GWf$O<OdsW8v+jM@oDP0BCyh0da zx5^UhX<tfS#0)(iExwx+<vg~M-&^5~y;JVXMaPQYt^TGpv6K<1UgtCMbnM7AS;i%q zTJDMImDuv26Fy3n^?c4Hqs}*NEX~gP<g9x$aQsa+mOoW3E#>pds$U1Dj@*{0lJgqJ zU5iDGcAS|I)pDmOZgfF_nOW!PPSw2fSerWMWIm(hdAxYu%qFwtkjL4BH`yIlrmwQe z`iPWJiSa#MnS1g`)@jOl5Q(I$0SX6<kA`lYi(($XW9ryh-F`UL_Zo(Pqd(_uX(|lq z)d3>nrKN$)nR9D_(WxV0KRUgR<uCMcol*nZ8$om<{PI}WB8e$W1hX1}=L&DihGFHa zyl)BEb346EAGXv}-y(@YEr0<0_sxpj!;bTaVZf#f10QB1VaYpTfFd7OYFX!56owrL zQ%Zp>44n}Pj8cGvW~Kmu5y41uhAn2^_3)u$-@_JjK&B9%w1IXD2SOu+h@oT-kcmOy zBu%}^%1{=97hzh!%l~@`9k$dOi{?sG_PT^SWXm4z3>}@TA1K@9qZv>9^&NhuZFsY_ zclRJKH;sChe6Zg-3W3<>--i2fgrB$3l#4%lqt1fCRU!Uc@RnE07QmZa_%g~9%z+sw zjMQukvR4RS9n?qtF{Xw>n#f+583{HN6t;<*jwE{{Q5ocaIo_@_3v@LXS)6gNu`Qg| zu}|uUW0h4pk%$4%bBtesqDGPiv7i3#Szn&JU#fTHpXuhxqR%>O^E&uyhm-u)d=xxT zRv9QyB9Ss5fMM~mFeD@BLKfmW)!OnKj<{HX8dI?xM-kQ7*&`wN8`4-QYZsg#cjP$^ zsuU%KF!?f8#i0H-Gmv1G3!7su!1VS-Oehfgq)2$sii!E#HXE#0OMp?jPFcK$*2^{k zL5fy>8RaOrd;#!lzVzN)cS{8p;F1NG-{$G@NL<LE>8|>j!}m7S&mMhf^5OJ!f{}!W z&?MDXNO<`pEa5cl<tZdYU=8B2Nxjy5!exY+^J-<|z2;sDRD_qi^5i+oETP!2N_{c3 zsvy2<w?F98Mz)BTZ`|}lpfGokSbXZye#hy<M=ekyt-~OnUo6=|PzaP6Y|(sAw!kB& zV-aA-4Qm+F|E8Uc=EDp03*l)qU(9*JQwxM6lb1J)<@)JdUQ%2J&ixlh^!rtcUblt* zI1H&L=~qBbv1-d+V8krk6I2d(p@f}|ws3sPXz7smUbqoj=^7wIDF>~4#o(i`mEg9r z*Hh+ZlSvlCTzU61=@@=f4q(wLsxf7)w?G{blfrZQf{E5g(=j}1upgz{_>lKg*J0q+ z?Q5$m=5~`q90Xq@=`{-1Yzs|3acPm|)AeUFFxPq4rW3a5Ujw_3KH6*aCgJtTwf$7} z<+qs)IxLxx6g?II2?@r`n@ermwSF*5_B=4RLx-AFfFZVU-eJBR2Ih4=3O6#(_J_iY zXuS1?BbxR2+@~sw^DuOSdvg7)t_~Hrk0p?N!KiMdaq=yd!acK99mtJ$)jp5g7ZJ06 zO;;uy&G-JEebfFu<)w4N$>Tztf|F}6gM!3YUw=<IwLW{M$IR&i_dxHtuPHs3-IqFo zxbEDI1Aou|;pf@7x0Wk$K<@QZZ*INYYHHx1cC^ri-DkMrVip-Q*BN%zw11)7%7+gw zt4pU6FjmAq(UO*o_D_YVV}`v#F=MuW=4PDR(k=G&s?y(I<R2A`=u`OFl5MtC+u0bW z+%%rg{6=?mVrQ6~R)aOsR5&Gay^9#7nVY(kjFiE32(C8d;HRa}lcY*FC!%x6rYf>e z8;1;kT4%RM;ZEXVI<}PsD!^W%QaI4f0tWHYo(T6?I#Rlj>7e}{owHPYd5Xv@dG=C% zwgJNa@E+Bp{QQCq57uHMGy^`XVt-}O_iigLxMZrP=_X@2+<O>I*~~`B)8x4*1N{mv z(LzJCkC8PEBe<}Ipm2+9-g{;_Rdaf-?dgD=KO8Pv<xeBcD~>m#A-+b=d+S)4LJN*c z=Ak(#gnChZTM>xD$+ECGbC3T>=u$PhB*_fHEoab*Oc5%hLVO&QR$wFO8C_>cpl28< z5@9|5Si1c3B09rI!m{MfEde$x@JOsTiWsYgr$%aG)*(J&8hkjRA%c&F5xn;l2Q?C~ zm#}^2mR40+KW)w}cW&Q*tm)}8OBJIx<>%zEEF!DcC}=4WC6|$`qgp}}AkjdON>dZ< z4L7vhQBfJl`-sjUSnEr>Q7+j-eaIm@`M-Qf<ME4&TU-^R9X=n-bxESq-&(IFc4-A3 zWq_E00dO;(17=avg$EXDqNoV%`bHd^pOE+r%Mq)x=S2^>yT<h^1!6O`%Ug#~2zL4I z0B<_b*kmFPlOccEW&!FBEMM$FFnLv^vI$EuX(OY5HNAfGGqE8)fpb2J&}h?+($2UF zQho4H-!wbcO3v@VdSB%WPP5)NPH(w?a{9T;uy5JNC8&aQ1|9tfLQ!Q=Wyo}aNi^w& z&vP-)bf|lpt<u${cj}jbGx5aro{ZMI`N#|R50!_4(lk}^ca;|32<#&Mq{Z*8b{1Gc zUEcH+C&ju?AG<7(mim<xf@^*!TG}=sf1>_SLAa%tk*)AGOwL(plZ_B*vj+pay7kXO z|C4xyAJO|?z{LM26&F{B^5ACuqe{|&hiC0?T^c=OeC*TogIf(_HRN=xf<tTL#6?P} zX28SN%TF7q7ah(y+-`by#rsy&n}@frytq#5&sA`|)BN&Q<kP1A1|}TuUi%-w#G|{{ z{|7MP)YdZF&-@QC(RO40{{IS?aJv%te*+WyI_`XZ-FEEr+tH4@-{1ZJTg7!QX@3^4 z@%H~zaYfdMswVSPT&^qRi!58sk98S4$p0rWaW?VO<r<+>%}<R!X0qGRb>WlbMsADj zC9-2R_w=XcfiTd8uk|h7;+oTs2U^Ek{%JM`+!W56ZF2t__2uS>=Y8^xQCqFA{}Hbo zjv5R6FBRA4uSaU{ZC<T=S$ODM`_+xz5;vDl5wD${^Zj(N?d$U^wVkVrSM-<*-~Izk zT)(5)0rG%}-v3r{J@d`g`+re!$-f*>Z)n~TK)llS<l(M6g2!?yx?jTsJ3lnv@)Oh^ z|Mi&6r?WDi_tAnUUP;-Cd*Wm?>W-T<oVhi!-*5d|m;0jx)THB{%G*|6UOIP<1{57m zbP5s)SbZ7&y7kE`yM{Nb)A8oW<8P7<{7!tEy2c&#m^vk8oG_EIQ|<UHQzLNdP42Hs zj(L&YHx=IfWX#4wRm3%ujItv!?`F?u>)vCG7sl*<%6`$h_Obcyx6RMI^IVGUxv|IM z_&Xm?C-Z=bn2vkh_gev|pYKTLP=^u^m>79oPp&R98uR&@V6K;BG2wW<tMBEJ>!*K9 zyL{h!WUk0O0K&5MMAx0n$IP7g3Amn(5Kqu!>$^so`QL{LV_*KoLxehQoA#e4?BmYF z0qm{&=EZn6{Z+eVvLL1x>$}X5ZY~CP4qF`F`|Sk&3maoc=@UD>oI!M|#d;0*N#0w| zB<0r%Mo{`?UoB@DkJJhuAMRJ&9M7nAl@#XIu8JuCTV_Vck})iAIW^LcoE;8|_y)?L zrtgnj?~x0VcZUaclYivV1TRYSR9qJZ*!f>>kOe95f2p{hJp}$+#ijCgx!m+@eFg}J zQl8f}+7+`$(#*8Zyq9c&?{72{v@Bo;!IEM6aDEZr!S^abw&W9gUDfuMPH716ms0m~ zkZn;CO`fP>tUH0lU6Mh`(m=EU3`t?ib#(YC0@KkUJ<-pgX!Yx7+8v?<cucV3U9fyT zn%3N^iXzY+9dw1uc7BAf?rwoGQ$U>AP7WDEy+`LUWkxs)9>W2k2aZ&8+sI((ATX!K zK93{88lPWsfs>zZoy*A}3&-Ko5&oq~<QV|0AcMm4biho7V{RP_r&$LR;QmEBX#yyg zF`DeQ&L{qFHdB@vU$?fE4aUKYJX;VgPk{w4v}7QdGZzq|y+RlUAS|eg6^iXO_lIFS za0j0axfc~jn)LoR4;Xn{0;!4Va;8*48<K`#1<#htBsXw}K~&pm#LU5XRSn}lP5w9r zujdY`t!G0GBv(e=jtZ?{4k8bDn#N;-x2@ZW3ga~OW6334))JYo?}g5~!3}-fXJ@59 zMIk!D7ZAmD82p)MX>4+%mBc5IcH()7DFN}5Q7?t}2K7v@qt*Y~$^3Ikcji9)Oy^>F ze040W#spA^6aK<6)CqbcfJT1&LRO^0(v$IoJvtZ=2GS4x>u(r*6Kz3T_Nl!<Mmn-0 z54teC8N?YdaNW-THNo}Oj#~8hQOlzOA+Q`9IH^m7++2VRzQEO+T%LQ_eFl;OERZBx zlm+s%yC@LcJQx6zxuS1$1Vb-z;miANs2O#OcQN{E?~}I28P@Eb8PGu2<yxJvKcP&9 zYEyaXT>V^cFaSCJsz$#0c%M#s0u|+v5sBrn_=jibEWf?XkueUb7;Y=s?{U=9cH@@w zwZ|pY@KB4o#RvA5Kf~7E*SUGz9FZ=)^C0q@(30g;vE!yRw+t(K^t92oa7V@W=Lt^a z6%v1Y#_~%-+RzfT!XF9ENd%opP(SlQzBoWER84}VQvJ^9pa^*e;%|Yyyvl*ggHK!) zV+|}$Nj}<-NUll>lW5YJapAG2Q2v%o4FNvjxa*jj6sNvYMo7%MaP#W7W*CCD>y2mK zzNd#?f)r!H{3lZtX9EG$Lje;%2oGKQ#|J@=o<JEe>Qq=HLN|(*^ZeJnemC9gR&$`3 z_C64*W<XhNv>|6rDT=9OF`OLCbHQLz4>vJ-9dHMV5*p|7>z%>ZPl#*|P@7D^LbSc( zxytALaGHXOXQ{oqwV-wYRQlpvvCKN{#WwEkXXZC)T6$%KuBp#5&>a?H+|$5aL}6Gm z#ug_{xck9o_)Y}k^RXG(_mE>-FTnZh=G@QeJEb;k7(ke?DLtz!(n7YFet^6iu3YCs zv=XAl;M@#pfIPErl+P8wj?1Il-h3lBJF?{3fKC$~3fP9728{2v#cNPr`8@<X?*ILy z^zk(Gc{F3l=+u`e_WSPbEn<Y_azLNji%1^_fGe#Xy2LH2(i(uO+l!T_^?C&m9zO{p zVC`>5Mx5kK7R{4UL?ZMln3_@aNalywhMIPb5lRo~__Ngi(wOV3ov&?8K(Qe&1c3dk zc>uo|<{1~LM0l{|L71)Q`^QzfsQp5C5<VlNaC`Ib7xw^J)v6r=iw!T#7wgaYZ0X3X zRQ*V+GQ)~(J6O8A=YE=?z5`bIz#lvNWVAy?No<j%gRtm<Q@fnJvT$M)SWy{gAgSB2 z0tgat!c?#*#HoA%FnS8|hV-!j_;4+7264D{hw)W0%J8<slLHQ^1Ar*(ZQQRryMu&a z()o%}YQWL8_>8}GhlNQ<1rn_-1Sptv-Za9siJdTH1IiM#`BtR#A{0?4mV8HypRoV+ zCD#LufC)Oqgc=@6G@nDBoWrAZS%^8c416)@yB3MiM+s9AK`%h%Fdi=wcXR<IGVaTz zA%tmKsm3@yE)_hvWX)#**pb}gD*<H|f<(<S8IKlE05mEQA>qMsOOSsOKxPH+81#@d z%to<JB{t$LTMh{j64mO_A3eObdANEmiyT)=?C?f}#d^inBX8K)D@ubB<+<EgUh(8u zW2J|HM8H^*H;V3#!+HC~y2-Z`$gHAvt^=ML8H((LYjdbq*0@biubAIR=fMm_Em_M8 zDp?o7wlKM|Ni4i0l6D*s3-|&aoiF@&%~amghZxtKFg$*~97t31KIZMhS@4*nM9J?g z?46*XEi&Aw2<2zRVYtKt8hu6lMQ?&~67!io|SQhlp(oz&cI$l$Ta;G#iLkeh%| zr3Si;Q_==g@VJ0;YsUzsK;shy5gH@T15(2=_O%1CzdaR5<-#O}-mQIBRD|$2s5TA? zlfBlGaBw`>o&{8_iYOAirD6{r+DJ$0lUNAwVJo1@qG?({^!xf%k>+o1>~<NZ==D>= z7Ad8ZN#oGTOBJq?%&KSM6?};q-zE<vt{&uC)9|r@8LRsIFv2%hNtlUiX$vc_=ZUT2 zgo6PT998S1kC{Q7ds!*$65*$zb*;qrJ46p(tq=-^zgLPkuHt&Ki-{mTZ6Lhwgd+dU z>9-bp=?`#J<Fs$8@nV>hu)TfBMkFQ)rrV}{xr>Vl$JKm1m&<KW@R>h#e|v>w)%jAB zFyCF_;=c^P+ox59M*gadbjynSGjaO*0|f<YvDPj_!5KiQs!W<q)>026N_+LMc<M64 z#9|$Vcqdp=?JZS(@lO=-`JGa^H7hwFp2%z5?IgT9LwIF4XG!lwQqC_P5R3)4k)!$U zCGfMIw0M<~+#LiYh$rZ;X@te9hZ(FMlvs~Ek9NcpFStp9?dnd$_;4-FG&9LVNfM5x zM)h|>9jk3mJUg+kbNfCV4z!3=e9&I=Qn^TNrtZcnkhBQ!kQhx^D;QlR;EiTYfgJDD zdnbIP5)eLW?y6KkkOt7}4|_axdsly0aXoDMMf6XuoAY$TrAaA0*@Mo4aMq){3Al)m zIL-RGsRA>@=&$k4WA->c96|~PHVq=Tk=?_d??(m$`Y?oKLn5fEr(RB)v-GveR7~v7 zqfM^;b<r#&2-G_px}6-*tay?bP4~TA-vnK(2QE!EqQKm2R8=J9+!{VT(%V^?eFD!p zfj9~dy*lHQ>Grp_=J^fY1DK7fMf;3{Duz6HfU6T+^l1>8MRDEs4E$K0`3h||wi9W# z3X~aVOA!G7Vedmp`)*=m%qw*c%6MzsZ+ew@93;~gS41vT638T~#YZ1uCPZujj7Xl1 z4Ui@W)P?=-v?2lYErWKX2?y-wdg7vy{sV??P6@ZPL{TpW+$Vmc^kJYgBATBL3BmsV zJfkE@)b=d@_A<o#A&|(1f(>zIYMzebK4&Np7VXa?doH)-U?!rsaX`Kg5FRL0>u}>F zAQ8761qhJ08f5VZ>@;$}e%EbyA+|Oo9zB~<A{F=Rw$gzp1rZ!lZ+!2ar2OxOxJ_TE zYY8a9<g2RXqh_;xXo&1H7j$+uLR1f)5uovISW3gOXPGXj87T2M;=@WZ5APuXg)Tg> zjTY_enMDK;*Yb{29{D#-0a7!N<dBDe4-UWJW%xpqYS(0Z8^z~w4;kxbak?nc4j{4+ zbd>MdAvZrR;P1%tFuaSzz~0yPbl?g8HZ5+K`fPc4z+z}{`oqMlmblU9oi2PHWEN{o zt~)@bSm3vh({1meM<Ai{_R|EP>-RMeM&PixUSLz{Q<Q=X>cJR>=J_l<4*S@qiVl z7g>zrSzUf60lRP~R8pgK=5s)53=W2#oZ0)Ak{}})Z}z-EVUc-045vy0hSc>gZR<+B zdxvqR$jk_s%)&vSHy@$L(l7?)0tyU*sXKxk0f6J-|7IQnVr@rPkF^h6Ff+`4VH4ce zLB-fMadF))5x8>+Nd6N6Wxr8Ex7`B7Q6Ry^Fw>3Kz<==BYtj~g4FTArr&_|B!4*L8 zSO+75OH{TCtFA7zy<765@xv1eju*-K-q*R~#UDM;8YX^jB)^*GeILDXftP_@G*=)G zhXQzSI>3S2sTm6@ta^t%Gu&f}GhywW-<8c*S(;!6p%+e|dZAtXDF+2oVx`j45`6e8 z-1$9d!p5{8s_u)QA@eoUxv3#>wYbXPUe=lJ0uN3a{r1@N`>50JOvEhc^f~7$!%e=z z{Xjyu_a6~u*ju0l+4<pub$r~96<3>afakxtc2kV1k!<*zbMEeu2H&fiaI%pH@`^9b zG64aH9Y=+`yp_I%Up(^E4%+lU>U5m`<<k4iCB*z9paA6fopAO$QFM)~%E$@b9%O{u zPN^46&Ri%vv)Ag7Hl_2?dreFA(8}kA&XNZNS}Jnf!w>o3gj0a!tiu>WXkg-%?hHV2 zx4p#FL0l}LD7%;3VPN_7V8|3;9A0)U*CnM-<48ZHT~${cn>p}$Cx0yXZGds56tMpb zm)*ahrC;0CRR1awch~xa_AaMAlul#yowSpHrRT|<GRLyRj+9YKYC(-s^7-NF2h+25 zV*_E?p0A7%K}YIc`IPNtGIwa(9%Q+P#j5NK6HiC;PB-M_2lvn12`GNw(A=IJ5dHef z)b@JAUpv2LOogcH&&$+T#NR4^cww*SW#W9Qw`BU|a{J2EH;><+v*S9Pn*96PXZ7_b zsY{<~pZp32rtY4<w;liSfY_r@;6u4qj-S%Pr1;`h(b#IOrG1J4Dh_^9{>e#E!V@PE z-OdS~_P)=<v}Kz%0`z`=Rq(ns<$<25fV^rhUC8mgXoz;Ky;&g#Q10YLku?v{2d))e zeOWaG>`tx~Db)Sjr7-zCRg{{%i_LtaTG-rN{w8By>^UF|Bh+VrbDqU6Q=k*?eRJN2 za+imPAJF!6mga;RN+LvoEBd4>+w6dy9CtHzk%ai{>mS-0zyXD`C?_fu#tA$x-yTM~ z?rooVYazRJArLWv4sAHxo#10aK%dInUxaGqf9`SQrR&|Y<A1r~$0Oq335(Ca&_5{` zi(GcZg^{l>){{SaxcKrPi8D<6yke>z3w&HaT`|P%`<N%(Vo<w#9627Ho#%hL3UD&o z|H3e!UBa{IcB)>XZiv}pw|k<gDH6rb(>i_~^!(&pUe>Dishi?=tNuvCDcq%o#Ouca zJybw;*Nr`4U!@2x4wYlzHT}Z#3W6DkKoW{?=6b8mr@&Z1&&bsZSE6NyQ)dP0RR&&_ z_uIw#;Fk@M&IBtLOr$3theRGD_PU59A{@`^cXca#cP;PpY*~{&wN_Rp8RX3JJ}kkX z^D=;ewU{0ds?s{@SmJ(;kn2>mqi#<4)q8r~y->%d?cq&aNnN|uT3cT@G0`c&*Pc}L z1pjooH8|X8?}}y6igntGZOsa$XT{;&iW7HbztV52`ES>t-|lI@J!^h@_x$#K_uHTQ zJ5XtrX1*E{v>KYW8eX$%di}7r(ux=jlm^z~l-A<S*Aj!)lG4_aYt~YG)=s@!gSl%A zrS%N+^{k+EX4-mg&3b;%df~fu7I(cwX`{@1qatXdDsAI*%?59}G<}T0db)bE7l?Zg zUP{|+tl4bp*=&Bdc`#=)a^rDR57<ytaar%rU6DVdlTKU~I9m4S(vd$0Hy+C@Z}#c^ z`F?h*_dD3C^yf~|R$tJc`$}7*&VNUg{$8v3`>N;fH22-#S4Dr`D*c-?|Mx!V-(uRo zrJ8@Adj5TR_pjG{VZKnIBpmmvh!@3gl??rf3x(F+{Q-U)>CZ}2+>x|iNvh2jlG#Dj zUb48rhgH=js<zQ<IR*TDzAa4LtYs0}M6s1XogYpYF|5d_nt1P+rD_l!DIH>kVeUQo ze*qI|W(NN=F!8Sp=44k~;Q<pUx#wCIHPYyRw}LNP_h&^ua~LQd@AHw<K!zl(FZX4N z89U+Ky$1#>(nz`18xg(fnSzq?dNE&kM8_?Y+%4Y59D*hwt$O@1yImhAA(X0`-$DOj zKH6-f6+W6AGye?7t=PI4`=?J*s&epO%x;oO?A&01lHK{OHu}|v=ghPBn_B1MDBN=C zpHCl|tDD{OA2UOR6etHq)$RKuZdE47<mRw(b3^6?ZroOfMXycS<{t@Hl0X(QgfrH) zS}{W=<1-%85u)Ex^s@gf{+h``9b=PGn1J;Uc_@jw!vfd~j@Q&mDc1Tn5?-M$#H(#l z`nED2WpfSRTXu?E&2U)eSw9?FuAtR<<O4--(v?#1BR+$eAz;}8Wa-HcXxHjl<3`N% z#c~-4;kflal<+Y^w1B9)v}l$<3~8G(cIqO$Z_Aj1K}(r#+2yQ>#erEFR3@We%O<Jl zZW?r(z(wYSZ#fv-JqR&ywb!UGBQDaK4czu!#9HuX(;SAcrR`piVDep>(p6TA_NL^B zQ4iBpC3X}0^ThWzD%bkgkZO_4pFhbAKKwo422nQlyAmYcM94rV-8<6zS2pr%4JyWp zj>7yqItyFzcYUpSjh>GsWxg6XoU`%o<*HJsl>4mGS>!7NO>w^_qo9*(Hs5ScaZ$#~ zorKNLN_x9-3Bzd*$8U6`y;^U``r3V<d`~*}K}fE4x8rXOMjUglcN^x<+_>KNM?%cR zeT9(aJ7JsJ3){Y>&!GEa+CT`qGBDP?jY{s_AsPe7WNzfn0H`-H{X1tG6eS)XyxeeU zH@DI8%Fw;bqq*s2&3-4}a5BVkyJ}}{?liXelI~6d8*W;J$khrq{URJ@8#C$Yg1XdM z$kK(h1W8&pecLN(*+D?(A&<LW$XZVPStE`Qd+=1l2dC^ZBEFYNa28iMh>%#ChLPuQ zDt-z~-*4TO@IveNTEfed47SR9!5xnEor`-PvG42}{;T~$K7rr0M)naVJuie!R(ZDT zk3xF8wC}##b9+yJ);&86y=@-f^(Qd!j`yRylv|j%$kp@gQ|>3%-g)i6h`E-Pw)*N^ z1Tk%E?L|-8Kkix(02=dp<1BbxYZw%2BmZYoOeCI$R5rHY_hd1oT4`wgHVdId7B^jK zg@&;(wiFd3A;i}0pwn(WFAV`mBq>-h*w{+uIV;PkHCXs)o0Y;UE8Bb}7)Lj@R+cPg z+8Kn16}MTd?JCZ3jt{}t8ry95EY9_64UxRjW}}0>0rKZ42n<G+qe!&;2)v`rvtby; zo+vnynv2y(+3o)KK94_`tf)kT__or)plGrpcm4iuNiibBx=vZ5eVC;Cq?j8^F8UV? z^V&ZkKZPtK+5#i1Ci084-^*H<I2b%EE{h2zW9}@L3dcuag;`ZnRcuwgvYFC`j01{C z+aIkNmQ;Q}1mnENZA}wrXnPzmO~N#U9_44{SVp+P&M=3A_m1qa<mRXzuOh)wiBHeG zvo6-_t-g(1sYCcQ0z(g3nZkATfJT+2sd(J|BW5!d^8*oP^KF(V9~ZK)Er1*%hY~P% z4B%%+m`mKFvYDl|9vy0OSAW|Z7XB(x^tM71H>ibXWv3NT2S3Y_0eN<?pfZtcX?5>O z)b6r+Z5<VFQyED#p2N4_m~88|>3ZJs*Tubq3wvuV$4~f%U82cs7j6Y$!RB7X9#oXO z-AC8U7xrJk`EbZDiIf!ey8P%27@_(QNEw<8NE(?}_}=~u6<Y#gmgl9OI*eQ^F}#x2 z`MG88lijUT^_Ps>AOHgB1~m3{4;yWTw9`}1Ma8dFWz=!8c#gf(4i2aRe+K_u0MODv zDP|`}O_ch0f5k1N`qYxSFb6sd9=5Qf%&JTAv@@;6cNXe&5O@|m{^SmDxc+Ke+2Z}{ zs<*KWA&&SE3FzAKygj1s)3I~vAU?SqR2!ahjwWm71q+r;NsJ|>PVVQ6exadS&YHkK z0nWAyMBpM}ffyA?`u$9v@qr^J^>7U_he4FyFNb|6sVH$WO)wH;p;6y4v#C?jd-YG@ zHRj~~Z}`iCYD+NU<}tvhf&)4kU$TrMW$qyLg0hYu6qIlvzdQj`^#H_PQ@xhfDToTn zpr32Ak$x1)Z>ifHb5yj2ZqQ8UxME-jC2nWvq)p|64Q%hn+y^86+h+mnQdKWz83w1= z4;2VxlUq2rhct^+I&a0_X@~-6^p(#pJZ1g^iNXY1r2N!#5Y0yJp3Sy874`irZ}bM0 zS6?DZ;7G@^&`9FOgQCRK>B>5W%KA?IK12%{%Cv$SQ^V`EXi-wqq=KFko!_*HE=Ds6 zt|830nE-t#yfx8WK~vcdN3V*ZRmsmgIhpLQz1Z>72Eif-?IdyP%5@Ai^io{u?o1ic zirMB0Hk9&(jKWhvvqUzpx<S6)8UTs}N%o6S$f(u=P()m88~?Ig2bI8>P#1y(m>j8J zLhsPb8AvyN_6|?+%ng2I03t9~Z%K6P+3TeSopGm_=)LqjR9<?sPA6ipx61x{c=;UJ zg?uyO%nw$|v-bnMD~aaYKk@2&Oi;&@Mj|GotKBqfYdSYfk19@F&>ehZp55M|ylv&Q zR9B&p(e7s%nq?Qoj6OQ^Z6B>wRH>>-xL|wmz;hon377qEKF3;bzPS9>{$|DBywzyH zl3N^N3O)IB_y`9P@@j|-#eGP8al)6Me;B>;=3@w-=~kWM`n>;5jfDglvE!w^W7aA! zS%eW&_V#1DUX>K6tMh-GheQV!cGZ3jjpSLi#wu<B9nY>p?m@s<Vg-owhO&t>-hD6L zCIsI-IlITosg}XLi+p{x$};Nr!*8V8b6*E8UOC2|e;r*5{`R<9V;l=?*b@1q*y4gj zAY<j`8d`|?H*Dr~%FhFbmls3?g!dyvgHBWhe;#>;-%Yq7Jnj%8@%Aw*zb8;ik)Vt1 zEo~!|rp*W)nYf{FON9SMk*psBkpyGCcdwL^v*sK4orK5M`T3SB7)wA<HB|0)HN#l{ z$9N0#V7lzm#mJPs@@;gXx>B=`Vq&lscIMIvf!6axhTIGwvZVUz7DuVM@)yGLinMtq zt1}~3E&nq8J5zPzK$Y)9MtDip_S6oCSMZ}o5%4I8_3lPlu+o<4sCH0zJ462SZPex4 z%I^Kiy<J>G`8(%n7sZkQ_~x#|>9xH6xgf>#P+q4H#dJ^fwcic^b_U-6Q_P70@RSf3 z%9ZXE06D{ZNIJUH0VJmzy=-ALX)Pn#x6hy{e_r)a@4)-d#!e%uPVzQ;T)Q%6jGd-+ zDlRtSL$q=n;0Hek{K|@V4GgAU-pyPZ3_#k7eH@@63o)VCJNI@sE!XvL8w#((2E-3F zF*(k!G;2shR&!cAqqN#La}Iv7z4~Y%5^r}&dg$m1fAF8CJFl8dUG3T<uT|aCWZYA` z<qKfOtH}&rxAk)K&x?#FYPZD(cZJwFl?^Zq?x%-hBdv!o(Cms1HSpoCv^oMmH?w1} zP`Gy;;CF8AilG<pH~`A@ojbSTK3=)8DLv?R*4Qb!HFreS@l*2-R{(-_4s3K}wmzsK z-p}+0W`Ahr@EfYd*B^T&nzJ254NE9}teQ(H_u9yTnBZCEvhQvf!CA}cHh5tkAP@mG zz~H-az3J>u2!D;pYxo*GI!_(G<;0ZnHqUG;{wyt_IxVUvT_I*rCCl2AeiR7WDD*e6 zK+zZ?@j&|%l_T4$zyH~3DN5&s<T_027@5*qd&~zpQ7n-$_(k*f<Vf1^gUtB+{zv8h z^g4V7=E#p8S!%mjqfWXEFu_9!X$*1yolx8Eow60uOor%ebp`=1VGM|pO1T-h{ONdl zf(sKt7Ch2EG-`0ab#lZhzt4Z8=W9#r7p8R9$7?S3<puUk-zVZZ{8$NqK{`Xv7`Nyj z?&htrnLVJ>wHVtt-73Z~Vwt{n)@*Tl<gx#7N)+5x*0Jl}E))kI*1E`>r{x>IgXK{h z>|JOQ6*UYWI&=k9)z7E8FLPZp=K`E^2>!bR=9|)U{M2jFJm3<oWiM#A<xlzG?s9y) zLB(gSkfz2WKNF|3+jlnIJE5w3@5)5aYg?s&$C3(mfALSY8M@jBPpFg+MY=svKZo7s z@u;aoC0r1DRb_W$Y%@OLiNsa1hD1~AyzN~%Nm4>(jaJhc@w!~cUED}5w~mV%-Tfxr zPn!sDo<wFmIci{P<Oc6NVB-+g8rso}FxGc19?n>PdSx4E{<2S21^3Fe{o!YACs&eV zNY{>#u5m0}91jXkJlS0^q}pYV!QAxgYfUUMmuqW2-zYKsNMhdVS#B_l7{}4_7(e=} z1t{>G6K{|Nd>aD#q|>{fdSDxGFQkucTXE0mbUV{|jo-0+yYa(~4w5T)W6sKQ-+}hj zvt6=?YLi3N!WMKCfnIV#ToiM<52h#N$izGVrDAL0&B4$&Hq_hpBCH+EaZbkiu5VN1 zBQ6jMqlX$Ul&wNc4p1`*AlCs-x?y;b|B;A26MgwshB3f}#-UHYK&VagM8I&Egk9)9 z%(qa+mpNf|?b~8h#P;Y*Ur9yU=@<!b2%?QVBIp0DD*7v3ny6ORVl8-Pt~3K<U3mDh z?qSz*2UBs1hIk`gxCKBZksB6NVh;K8k$w4E{tx!vE2^ot(Ysx1r4V}Pp&F{8_bN*0 z9YZe)1OcTf5djhX%SvdW2SJ)G6e(6f1VqG8ML`6msi*-Fv4aXCC^>oee)m_;I2UJp zm){s%<pwTDU_H;A^9LYFrn}DEO2dPevA|wy!rr4&8&?KyT(Gus0n%LUtG@))oSo_T zt}*U?wWH6@W3$HFuCeuJPOF>w%SWB1w{&b#);(W*+LIho2cMYUu5BXCUHruBnCIV* zawwXzvl#5UE}MJ#nZ?6*`v*`%eeStN*PUY{946lF@4q}}oCr5tJiBnN;clO2wbIqQ z_byX4yiIE08#0Z~ZFA3zy*N*N`wNmrG+nF3`8sOmp4H?}n#gFQVqu8B``7Gq24XkT zsU3j>Ma_U0GFHUZ;K`(yN8@0DPSZ;jG`<vHCI#-?DDD|GTYe?X{dp~7twl)Xc^fvr zH+$y)gtVhVjD2W(sTif+u?(|@FHf8O`*7LCs@IfWLTv6-V<m2jM+h%4d$s7-vZ%}F z&}#SKpXo4`4qse>gk%H1o;fdg4aB^*is;i=2!g~hFme_`_*{Ppz<PD=nX@kAU&xAo zL-BKS;#a6Ujq1}#XO#S|i;;0T>McJ4`ULmiggT4XKNrj)+aF$IzYKs<x59*lLM?Z9 z^9{r15#wQDFlW<{EkuOJu$uJ!mDPD?oh$)SI^cw)=`>yVyKq-m@&*3&Kvz;Z>2s&o zp9#e*TekxthL2o?U`_iY7FHh9!jfJlD3!UV=FVmNi8tm{lWraRxvPfpYBZ_qbrPSq zf`$7*Jr^O%_{FP7_U9UV)ehetx;Hp?k)ZrELCaq!Qk7qON1bOT#XPS2T~w`??-Ie| z$h%0DE3O9~#O1wWX}`N;aSiTw#F)Wdw=DLidLLQWaPGb=a&(tTfhHeLM0aAB>EUN4 zX9<0782f9%$ni>()}3fNcc?9RCKx!jbgyfx_LOW`M2NcIMT-ipn?g<xZkOCYdleM< ztMt99llO5Qhhl3@Cspa!l^Fcd?u==3)zE&~WqHU0fSR#aZLt^+6W0Sz<%Wxdqk)OM z$=4sRapjIr7djM@cVo=Q{Q2iF!=i^SYCU(^=hs#?5%id_p-T->k2J9mNG#tT1rAjq zRGrnlDiK}Xt|y)gh4$hC77E{r31{)%4AZYV(*q(mXjkL*?jQo3x3KJn&1|1QXFag> zg|~d92yX_^jg<|p>8H=?N-<010%#k#^H=hv6Rl@2F(1ovQDFKRz9qE>+c-Wt$gBVU z*UEET^P4R;j8k*HT-c?z-7A%%PbW)E%1KUUl&-s0e>Nx*Fa(qN0_hX?BZHzWyRIfw ziE`|B`|GbtZ<)cmY~VmuCEB^n`9%pc5G&#YFCF->_R&zmo2dO&G?Uvqq`yT`$;YKz ze~lLWGGc(le1k>FUD7boRg5=!2GQv?5kjcf=^BG=vmc6iO^6vcw(ijYyhp^0y(J_Z zdS#*zYAFrs!w1!T>2n#o#W&*Uoke;0j~Q$@&kV-x8Jj~wy=wUv>9kx`l?PpPBR9-_ z^|;Syn6p(<;oA#fiMU3}kGNZW^%Nlx5Sp(yqsB9pqOvtz4_HvONQj>9!f)g8>CO_y zP6x6S&wep$z+6?;opt>zu7S{#DY$-%aVJWOP$rA-RPC&5Tr88Z1<P##&dBl^Fsh10 z!c-0{B->L%YHx1gs^&Hx|6++AHHS?<<c#!;ewGCh&1|aXQTaqFYPFzNziLkosQ&tB zk<wxJxe-2+G9nn*eZDa<mBrUMz=uC;kPDl2x5xa+=CM=>cHxe51j*j3dok}Y#-;W* zl=$(7VxN=ZgZCXjnoo3rOPzq+VU7FyfLybyJ+8oo=(o>rdGfP&qi1#9a$&*FmuLon zV8UrXRM1@Yj{#$_<J2qf9d~>&=W{5(_IO7_V}QW^#F1pVsi!>#-MNpH&lWbW@-OAY z)b<2A3j}i&px3#!4jx|SMg6r23tF$A?VFK}$Q@D6SJug)8FB(kBaeO~{LcDTS{s?W zqfg=HZXXl#=sn!4$_H+8nu!q>1(%3<Pwo{2ca?p6U~u-}Wl~e&XNPLO6A}V^&+JdU ze7n(561>;Hwz*~~C+KSKX5<_>=?;HgYWvm8Pp%XsY+{Bxs?TY~4A=$j*xY+@pjuY) zj`G@tj@@T}b@jO1{fd`(EP8OPs(YUdXccy`@+j5hd&$^~D1_O)F}~}JtI-m`4Yq~+ zy-4s45twoX=2T3|YqcMFV+!k|5qP*-x_<(-b@S8jx?3>waf!S%6!RF`66%4-)W^F@ zM>~%lS06)TWN_TUS5_qo{-gUs^hcuq^5qW~H#)+0^iSC2a}L~MptvK3Qc_YfYNMXz zwna3#m#q(XTDIs~g(u)LtrzxB4Dsk4nvM6Tn;o9-7O+|sB*(&+q}MaZ0b_ML&rzv@ zpDA-p*g%oRiGkN1?4hST$ryfM=6AZ~>Zw{~@Dqt14$&dAZIQ&4n*;Yvj4>woMi>NX zpn%Fo2a;Htreudz39x&cDa#=x#u3Rmd1?BXT>J{NmWtSCQNx7UZ`=zAW{H1H**j2q zJQiK>>NghcqD#5K;gA38@XD8uYnrpo2L{zvsw1^tw8hM{-mbzodC7*jX#Mf;AF=8_ zHu5L^<ti&j*Zh<mvl)eQ<PL8fVZle!RRn~JJn5swZ$rgv_0e_Rj2~}AaP}(w6p_i+ z!KW4ewX+9|!i#GPbpM=uzHah$uIu=ZuV1!IS1w~l(Yi<eY)oajN|!DZJM41!gfuJ} zA=QXyJW9zXL|73?<JaQO#1a+ztb_=orZ6_l8X@}Sj^TzQt&g_JvHWbrA}b>V24;u| zx<0wr3X{-0VI@T;Dr9Ubnkr^W1f?iuNgwf@4wOmVs6G;}%>Z(cs;KhN-33k)R)Q*A zSAq}M3=|j*MG+lM4B)p`XqFQeQdeS!+oD%Gm95cpi3jp|*~=;=>NGRev%WzmRLh8> z<*MbudoG6}$f6#q_=+{&&hrT_>c`b=V_F{`%tQ7*Csicoeo(!5;^Up2mwb-S?qpK= zEC|(^GO1Df`jhB{+JgTaUJ07JR1(CUTd9ocQm;X8jH4Q=b1gKQE?4F5g9MPhHbmgR zSK6fjB*2U4`w!@N*B@D@W@c|XMoeS>|7WGW?qLbR`~O6x{r^J83_Ho_#bPJ5ro}UE zCLb0{NDk`n{`X3|`cg&2e^lD*o0k5EN_*mT^uH?YP46$B`Y-7CfT*~|ay8vyl30^3 zGeE4R?IDiWFkU!E|7WG03mt!GAiBhqG&0L#V$PN)SM)YX>*GJxl5IFlpDWj<`OZsW zeaW%ztzWCen|jci*NW~5ovgm<B@xSojvZ!z>;DBEUyuGT==gB_8E8wp_CKKGZN<DJ z*$X|qT5X?(G;f|-8H@dPPqHlUThE{MeN|UKZfgE#rTyQ~@m5#VJwZn;Zl&EnZgmiM z=zplRe-FkM#eIJm!yOsDM!3|$^3v#-o3GIl9$<~=j$HdO7G=zWpIH72I<}KK%!Q5{ ze2;OVW9?GxQ~i}=V;(#1>P{tvfoo46g$1wW>X$!Sn~Au&X#6z1{JM!-QT^_p&to5G zAGbU5<Zy@2;WyV!2a|qqrhdIXsY;xkgr)Xe<wD2Xvu|==X8*7%`Zk>Mw)Ef7F%wa> zHFJbpY2Riq)|B@cz9+sry!r9p(DCalpY1)Zw{B40{HxL~WoP|OpIen*VM*;h`gLe0 z7dlQ+ym|S@sN*-upHH*h{#l#-_8yGli}?18p95Plp~jQKGiw%(LM2>`F|BlC$)Awv z{h9wYc5`(ri_^6AzG!Zw?nh_>L}0l~<L&>J;3UVM-GeMvsMvgVz9`{8q2o~|+H|;A zD0L+rFHrp-(D9P9zuF%`l=uGz9p4U=h)_`laW-Fe>=t*%a38uMIhoa+)+@rG6XlGU zoW8zCN{zU0Tc7&>D|Bp7wVKaE-68W(nJSe}E}-Ps%KdYjYW`xiFlDq>;n%QZYg3^j z^0Ts^B*id5<ojvH)`KT=e)gG8?lC5Yn9Gp5Q*pCfj8G%+5vX@^cGmVa-Nzacg#pj9 zPk}~T&#gUj7_QVaAUXhsPA?fQ{6&DKx87LEG{bR%@hN95b95wr3+uXt;mZwRP?VIO zCJvnG7zO#tU_k1RG7rMDzK)xnPt#I7gH#7hImK`!<XTA+I|Mlm0yuH7(ya3xZ^XNF zDw}x@0YW?&5(idg0_RNmmz-qqV1V^A{>EFqRx#vsEzIH$Ri`?`Jnq<$z#>{a3g9Wj zrl(O@Ra~4BWnsZU1psKhPHS$X9w8zJRPs`KMRkZ^X#x|kPwxX&Rt%)Ne^w!^LB1Lm zl|O~erD}V@8aC}XUz>`R7M&N9Kr{HG%s(VY_l;$`@^RZh$cMe(NbHH+1Q;@B5_B*8 zE>aR#<e64+`o*oOE4g_i_tCFf+c9ZrjI|x&<d3cwVz8x9H5lsq&fEIHQ}H%Ue%*I- zdwHK`r6t0VHK$6g`0<*+MiL%DWLfnPr=R?_MQSZifiNW<bbEw%p@3fM%}9uoQUcwO z=(RdB{`7t>&?FGWKHy&SNT`&`D__xfw1Jh8ruS>d<K0Z9u&F0$a(X=GbO^Pdl1{~* zZTt`cy2P*S#W8+@m`>KdyIYS50?2y`1W2H49KbP>JMQMwFvFYvQY<oFBc&-id)FCJ z?hd@M69uKQ0;6I@uki%J{>4o+emNMrzvYNlaigBM2KuEh69p>hqd%`O%cTd2V+ssF z#FhyvagWkP#{p6DMxf-1CJ!E<;>0>t1)W%g@Epb*?@X7`bmXrr=P@;1VkKJrJt01j zffqYb$+I7TGIm)i?fW%sb>tx|W^>hG*TAT6*<$ScTJucS2@c_eW}ULF&FxQ9fi>|x z&My@nIx&dfi-wU6%pH}7EOa0HN-SUQg0e=NL=vtyr{Zc4uft8?b$o7F(B)b;C(oXM z7?${#m4)sP_Fk>y^z%ND3kCAh@GgC4<RrfR!JV1=3=kv&rqOvYg5d&oWJN+zZrFgK z?+-(=<PNWG6$vJmg8GDaqC$8dd%h#QSON>G`w-%Da`7t9Lz`oV*(lvoW~Goe#ygMv z@{Iz%A;PyejpzHWEp0CLP5c1<(S#<Hj`6xO0oQUC7`()##h0f-`TMAHZ9jKN^ehPq z5hn;4k6%iPyw=~vMj1EGSGYB6=*wcMJWk|hJx-^3Na&Sdp}1;Hmo_GuyS~ID4tH$d zQ*+_>LJ9#O>Z<&(yZJcWA-Q-i`NG;QgZ$Nk2qqn+PZX>lXN7O~gMpMu#oMmHD~NcP zL#D>Q)PN9lmz%ST#8IABq)0@?wO5bpPhaN+%3k<2aF*LmWmi_pU&Da)5er92vQ<;% zB){JU8aFz`K-wuHj0(9(nJfa@Pp+5z772FdJxx1fdI*ER8XOE9Ka~~o{{Bnak^7au zUTvE4TuHm?g!(2jC|U=hzXIvT(h~-DKjXwxd>}lLhQA+BEKVdk>|9$|^afB;gki8S z7Z^}7`6!L=h45HfjbGXW-KA9y6!%9<7E!XUq}a`9@}sF69g9oa!wzz_NTXSPeHda3 z-&?h01jGh{d@NU5iD8D1OKt?b+#p)y1=uWMO9zb0O%B~nbiTTHkhfD*n6yW#)6D#> zMs1tXVM(g^ykU6zLD^Z6Y&$nDO<9E0YF+?%96VYE03Nivb$z4&4D+lyF|x3aB7h>u z1y!7$as24c#w4^pN?0{r5cbHU0eljXNc}i0%2Sne1S(GA;ME05z#bTSl?kcfg9Pv% zUg>+$u+NxE@Lw*PYwz+xa=$<)%%OmbD8xo$hR7;V{+$rXK<#7#s$>M0Tz1n#al3Bb zrr5k?Ae&P`&o=XYjPx`f-;Z4NVyJL0Nx2Oea4{)tQB~8F^{)VMonzcxpX}s8FF6vR zLJUzzLP)U_IFb8OF(Lw_y=Y_XqcveA(;R+Z^t}K`>HYrRs3eppV2jN}7l()gNyrwY zyDCJvoa$<ib(i>uiuOVt^`1@yB_ll#C4p{3rjrwZI#7V=MP@W+K1c*ySbok<N%<*B zJQTXmx^PKSy15wQ;+ilL%LT{t^od@Dtpq(hB#19SiU5cf6t`h6f)4`e`r{e$LTsS3 zwfO6Uyr8p5?+@m8wvznqu`c7gkFil|O!~J->Z`L1)0I#;Y{|FMFzP#Z9ggZhD4<Yh z1*NzaO7%UwCp?4a7NClg7s&*L$3YV&Nx&D<i$aK;B^!@}I5szTOzgDD#||RhNc0dO zu!$ax<6dAf_Z^A`qyaA}ybrg>BuL?=<&EX=>X!-oke)~$ayI{=Vh7%^7sU|<Da4V| zh>=9s7KiYu<Gv!s!F|cZtOjhaAMnZ$G9|n7<2}}QX8v`o{5I{?-w(^$I*ByzemQZF z+D@21lY8~~!HoCD`x|L|RF^@MIATR^n63Jzf1&g-Ls6#f4@KIpVNoMnu?9cf_%o+v z>#F)D`TSdl1bWZ4I=dbAb~Qd$jG<l-#aV73sKV73ELxl-I8n~oXeV~`jvn6go?>C; zCeB}-ofL2x$lgpLG6X4F_Io2#DW`KMqxTN&sX`MOXzeFT%$S202K}%%7YKZh(s^5) z>b#<j(*rb3F73jA&3&1`<QZRwEK{*+%)GP0aCP{dOiQ}4Qb0^WJ9hIIL8B{^=2xRJ z>?+DvYgAROs#@LmgCJXly+5#HG*DjM2`lt2eniD``(Uswv&f^={jPW{Qp8iJxlUF6 zA8S@{Oofj$5vcQWA(iEOM*+?+BD!qAw2q3A(%8AubTp~>Z-*;!*u7T8wXM}{Sk3aF zS*8*RDMfOr;*D#KKBk5B=yw2B#@*+P+)yN+8=Q9t2ycATFK*bu=@GK&1=_sJ2M9?$ zr&{k;T635WU+-Q~-~TW*HpNwu0-{!cM?S@&7T6mYkcX6YRKw#|MAn?R>$8R;K`i-X zc{Y!tdwtc84}tQc6!q*ylnIdj^*x<KhO!znjTxxQ0c0SFJ{^Q;yyfOLj&@^G1@M|x zv&S%4lvu;Dnkg?78|<EPMTTWxcY=QSc`0!Zy4YX@3PB(O8q6CS>`;Cnt8O;!J~!;o zI*uCz4^72?TRWl<nXLnacl)O4zVniu^3-|<$xAxVt_#myhG>Z5)AkhSM~S~(a><=7 zjAy{yRM?zEgh3K`q@nrrRPZUzd+2Mb>)%`m-3$giD!+6m8M9iZ@X||=?5QJxsCDuu zOmTf;6qirtryxzo0diE^(Fei8$B|Ld*i>JyX0M~fN5JJkdG26<1Ya<s8of45e-P=r z-yHkc7x5qx`=tRZx8#fXEiA-~FlRzYR%&W?bo$i-sdt`;Fn@)?oEl^Ah)nl^g8<p7 z;GJ>&GdnDr4cSF@zRPrf_958zc0<|}QGf`Z-v~T4li++@otHw%v++F4<AYvB{Y^$5 zKFioN_Crx2)8E2Gy|&u5eGRTyY;$CVNznH-VeD@YR|=vb+r8a5cW@e5N(H(zy`t>{ zH~@HL&4Y)P+QqrNk2`==H*!b{0A<^E47$kg96yh2$p{TZDE}^GMh5y1n&&o9IoQ1@ z>&vJK__qoG+hYkZ0;GVa_c8Yo0IQvVir$IEm#Gbz?oS(2k8(TNY>zGDvKrK}(@6yc zI39Jh5+DIT&|drx3=rpfIjX>$fh>@Tq(oz1Ng!O=jDM<ftsJq^Wr$P0k=36<2o!I9 zEO2AZGxSpn0Sh6Q_o5V8ZLWUX5uS6|*l<T|`;@;-H>G4S8Mi-M(HOgZwoBjfxCR>$ zZVFgQ95;Cu-E2_5AyPNl8^K3D5~6qgiE2LoWpq$f&Y+Lm_p6zMrOy6NNvHF%)L3^r zu5_W#6-xGbKJ@phe_r-g#Rb`d`dWH?@+9aM>3+DQ(Jd2d?2Hek09`15{r7jY>i4~} zKQ<?EY(qu;exBd+Oh1IkF|T8-lJ7%w9^7p;RX_8|lV8e9hY969kE?P`ecIUk@Dns! zH_S@`_5cVSHn?tk?;!VB?nI@|Oo_r(Cf`aMLAB53v*&=DUpjy7Ejj<~OfPkRPl8?u zPBn4zW$=r&zCDE6jh3Dl6QB?&L5N7lCPCYCAX3m%jeM!=0Czs+h&(0paRi`x+}9f) zJWdP4z@Q)*6l8!~_8=EPH=j#WSecL;AMUT4=<U#uWuDT<L%hrh^W|G8&hZ@AmAjWy z4q%V_J$(-rbOZX$;UQ~b6(*<UB@xn$EUpyLcRBe;xu+x?qNtap<d;@t1HI>;!cd+{ zF=$w9-{wxJ;CzVHb;zz`f^jUK09W5QGhv$_VBYRJH3W|T5*8sQqOBpDDS&)COn?X} zHs5IFX7h=f85vVp$0>0vh?AU@8=4hoLa12qpTP++6YTNp&EohAg|_Wq^W=+4((gyW zK_)K!2Onl6(uM8gVyDu1!(0$%6|Ix?O*OGRDv@4hTwx<(%F*~;gq1LM%y-M6tKKPD zCem=WKKk%OG+6nh4k-B)8&(x5nh9*LyA>X2_;tK#-M?v(lh_33MyO`qiR*ObR8B8y zTRw76;aN@3iLmn7c-eaayM&CaiFjCgXHNHR#@;fgQ9<+1wZNksg+HI=iQy-|-Z83K z4+#k`J!F#cRo(fD%K6T~`P_^uv495iXBV-!=zreMH+#L7QaGd;bJEv=y1+YcA~r9z zCo1ybg673}{TES+xVN@VPk1e;S10F7>@M(}IR8oU!OuPsxL!njgN^cLFU?<A=b;IJ z+Qqh|<~IV=8~2DQFTS0xGD_!uRa2)Uh~96h{&9JA=XeU;-Wkk47rn9Phk<Q$4A)}g zUpe>Mv+&(d0=hkdm;$Un->r4*Jr4zvz_aU0(@kmt4G#1Et#x-nEFvm}xRBAv2fG%J z`H8c0RoFpk{=h<HNU)rK0G9}6PM{{nRX*gczbr<DA-oyI9!5ExeWfmqm%NR!G%fX8 z?I<3-n}0I>)FW@dNd$Qsyl!V<6aS&?A?JzJF1``*d_1)~5bOERnlK*&<+5=t5|8aU zP7YbQ9*9pU2t4aTI@^N)MJPe=+AbxQkKv5pi9qCLQk&$^zI1y(UM%>)U%$FgUYG*C z-&5vak>vh?F+G-NtjArJK>n&gLF0R{5&(t&EP`qw#IBFlww!p+-~hnIk^bKYu^^Tr z@EN-3d)u(*^RXKjU+C8t)sQ+5Kz<SlfgD!52?_n!2z3~yhnZtNQ+|vk(S3FfUyryk zlM%dn-fK$D{p~yd&}P?^!AGL``def2rCtyh3hxUi`vpYvW7B2HWQV}BrpL&9FzEZ- zR)96GN4F7iICZZM%A<YL9RewP6D;dJ<w$nC%^*b@L|)b({VH#&9Nd>~$g;D%gCurD zyY6kTmB&1I{wnQ=n^S|JIj9=()HrUS|2gyP^A76;=C`-iR+}}tn}<9$7b-V-PH!rQ zY)+YPUJG4n{I=O<wbdTF)tR={b!n^n{#MVMEf#01Z^xejt3N}be}>ckJi7E}^!}f* zH$#abvL&HT&qDuBrv071^mq3D-xplyc#iXz3mvnqwiiOT7t^+vE^RO0-~RY!`!i?z z>kiI}73X^>=Vuyc{Ss&6KId6zJFvQ!O{Ad&73?ZV^V~Fz{GJS)=K&kEgm%b4h38v` zLK)dar1bX%$1?(Za@zt#BL_>=WZU-hiXL>UGCurzpwj!j$Hjj`$K!?kDiIYG|E{!0 zHse3~H2F4#+^&-NG<{7^%qU=my#O@}UooMOj)H-$;Zr?lb77E%Mt?pizEA(Aa|v2} zII{V8yz4DNK$k#fUv+Mx%BG`swXVKy%&JvmUGp{cA3L}EIQnm3V${=G_i~4Sf|6pU zuLgHy{S8WvdvS|%$Z=)G=U<iff4o&RTCJf$K8*kZi>(9kO9<HAo+qcQ3J8ni%I+px zLnwvmRyT_6Kruq8W)3&TeU3t)MD3DxOx*ybJon>?TE5n&P{&_t3WGGrX;?9vU#Qdd z&f=^g`EJpQtH8DOX&Hb=h>t!GAq%ndS%Wl$zMY7pN{gM?UON#&Eo1Y#y;NvMvC>Pj z*e89ITSZNlP&XkxM<}kjI$d;owFZrXKeLDAVhPIp%DyWT8A2HmH3f2S&c*UewMUWp zsd#)fC_-3fWN_z}Xz2(YIydiJv+-b;2+U-=tzxm<$z;ijTOeQiFqI}t-q^{<2UDmV zEvfNX@&vz~9upKo+V=tm@ocUfor|TyX(Tf;6QOjjW%7lGv9Yg@zwd2dztALOzkowi zd>y#>L1X_$hy5%_(IzUNs#r;=PS-+ygq?KHNDNbDwm+}~)wb2E^VKaX`uL3t*ZTOW zsec~Spw#~IP~~#DIe3E1Mm9pbmd(WAdZGZd2S>e+m4d3l^NDXO;zLD9gc=fZn_3Ox z6W}mjzWo~y9&6hX0Swh_<NZV$Zb>{`+^qR#@Lu)pY)Ht<&OGw0|G_(v<@WnM{VNaE z2Py{b%7ZfnUMr7))OrFi494JWm{7gmJbXLL49?Ml0@$#k1&+<xv9mzsDaeyWB7#Gu z-bEm!Lp+{?D8tV0028=g^A4HLUQ{D5$@(?TlNgr6U92JV3IU`VHV#9Sh4Hzax@hWn zdM}YrMyl;g8k*>n!5yw8@&n_0U~ZDro4qU0@qXohue7hdOt@;E{5(n9b5|K;sF-IU zl(HVETfeb$Qc1oUoKxWT?_Vlj&<cBzR<Uv-SJYwQ6Pm`aIvH%k&ke;v3pzl0C&yV9 zB{7=`PA2o?6nTE^4*s<Rk0g+DzNiy>NBF<*h&qsgayj?321wVYz`(-q@ey%uBgSN$ zDlF$RdeGFGZ@WIppUNM^<eGVtERK^&qcyKZ0K`M&J@MG^DZ-`^7F&!$2&KTh;#h5w zGmn%a`FsV`GCR`(_%I*(0JP`|AU?;fixIu=2-&yr6Uo~03qYWO9hDzOK}TwU%hM6} z5D_r<WG#o^jsj?0c^{^P6XMfh-Qw@MQ4pUPE;n!HXg+<^ul)*HVQpCataQD#MDOT+ zsOjQOJWEG(^AUt4ISrE4i#MJ-olNlqy4c)tY^>{nn!Yk#W3p99IPugp!l}o%4rnjg zn~oK0LfS>`4yaKHkm*-o{Sl#c3`FWA-El2<rWD;r*4uubJ=>wTq<k>Uc^@Ni^ijU5 z0i~Bs);Iw31!NeMa9R$U3|^MH&05q~KjF6T;_uO>Q-W3fb>S8hcRZ5XOD=rN5L8Gv z-<v9vQLb3^aQE7sy{FfoUE=tRcz!e|(S|SvDElZIE_9q_GFdHJoNKwmVj|Oki6=L) ztQA&@csBBDcA%o2>@B>`D5z*a+R-lRxU)1l78>CU;80JQznfhzn+`^MBy~M|Z6}^= ziHgbN9_`W0ZX%5-XCN0cVyAm=(<onz&t(hWD_KA5w64VXojV|^w)@kGNStUu1J}M! z`9uz~j}4mY@(cc5dOd#kFs}`Xas5Oa@IcfFxVGeTvv2BV8Y+(b<%4VQl_ZcSunf`l zE_2B}4A2<1;Y3uD;Xap)%V!7U4$6P@d)#_9SjcG_I$c`FjbCVae`GoAdWp@uHhuf% z-*>)YTYk;tp?b-J4{;(j(y!L1J31FW$G<-ju#hm`IcWd&=-G2~{d{$IMlyAd)$R)Z z;8)%?bNfhg%iZ8FqUD-%sQBakyFymW%Ddki$EQx*4Owe1zxORE{?z=g&>vZO&3#jE z5eiu9-}UnQoV9ouv?PO46)YYT3QeS&j54k06;7sPC|ZW``d9QxwNtY6yTb&JSM={# zr_ik}4~Udk4D2*%N!OOy|7U3el3gL@M_Pu<%*+m%4jnB_>JC@<HT%E{oxnILw^LE- z`LLry!kM#N=vdA4`NO?g38j~>y%lsKwrh`tBgyAMVaoH7VDyjjLAiqlMbAeg9ez}X zbyEc?ClHD&2Iub19n^~t96L0|x^VYA$d4?3BHIk}v}-L}h^3Ba>m;ISbkMTl`9wk1 z&stUaXqUY&o}L~0dD-|vv`74lXBW_G4fgUeUPUh^FFP1lD6#<FKjI@|0!HT|cgF_J zyqNA7O1g3M3&`JXhS*6?JgYyxl!kl(X^^aWE%Bhhe!OYR=~c8In~JYu&Std3e_$3A zaSY&*V!>r6<PQt@;OY13+mZRNVoiSih8#B@2<lM4;F*`Ne+?b)S-Tg1`q#@h9CQi` zwTHr?NzJi&96QhJk857*NlotGlQf|G_@L=~w38~Ju(GY6AtvCAS6JL&z>_nF1bdNc zq~4b6*U>Teq#;LwjmVK^<Z9e}*q2ls7TUdY@DA*uLC2w9WHj*yTmwTZX1X=y-};ya zFYG;@I$6EvKP&AWsnabwG5mVO8lj@#Yhv5q1UB#(T2>3PI}#!HSJ~0yq{0euxDGF( z?${L$m2?kg3>q{En2^@dIuwXoa6uTE3J>gO*qzSl{l}AT{=3~@FXO_9D`EIq_ov67 zc$mB2aBwG=?X6OumUAoZj{kgo;PGXPcHtm)CbdZ)M#xQ`K%BCgW^Bp@cFb^yy!zJw zAs{|e#tuN7+8H9-s+ZBT9fc8uf1D4U1FFLF5piOe{-<r3{8~glPVTvTv*`4p!_`Oi znQ)D|JX1Nb8gzS;`uVL@+V7c5+rK)}wpZ_SoR0tfbmNkAi}&teev?4k-10}o1{>Ku zE<~&n{q|K*jYL%Y&C{-li0?I{62QO`ZafR5!sXhER$C<Sc%}FjPTcHy1r$~xN0$|) zm^>M|&1Lg-$O!F}``~1+{9>=d&)ywK8~KRcr4Xx%x_jHu*yQalY#%H}5p4jgxxoiH zI`N?fRdKlZGGtlvP()%wL~OiI2G?eGmnz2wL@2!{&fO6m#d7%dEG4j1Aravpo}efj zmc@7JpK8OBVZCNp1A|a{cHi30#>QyC#%{pYXTWaJ;^wj2N~O|s7@Ob`;NVLG-Y7#? zw+=VUT#b`0N5c(W7hA&+MqX{kyp2F~3E+0k;25GU*}Dzz)nWg`&}Y=}RBf*w2?UmD zdc(cW$RV=$P?*Zl0ZTJsI*^q<P!$aa7`7eSZx~fN6je7A-8K|cH-x3PnEn6`PdZp{ z4ITOHa0KZn&F?6!>=>8df`wa-?tdVC((uSnhob_H$=wc7i~V|LRDf--%_=zQ^8iK; zQ^kjAD#PhU!x?tNnLfi=5yRPu!}N^doYLXkx?xUU+i<QOpX2_aSt=ZYc*qccSgi8! zjM2jqyN9Jd56?zCEK77Q9srQbv|u>^a7xD$+RG;&Uf@>Re?Gi~e8d!gRIT!;#^_P4 z-J{ZcU`wg5@Q-F*Yh`IF3@k%p%Z<hugfLU9Ve!!oEsW$3mn*bKd3;ipqL^f9*Crh1 zoB^hJStid5PB0(2T{m(o!=-&-B!Tx_eG~wZXhtdNg5!`V9%vUB>CYI@v>k0q)#>~R zcg__$fwdJ~#iSGJRD9u_jjNswjD<ndd4TDCUZEyWL5Y9CN$A-h9(Nf`ms38p0*cRG zY|sNG$GH=F+$i+u;G(-0V&wH?69-MYPGu0;iWg-lfb<zr_NvI$V#R#hF|p3#e7=ia z))i?YbOfP>p8$vh5QZhjJ>PY=7Itw4M6i2}MfO5CX8wdAm;ccqri(M&*ll~~y+*f2 zo1|DEjSQ%*igZ^&bFmi<Ry5cr%G61$xQCEPD}lG7LsJ7I6$LOgOFzGbhaQ4?^9rZb zE56*JYAwL8_VeXwz*8!oe|;v#HXlpKH*rB*aokASY*lCCE^Gp9$jw_X!-{5}s+hCk zyb>|y>1oZ}V6}WlpsN(|oGejF3g-pj>1kmVv<){2vx&JEg2~RFQfpqlkDlmGHN82y zYw75&_zwW3rHX_43BCF)eKHjuv#wB$g43wr4^}t7JgiI+`yMMt!&`lN4)=fb(l_>T zikq;NXnG=}y`WfD$E$QXwdrze`wr<db?RmBmFVVF*rA$ac}Gmf4bZKD1*62pnKdWw z!t^`T3+g`hnN$A!&jRGt^Io_tFh)EN6n!wO7}YB08TU$W&g*x{?{DQVw5S-_$o}P& z@9$MN<s%Suc3R18GWu`h{9NO!xyCqo%n|L$^2U*JwpZ)<k)tU8SbKl1b5n_tGs#K* z%q!E!-J7I+`SQA4Q?(~r2mDXGn`sJ~IgP3xk)gNaFehI<eq_eq=;K<bG$So28@}7` z0hV6S+Q=zddBR%uJNc^aHZWTl=~no2Hnqmz`T)ErAiqBtUOZK(C|DlFjh?3zD)f!c z!)2ngk3Qzh8o$7aI_1A7V}&fH6@&Z+%sdYWUI169yGGA3B41qCoT<Nn$KX7gSY_o^ zk{_C=az}wB@iSUZl5xcf-9f|;AGjY>l8rJLh((2}z4CKR@t9g!K-qE<_g$n^)~rG) zM#{$7QkVMTzIIazYL1srm9~5(;)J>|bX9$|>{9WWXx^*TVcMJLFCrD`nBf{U89c#- z5Ljb$5jsCCWpu53aEn$1zB;2m<u5-sZQt0C6dddfh;q5>fzF{d8iEA0sEUFqFb7O& zLJ-o0@Nh+{Ol&wLu~KR7R3_65f_iQ@Md;c@5J{5ze6>jAdJ#Y4<#ee#b)__IR_^`N z$ywt!8KQGP3W~|99;ms_@RqXo&fW#Gn5DWh1$9uD46#ls=&nd3?Dzf6tx(0m2)HAS zf}?xZYKu^ZPI$FDpHn4BZRyk6Jm2tp5M~G2Qu?F0%|4f?fPBlON(&IHNfirF6!#Dn zXq+Up0ZYRKJ%RF9bpSunbu=9|)G*OksvQjmMt8wQe?&*aUkREl@VdNFE)-dhy72{g zal7$)WN=+YP~F3P^>_59{-C1B$T!q~bP#4&!!N78Q*sxIS%~so;26DD7W50pwFFQ* zXK1%aa^y$Mvfi3I&@Fnd@4n$$(iv{1vtS~*sEU4WZL(-v=xgE-QT2Sr^7PyJMOVG= zZ|&<Ns+<>GlKI@_Ju;JY%suE|SosPG!h27@HC^Ak*ChOpnWo#pcR0^Qzti;hxp@`h z0i#A<0?cd6IC|6<Uo!_lm{O9cc;8qfDA`jWTxW#Fx}GBen2FcQ;xz)w4!-GJjBc-d zRZ84(6cFzbK@m)OCq+7B&j@?S2s1sX!{y2I;^*?HiM?VL>P4%cdyp%zg*~-@0r>Gd zOrjeXyMCxK>R#GujARA1=1gcy=G~=0BGs(yQ18{@m~o0Tz~N`ZZt6SE9iwVYiI%L2 z=2vz+8Ug9n6+$iL$#>u%(GgU?51EZiXOngM&P~YtmA<a+6}39?SzJQU5>fOra$tj} z?wsj&G5V17#L#>QZ6hk9vFcpXhx&tb|Kyl`YIJ$taXII*hnbQ<;hRgI#Mf`5smw6~ z4&Z(!XU(6%NQz}V7eDcESx^<TReY(jEH*1Dx<SG9T+kKu7OI>%7;|S5|L}#F8L+JN z62Un0Js9A_Q~M9VozAkBaR7!cYb8Q;JF%}d;Pag%(Eq}xF@<aOKjXqICL$&1>Ak{C z?Q-sQc+}-<zLI`sUjw65r_t(C_I#=@UO#&Ibz%JCCr;PWVcN<xjXj-nwkck9rdx}9 zq&ad+VDZiNp~mE|%VkGWzaRGV_(0d2X*e?S?&8<4g_vcBh=C*83l113kAr%tLU)|} zg!=r<dbFmz;=h%}(;L59-@woUu1uh7`(p~zqYFK)fjbrI?kJkj?`+Ww)ma7l3*)B) zxDQ`1e8Y59!es}0Z~@feT|C2r(mH1p)kP)wMAcO!X*m3Sc?<@Cn7hP%{$}F?ltozJ zXB9ke!|E%I#kBRacQoiNsbz`}-zYsVMi1`Z*j=`74H#7LnmSlPAllNUYZ=b3oO!9Q zZmeQ>;%&=-3+7K1C*n~gTBi|r590}FCRt=b=TtoPQokTqd_#u1y!ZT(#~S6w-gh0n z<401Pkmq6F6+Un+x>$=HJ$L66yb^3#s2F@Yhep&Fr$v1==X}v@h_EsN59ojH-lZkn zry^|d8L!{LL!c^WzCFr41M<fi22SNUKhfxdbrXJ?-~8sX?i>1U;i<zhuskMxwrImi z0JV&j3MdM8{PF#85^r{*o6b9Dhh&`#6FP$d$q)HIOz}JK`4)C_)&Ka<Pg#7gSnJ;P z>&La%$9j%<d+-f}VE994>#^(7^)rb(G0D0!N4~kon!YK#;_Bq!+JgU<s~Ugq`K$u; z*3zVDx8!US38Poo<Z*rEox>3aN7tR-_pXn-adeVWEcfJ;M2$38C!`#I6rcU#*n7NI z2)`HwULy%KF{&eX-|5Vs#_>t4kNZ!x!vf^z$A@a{vP(Igf$L6>{Zb3p*?16JOBM9o zs}9eb{rVDJN{G4<^^ZH*KK#BDT<0NxoF(80L56)&LV7BCV?bJt`1GWTN-Ig_u<#=r zS>EZCfzspk|G-f_-*_k*R8r3+YY*9G(X1sVn!c4^TPAk``0zPa;poMwYeftl@#EBU zSd;~K8sdDoltlAI6a|zc!Zo$sPhaEsBB{yq!1^orT~EKWq7|MX>=rHlOt(U0&~|ZS zznK-6**?W5_@+kc$@9Vf{xdHTW;-~$_LpL(M8)==yt%khA4wIq#PBpqF3(2;Q&mHQ zHu4`dggKQa*XLwXbTDkg<l=J1ji+*S+qV0EY<7I4S6fcK*tQAu6(?*`J5Qa~UmX^U zPRy!65U?4J<nQXUW~eSXGx#ftuF64gi)}m^w8EK_<n+u)<YGF9V7EeCQ5wpZF-`cq zysA9RP;xw@75!c1QK^Q1YupE~cMw`4^y#(eA8KPIiXP+)y+PL;s*pIl!fWXgLYHS- zq}kJU89?E(1n|RkwmIf|InN1{qt+0bLy8OAC_-d%k7en&6qqH6i{l7(9u?`mkHFZA zix9XAVhE&gn*<e_XL0201!_B6+B9<0G{`Kv4GHMwLCf^v=r;DgQs6=j8`jU_9~CqZ zB{T3lKhL%vdUoURmdO!@fTYtfg9{zA)urYHd+SEMbptI*E0x-Q-xrO1l(_NXym?7l zNJRu^=C8Wg0@B|~fPqgC%J9^x4d8B?KuApRerET(OEYQc+{KNZG#E!0oMcIw1J=Eu z=j`naekIK8MgC&mf!9`2cx3-SQl)D}DOv>ad21DMY-OftC$U#lsiI=q&NXofisZ2M z#u0tbQ<MwMKX%q0)_**p%&;D7uYx4>Rwp6(^W)Y$jy6pAj8G}bR#2Wme23sG<^Bih z;1}2ja&SIO)p8+n8<&w0$N+dX{vbfqQ3XBdAHg_15~MLev_@!g3FvGoCb18!_k?Gx z1hv@QLrN6@<QF7i(=kWAU}~M&pGxWlel0zSho?Cb3{arMgesAt_xL6b1N$-TXkVoo zA7TIa&Y&_24V9bsHa9h!Tfa>2YaW!@bq3_cma}3vMP`6ocU8B7T5}vmh_?rFvf&hI zbypIEn%vkMz`-*@JKiTm!DJ~_k~WsG=!m@=qR)c;`I}w8TJin7s|yL>H(wx7DsXx1 z7f~M=9BBD;^A4@$<>x*$0saPU_c*M!$e;Y9KWwoX<vFY>wM)kV4#_ZJa^RX%#g7zj zTV8Z9>_5L;C4K#%;n=QcpMSu+pPf23Zu(%q(U_X%J)>vt9Y)vUJzRGiPx<cq$9OvM zmQm|;@Z0qn2S@%3gmF!M{QAV9kx|d*A$R|p%mvxXo4ztWVKIJ>--ylX<du7+7a|~w zr`&Ot?Wqb_RIJ*tnxz$(_7{j{Xup<4{h1mYHTjeB>cYwGJ2&^I?@4t$FT7~)uwYI` z+>cGgD)I`FvTP6nO5-q;E<8y&D0DL!44FUUY9lU{c#efOXE7W5&^eb`2-&yq)$WT+ zv8)B+)ZHw8y*g?2a_-H^`?3zBf|KB<iRUC*rD`d6$W0iFMWiJkR<yxz&~|>T8h!Dg zPbf@3mXD4{W7sUo{o??C4jfq4G-vhoR|9$g?}NqDk;_~k%x48qG~-sg7eKzrM@F3G zq7ARcJ_#X5HI?w{_cCz0cw#Kx7DrEPKa=?^Qt=-|3yd-2;xMP?cj&JOdlxoJ((q_S z^8k7lxBrF}sMCHORD|KfqXq-?J<HT-(H6&8IgPx^WC10f7)-x$t4P*-Z1@~*1-ckf z2PLk~+b@wX=e4<_Jfn!H_HqRruhWTQ#bKa~cwRcJ4p;<T_YFhJVnU1j1lU?i*UKRr z)>NbXQ6b#j*+uGdFEH6ZMof0XuGqcT<xe3N_>d$y68RH0>NP5nM@UUnyn{6|S3n42 zVlnh=nj9U<u)|W*?5YiiM;8Ny`bJcj;4^jIY9{mRLvaVb96fXl*sM3oRIX(2P+KON z$C9AJ;t{CSQ;ENDnI=nNUR;Y~S?a=N{22f!#SJ`?*%1GRAVw}q5<0-R2$5j}tP>0M zxepXGhLI;Wv$M-)a3aek2&GQEsjbFSuCh`W9IkL@{kB#!F;5wVhsj3DEf9fOZ#*T; z5pUKKI-$D1yI;yd0DA`|4g`mI5*Jqtyl-M|hdnyb;9RRQRe1Q=l?2)HfL0Cj!fq|Y zLt7dJlhg3EX}V<^HFS2HI@Ky<t8Mu9_m$ae8Z&pkHr6F_EA2n7_+Rx+x_SDqCK;ir zvculJIcvAp0Wr;UC_A_?_aChYWzFYBK9f+%J*|U==K{Ks$p6(V`2Q0#*Z;pU^JR8A z)`2jeA?_D7pNTuzIG-h#ygZ+c&mt_)Rm!3katQT}3%OeD%L{pWLxi{aM$=Jm3(S@p z-xgY~FTX7!qSY7w4|oM0Wh})16f@^~1!`BgF>{+qVr}-GO~NIHU(A1xnXBg(o#w{O z>&jw2HZ|6#`blDwm>=Clx;Yx3uC-0ae7fGbbmh~H?)8tKZnDstpPL6HV?VbHt6k-K z1ty<9-x~jS%>2vk*@OR%nRl?WG{1H(mT_a|%k@{kc71OD^!4t_kmk4UpVM5gU}Nd( zzq|r&%slo6@_+IQR(n_avH$W4_URD+!z*YZL&t6p4M7X~Sb5H*=XauzX59lT&5mmZ zBYHQ_Ge-55OAUqxK2+aQNLijUe3F9vZ(hO9f(MVy_#gauw%bu~?b)uq+P5ctLk}lS z?F;{M?AajrYHc>C+<pD|!O+J>v-hhnv`xi_%9~EwA|9_(e2!iJ^{<%umtSvAzR})b zXGnQm7|hzrPFct|{krj%;i&U_@xQ!+-%IC@fBnt%3UoG?>&lO8erRmC@!z}xovqJp zGe@?*bediuejQI5J$a1pkItzSS%D|}1vvOnHq;~g&1YroN8PEPke~J6wb?^A|E|v+ zTO|HsXX|cnESAS_|6XpmxxM+h<J<Pu$^%`_pPw`FR%zmMmx6w5{`$t@00K;a$B6~W ztiXV#0%ZD@s+>ZmV&mvok`WE_ubBD&>J`{vU0}7H0?vG{xDpJJtg4g2vO3_)2*}LE zi%{l?Dp*a-I7P8#vs!>7OYFy7Tfv*3592GSU<9nH)6M4QiTO_Uyu&Nm&Xx-TM+vrB z%X*4?_R|IWqZm3L8Ts#@Rbw4ss&WQ*%>>tr?iz;0^T|g!Q7lAcC#<>60Cgf@0cm_w z+J-*FJ#Od4uk@kMQ&e?JtC0r80kkDwA$<OTNF)vtHUgkiG!{hP0G#%aL1Dr>ga!-t zwP0~~sEFz%xPhQ;O0Lsrwa#(#{@??i<@by*deIL@_9Z{b#!(<%r)FSB9a(ix^MX~) zhjbAi240~N64GLTJG%9=g9ogyQP?1FHyb6{NZy%)qoUbt6fXu8vS9(DqsI`2I1qUX z&&kBv!6;qs#qKsWU96RrEz(FtsSq>NjI0Y4XJMWwJ(^h$i>}Fxa&W|hGS`TZbg=cc z5Ix%+Rg;;a=apo9V}=cDe%7g}I=T6$K0VW(SpUwo*GhDJOuCN9^jIOH3t2-_PKsz} zIl7ooDpFFe7c!3n_-RBM`UVl>;eOFHbH$xkkB!obB6`cGASF^*2s4Jw_d-0iX%j{% zG9X89JkoKAQZ0z0Iz|JK64n}0rYsBDj3cqgGIZKy>o8dtB-W_+Chv8YUdhLiN0QH4 zS(7RUjq?IS&+O&pZ3YnMpTn;}KMdLl7QV3pp#vta+BDaQiBd8wIYGqR>Ub8q5Qdex zli1Q28}vmuJ;VV94KY{61W100;!H3;$p&M?P6w|YMgI6{4dG#`0Mn<e@C!A>o9&rJ zW8R#W0|f<|srOAJTkM#iU^3euTgS@P{in%ojsMxXC8_!V<cb@|m93K{e11=q2Eu`z zA$Xq1w`U_8+bM$(_4(oX<y5bT5}dBQ0aP3OTrrB>1*yv^qA-npdruIkXa>H~a77QP zrnPs6lW8R<iYfap`k|Cr?``u_aBB2QQIBN%O(PcZlp_|B(IeNme~mr$`_YX2I3C4r zixVt~+0Sjcv|jk~y}aNAS(pq|;utKn0oh4?JDiibXB0-sU}@Au5lD2Sp6BB-LaLD2 zu5tMNxnpx<m<#}s*sh2k%cly?PGwqlt4jRXV5O0nH7QHWl5Yg4=Gp8FpV8|2*cS)G zo*G?-vJSW$mU%||S)N~~wnMqYY)I!dHmBV|N#sj+l<gUEVW(W%1**A&zpUsJl7N~m zyK``#RNbIwTeY5Q-#Y^O<g@7^6Cv(Zg@J4S<I}y(2LwJ_Yqze<Eqioy%{=~^e0S^B zN?}L$d-rdtrtYZqv5uZ!kH5V%zxxId?&MaXR%o(+*q9k%j_BA*))VgUy4A?9j6Nzo zJ;PV>N#{^@>q<d*CWya@<s~!pmQKuR;yK?o9$r82{cODIJDv9~Blp6AXT6q7L6zoX z*AsqR2(^FjWCOOPe*JL;xVP-7*mWvK=uWNjUv-x>3!n2kN%eO3KDt+1OqV3AUDve# z6k_T!(|=mLx#YrIMXO!jqc@V7`S-rqgzcI;`F$PxMJFWT(w4`^8^10t-uq@Yzl)vp z{a5dd-OA1@W?g*o8<qGyHl+(vZ)JCsJn%lPR&u}FRqN)7iin;c>hqS%`@a94IA`~> z-qHC(lQMR!`n9=0=Pql>ohL`H_ZVqDyyud9bL;hw?O#3LDpsg_|FESv8$)~dd@sNG zXUUNBd#q^B&j#JUAH6x7(@*xScijB@^%!UCwXhX8A*Q?iy@c}%abow^$_J;>ZJfVf zi>&^<*X3+J<7}@#vD*H1le7JU!`bErjm=;v07j<3=nAf(4fD;y0voUpj*2y-iUv@{ zQ>c;z_*O&0&Ef=w4JsZ-Q!=Be1klt{Xao#RkddI-NmEau>1@yp%+iel(oIs*%_`C@ zI@2v@)Awwo6LA?f%T$fx<lDtm?$fY-MM5nyVe~Dvb~0o2eTLvl2Hro@Z8?MccHT$- zSC$!n+{J$*L!X|RF`02NAd{ELeLdqyMMgX>n_`xo5RjdilAT<Uozj`jw;|lYBV&un z5QG78BY<np<YfeL!_+t!5adt*HEwBr9B8@?2$4Z@CxB*I@{)phnWREY0#_=~fgw3c zuGd*Q3P?Z$S=>KGC>W@U0xnDB36JOA2*}xkhwO3mo{c;fF2Bz#e;^=#C?#JhMK%?e z?Xi4XQ17TP3mM5ms*)fRe2zB>&E@mu$q4xs7Y++4&nS2~TOdyY6}Zv^2@F{gR;9Rb zEu1|JggF~BT@jXA5$1s*A^`Hj5P?mXV?#<rkSh{kC?GNi(4a6V;s_;f3V{vn8_zkF zQanO0mZ>b3yHl+2ycqwxc<X((+^o!S0F9ponXzbSmWCR(V15=f)<bbf2scuRJck5@ zu#h|qR3LY>@=gJVrD3dB8aNJq34nx}X}k=u!3iX?q2F|99}EdHElnvvD1cCEMw+h( zYcPtqqxGTY#oT<kJvmp32<?1ccI0;%MY=q}ynMJZU#Sx2Wk63N{sonLGfO!nfKLx) z`Vh$t)kEB;JFewH0bIsG?jWNo0|k<yXUhfl&$+}p!UPW->;yv002l7JwgpX_k<|;3 z&N$#n0ib529ED-?OIYPN!W2N*vmreqglY!(DCI2aGkwzM2h7h81)d*{rm8gMCw|EA z!<|$mm1Z?@r?w0Ab4n~KQ6-hAmjR{5%n~;;<is&Y1+oFtrc#9p7jCrM96-1d!S2Q? zS3D%eswy(ObS1C|0scSiy=PQY@7}JPnMQ|%8hV0sr1v5Oq!$H6=@1kU0TDz5X@(wp zM>?S>MM`MW5fGFj2#V61f+8ZI0s?|L`LDI!cfISZefAl<jIqD$FB$oiIWoo^b3V`Y z+`sFFoEYUpjetut1z<HI)RqVjBKEjHe90M(R?bjd0mTq<FYgx8;=nmKAyXS5)EvNe z%*1F8j<Nv@gW{I0GZ+!k`!`Y;aCuUc`aoRDz7aUm5X|ZWaHML9Qn(ngjKk-Klz6yc zZh=k*@w{!hZcw>CZNcbGZtBgbc<X3f4#Cda)-i_=KNBC7336-$!AQ|%3XiB$L1)}S zPlg_~&*V247}{-?!bow?sz5bu@n&ijcWo=~1y%S}5sl)@!8tKovC(_eiQfWZLOLp9 zY%2*tmGOC%oaFZMR&CuX_9~cCRl03eW>8gjUR6#<Ro+}x!Esd)S2a<sy41G1JgE9{ zUUg+hb@g0z&2e=d*AtR)b;VRd8wTJ*TXf_->FRjWGxwzT_(?xk&45}BH^O2t@5xZm z)fcoid=o~6cdri5)x4msol>ivvDKLFsGXgwT{x~?;-aVu>OR=ktp(M6%B$PxsN0;Y z+d8h>=Bn@T03hFEivgg$132!eKbfPf5bHtQBrqK*>2dw5xq4J;Jym`^xx;<2#hrV? zo$d+gm0AO{Yr}#i3DVhcdd$T0y8+GJD4^abXxAtl+$fsgDBjt4cD_;ScOy9ukogKU zT#ITZV;VTomTLJ;8l6p=^G(>_O*-7ox}9!n5*EBfFb#J@n+L#$13VvtDY-9-$-gZg zU|(srebU6<3;q)amhA<wy#PBJupKqSq_&vnw;abCBDn#ZuK?R$hWk8KQW>*e^ZCx! zp!wF2->qSk>TmV72)nkZ;I^3jHbQ4x{Cr#D@3v&__Eh!ubh~z~C-oR~liZW~3!QEn z+zl5y>uDsKO!9$qCiMrKoP~5vV!vzhB`hybz!z-5Dn3cmm0;msah78yN1r4`8R%2b zBw@4#tGWFiHN?W)m$n@$js*^e0Qk*(0iP6}-UMYIKo*xj=9$k*f~n%5d*oqKje5_T zUC*cBo{jvT&CZ^!-}PN;;IJ$(Gn>U3BKSBDyrT~0!<li*fPZj<-`{l?OKoRXG*?pR zRxxR(t!YIepgKOyd_Ea0n=n_I%-Ic?JZG|=QQw;(aZ_v`s-RVn_?Jb#Vi>q-l+T0L z&?CW)elm&Tv&lXX9uUM1pAXSa(UU<4puukbKsNUPoyLHU{eW)BfPTS%Vb_51!hos9 zz)NvJbJv=C(8`PiW?8r5Te0F?x5ALXmk+Fi)~&qunv;#WpUn4w^8re7q{kL)Y!2o{ zQ>5}aWEq&;QI3!~Jj1Aumk7NVl5~^@EW!YT-6Ars--3*I&T_w-jHcXH&_|-f?l#%b z$s&pe6#3*u!NPFS$uN;;q_n1Igw|>Eoy&Q4>mWr7Ha$zecY{BKoTBwCR6TozhPi0A z2DIrrI=H}!=J16tux>kuV=C;ebtcOkoW~yiZKjWHp=lsNLp8NaYL`hB4{qm#aF}N? zkf6%gY&FxA4_;$Zi0u2n2RahRHw(tMy2iH`#&=J~e{8jNvN>T8PP!|Agv_Wk`WY)5 zP?zYk!!~O5xTZ3A^hw%_vaR|f53tH^;dvX#rC_j#Iap*RSw1fJiXHe;LMMF^@H!ZH zder=`X6!85a&!Q2J{lV>2Wxuek+EP7bPpZb;jL2WTb07MYKx5+^D8JKSQ=-h>3>t6 z1U}7wV*0{G3^Da(&_x<Ib;EVEwZ!cw{UA5d&9oC>_i;bY1KNTBYY9vCRFWM-OOV}D zRXbo|ui1^e<MF(^xq2&;#Eo@9pv>;w_k!ub?&+Y#>5$Xuu*CtQX9p*D>zz-{Wu0zC z`3?D|Ll^R!LZT*~q><j(&Sr<s<`mB6b<Y;unw^ZFEnb{0VwlV4oy)p4S6Vn%-91;c zI9GQ%N8+7tJU8F$F#j}kzO8V+qkI0LS^cH~mn!s1KSS%lxrG-F3qzp`BZUjEx);V5 z7bZ>@-taC?om+hGus9RCI9Is1(7m`sUR+!`UHrhiw03Uklf%+R=+b84(pLA<d*1t1 zzd70Em&2@=_d=Hs3YQPNmyZ{hPm-4R^Ok|}Wytn2-22XUzzXf3Wjf7ZhVd1|pA}}l zRaVVacE?pz*eX}iDo@WU-_k1j&#D052SLpbd_`eYulOX~5xfRs{Z_`E4-Hr>(x3lg zN>fHC@7<PNLeSKG>}Fo(0sHc$fh6JQ`hLu7fdLR6u0o1`4qltnj>DC#xywL6I3t6i z4;Qb2K&fymBKVg0S@Uh)nAv1&XV5!ExF;U&Y<}}u#F|Fwnx_oZd4fv&G8N}a^fS3n zif=%WUGQBHRjABH=nBxhA>l(FKSM7A@}Hmzk=Y0`2Yfm{r{5A}LVygg8=<{$VC7?L z`i90E5U>lqi>LCW_#t6uLz2$`G9VZTRQ2bREu)as_Lug?&8k==(UDJCRi$l-R|%`q zS@f0n``3XB$mip{O;Rc^!nT;xw#Ji@V|?G3fNxWd$hUmFPKPS*!@jYkeOszSEb?t5 zfbF#~#K*902IuWB;RZAr+nYUzExw(n#ye+acfK?33}V&_BX>6Ib|x$`IZFbOA9re< z*Qz1ApDo5%ukWta?H=@mBU6|WTHhJ@x7ql=bL@QMyuHKynp+`Pl~;?0g^JY#B+Y;E z+Zp~HvHHZqrXQP2KgO9Ee}0zwIo<<;D1I0I4)S9~{1^QQ8wf(tk97Y{Kf?dNrXP`z z8v4JThyMpK;lJodh*9hwl}>-}JXG4;C`)A*G%vT1qx8ZtSbK;)D&V^seycca?#q8* z!s^ZH8aD!vlJS&+39mPd|9@e^$IUnY*D)c8>g>N@LglT0V8VaVkH|W>htL!GAn(32 z@rf`^z0?UgdHZ9OwvXOVN0LdQNn0X8gNHwK@0B0F)=$iT=to3q75IbJYW#e(ex2Q) zvb4Ij|IYeGlK<Gn^R@faxL8T0*ABsw2ea<QWB#)}lHU&IeO^i`%-@~9^~=kXNB8Ao zjv^VvK5}>KRw|z$izZ?<`b_enR=o6f+iJ8tqw2?W_3>6KI+@;HtDu!hmDRwge_}$Z z<Mj^z?W3=S5B`A(KL^%~soiRLz8$>NOO^`R9bmexvC;YQ@$rvW$~z&SJ8rkJkdlJK z)HkMY)Svq>>6z23wJaj7>EeQbzBv4MOh`UG{7l)No@7wz{Z~v#ZAt`l4E4fGZv-($ zF+$H6QuHI{A{?*KPw&a~Df_32(H<I5EB@7a=woz7<DZ>}_V1{!=k&3%yND>2|D*G8 zHx^4@iXg`t4hV34Cm5QRGCv#|5LWvhXP#L4pPh%SDa!(+=V<z<1e?Ei9{!~taW^gF znjZRF=iy)a5qaTo)&57xWYBdT0T2+mmxe~}=JRIUfu?I<{g5hx&_6RT&9t##2KO~B zbT5eN<T^l!TP*)k8ET%u!H}pvEgeKS+XNPjI&`7d*zIQMLZ{@G18^)B%C**zaqhm5 z?xkL&z~K-6Qm=k276I7B;Nc1=fPp}Q2%JEmy(d)i<USDH$|cD&AV5xgBFaXsDOne# z%@UPs>KcCsBn|4LCiLQ|SH9=D&T6yt55E%T$)J`%Y0E2{lSkdbmviY?Zm_tMR4w}a z&eCJu&_W0>wJt7;zPFbet%{(5vO*G1Vxbzn!;$GQFkdQ`fBz6qMX;poE!VU?9`!NQ z=%a)7Dot+~zs;N5d#o~6bs=EnZPD>w1qa3Kg*UeRNhDSpnpIzVxY;u%yI*CVRBc&d z{I1$|zuJ1N`s$8ycZv5q35p2Q+U|Ko!yQ*TH?t?U(<ASncI?;sBt5bJY&_jDw_g`H z_Qdhm$aK%~em$O{21jKw)6aE4BAC^L#1pOa=!p#~$TbeM$?QnXATfKa#;yIs)L76# z6Op0TU2NdZWZpq@rCF_q)#%)L+4uF1?zLVw=(2aoiwFT0dMB{gyiL+tDw@t33rHDF zpJx=jJf*O$mHMPAT(lL)b^-ZS-CtPZa<L)jSo#%iwwn4|b*%Vrb1NDw{mA>(wP98t zG(Ea>(DAE#H>p14v&r)D+^?R)vHGxIqsxDee?0>+lJLN*{8yYg0M!MV2#%T+xcp%s zW3o&XH+mIjp3}wVC=)0j?Mxl4@|>OVd#nNdHRk-b0a49{_{*<8uywW#%7ir}UN`;7 zIp6j|rKcg;@6~mt9k*VPHx{hY<-9A08=@0#3`nYJhlyf=zAGRI0_|XW#m3L%sa%F^ zmaDi3Xb8vHl=IT`lU)AMEB6b2p?*ytm0GRI9kja?5JJ((qlf@CLJq=8Iha@Jh4Z#G z6~-3a5Vu1Cn8R2)^Im{W0S#x6!2>_e-lUsv2hoe-0lA7V=RDP3=Skt2%s~)Zm+`U6 z?S|^hW1CkxJKmAPT57JFeYKglRrc_{4dL_IJR@I1e_6Dz*mDKMvfB>%t2|R}H{~p< z6M7kaKyzphjPYV&WP~_v_DU;+xB}-81<~R`0F=-RlWN1$Wt)UQAfkcK_W&xT7C zfa|q^vi!z&!hZk$8zzK|yV<p>0@A&G(ehRh*8ntKLm`-@D>a%~W|dzNcfi_Z4v`k@ zgmc%og$wzF(_wpI%4Byes|s-gj#H<yQ0c|0fFgNLAk+*#+N}1tpI*};XjaM*g`Ded z>Gbi2{zbJn59{_G%b$K}e6in)G>u@*nWpR=djb3{$Tf-IAYPOXWzQc4F$F$Qp>!CG z@xCyhnPECKp2-{ivp`xKs_fHB=W+o6K>=8xh(BYOF#<*DBgpylV~XST;S2RY-&3vp z`bxa7pFe}@;ETP-{=O(W>BhpUD?adL6W%xF<-MVbuwKA0^_Dk38(e?@UST5r0C=1y zb!zW#M<1tf6LFASJC*gq3n#1G&kl#QdVXYF45^ZK9M0MT5haJCnD;m#D09#}uQ`|- zWp~_9VTCkm6P{<E=P#%R07ZJcOcasD5GVC9{7y2MHnVGu+ByK9%5(JRH|4N~Le*66 zzY@8gcbyW-zj0aE1upEKLHU$%f$xHx-s94q-pqY^lOqSjM7r&N&xJDw<o^^zWDg$= zh=Aoph_*$D&qSOJ4AJ`ZAhujJR@X(LQcU-1r0G3J+xL-I-6Hj}U9E)iy4F$pfl-Di zT=(|~shKF#!>9|WXmge5OV-iKpSbfgqNg53+qXqK&P3x5qpzW2oK+AG?lIR55iU6~ zHir&ghcTY0SP$yhyP~o8tYZTMV}o*HL)v1)W@7P&u@NXjlnNonnm`C7#OK5ugyZ03 z+4G}{2n6f30X+w1Ag(tnF3lQI=<1Muh{(MjSM6%YW8v7`f<)Yl=L~nO4n%6ck7rGD zB&i@pu3iz<Go!}aQTry)^d-R45)i8ibd!#k*9pajW*P1=Z?7k24JD2e;xaZYO9G7w zMdRL3+ZW{^*ba2l_CSc0q?N;@52)ldmE=#>$s2*mn>oo_ZOPj+$-9TiKTs)qDk%rn zDTje6$2ln{Z7F|dQb0#3V9r#iYAW0&mHK`vZEor}YJl|xH*y8wMyIi=rm@?kq3-_+ zCKQNE<0BdKnWu}Wri<sMVMu@^XSz&#x*TVQf@+46O@<2jK82iRXtZZ&&SqebGITgI zbyYL<Z88m2GdOW(9l#~--Ar@NtV^m{mNr>e?`K`56qe<tUo=YNM5oz`Q7)M^6C28j z{tJqTh-KRkXIac<i+ur5q)ZeJu)hB=F!y0l`@@jghhaw#@tipksyR_MIWhNh2)Q}& zaSu5svJm(<5;EIKHJ1;Yn{AVub3ZpPH@BcYw<s=`-3NTHo$^x_?C6KwsX%EvphCHC z^&ay1<W(GHu@k|{cyAsGP^Byh&;UC&pPiV^jwndt%x~b#_P+^WCP4DLw+sdW4w<xK z)xtuX!m0a(?{f=h+6(7q3m1+GmpF@7$f`vjY>L+I7k$bt+GsD@oGqH3%}T1u=9DSE zrkXowl>0;MA#*Np1_5ra;;v}ViJr}2&-I#oA4;k56sP=W9N1<8KKb5Dd;(C!Lqv!~ z3S1JFNn^!BAZZX$5{x2t5dcB4D*)^6EkO$56#<K<0;t}63VQWW^_C@i$6tj~a1F(@ zaZQYf<to=vE7!Fx*AFT;^eAVoG97NFn7p!1XLHW%mQylOTH<MEu*B1L;A`fiJ2biV znA~mE$5U~DCIXtHnnqzq`JZ8~6JCgyzU3Sx-p8K)o3KDz2+K`C5D&%&Sbh}-AHqwW zK*6Hsm0Kd<ts8!n#g+FpP^k&duSWzd3o6{YU*+=em@uzON(|7HxzKEB@~hlbHx>L< z7b50k+|*%OVQKPM7izZh$TW@{$Sb$b1>{#CTsB~1nJ|ht>imR18R11KyrVpCT+P7< zD>wzzys`~-j0<H&KvJr~0>pf~)ckGzx-A2Q9<h?*46?%lh>1F7A1DI}D5I%42&zBK ztN#lV8kaNQzql6#95$PxamH8UP3vq;TDicw6Y08WV0AAG1$tbEd0ZY;R34Y6hzKg1 z_7Aj$n@;%LrEM&!@CuCgeREXL+hNb(1Fatf3|j7B@@_>_w&&zt;G;2c3D?AGp3Y%c zt;OApRd3d@Yt{{J*3WNV{{r-6nwk;KhIFB5pNo_;OURQa66h9PG>LK4><qd9bX<0- zmc?uX79rlFP&x{6r>O>uPlTSw`P!rsZ*n){-5?@ZqWOJ5(5FmfHaPJqlyXHL5_Clv z999kf2KVOkDU+HF7F;R2uHK$$*Pb2Rp3|9gMh0we43#FeE9`<XI1(SC<BA$sj07}| zw2PVNjx>WkRU6tdfY_7fwWG{tle~lJrn39lcR26fp)m5B5A%%bv)TbRnSvn+ASt&i z=_tSAOV^9}uD-bD_nw{8lnJWN?z#Ey1-s^Q@|SdJ5KwOOu)(H#z$ou0=YuMv;^DYl zUVm<n_Ut{oX9vO04)dQKcRt(qOh5Vk?BMG&QJZvd%`+H%?=NmJRbnswLNDV<FM_9! zS)-5DzK=bGf(HAzy83>pr=b#oerxV+7of+cUofO!xS(IOt6zMf|LjS>6wh-RjpuUq z&lN(RD{b|&r;0s_d#+jVT#IJ_`|p_WWZ(kNpn1r^IgLS)t<>&5?SV&w_FaRH3xl|m z!D~D(icv3kGUMGeUeGJO@G5xWz3?K-5aewF@;P~N&;Dg#$jhLDmmys*!xmoRPhLjw z3`J=S#n=xKLWbgJ3WgF*8|KoI@=?RItClU`L^2NKcZkS2J1heLAQ`wV0`y%y0RaHO z1k4Hq3SjRquR+j&K(;b)E6VwVIjCk~1U3l*%Zy&cQhD{lZBv1Om{EG?k&Ae^@rryX z9s>0l9ne6)uvCFEiYhXoNBghZc|gt}g#{ik6=>K;Fa8|Hg%(S7DUw2EUd=3kV5y+1 zGH_!oC_8bCF8l@n0s$*Sdm;ALU9bOyFn>6C4L&ykb(nyMPEZ$4&~{H4f48IS9;WA= zWIi`Z6Mm~2HqOlQUttFg1$J=!19nLK1v^%>sNnz8u2t1k;B_%Jl9t!FxpK11Fhks7 zq`B&Cg?X8Ap>a#~yC>F79*ZL_o>z(;pU3l>Jgu2+I?E=Sh<*c_YxVg!QfQ*QMH5XO zMQ?w;v~Kws9zqv0>Q)k)jp5SdeAU+Q@n!0$aaGQz;`E^$dC#R+HXf_v#PbP!W_jf) zZz?Z8aUAPt`8rLyK3Zhf`Sja-o8Q-^vCh_=<=#kXHqoxO?;nRatIfu{+JDYb7nu}a z=<eA6I@9F2Jl@^;YiH$o0-66}PuJ1Ujki{k#GdZoztET!{6(!JU>6bdqLLrw^{eNE zBJ;u<=ozepQwvwFM9?e!_cBo@``Z7^L<yXC@A~&l6#W~3l8KUIHApjLd|~jv$F=$w z?D&sN)Zbu-zWA5&%>SB+`cgrR`DZ5TFWB)^{Bua%IQb^gLwevZ*m3Q?Q=QlN$Uibs zS1_sk|C))CyuoZa`s9I+qRg%8IpL{qTFZ@hx5`$lkMR%I-KMY|v^Ukg!?qp|u-kp? z5e$Dc_hNLiW4`)D_HD$JT~?1*(J0~>3PV|LgP+sYnS#~#u+IuS)MZT>G<<vw$U#%S zdILtR;jrasjdw3tkY{i7h(ECOZl!JAlQkFoc|%UuYcb^ND2FUwE>okEwb@|VL&JQ4 z4O3e-F0%gHr$+PW^G|(Q4h01hq=Jn6pk;mV{)G#vzgo<WlO-*}m}I&{p>B3lN`>p! zOeUt#_fNOA7!$7kG~hfTHvzWXTW07*jndyK3%XfmX>S;1$K7D2%2ICzZj-Yk%rbIW z+s%)e9b2bYf*g*@@}I9Cm6tiK9Zo{D9goX1J&%r!H6Jady?uH{?RVpxK-lH&zU<%f zo3w=&-b`KatL@TV2Jd{{7E@))ub*>xRrh`Lt6=EWso3Veu*F+iZ+0(wHU}MCf$f&O zzVc*E{aDPI%yIZG?lp7g!Si~LAM@giJ%8wPQAg>Dy${z?j4bFJ_CBmP!P$2;ejQ)< zfl4i=1^YO|`xdKqMbfDH$L&-baG|8#!k8+C>rmB|<im$5Wv>AFfcq)C2M_z6k3nzp zC63k!{AkS@AO$iH%s(gVqB4FZ4HGml%df3x5Nz)SBRG)-&bD{*Qtbil3$HG*Q~h{$ zuib=D<2lB5PA+m8``Yz$lO?!4P=<R>Fjn!b6&D~62KpK>0roU3*U#vEiK2`94R&B4 zr#-!`m*~vN@{VTNkOLbd=t#E_VZ(D@yMlT*;>XWyv_zv6Ewf-stTD&@Oia2dyGN2Y z^cwSJ!yzV}=ya|T9o?W-5Pa&6c;(iIGbWErQiykqTO^h}v8s<%xuSA3(zwrBOm*2x z;l<9&KO&XWFq6D2gr+qtl$0YHy)jK@^HGKhk&UK5HGXDWT0918`|HP=XJjz>&8a8# z<KbtCz&_6e-@_kd6T8r#VT?ytRUe2DgEgBZXcFhNnBI-YylO&IYVLI+-*koOxD#hG z4Yef1F0@)ShpZ|vYI2&tjueL4Z6wC;$aK`0*sc=~2Pz_zj%Bj%D5zkvE}SzFpRgO5 zI;(nR>bJ0QX63iN3KVU%!R@&h+9iAZGQ0_9RMA6`EvAu9z9N?{Hotk2XjWx+N5J}* zkZFnO75N*kLl!L8-W1K;!6n$O=_Iy4E=g)3v^Kk%UM`oj6mAw%^8ZqVGO%oUFO##! zBY2UqLy>5iCOcB&-t&ewbEf6Vh3HcgQ?br;8HK1Y<QK==YwtVTXH%QbYJYoVX~M$T zXdz1HW1<r=(f@!vp(H=vEMycAJQdQjFP+PqEyr|hN1PhLWN?-llZYHM?y2by)`uN{ z%Dyj-x-eK;uk(Oj8bVNCfnGuK^5@2@WrU~bTZ7cWmg!4VB=*pqcYN0)I`e~dEH!M= zY5v+jOcVHIi60fuHXG7j35L&jP`#(Q*6yZ)*p@dZNZj&`zH>Ip-qTqVvt9Zjf926r z-)F8Le2h1O#23Y%J|FM*uwkP?E~>q~j3D0D56Z7w;?f;RmHXg#SrvV*;B)<@gwG1! zY!>#G{3@WswFFmFAv%g)IX`sQZ7$*Z`{q_r@i2l$tI+xj`%f6|uk*S(*mLW5ppflZ z30)_zH-91q$ivCv^|!U`*PHB<1+2CSxzAM)>^_gjMPJEHU8312VVy%e|E9Wk>V=py z#!PYpwYI0%iPB8EZ>UOLXBRY5HDX7e^$qvFBpzmnZ$W95(kKC?H|xeQmVxb$-%Y(o z5vELnevEx}DVFDu!u4@4Vx`R14aW-T&+pF^)g{#XLT|9D+jWh5G+9R^l_yCa&dy|C zZM^+%>-xQU@hR^sZB1t7z8S#+MM}TgA2fTdj@a6MTcS=CYW(KUFQgAwO|NE7eIzlh z9!7h=xAoD7k7`pGOo;WReyVhzXyvX|a-hn9NRLmnLDvW5v%`UJ-`K()J}w`OR5WB> zicQb&Vqzv=Y#*^2|B>ApvdSZp(BY)>Hjkc1G(@F+JYf81(eIPb*y;P@lmo|Sb^5T! zPyOA)pYJ>-KmW)$a(|-Y!hSV5#3)nzy7mVL4q8IgG&v?^s`kP`BUR|eoa{mMwD(-@ z=)gDDl9sy#jQb$fll8#Yol7>}0@9pEGwK${cSBk|YNHn4Rot3b<%sw?rqX>5ho<J_ zY6;}7V%e5u8d>(-3+T8JCi6xrWR;nG^i21mkym}lGfSqdz4wb~FX^GL;c+)yAU%7{ zXF@;7?vy>xpZeJ*9rv}kXl?%4&H2i`)^Do35_QjY_q?|^i}+rrPO)emqQW&xJsf|} za2H?hdeBO))g>doo-aJM{~daqa!dDXQ`pI9u<&lePME%`*8Jr1>5pd*-WbC2fA3xo zg{<D+hz-4ngeR;b1s@CigyVnti|!b3#~pwoZr~g4*rUH&(>CCfF%PC&IagzYl-<1Y zR&SmN2Q}S5Ld}`EeQt~ians?@vZzQh9whG`UfBntAzh-8iBv-Isvjb)iT*btxg4jB z*9~qzjg4#s{Fgo>e^nqtqc~63B0uj%%C|+DRYVrTuUHd6f<sYZm|M`2XxjdJqp}DO z?Jxuee?o;qqHs$bu_q0bR82ItJksK$Z_q~c)x&57(U?#BvEhbDZBc=nZ84sK!BE2x z5pvrDnzV?BK$iWNF-DEC!R`npYYp3>Xom3Uj16Wy!OJO7D8W50+3>-;0I$zfc6jE9 zt(K_j4WUBo1P`kCk%!J&)U4+WV~a~elmjD~N@Ab7CrE!tU`>m8LU43#ix<v`Pv7wJ zYkM$%K-hnrcsV?A6O*XH&bzb`spyWNJO-BCBPVlkJ$KCWE0cB_A{16{&WMKGMx}V| z$E4-Nv-l>DG~L<?WH&J9#Q3Tb{T=0ep?R1{t&KQEYXW5ECN7Y`)DX8SnpOu+<8Y20 z$Vn@lNxkcPgGL2mwPq9R2g_E1)35pp?jhz|{2TX~1aYZ;;UF6H-(ZJo0uNa`g~JFj zT0&vv6yAZjU>MRXnvhf}mK7LWNzLX_k|8$<x@?FbrAKWaf|l12EqCnan1OQ&EMHr! zQ>l~qhgdf%k`)Y7jb6mI<cQvi4hbWqMztl}{T{{R?DqJ8Nnkh;>YGJF*(%>eG7}{O z^brm=?9XDe72PuwZ8G$o<EZvC204&V9;XDgi`H($?6{|#^$nv0+%l_>6bH#!AA2h! z${Q+zFFc%#ha|Zo+#h?M(T-A>j$v=ev}%afu1rm9w?zy`f85}88fHxrVZESA!TPx# zGr3I_?8;R!%#)eMGsp>>0=mhRfJ+7Wt?^Sf$oIpEUTuXuV#zDyc0}=gzNufiN!CTm z?+SID^Oxc>1R7AAG~AXG%p<u4vZ8UY!@G-q8FK~?=jDpzF+`@xyNR=jg<`??++zjP zP|`BR4dEV?RGJb%Bvs_Da>k#xc#s#%f}myNA+nsSEHFC?k~1oTYG-7{No?h^6}1x! zCQD0KLyrSpf8G$U6=SOuExVqUE)ecU_R)j%a-XRVYZS2+%p=CN=NO@wp?PB9<J%*K z=Lj~UN<k%}L76<if;NAZST^tnKW4G`!lO4AnZHrY@Wr>N{js2NGEG{H%t(;NrqIRs zN7aX>m#b6a@2B6&BGRdq8pf5-hUX4GEIK@Ni@jDEBOW|P7L`nxEg%y?BFA^VIv&$} zue`D;nw3{R#EEnrA<pS1Emu6+xi7jz@TQ%NcNC8;o{My>%t;MOezF;GTO3(u8$*=^ zlCLV^$jkKe5W4GL(shh{rdIPJsAkAmtSPVNHgm+_NKM2g`PZ8QxwN(Kt4k8^)mm9p z5Yx*>t835qhigoxlfskU1__*_sWU18EmYU7Thwl=aqWup8KCO_2|NBX6Xhuck|Uj9 z+~k1-iB%BGc`x`^w(GWR7&J6wm`nATbS8qNgsEeZEl1Juu$eGxS+X1NKI!8;o2`$8 z+k`vkp~VtdD>+GVN}!DIwMOLg2+iXL>q|LIz76aR=ON)R1fqc!D1TByQuAbYt_C&l zhjILDH0l(=a<^F8wOkEuvCeO?<rZV?Y;pYE@?y0KCxO1E{!|(4soRNAK~U=Y${gkq zzdk&5`;EArfW(;OU&jH|c*qsdO_n};p9VD^ZWiFDG!g_bg8(mN4st@4;Mw-_hqPuI zKhj5<*}UD$vfcG-%MKevRszY5Yi7iBBxN^U!vwI)8qDv3_()(HpEiU!z(jP={0JaP zvdCT#eQ;Z>i6H|TkeFyg5Ia};NrX;tl#7#}T?$$oJZp^P3Px^b$k<ub(`k1Uvms&X zh|4wzHWkDf@&pvU0<3X^xv>y488G(*R2L5*Spf+wWJL~)K?B^lo-<fzoF_oZ@6)G( z6=c8+yWk;p%9otcP8JP2<YRUA%6tU49Wi8rC_jiei}hUoifrWWL6ab-63@^RP(C!E zi+)B1fpro63RvjsJd})u$Y>yJ&O_8w`^6TZ^t)i)UXU57ABB*ivFGL{rDL2^{kfTS zNWE-*5M<gjBo-=S3Xwp76>uPWL@#^-ikx_+?jwyk+e4W*5M2P#5TA*fLIevymi8|M z&-QBD^MNkaSGObX7z`Nig3qWU=ed!p@`x=uu;|$y!7ea8qMr}nPsa7ek}&{<EKw#G z_PzoS68m+rgSy0L8+2fW6(C=u?Y0I+x1b{|L-9<3A`0(D0dV2%4uaPK+p@MR`%D-- zP?ZSKlfXi+Kzu$UKR>ht#GU!l*e)yFMFtPV&9^b3b&}NO%c7KzWWf@tZNsmg7HbIT zLZd(1j#=Cpn6u|9Sr}X48Rx(N{9@yuLdM%xhc~*$w-&~?y%1Z+%=J`7x3k7}x_Cz< z6qp)b(gDo}A+I}SqZ_A~v7m{-OHi~g1cK~_cVlR4k&6;Y5eZp_#WTzHNQ@dn)qIle zLr7v|GfyGk>p)YOY&|CQjcDN;@$NU4+D>H|QW<%20x#cmlAW6n+9`%n6U9O|8L)K< zl9<VcNd#sJ@_mBA7ce|D3cZTp?1n<a!9u5RQ4ydEyp(PQ7_4D(GEI$YA9kq_eO?A} z8D!4B+Cbwx1+|!Pa^N@Zg|e5tr)iK?#=nPQz(Q%0o(z1a)>8TE2-26w489=4bBMsu zYxf;6Z!)UTp)-k#Gs&kj5EDyHGZxxj&^OxIm(CEl?5xJBFY8EUPAH$p3Q`D%aKs_0 z@orMMZZdW{Y7DVh_O|2{efjrY4hO`QbMso4=HcI`JCXz&Pv_5G11l>dE)%-@3(<4^ zx9@!PEjU-Xu^y~fxWM{D&J|Y0>-^?n_2SebB@=bJs3G_EqIMda^IMUmZ1|m7nCv7p ze1Qwd7}(P+eZ>Ct(Go54^{y8p<mUUWMa0B#1_8o8)dbq|mHin6isnT=e}4OQ;Tyl| zL^>IZk*`x3=YpBWUeooxZhy-W=}<@$4i<lF5MYPk<x5t#_(1n@juu(ke#+z{S$SI{ z*majlej9n+3|YL0^x<8g0U!=42uV$ZswT72X_)yULfbL&%!RAum5&^&YpabBce`N* zd`a636V79ZJO>1X0jd8D44%lcVh3O7K^S=>tQT3}X)F8~kl!hjn;8P^^Qp??y!anH z(`xIbiDh#UFsoWO_xCOp%|+>@xj<k|f$Z>+&I0V=GY7YTTx8Ve@B2iG)x9Sf4^8_- zOYz13VaoeMNoC8anN5vS9&YV0$m(a2KA`&LN6&Bb3>FIt;ck(I5fP`%9KG{lh1wnC z2o$OMp<`&s*xWkjmP5`Y=UHS;D9B)FZsi;E0Rxh0qHghi!OV~H&$hKLH9YLdZ?84k zsVr*}PQR@=ZYMIB*a$9t^5(g4`h|7!>(@H;{X`rK*AC(hK(qS(aUnAC<EG86osE(m zQ1O}6CFE`$($yP5rM0`{3|3p+qG!TP_NB7)Eg~O$M-_kPs@K9zu9!TWva>?+J^P;6 zuuHef^1J<-?ZNUdNo4G5@+%VrjJ(31W%i@GWP=X)3R&GC;~*E<N474_2%=>IG_yO$ z0oH0scLymwEd&)_Quy}I+P<GC444ML$@u*XtN91Li7#~8)6}Q4mrcH0dd+1MhTOA$ zgzw3t>2u%y6aK&k5q$wcNpw3}{esD^VZ=eOhVD-e2g$x4(`b>_-!=_U5Oo(ob9)Dh z0aM{up$!tM*v}VvkuFS!GJ6P9^Er`crAUk(6}k4o`7h+eqmPT%q`uz{+Pt89{WuM2 zIYs}mPV0BG)9<Gbezz6>&Plt}!6aZ=yxh%y(pCMl-wE@8;#w^}8F_Y+erfil6Jlxn zB*OXo$$QGFwv=>?>1sNtfP4$IDRt^*u>dPZ96BNtw~gT1CB>Q&EM<59Z0)b`^Yt;3 zxkA^d%{ISlahuyAk=+Q8^UCtGGooB4>MDP^R_PrSC`0`pbmRZiwaR-g49a<F%`jca ztVlQa(z<cBq(cw%2uI||`G31s%@b_c<uG~waIHpjUD>p(=7K%eCHiQC<LIlyVBA-? ztQ%d&iXP?o5T_r=P4+}{TW#BS_<vg(%(vQc><K;n1LLvY#q~!s@UstRNnCr8#H$s< z!};M#t$M5RivpXUZsQ@UJfuS(=lA1}%!>63xdb3BqIOSWc<m0n=8)u0!-7k8f4Nr8 z0^Dhz|MK}Tn8b1g*H;=FuZ#xA1@@KBe|%T#^fKAEFQQI@q3e%9knESO^|4|DrlOLd z{f)(EvHVVdLXP*pEx#;wB8QbOaEcER)c(K)N!Z>Ky99yH?BH7^V3f`Z8pJ^Kk_6}n zWX>}bHm>rou!>^@C)v3sOBgQd%IamH0%ZisMXQ~Oa>8=e7`n{!;Q~CuI@)S%51?{G zX>gn&O=_C}u7p?7*4$8}I7IG6lBNq`B$@{=3Kwl%YcwGsEGxk*!s+QH^eEcz{Pc!$ zSXJreD3<e2;kLc_LGg}^@dqf7UyF466H=+_N5STaEv}plvZOBCrDh9#Dq98ZD7dTW zWR$g?Nv(;rYxBADS}-<oxV}(}<>iZdidU{!xwc%fa*9^GYIEaJ%T>F-T&oTN>n&DJ z4`52x&JP&;OJIk(2iC3`uJ>$i<VPRa+$>vf3cs1vl0D^_>zXu0rN5}O;8LrnVCVb# z5xax`Th{=GfcfZO4);Gk3UCbmI{3>m^yhkj(}Ulz!<lQ-TnAQnj3hZ$VTg0=lNK!Z zPzzAux+V~;BXnjJF0ie1jnHa>1E93R?JgM?_5bc#UAIkOP;tA@jYUVMwH{0LLs8~v z2!w~!7rw(x%J>Aor^ya5*<<_AC|nyl987PWL+*!ik&ai>D)_S8DV|3x3~5i%tWqau zseXGfeYNw})8%{W-ff?=JH0!0_-0(Kn!a&~39I?6L~-%RXan@(I7+#f+U~V@X4Z|~ z7-nj%-bh;gbJ*x`9K|7vd`d*epxoI3YFb9rZ!n|o0WthB$0rbsjeQ6i&4Uw-h)mo6 z)E%(=fJ!rPH8S>SJBJ154EN(SJlQ$xo)-~!wow$Q8YIhB!=)RGi;l0eP&|W-Qljbx zwDxU<k&^br6+aG&dKUa8YP2sJ(u3EI;*JU?gV|~n9YNoeumF21o=O1+Mz-~~uipv` zF$U;N*YOz96_9IA1OxmRlQ0jF3^`8`=Vub}Vj4T3^Of2JzRx5zNg_ya20SH2(ZKUy zRe0Qc8M0T(!q>22WECs}4KW%*nLmTz@Bm+%uCUT%+{LKUrTCZFFifp&qTdoLyYe|{ z`<<Z68`nPmv4}jo_84k)-VP@BD+NIGQmNuCXDL-gNZnQbQr~cQ`~+T9fe11|Q6m_8 z@l>J{sg@cp0?2klJ*D)t#Jejj$aOsP3=xv{_5%&8dBn@y-gL#B2w@ZAAY;J_NO%J@ z*Q^IHpM53aGK$eb`#?Aph@l@p#?!GYshhT=Ayx_3WTI6~udz4fT)w;3q5nu1jz|KK zI{3yIH&Eg1ms|z%TlPl%XuM7%L1#(h{Zx832&RGed@cBHY9#lSLF3!PZ&9Ds*Eui3 z8NDw4q@c&%tg+DQglO`DNSn1vUDz9zVz}OhHd~%~Opl-CfdV&F0BsR}VXBmEa6?Zq z&m!4-s*D%*#XyhiQhM@Kxscu$qbqrrvg@WENk)G$apk(4H$L@Paqx?of8OPy?Wu}$ zk~hoYZU7VOyGjE+k4sq{mXDR*Rb7n!yKD98yK1XJkE<;mSL*J)d*TH1v>sHu+8FW9 zY%snTu8|tv@-(aVw!f$Ss+v{%`~6yO^RM>GK2~j?-a*1#pTLx`mVE~;wfIxdYcLbb z4yE^XDgIt$7mT{i@YU?bhb>-ivYj?#_p+Oc_r2V;)omxUvzsdvZ+TcGSWR{KLs0lF z&#$!MC4boJTL*7>`*+$c{ZN7^qI6(0@!{Rq@K9kAWdL>_U|OKAA9t;VxwlhhpBSEU z6F}FSzJ^Z>;=!m?kj2+lDDBMC*3WvkgWh#I9z31y-if{)vaarQ{C>LU*Wm52{m$h@ zH#GE2o42=os#O<bU_Hd~iS0XEOXdakK28}D)g_sQd8O8i(E{F{>YX^)ZIGA^t{-lh z3a|}S(woYBU-n9k=9<C{D&n53$IGOu^`pUjE4|EJ5)ndODKEv_K(y||z#01TE-w8> zk1TS5i?H<UuvyHHj7L1K;umK}a>lT<1Q~F79UhLM1{kj5r;$<EcKfFwn)kHMH05|W z^UPOjeOx#>1_Tj9HAS7@okkR}S?aFWd&~QPMM&ruoQJz{Y_0B$?}_vd1^s1%hAi0Y zSePIVfR%zE^wzi+dRT2FZWqR3kE2s|2mN`91~)XUfWwn_ik$!HTJ`V#x;Xb9jCKbj zu~>+5XFH7;N}KfDG)huFAAW`yo>OK9K_FIJ<Z(*Pxsu`T2KZTBk|bQpw36Pby+LqS zn-;va!HAon6B0d7(}){pvTgL;mBMtI5wCu@1_E19-mv9wL1a|#cl1GLAK%A-m$VA4 zBjpU*5a@3ozsn0B*j^qEDi--B-`1!L_Lqm3GTd@`OBqS#4~G^Y0FMW`b7t;fYDerX zX%p<aK#CHafCk)yx#vLJez$HHQnp2k^@b%hZ{}r2SRUf2;}e=WxTrqJ$tX8)Qv*=9 zkVu|BSpx`Wo?W9A#;6OxNQ%<+e)DQP1)vF!*x-eA&47;S#qASEZI;Jo5CL@X=)&VZ zc&Qmwnp^;vM)lD;k|Meyd&fe4$t}Z{qmT;0(C54X1tZ^l%YupNlh0iU=Wr0=-uLkI zrf_yMA23Ve;YV(S+_bb$B=0hgPIQ8Q`buxONdVct86%42Dk6cH4~u@jR1W)*_AF#w zncPfw^`yut6|7#5hIxbnIml<>Utg<2gTG-b&abSq2I9Um<FuQVNr5iYs+1Wl-vvo@ zc&{zKEwcOBX};Y|*v|tWBwi9U0NQI0r&Hmf>BWc1lRD3YgHaG66o@9ZrL(M;wz-#X z081Ao_4~2}BTvoeO|6-DQYlx>?mUR)Y!`i7T4}H(Gy(rAfd$*y!D%VO)!fH5(8s+d z&ve*x?sre=u{Pg;8uMBckG%{(Pd~Iwp3g<6OiqV4q+c|uUn~R<P)Ew9f|)Bh1v2}k z3Us8Q&!t(P%LqP~Rd_C^`&{1gxq{1cvf|z6N>R_1GtVn5H1Rf{uTj_0IO*f@(!pd( z3fG)xwr3$k;E&`7c6I*dT6G!FyE~vCHDHiAVCXf#T{2)aFkmu8`NV@a!1NnnHC&`3 zDS}>fz*Kk8%yQ7uW$?<~!K+b&R+)p=<%2fOgSG>Mc2k4)Yl9A5dL|*da}kwUC}q@C zMx2bkOBIdlQLM&fvbHlGG!Y?N8KJoX(cFNrq47G`sBcVB*Ap|HSzr2Y5quP~B`m0^ zRH$!zQD3y7-km{3;|;W`;>wO<)p{c}Cthl*gab1AiH6hxf-l1b4dZbyV?;9wR1AxH zL9|$i=YamX8PF<qN<=fowOT-joul4R0WrEWXRVYFRCsC4!_{V9?pGNS4AaBWDRF^Z ziBZEjiPWEbkZCI=lGZdynFP(;hM0}vctrV4OEBn=ssKu38*wJr(m1!7qF*P*AyUK9 z>6jy<1X9^OQyLI8sMda@Zf~T(kR|O<Ertk+az`W{f>T71%q0Y>N_@=3aJ1pb1AK9P z^Jv6fkOXI0bl_-QFEas@EI&(t`?4^L()d{tT6m}>Ei$08rqPI3b=Ha61B8aI(a|nb zRC5Lal$sStXsRL9fKszvsMC&;-wY6-E03>h=>M=bd=+Ju!#XrmJ~r1pHa{@7U>P?% zHMX=jmYjnsjv~-x9~z_tjxFnscW#X)RE`peiBub}0$d0TGb|vRq12P~7Q%(kF4Uu@ z<2xr~>xtBFx(F{>;~FgqJb>A*%f;n|3-Ku3J<HJ!FZ`z{>NkgpPhJr^5=RgAUXv{e z)H#HdyELbk)JNq8peqvzuNV?>3`+`ejW!cBr{lj839>h7z_o;fRCDS_6HJmr>{W^3 zD&r++vma24dV1=AdTjol*=YSAA5f9M_dn^eIc@@`>v4a}Y<QVKsWJGoxTm%Ae`PjK zjls_0Xvl0q&S+~rC9|<uXM`$sb%?$ImT>$lv(a!-IQb}GtzmtXlG%t+3vBxQnv&UI zS9NLr^7g-z*)W2E`7d;}`9{+uOE`@eJPrReQTE@=Y^2-){>p4TaeCboy34u!akN$P zL?q!Ttox31;<IODvi3Qu6+D#P{r@ksG5H<%r^n_Rm-xSXY{GrFC>|Tyc1mU=d|&&2 zXFu-$U}obfjZ?L^@Izbrniqe0Y%VwIea!_g{Wm=}HQ|)k!IS$wRV`bU;CIUAq3@oS z7ni;%n(KW^?=ygJp{;7U1);w?pKj}+ht7bd#c+EYe!P&t)zx*yyzk0d-I1jBPcBPo zJ&1^ccP}|`u+DT_r@6KpL52WOrW?(-%^1$R^bOXw=YKck&wqEj;72k~dI$5{s5=*V zUdBr6{*JNF9_Bp#D%h_)86v06>g3swBJr@<XQDjF-+K_6pV*{rSO)Eb=o;8h_Nh@l ziV8F#XWr7e;v_in_Pvs%$8^Alh2}9{3$xTovB;P{1MZWIa2w99bLcsxi2Pj(7cH`& z()s@V)Aa$x`$B=f!S5{foNSn)0_K=_G@7S`cr_<KCfW8(E>oHD?3cxej2v~`^5gpP z`B{v5kbR|u@%Cn{TT;7G?Pc%I*Lf+K>KQG?&7HUEJSvK}NFw%KIxkxV<tw^7vpfy? zYN{PRstQS`?YGLqK(Vl<sL+G_2U_px-dRXb?W|CBlDe-26o;Mv(8Q%>_$he!>2HD6 z9hJe8(bg0HufMG}mJFo4kb-tU{djet4|}ng+At|+?%o-{=xxihcQ!@|n|}apvEc*^ zuM5rCQ#TfM>rXN(X+&*Dk?MnQW@@iJ2~^e*{gDa?j6+*e`=!VICttQ=%p!OZWaZe@ z$NQ3zwnt9dhZ)Q~cwJf@kU8}`1w95@Mpt$Fu@5Rbno9~h0+1<wL$}YuZ0~Oqq%b9~ zWilfEgnY+)jt*1ZxULMVGQ&Z_v3-1~c9ZV!Lhg5Io6Sp`Wm1Jwcjk?lQv6?hSo9Ux zuYS!>&TNUyjY?z;DG|OklW~g%n&tx*GS#IaifQQj(_=Zrt~V;mUNE~!ydz}5J}g-O zYEm&{;nMci-1PYG>Ds_`toW1446$o(tX?J#wI)~b3%>9c-DJKXHMVA&f?_fHaV&(+ zg_EcRn=IbCa0zG~_T6T81%Bw<$ac@I_9-e41KtV~qQqYJe;ae(56MuUeoP(<X%x)a zv`^LIy<>8COD?TKaOR@7k?D_|3STA@SIcp@<~=o6M|$jMG%zsEAh4&#;E<vp&3Q4- zja33BX{abI^fX*w#`(;mdz20>OP=xAV~==IDyoRL<!yVW*$URvLq=@5e7a>qrJ`53 zI^HNKzQdUq-L$%P-7+b053OPc>Uexjm0qsgRgf-GoJIH*o+5)3cbUJaE})svALsUC z0e8{KHnlz7#gQ3J>&OnNy`O7P$Z2-t3Y>67MRi3XyjJ|;ol3-)bAmBlvSq^WY%^Q_ z3^(#utwF>4@es6Nyf!kKNlIShipPF)oZcfR#(YhuanC1O;cVvx%3#@Kd*}LEOf_O> zmZdZ7u7`Torup{yRO*2wA!Abll^b>53x-P#&xA&=#4&e8SxyT;4Tt?NM%v)~m2Xjh zm%Q3DZy%-oOO0)B;_@wKsiu23?|!(#ejig+0pC;X8MNKW8CPdLi66+$d~4?%-C2>S zIpN-~vCMVz(M(3qd-I=3+ZQ-=R`fAhqQ`|()?dX}Zz8iQN;iq(vAI=Lq^rWR4z{KY z{Z8hmX024N{I_4TEjX5B44~^guK{jzg;ipd^2V(zr}Np5^x9-~^@n3=I^Ld9uI^8$ zO4O#hV^0V~$Ji|lEik{iwh7I?DaiOqtAi&^u<2&UW{51+@Ck~IRggT&%1*=1c&%2+ zEoMv?Q=QA5_5SI~{WDg-UxvEarHX1|CO9!t=h<Zp0ihUlygs$}e57&Uoxsc6g;G9B zsa6qPH6oX0;^@3Cy*sxvFcknM-BsphnGi2epbBr&5lBj(Pj1(~a`#TgrIQ<rD|>HW zO*Yx#0<MVzoM*eYNsYIg*9e7&q)K+<#)oFN(5Gxsy~obYp8d<Wf~#lVIlgUvZsu|4 zp+*1nrysS^kG|SD<&P~XDYv{FD-2B0ZBkIp?_N(TUYnSgR@Ns#lE-dSo#u;vsVjis zz9L|tto%_UZJ6`9v~M3iEq;|!38Uua#@&W~RDFMF=pw!q`gv_dl<eDbr|7G9TD`EU z4B6mSz=xU5%%Fa$V(O9CZ!g<839qU?Oc?YRyiBCxl~R#c#n*k^$>v{_?n^kDxDNeM zG5TmzH@)K(kSy$Td%a`gU6A%Y%`=T!dSBAz)ZR}k_&<3I-Qp}h%2S*9#??CgjorEO ztxbW*ACK-Yffa;>`5uu>y5Fr1N@}%#{!Fgqp1Z;pR=Mcwc(yrVb1w0rddXR*Z=U>) zn3M;XH?)htzqswNjj{?^$&iaN_Y~U?whH(nR#h-0nE2sIG22Vk54zEUR`O>2-HlD+ z_g|SVYE(`Sf%GH72gYK6x`>`V7SQQJiW@*(DSlAlbh;I=M%x{mOTH<!q7sYfK_|BM zcvwpvByVL16ehFlC60$OULybT{S*d{um98T!VggYd{Cgw!)S$nG#z%m)t@RYEP2&m zbvo>G0GfXH0U6Kk9{vE@V8N>5=8lp1Rq^0dnU$Xq?y7`XvJ#*r-VbTLm#Z9%31pE( zg`aN>hiZp1hKJ6?BKQv@&dNrtDMW~T@L|J5NvR;{-5owv;5n&TbqON<(=611L9odv ziyseEHbMohu1D{i3l6cotB}YO3gtaSSXswh4UDkXiN4&1KvqW3wB7pz55Hs><JX2r zsfdx4#ZO{Fp{|j}?h#fhh>I$c?-Zrw2<Xwz?17?$5GodLvZ!KI0O3IiG~+w+7xHGR z9t$Cc6QGWO`G!wa1gWWnHb=x<_KR^NL<*~Lcpos;DI@%@#xdYwDF;k31BjM)h%0cJ z>nO0eGKW}Bgi!;C29Y@E9;+DW$^MIwC>o#49BDk1XttVoAN7FR!jBdy6*mKVHHaVy z*g3sTl3TSg&q+)VWMvP$sec#?^^N)F9)l<WF%AivS!>xJMjwBU^F>B;rX@gDgR<IU zpqOO%q~0?W^5RdXab<*^K6`RNvVKlPWF-==f?$gaQzIaJtfOce2zNfD(F_p`R9HB~ zSSY#^YRaL!YRtr2kSs}D7>lsjQ@ZpX**UGYOTKmk(-15vn*s;Y{0V86&f(!G$IR0B z2*b>?RlKu<teT%$<YvM}<I=yW-21KkfafMcC=SUzjKJCi(rHJdDaD@wv4R$95}aAo zzUl0;X_I|-oGa37R3)$9%yce^&{q!J+CauNWVQjY8`@cN0qHM?2;khr{-JAD?OAZ^ zhmY?BFn`aI)V>F^PK;K~xqK9N`O8BdWQJ^SZkwzJ84p(KOOX^win)1KQ<dXRo4E>* zXN3W)HDpTIME2z%&gSNHm&OXM<{%q#(}!7~mTE5m0S;BH-f;r&-P!tPIlfQ|G!K!7 zayP&-+{t3u(^=U!tFp3ZU3+Md!$%^K<mRl{F9;5l7`w>jm(zEqX6}D#i(37{vMYN- z)575G|HIy!$3xlo{lmvB7-KM&>}kjzLP8Q_$(C#h(K1rWnl_1+u`k)lo`&q}*mn)t z_e$AXDA|*J&pZd!S)JE;UiWp~&+mEe-|u;@zy0U+n&bWbyjO!bxJ3ZJ@WTP>_-Qr; zk^X4Lxkq*{;t|RTQT?Hj8E8A}P`mP&DEC-)>)6_+g#0FkxpICYl`Cy%VobsPw=sk$ z>iDlQahUZ)ezU8qF{0hhMy^qgl&wy#E#8KviJ#ehgku@t+5$d(1cC7@#1@aUEkdcn z$z1tQ)MJyiE0Pl!lXbKO7aHR9)&-pQrf|3?pNLIy>-9I2k0@k3s5_9N12xuWNbOB~ zcrrRRP9>GZ6MbHU`+lU~l}wInvE1CUX}$UJ&J}5Q2GZ`Wr{Ou$-R09g&C<OqcG28U zpUZzBNq+9Y&tvd3E#27SvFR{G0~?YtcQ0%b6A`=XRe45rsIPz|^wL#$`s;`qL(qW$ zF;TUpRDNtGW$k6-3PrPD8emwOiy*A?(N3Uawb7C{DCoO0P*>9`UHFNyZU$;6UKoZq z`3v4$&we4F(_@zN+9jvYMTj{h=gmM)`&`yL4sI8YT)FcpFv(onVOWrM?pup&76Vmu zD3=8WLOldC!MQSCrRdaVX`#rScG2X{hZbZ?R#%{BMBrU(d2bdNxJfCD!@20W3{na+ zI*a&LIh!GrSZa~WvTrv#Dc!s_e|Oei9q9sr!~61_3x<t}B4CeA7U#%Hfz;tbjwhMY z<UxU1mqI_r4Ee!A#f?HNXHk(<yvh{Mut`x26s}oWq%&BgyHTXiS!{TC+p|Gdb~LWU zl)8AZD#xC(<uM>K$l}mkXv=elc`r^Kv^vZmSO~Y>C~@3CkC@6|&EhjPD|L=5b*U`1 zHNPv_T8if^b3a_>X<p{-TIL&9=3iMBFjy9}QRV?X^}H2*-In=2P5B+S6Ou8E1<cIW z56bTjQ;-Rix(tOdh7$ET3WclX1ltmHD8)UVSkqcavT%M5Cu4FJ`rr@+@h}I2jH;Y! zrK$nEK)6_jgg%I67Tw3O<x)u@S*}%A(dl~irFr%1!3tj2>JJPh4q4UjHmZlnoHZYQ z?Xht^G%2)es-i|M)X!pa*X7|v45WH?gEgrV-PHC}M<2}(2BhPwsg)sz;+`giro#*< zg$&?g78Qt1cG}`t1{8PovGT9xX!2n+7*^Smq-e24%McmAOx30vYzI_Cs_I1F)QNA_ zNpL-rQg|kf;)9=l*7M+*eAP3BH_sH`q_N<DW8qwO{`N{$oSa+?xQCTyOXvpIdJ6Xn z{Q&l{i`sMybx$_v*%cZl^BKvGwWp_fBmkI2`|exjjhEvaZK@jW-ZZjI6+4{f+~91w zak^=LK%G;3lS@_8oi|Ob5N+q_COv~QZhY15(=5iP87-f<Hb;gwBlF8Q;wl5)aF%S) zqc+hxL(Sm|Tsok{Fx(Iqz=3>&W;4%EywjQ<-<ny~3MNuKX=-yfcWH68wGW?))oCj` zEn*tiHfMeYf!17ZYpYXeuRq=1c$$&TwY{~fy?t}<_&|F%SBH8<4mG6p#hs46_>O^i z&ebWlv5U>Uq78!zoop{^M?^Va-|3u0@z#PpHk+NZTwUeyT(X<lU`&Q*4Nids$bcvp zfCM(7#XGzOnVL(JNT~HdfLRlvZs3^@dari8W`0t`1GWP;Z<_O;GzDW+{kgOXl3T)s zPGp{LDM)FHlCW%z*D6fyh?BcM`R4!CVvYV(_wB5S;<V#;-r`X?@Yh)rnr+?!%$kIQ zyakvw8T%XF;(OL)o3{Y7CbJ*g9_u}=`MR;XF!jD`o3{Wc!K}%@z+3!3-M_0CO@i4s z3XjF#cx^rQ$a%Y1!%1sM@G+jU!VpHoATpjv&+b2-q#)c1z81Eg0rC7t*T++6YORG+ zIqXFQU}(qftjQLWO-6d7ns6w6cB^%IS}Mp}U~^+fCVbfOMpNmuZ;+R=HP>uXh=l`V z4F)LYtZCCq@qK3sJJt8?$`^&~%kd3&x{#wYcy{V@>EaS{r++s$x+h^HscbSKPCVyx zL9|_!VaKsNKSvdsnaU39t6Y^UsVr(Fc$*Qp`pOcp_o-1utE0|aGiqfRlScMz1Ha<w zj7GLw(~`HVp_`%2d!p>-TV{{PO0<ev$yw*^D-AeTu-t0*sp{aMj(C$ixrqez9DTFU zt#(CAsOzX;&f*Il+0W7mDoT&|U+ggy+b-6~S$ci?*5{>%#`ndR`(nI4<9aTP`N$Yt zN_&)_Oz~Amf6$@V{?>U~iIA1I-}-l#<{;bsyNWLdyv>&mz<j4}9{rH@+&&K7FZqrH zy@1TQRTa4ZZMli5{?_el(dUx)j|c^w&7C}1plCU9xh}{>Be%=J^@Q}TPo(mK_cI$` z%wExL&N_b5-JEMa*HekB6TH$le}96udSUPASJKR3ZC$W`m;Cz93gW!@meR}0)gylt zYe+87m^-g0ermcx?j3s%7HjOPC5O*#(tzRiZ~eQ^TlPS`RJ<tYa_&uVM#BU(mCN-B z?k6m;P-)-VK^`1rj}DgV5VZCa_R9en`#EY2p*`pdeNWL5x@lwIkhw$&@KwljpShW7 z_Xo77tTZ((*<$sX$Ew7gqa!+Knrmtiq6W9M0(d=Qg&GbS<nN~$ve;Fs`Eag94MGj< z)xSh)V9^>D#_^qJr<qq<I30TWN|7Nak5to93%aW}Pw#aua?Vf?5DPL84t%h=A}cD< z6wIc~m&qK%e{gc{2(JzR<<`=wNtf`tzOJ*TEvuz-cQl-gyYL7&)nX{37LmG1$8(~k z)wp8*Au%9D)Jm((Y+ydJEdCY6^|jrK^Yc*~et?9JR{MF5h3ICTRH>+z_Ox0pXh%Ha z(-x%TvW@k<*U8inP4qE~*e2?J)L68paObtyh4^uuH2L0^PN#~6N3#KG3S(MbE&~e* zt3?6J^Zn!~uy&UB%}5%SN+gpOy+}YDPgh}$eZ(NKn1~KcR}<8J?r&zazosf(UAFak zkjvr|3~h#{hW3lF*u`Wadm5yne9YZ~#T1Faj9-g25>-1NfyEkF+Dv^P7cLFPrS#c; zs9{uVPpbSs6l;{WzRGoZmD;yya}q8bn&5wu{~}S71^vOzy=*btG0^sQD#oO`hXB91 z)MCEyd$9)Nr9AKB+2>i?`WoHoA-*^5h<wNTGcWY)l}OLNB-_^C2^MSUJ`laEag2>M zByz9yk)2|V*A>gf#6YlEV;{JT-lGOD>aaJkBMhc<;i9T(a~*w-z4^egQr3Jt_ga*# z>=UV#^6tRg8)?VhPA<QWd)<*6GEi}p=JHDA5N)1w)3LLP!iLnJ{#>ka?lTvL_fmry z_LnxNJuq<c9sqNa2sl8d_@xd0Z~s6CMj{zuRX<>A^$X-1Of?e||96L}@^ADy_wkB< zPOp<Z{yzp&B@?4@j=#gy91j2iVM=8D2fc1{86F@4_CIm5!?z=m+AkkR*7adwypkak zX$~jB)IpN_PEGtyB+?(97GFUYu~iSd=Ub~3-I@73wJhkAjbU-FwLVdXA#2~2Q?m`$ zxlQk^?FwOA{w#&vt!sA0C+7VPa`Vq09xr}Z*9?>m@6^OMYTA`f)W|th_FdB!ui`6+ z3$I=r&AQ_J(Z%J8O3%!`SrTo{K6EyDh;#HYBx)k>IFd;;-}BA#2ELZbDq9l2;4qyZ z&URmPzM0Q;)v?7;Jz(C2$MxoXt8opg@b*Bb-F087_t^`b3M;20TNSB()WkD?3fO_E z#h3aTVt@2MeTS)?{-?(-0rp`3Q(A`+3?)s(5Acgr=e;>uK)V=zL-ppZcGwu1w)E;1 z@=i^>!>Z@KJ-MqtYT{@5--Ych17Ln8xnNEF-X5ZLf_G=(II`Nl!o=-<6n0E9r$&B? z@QCh5P5ju|nDOK(#i1#3^32A)I&%2h?A)&4&HJrBH#X<{$`cGG3sm#YEp(ZmdpDW( zRIGY=>Gr^p)se$}SGQ~8YvTIz^v*8Ln2g-DfBe9c1VwCK2bVlGda9hr=7`z#mED`e zUobGW=0VU|L8;#9)~njQ!Xc&X7LeyiT@(UYX~H5Hi84rH%c@9O2ym}kev`=;cA&42 zQbu20z>|YI4z9pLm+T=vjYC$ys-*TJ3LelwY?1|}>X}%YyizOos2Y|%^AURPdshn& zO_n1Gvs@LFoc5(nbdJKD?H1Y3OrR<^jbXd@oX^ClnOS%>SWHCtfg1HNy(C;iN+1<^ z`l{t_Ke?hK;?03DttY#?4rutV8tD3DYoR`sg{m-)-%t+V!fb>Ca3d*?$f9Ibsc}tr zKB<seTVp|MzG^L`#N|+F27!INN4@kzUFg@6<8Z>qs0HdHu$lZ7HzuBFmppezSSRgE zlWToJn;dO&EqU+l@)mRC^^m4o{)7;}b{WQ(H*Kq4@IUTHYhEfinbQ7(HN{U%gmEEy z0L6W%dRM2B%I`4Mo~F3cLhib^zVH~JO~+Dcce`_ZhpBZ*-J|%#UDWPaZZHX9wwT1$ z@s}`lJVV>0^+jaGKfu&>|5Ke7RB;=ow0n{`mcI2r{XI-AW#MSEOq;Y{7sM`QU;cOc zpX@aYxRUU~e9QTX*6)?0sry^amJ6c6{-^ISwcY=uactnl&;F+$FqJmx)qgoDCAOp^ z$Kh7n;JfwZQWEV<Jr@|7M0|&-wl|~lKViyjrJ}DR*QvDa?TpJxrTHmAX9^X!xu5+{ zo)L*)|I>bp`hCCjKb`w*NN4@)jkFCubiaU4*S`!t;@O1%*&FFU;PdlFy0bhn_8a(Y zZ<K83@c|iN;vuc3ynagfr3zDc>DAVZ)bDwG|Iie<M4RnA{^VO&ZX;PfGgDp}lXZP} z*~NV^kKeWS<kr0KwI<e!!)@~==r&H|HUGs%iMJ%slW(o9y|2_?3Yd8`7M3-0n-s=p zT_Gr3nd?7WkdaxME7LtwwW;fS<>?>ggDMYOU1#f1-^&N{Z++CYn`?M_dt-m2l0*Ak z6UJv7e5fk1EkbG8^R1$#)AMbnE~tfe>5u#i4+ML&KX%AJ85hf;y}W%Rbv2Nn8m!-L zq;2roZQ5yQVqbhh*{BzIVRC<Ufn@aM=F!&{Q6^V=FSD9B4cPV8Uw>&^Dpsm1*wnE& zczrBqMa}68`LnFa%^%=X;=Bz$97|#$-F^oWE<(xr_mV%FsEdE!D1lqjx!j8l){Pxc z{m5FDu#`IE(wj0^<Pw?w)M4Yjp!q%5dxA|h8(-pk!5ito#`cXQn0LpJ2GhMc-(6{U zXOVSE_v>xsX8707gK5@Zmxh>LS9>C`iweq}_xEgFugiK`b92mOWNV`{P>=kz`%>P0 z?Ts$$`#5SW7MP<V0$cle>ZbZ3OwvlH#3Xd7bs|c6n<J(>g799Fnvc2VLg0>$Jj{1A z$#@fB)uNlnL`WCL&P!qn6Z901*IiRNSwi19>n-cXqXL&x<#N*S(S;_ZlS_J4BtGT( zDE@W%V0#ivX>)_P%iIIpZ{>r2lxXO|b#-cofR7=mf=%)Rb3xASPq<f_n-tgQg7GN6 zQ_%;})SDh562lQZ>;=t1m;#<)K21J~eg=dl!Gr-1Rt=&ds_Gah3mTDzA!r)ROh!Cm z*4%rvMf=#6Dzs$sVNTW2R)e$idm@V>1SwRs&+_txmtEi&ceBnqdx<f$fy-CYm0ibh z=0O<8L~@PzQFs0_oNc_0nSdqGZYM*cLOZ6y&k_OiBLpaMo}|QqhfqsnpeRSM(QpV) z6(AK)?>vSSrzS(Fnin8j@nedRRv_}uixchgLMpplx>aQs6X{N-3n{Tb_c3IS<!nhl ztc7(yYluM#p&@X0v<D^F4kscpLCb-Ku-4-sB6wv6Q!_WDCV?94MWj?Ax}os|strCB zCKWU|Z9;$uH(SG0B%subJuuG8P|9g)D2HZiI)f>MR&L4t?m$mWljtSWCgkgau%+xa zwJC|meg+S~Zst9ourNLnz^ujtp)RYXy@q$^C4tLx#C_06eNS*Ci%ROQ)$uDxC@&s> zo9$L+Qb)V(21iV!iFTIOSWgDTQhtp6G$q@t`|fE%J|-md0(;1*rh)K8X0IGOF?sVo zvT;!f%0BC;DQ}1v0S95krXiBRCO%PRxZs&OrJzbcm<u#bV%=yWLFaIH#0fPVz;GGp z&tbF(-)9Pe_zppGUSOe*>{aNoZExF<7vKr}DsW%C+nN9-E%+iJdW1r>aGf;=*vi8{ z%QO$b;$ZyMmtjF@aA{8#$t5(+C<J(jft~Zdp8yN1_232>H^gDz{fN=ZlPz^oh({@I zRF{cv49Qrij{T(1b^i|x+1PYWP5YA?-LGy9ESHqg7KHem9tr@WV#-jp6l_CoC?k_( zhCaZEa|puN{tA{=luR{L4pB9`23u$cC^?93lI8%E1^Y_+P{YgnI2;*9!v?V;54*|U zDhThC{<OcLb*wmODda2vB|LTeYhJyPFxFkZHC3CzXwAuln4+E<b-yv}Gsf;*yL7(2 z9mfnKStIH3_#=XoArH<oCMG9bP}_~XaB`m{%<RyhMwqqYW8h`C#Hml3rvuSvraXJg z=t_t_j|3Uf8-2~M!8MPL=}U(<`n!WliqejMwlUur=<6&gDed^|;JPt5L|0nYbbRJo z+{PapB`>M{X1;Hf3~szz{kBo^qkQnkMu}co9V@s|a(HtX9b8r~s5|FxzWIR-+$fRl zoC|W@{D{$z+pVfQ9~QScBJ@WdfAf<>aCy6x?m{dTibAIA&>7?OZ+U$Bif*4Reon@( z<C=OEFQPgZQxAWg&=0QY+0Nsef1Nb#s(4)*lq7H+o=H?}ro?@|Nw_jJZKcsnxfSYE zLUZ9Wu@Ou8dh3#K8orZ^sHB<+S}vKYYB}puJOp_Rsmr<!6YjP~I&-))OUE=_7u2+z z5dBo-Lzq2q?(pD7=US)9J(#q_WZ>Zk=VhM`73@bhzol@8(3hQsUW+V{w?4Z%!1->u ztP5|obQ8|$!@Vef1nNg493pUKsB!PC>*$fLJ0+^GV1o}Alzbg6JH2rf;k%lV3T-aE z=A?8Me5O|iRq)0jCpU~wLWHuS!fib7$P)B6<ij}$=%6`nrm*++;LD)p(x<y;5*O)N z@DMT)dTs2|iXeX22LkK6<&$>XLIwOy-it7~6D#X#sBTrr3Y{!Ev33j1)qJ9>)Ct{u zv-*;|P_(;9nY(D;_CSdQo5#<M62t-iWa(dDX8)8gK>qS%`ww5RW5@g7n%4dczTj`3 zY(m#iY|{G4!Nz8$6vY<)87c8jliL+a>*2{s+p}`7l<^`*BXlc79wm>GnWwVq?K6#G zMWe0V*%g_6HhCmuvJFvqtMw(Z{x4?b^oIRy^#&8H(Rrs8yRoHx{?ZNsDD+W>^67h4 z`?NB7<HGVk`<LaG!ryX=R4*;t5^A<6zx72s7KP6L`ebvQ*nYBASU->q2Chthf3o=* z>&*Z0WRnWn{Zw?Jy|m`CREJb!z=BWNyG?o+%_h@gry6UZF${&V|Aj9&rKkt?MJrQF z?uKbuKC<Y7nTWBnfSDrhva@Ml<N9q%17CC-7k*xTBbKtS^tt0pa8{1tExBXmy<R`< zHm&WjI!u}j0QrKIxBA^7vNIP)l-G}3d>3Z5%@^Eq$bltn_&AL};m20ocmHU;Hj&Lr z>!P2bXYDdo#OWYETKp_Ze5QP*W^J;DDp=}E9qSeF$;Q-xg|-QP*=(*?3YLVv2-i6D z`T6yjyGw6A79VjdJlvz8+<xNy5o=^RbB*fz{XJW2g@NZn*Jfo$lpVkHUU^PKp3Qsu zIJE7tdhUt<<i$}4H5O;Mx$;z+$MNo+1Gsy9<HAVYTq9)|_X+pNn#F?>5*%twa3*&= zgJQkM9v;jT3cH)>-s~PzHoC8TVI)?UCNG(KIyzP_6*p4}A1t31Jy|l0w3~A7kb03J z<MD$<94-@1#}t0{MgQHC?OR{8ffBp(-YY5?PjvHKkS;Gkt$z)wpxsD)4>b~WPpDai zV?M-JCz+SErCD8mJ~SjCnNLty;<ka5^hzb4H7}v%B_7zzIG!w|5tEG&3W~t?10p8h zXl+||2uN!mQ}!x|ENf2@ztz%qc6~mIgi8Grt$j&;A*MSZRXR<p!^UhOwy!-^rnIHQ z!DS(C2$d$+r1j5e?Z4*>mTtFtec<z?`$22}i7%M&IgR;7YyVTe;0LXp$$gUX)jc*M zRv_3vgtlH1&VtKSLF;=-u#ticcl%PQ5P^N3pyp^QazYmL{Gv%nYc?naH^C^w1po&# z@Qm;9-bDfrjrU<RkyXr~M$SVkGVZ}WOQ7Nx1+vumvtS=)y%pt3==DrV+&(rCYPFMq z<v47Q^q>z98zxir3~3(h$VCh#(v!zw+$<8Ri8Hwn7^0SAoJfh%g9Ay@cd>LheKRN= z1Hc@W>5|O=X3<1|))`AdNA$eUg~=kziND}>1X!@QFi@;n1=8`1yD09)+Z|f_kG|*= z>u(<YN><YWZ~zUf_`ylb5n=z~r2lu9PXCNCEe25f@qeTR_z#l6O#<~;{l{UK`mr#S zJ~Hgd!*3Y#M@=6~i?wfTYAXZmyb77vlWF~8a`Nt3wF}*51&uCKdH!dS;B;wSv^7}M zw~<6_mD#7C1xlx%i+YT0zfG5_1r1buE*%m;*q0fcMNWlQgS5bp>C!mS!ujvhrFoAQ zXTa%FkQR_odq-zCTZ<4BeOZqDMhnDao-v*%!CRyBPv-}6Txrk$P77>Hr$1={i6#(Z z&dn<?bjXc?ob)TF?2!hAE8~R~tgx@a&$W1u8`LU;(y1PuLbXK?NDKTToo;i|%dd~p zColG0PRm&yuq*wxNwD(fM(-obekYI?_&!~VrxM?pF6ChM7VKQ^_m7IgencH{;G__y zrM>MOb}si&UBH!@vaw-dV10b=t)P&JWUE_FqijbyT_$t<X3&$wK_8M*>9Gj>C)X<y z(bIdL2Qkd@Uldn(E4dkd#|1TgZ)2+1_2``uB%j0)mEJvk>&rS9XV%}h6-JSu<r;aW z%VJNigf4Zj_^kB3AG;;F0^<q6e`SB3m$weB&SN02`#oN(c&Rw`O6`8G{JQ{V-@Ii8 zPdEOGJz4+)Yk0^J&&Es*KhUgfU{CbGBpX9fY$}roqNk9~&rO1WM3j~0Gme2-Z@KnA zZ4#_<zh{_};g)l!3Tjr94J7=wN$?Y6=$>$~x$Sk6jD4<kkxvtesjECdDG=yzp@WXY z-AxXp1=7Q?6|+BRfn*GomL~Bi;U6$Yt3}&vJ}kODSwOa>Mb~9MoPbIZ($H$vU&@Mb zu)so)65>XwDG-YBIwmMl!=z>&u*P~YUba3~B7{M~*gTk=`;Qe#lK@K$7Vu=p8?zh` zrDl5u>T!5UL?WQ$ddY+XkH0{P0ccENl<1J-_7429^awZP2Lk+h<R?hJ8jSPaDd1LQ z3Q&5uj;Uyf41=ETPB3=^pcQEE07#E0r34mY<fvb0MA(*2aSlz=fe#5hpQa!8!#@;K zRs}(dMB<<^0*7?hvMq_{V<G4lIRWCydfEqe=Wxu{dS*{T>az$cH`asipAY7V4|{Y> zqY<AZIenT&C{qP@^M#MTXvWu<rUo%CGO1h7GBut}o=lVvf%k+z!Je2@t`~Xj<+*fz zU-cyHp}%ZNLeFLOBfAa9I8Fw>euz2oaLPE;KcwpXuFQKUn@??+oy_%L#AxLRmtb&i zjq=O+A%WQ!1i?)Lkduyl2>dfnI<n9Qr3(`sa-${pESHpYh&kNK8hkguTw3!Mi%=j9 zqQ_-m4YcA8fi!Ohq)f`Yt8=Il2H%XEl~(js=Q<U(z5VP`S~>JJ*ZJA8cXP3&RpUqU zTwb=lTdF9np6I}G+U|85a2WczNf1@G(g0kuw>^hKJ6Ehw5UEh{xQ)@M+Vu{wZGQ+d zz`a@r)DRu*A3#u=tfgDD`Mw%D9~k3S>xFdl{Y~0GuvD%#NCf2vSm}J^7-W0O9fCh^ zVu_>2tTZXoNrm``j_@+EH&as1Q%d06Xm4OCWQ1xdrMgGx`i9{ASaCWV;st8CeoBE5 zsqlSOBeW4DN_NfJF!Hdw&}lpv(<WfOIH%kY-ThFVclbxv$J{U>c&I2&8FrrNNr?rM z)y>LiA>80z&b8-3LDI>BViVdY)?Y++N~g-^Oz2);f0;mcFkM4z(lC6zCsp@grb&*? zF>^qUr6&L05l8694=e3waVoT1&%K3vaES8r?$}g)cb*H0lvd&}rs!_Ui{t^CgGA*b zdoWNvB45kW2SsgNb>l*K!o+b0sJ22q`0<C4;%H@t*1K*p*YPm(J}6S3=yjh!=r|<j z9)I!YCc!o>z;vhfu<`L=^J;6F<RNNF5^(+2=c)6mhx^GwZmdCPpx&?X)ECp;n%l6` zrynZQR+61c3OU8zprbLcMHV;2$X9wc=HXHCJ{3CgA&>ja%5TVM2t_0jj^x|_hE)PW z4er}}AAa;o|9(Z!6Wyf@^Xf^{rxmXYJC|~p)?PjJD}JhqhA~Q)!3BjpSmh<Wc;s+M zPO=7-H_n5u$C%n~MFrNL4d1ocLL(EhtfX@9Ib#H=mR(bUQq56%m)$U6FuSZ288Xvc zNg9kehh<jl#`6QifLwEJ8N2=Li@2@DbiL|Hldg5ny_>Q$Un)XnyGJ0dgg%ebd8Jga zw=crNM2GY>|5bul`998(Q#cit$j20cWDjb!60s_Bty^4S|KK4<<+A62w?98nUL3Aj zAv3bwcT;bBH#MfGwBDPywOsgZy7UaKE!D<gZSiO4h_pLU(JU;50PzCYz|K8;Uj%;| zCvy?-g$QEo`S7Rd%OF7CIaV}ORKh}%bc2WJ#*K$cVl6o3PLrFUTp<v$i5n*t`l;9D z7h2$a-Wcauf&0NS7ni(FLuD=&Yg|%{cIF(q*!=3k%BPFmk(Z8YS{IF3LQ8Nb)LoCH zdm3K0upG6}^7U9q`)!jT%J^8-utohtZ<{i2yFPD+Rc}W&pKEeHH%xt;oPC_5eO$_X z?)3TGTlK-S`MS&bdYbxrJNtV0LR3$3G7wG$kuO7n+5AG}{K8EABAopqqy3`G{9^n3 z;#d6=*!&4{{z<0($<F?%(f;XW{+WIL*{lA!Y!8TX4+=~l6gfXAiGENf=YMIO(`V^{ z22%h@E}+gd;Ayil=x`*Z2Q-!$s6R9{dKK`DEwEn5@Zv+sS3-dU(Wbt|f$yUKt4)IR zpeae|2&i)BB7Jm{aF)tG#hd86^TGT1Lzw0O=8r<KL+E$cj2M?fv_kix4}~(H;yp2o zrozE?t+6aDp{vV4g);<`!F0DEc<=2nA+0@%H${c}!^DO6>|P5q3Z;-b6`qzDiX_kJ z%V;rMg*zTz3&*lYs2qw=I~AdRJ3=!iLc2Udr$0h>?YB(=)0l^5<quC=%Lep5#IZ-7 zKNNZ4ROF@GV5BG#>@c_Mk36t=a#yHvOPPTUKf`VhX~|QX#>G)K4N>>{qws4{?(ET? z)P`g3!oIhoF%7}~G0|Rr!Z)d7g2D_<UWr9mN84N!_bQL^=#PnCi%DRQB^-)PIu)CI zJ2o{YHoZJHvp+U_EjE`uj(8}p;8a}Esi<d?C%enyD*EH9*5Yc|<4K3&>rTbj-;QsL ziEl2CZ|#q7UyJW#f7E^G(Tl&{Bv^Y?9wRw=J7GK~VX{17x<6s2Ji*UT_zO6SaOm;! z?Z>MzkJrl|Z}valT6+v|5dN4hMZ^*&*||RS6Z$ky%$EZU+9wdFj2LVZ5hQ?;kT_Zn z?1~j0i!s8qCbG*X(Ap#kxg?3iCW%%gi4P=6tS3ovJdu`va`6=>670{sd5I##sM7KX zi#`PO<}14ZO%aJGJV1#_BErGB0vIy^T#Y%LS(JD(Q=1P9r2^-3aR4m<({lm##6G!T zmU_u0^>S>gO+~8RK&pd{evQQwlAo|&F;JOmONWNip}_*ct9Q*{$Zq`Z*$cH%K(rxX zfI%~d+@&A`hOz`G6&8ZULz%G<aM==pfrbwNN-JPHQ{Xj@%!7ZLF13j#T}`FIK~&IC z-dKRy=i1q!JLQJ3-NdW>Bsgc(9WpkYatPr51Ystm^xsl?S8}_*6r5$aEsh12SSY@z zLr$!x4peMgzTd6q3~}UAuXARKKtzcUq`nai;VMOlEjT5sO#n{dpcH`1K?$H`3@A6g zb{=V{WCk3=LxEX2*bsD323V%tUQ&h+WhnQi^Miw`;BKjTKC^2+OI$u%W&XfgCb0tG z9Z+Cip|6ajxHtrmkm)iZSqIVCIzzT+9f3xhXnHL0jywweNC}IRMXRvhW=2z}3PRaM z9)B<^Qg<!Vj4RTvELzdZ%|>QoiqmRu0RjYDE&glBS%CKz;BE$CnFS|zbGuEAxB$3r z1%M@_umbScNC&wo2(2T8nUsGcE8oey)Y-MvC9d?&R6O@oDm4!9c2P2tSBXBa^u{w; zu_EEL8BlowKoS7GN$AIyDX(5C@U#`hR+h&PmM3hK14ynLhZ8Xk$*Hc1jL3M5b|QOt zuCafJT4m|;a+AB}l?AqyWv-PKah0E_E54k1T*FyacetwFyz0Ff_wfd_ef?qI494hF zCm!?%R!&6IdosM0(qv`|-|c5ecgUD}IGkDOsu7P!*^sOF?UskquM}89V2>svcSF)< zIG@fRe)?^bVBl)a>R`mNqNiIlY`kkvsS|;rL4A5$nB8yH_aT5I5CqlxaZ_*Gk=^L& zL{9&kJ}-e<QHFhee{DxT;YI!Ux9a<>A2DjM`u_6E%rkA@W7Ln1mFB*!bY7Tz`z=Nd zqv6&mBMv|FW%?GQZVK6ZEJ3HdU?)cXuKkD9o^wiYJ4W4QN7$~uN1ZD4{&V&Hf6M0; zXZ7sy{kyeFl=Bl)_d8>2x5&?j|FszP-`kNDSxyGZji!GLQdkCK)L2Sku=<|G`tM@Y zF}wDdIZb?u!g&jiMqh}u9*w!2nlTz{_vf1$v?JeH_T$`j?-!rf52-z5yZZhVKh`>M z%gd9b6n9oW;cmhQ>x`5{87k0@oVq@cky$c1dB(76J4THW!GhKIqkoD~?@Lc9DX^LT z`<*`tZ9p6k56F6aSC@~FT|Ol?i{+w_4iT=LI!FZIwxarY$l7yPZt!P6=*7r}kjQ&F zauEDbT5_Q^xUOU~s8u22dI8`{yS~OAt|kTmzAMTK0ymsZ)Yx-p5#j@U^+s{iu*bJ+ zwA#W$(9N*n>3JuF^DMmS?)Y#mihJ{VJyr!Z;>pO)T(sEvf*tG5VrGh~WssBm8VuJK zI^K<<C`J`uWfw(50UXsFeIL|q+Vi>Gt(>L4u8VkBhB8rK|HW}m@)>;;v>JQMiAq*& za>!S3$LFPJHXNiOzBUqJ;;{B9`WtUM^Bj@j1Md9AFJadw($jL+C$mdu)~AR~;(z$O zayMqGRzN#4iE97mZ2b;zE10*rz4N!Z(5<om>tc_|9w}IeIekAU`R0AS(C72`>x%!) zD>W-4N&@#*CuE(rHa;IHsac&9Tvl9J4L+xYTbO#PL`FFS%d;y_>)8mv3iW#^N*`OV zk9U2`WDcY9sD}CC+&?`dP|8MgQwHgs+I`uV48JC4m@}pLhy$^%xk_)oTh|jgVU(&{ zCcY6s??$18SQh=T$DE<whw2a;jEwgUy)8N9wLe0Wk+qKGD;kQ4;eCZz;>+7;wvt(8 z-(%~bh87p+Q-T(p?}HmP5WlL*STQ5msd)1?g$RCD?MCd>hK+|r)PlBncClrR?@{o7 zj=4T<*;c2iDSG}Y#^Qn{FM}|r3iMi_cfei_4<YnnW5#RtMj!9WP#-;JmT~{vO|3mw zoF9>{lOkdgbJVz^07AU+(~kU;x6S5j{pua_^gQU@YSc-Ec3JJeAaf#y##ulzg}TG? zLt1Q~TB=N8ONYHnVcgJWs@yZJ&a1J7@#6|<@-JIDZ&nmOn!S^zkT1-PTh=?fVEYl8 z<VQYow}cToY-<VCi8<;vTKEtlcahUFquW#pfX)x3shC@L{qFOMRE|kIL}k_vXT$mO z3%NmAaE6pz;IO@^FwAZUh)h@n1k*{{OxrI4e2S`(8;mRD=&?i`HFcnJ6^dj;Ih_Td zB=As|b)%?8Jd^?qOHmTsIne|_6c0h2cf>>dr4ue6$ufJ{`ntHHILGmB*6EMhz2y#t z3G5AkV*VJO13bt0S2ft9yWNC!!2LEff{6>~A&gprpG{Y$ZAJIfNteI`h1{rZNS-pA z4_%QD+-bJ10>%6l5%fVhiHIDLs@fREDK9i^D%5%iy6$h1?Np`kwb40gA#U2n4?R z{0}>F+i64ZqTB|fKFT0))I|Xk>vqvy+djmLP7X_P_Ob;FA`4*Jd;&W-tD=2)$gAN) zJ<a4-jf)TUJ?PZJUD0?foCV`9q>qOhlo4pIVR6jN5K8K9bGj`a=<Cx%fNWVU#3*Fo zJ|6~(F5Y+JVEZtwYuPi*7SUH#=RCv5r6hVeW%zmvKovovIVA@$*`Wb}3&TXJXcgMl zRy<F$91T<x5B1h}2R1E{!Z-1EeAelygm8Hq3Lhx881OV|5TI~ZGp$i2oQ*&#GN&Uk z3Sj_D833HQNE;m2HY!uOM(%J7IuQT(*oTDC;QaZ!6H3t`eWK~Z05ro5M)%+X+ks&~ z#@Ei}rUHck+cF@R0rn;JcL~LZk}@a`Aob%s_LDzS@?vXQaou>DnPtkXPjkK|XFeDg zuD{9+I+$%GHdW~@{lxWQ)Pv*L9(b}5M0nQ_RD0+xZF0{UiO<~myYO!7+IUwMHXCXY zpw%@L6DvYw_2y}Hvy;UQ(hdPsD&2Uv-4OJBO-_7o$Ba|u#@ktS{zuktkKDVecjoQh z2?nZk@tH@9?_dfUHRV=gmIG^PUycDa3u(FG-1%v+-Of4I$LIXat3I$jEo+oiWd1nw zFru6;y_sI5H8`(pM3k(4yK1NUe)AK@u1k$pHFL2qH%CFKz4KP?LLo;=a2&j%+e3FT zk+XVSvy1on!P_@d_r9H=;Q#nM?Ok)S;N777qV=9)hn5`IGgCNnMc*^s<@~tn>B~x$ z11~$5iz}-?JKnE+^HF!D{OMOQ!I2Rr)+BJKb^Z&??W5{CY}I4&nESa45AP%LTHNDB zzHkL>;#x6lt>$M<k#f_YWV_ZnUAGnpdbA^|dh0LZ&fb(ev~yFxuH0H823Jp8>1_-Q zZh=yJ^~|lVjdvScD<t}wSs%U451i!HX1$vEsIJY?!{oK@;F`rWy|0tz<n_L;n&r~2 zuQRUXjUoD{N~=wJTk{(CibnOGn!04&Bj}WW-Nk-n^WcYuwL$XMYS+`Pl`iu4oj<4? z9&U=KbjBm1@l8DU(|&tXZR-?_u*x5ADmfzbKRU(#X*$IO7Zm*$I>o^wJ357ka4brp zd)qcIF_9X7{*?8%IiW}L+LPOFs^AQsW%gucXA3fiK(<zX=44KpE}L?0RhXu29*Ht; zGNq2ib~@lOch*07Qw@3V+m3kcJ6SNA`ctRa_oZsFHN(1kbu{Zsjd)Azj!pq?CqHnx z0_qgmKkbWi^}lT=&owzrKtTKAj!yCPmSgL#^)@N5ecM{Nbg$iaokC${dZ7#Zhj(7{ zd&KMSyz_StGM|sy_Rcp=*bICXChcq|Z|f9+@1agsJ}X%25%TB$cL&Qqmpa|0PY9** zC>L8*cix{H`q5i&u}&$RmC||SIX?kE3RBJv8H;W+x;;)~Jhy8+`Hwf1<C*W?d8hRE ze|l5V^FZmDad&hP%?bK57Y|90I4t0^!LSF)<lqIJ8EyUdUP|D5_al?^*4ju~u;Thz zems5yZoMaTdH(*c#$B)W8Q;J3(dUZ!<7sovwapJty#Tr^1%q)=U`z&1ci~FM1I!9Z ziV`s8x!+g$04lReUn_>ax_c9&ibklQ=V_&2Re_ML{JN-Yy}J^35>b|#&)5fu-f~rm zbX`7p?z--~ikm(gWbf4)Ub@gbiqq!wQKqW9M`!(X19+L!gpRreTtUGB?5;WtP@b%h zH{RrZA5d10sk?%?cp-_oSF=H;U@lN^M3;h#0LTyI2RT<g;a+HNI<lT0jNg2M*%-(F zg%(b`22dHzhefvY3CL!&=w6!-PeAbtX$ZF(vRngY2mpv6c*%#&KTPpV5w+B6J2fB` z9)9Nn|Ml-$xab9p&!Oh?%M7w?%~)#f5VvhDoYNW9!r41)E|FsUs{Zj!bs(+{H750s z5wDeiOOzrAGC(tgqZQChlbX}|=AADVlppIqek*bzaV$VcO;F^yzu{uiz@1Thj-ey; z4LTT0k{go|+J~0e@pj^KW|*;j2qoJPwI$XAmWgqrC_|+XEJ)BBnI{$?0F?!sDiSqo z5P$7bisn(9W8rC@n4<3V#QqGU+b-plC<1WQ%jS~t06=-;V1}su#PMR69w;9HIGkc* z+%n0Ih{wPM`$*8#ir2#zhomLbRnWS4fM)vzLW;|w<b@1-VG%q+v=C3gjY`3Sl4rJ- zVMfH$4Q>G%)SxO6gi|GkjZkj6I^+qACp#*+0P2UeVvv$|>p6K-P$-Z>3gZbOuMX`g zEf!VQ-w1wXII~B4R`jBT1nkqW3<XlMR>^rEnuQBqUiY;f_hc%z*x)zs{I`hLjuyUm zQpm;PMBkDjC4A=3+sWr17M1R7CsXMRK{;1R2wkE(Yx@x8;niAn5YbamXBcU|TF2H& z^p<TOrgL3=hN1hZQ;bF(2e*@d(<xRP<vR0&Znb~p-dJtI(t-9xoe|yzaT;}jHq-F- z5rM;NE&4$P5oroV!uo5irkw?mrR|@@UDw)hbO#<piGJTsE{yGM-+oh_?ARSA9zUit zCO^2=>D*bEu+l!JxUtrSrz;{*9UoWWT<`YPElOhT7*{{M{yZe8C|U6Mgtqzmi|Edx zRN0ORUDx%O1iIpMjpLJsaqB(l-b^v%UFe@-YLK}Bs9|Y4NPBpDxbJ(I`rl+P{wKoJ zKiG@^q|~<Ai{Bgp$&&bV0zJBil(fTM{N-?8BU~9o+MSfz<YX3crv$F(_4aVz@9YKo zk+x`T;J<>jwln49e?r<FM}T$(wq|qrn<D^3TGky$KsGUELwtJn*-b^{Rd+@`&~?UU zl|9$Ub?ck!tRT)mDEk~#;E$ldjw9f|LRvB0Gu>ZOYL5=~nBDrE0zJDo0}rz}+;9_2 zsr_&Ss3y>EBdz_)TjxJH0%*9g&NfJ{Su6y>l^X`d9k?K8Zb=`a&H+&iihe_B{qDj? z+C<THr6*Ck>l3L@-s~C)VNG^XC+zESp1yEMAIo+!KoWl@!6yRvd=sM7J&mRgw){eU zl)G{caha}oG_<g@;uJ*y0~T$Gz~4EI5bgdt(n@}*Fpg6t>#fz(Ux|V=oD9)l-<uM& zzB%6u1_hSKg2`L!ZSUo$o`j#B>J%hFk+XN;;GjmE50+9MG@{=j!1rp_QkxOo*{X)H zB;zAg0G8Ss_r_en6ivx1aT^(sFox_?+A1e{?I5k3{6|MR=+k3($c<)I_(-=8b~6!8 z_Ry^7;mG&ZR7heBZ?5N;&-c^kN`f}ZHoU)m1%jM?$DHQdAbx4?!Pz(GR~ns<O2y9k z3txE4-fP;pjkFE{d%4DhG(?TBoP&^**^onk{Ca-SeH0&tin>W!B`7d^>ih~_%TWn= zseq3Q=h^QIHj1dvh3Wl3S}DK7s83VIst|-4DI#4VMFb2}pR6c&NWAkMX+hUnRf;%> zv}e`}qDY%55*}LZ7P*E{RQGOx8|`s0gaBz2O_hG4)nRQ`_y^L?7aT-Mu=ugz@RCDV zq=4@;YP7y&(^YQ>tq_T!5$}!Etc5jRPrLMios4JN+>25a!WJy{vpdV+@9Iim4^x}z zAN?GZm}JnS!m}Nw{^mM6*ytYUBCQVln*K+a`X5|pJUN6^xsD9o?UdRN*V%tBrB+>7 z4Hi@%L?I^3$FzGZ29|Q2JF?EM{2r#}SSI=&&(^FW^fk(}$Wjq&Egu*bwEWYQ+EG=v zS3knk#|8(Kw%zvC&(*H~NU8lErUp}LA_B<H?_ug+Q)(uTm0qWQ%}W0{`TVbk&;G{? zI{t$xKf`Bp{IkGs;WL}`@5$$bz(g`qOFQF9<krGiiiu3fgi?b0qHtPr!7gR{v;?zE zoy6R4m|`}WUhvu`E4#=c+AXy-s2&fNRXw!LLsA^ec09`kUT;<ot<#0w%dPmr=f<{T z0Xb*0K9{_40t-4w7io41I(}eE&?)80*~abbZ5vbG`ak&cJElk^KjYrH-nd@o(P@b8 zTyIy4X-@xwDc`TRnxr4$GZ0e_;O?~lxZb{AY`^Y}Cf`ZyVlmiP<fXjlXZY+#@|l_8 zxakX1Sn5q2N_zHY?}hE_t>|jt@_qK;>OZcxzrYmG$y}yx#Py947ozxu5r6UsJNhQ0 zqx>fFj(EjAPEVHgaoL91;7Pdn(4k3_NAE%gg}lT!;z|#^DzV6Zwnbn*_k3n!b`|;9 zYNj3xpM_D1<+06oYV5Ce>ejpRRke=uK3LFk>&w@bA)o#C5;}s(<`779-rxisno!3^ z&qb)QNA~Plhge*`dKCE7MIZNdiIap*25nRqu=nIuNlMJkB#O}#7fk+cGoY_V8lDI} z(+wpLy&!ek(ecD>V4~i<mg!g4gH&=NkOo3e*Nao`fdnR?qfa5MSqqtnqX90akvx-U z_f(qW;pDqQQQR_A*FZyx5{gtWATsB7Z0CAw5K&}+P?C~Z3Y#0mT=E~_Hj~(%X*Np6 z<_BC>_{j38S&g#bxgVnYJlB|JlYmSJ7(V;RwcA+(oEF=;-e6kI${YnDo<?{G#*sp- zPak<k-<^?OOH0l8+x143(Iht?8g#74QgEtIUB7}M$XX|b<K#C?$tX$^&CqO<ty8y0 zjbkaeyWOa!=c8&+0unyL?cW%20V%iswoCK#F`WSd(rLmSHiiqauiFKr_YvA`t}Vp9 zg{SQ>;@85XMn%))%lqB_RM0W2fMu<~k=@yeI7$KRGc+^4YbW_!Y$eZH(djL<nD{n% zR4!l3z}~DViLLtb{wQ`Gt80r-T2aE9?@w~(zamkd(EMk~=XIkr9sN4?if&D@8$75J zxH`RG3pzwz4w{O1l1Z7yg{`l0T#B=BUo%agX}`{oEzbT6M%?Bhgc^s1pl}c#L@gC< zpY0hcTa!AD5~A;s?DI@*eGT#@`BqD8FoDB4&;Vr`Z8i^P1WuY<40bA70+3`p47kig zN#Xp+>ZEEv1r~=AWqSrNmJGZimqh}~&K}fA?BGB_Bm{98>v-2S4!#&!)_n5#1n+_% zb+$1AdUZxq!4Xc+w^Cup0r`=9{^fcb|54C!OFPqLzg6<SbAvd-PnX%s_v;M@Z7BWs zuD7k+Wy5dRn-LSwH<#I8UT>Uh&6>IeVNvZPArXn-^)?T-ntT#5|I_tW7~Q1vr|az^ z$cPt$*PE5dk@A24dJ7Ewc<tx)mUoIeRkt|Pq+`;!a{U!Cs5sl|%;+vzQOqwbCEu>O zZ@lTw4Ew)&&5_0ao0Z<J#s7=7=>H#IbN<d)uo}yc`yY5yI_BCWKbc9Pqx1@(77bo= zLa@k7nILbv<L`zJVAGQ$V=pH2oX6Ry(*~>uXIUW0Ma-F5ueDFJpl{-)jx$WR8a=L& z60{}O4;;14XDiV@xgGnqyNTig71wY6?o<~0Z^%2eB_onOY*=9rUUP#S#1q0<GnGT3 z4}`ao_kGp!XjY#0*p9zD_;qF_<oh-Eoi}}S-hcm}dDCyP@2INR_24yEU@nwZ_M%m~ z1hwEB9k!8Ke_$;8fEh}(d!ciOH+7p(UVN@;zIhF-#<Dj;_Z%E5Y}Y+;`9QT%+f9m| zV~3-PRZUF9N*vDw+dCaQM|Ebo->$9b#eizs+vPVm1mU;dI-gi_+V*$bpX|FwFL!gu zb1(m`VPC<m-naf!Q6!~cjhVe41HWt0<@kszy6=ZUEn42~MUX>9H=(y^W#WexUHP_< zmE!2<;?y8ei!SVR__ALNkDn#6>gCTgZfnsF!uq2h+ihPTdfUk=cXzSRDzEz8;4S(q zOInBN@99uu^lMhm8ADF4ecachxZbR+^m$`e&qw%EZ||OX*gBIrmi($*#bus~1m&2; zBNowL8JkIz^0RK}00LZ4GoQjxLJmnBqPQJiOK0QgQ9g&GR9<C*qtre3>coubFDNs~ z(0d7chEQ9r(sRgM@KP%nqOz5%LGfZCN?h+|!THo@Y^_Iq58mnDa2l`kY^K*l_$D!1 zYc_D0<@=jf?I7>I$S)5@Y4)-;2{lTE%>`W2*~`%zt<J1I<8w5?l8elvB0peoXK(w* z-77+he?neo(GOVk?Phf;5M%@R_^1zQDX!}WU5kk4eATQa<5Cb#*yQ7^?rSh~n2Sh_ zPhvjz5<u_`0n;?RXe;)53L(;8U2`0T(aj2}QuY%7h4jLokXNQOqr(A2-ghWLxhAk0 zD{LWtR7X(0H>1<3fay_7z?jsSaF@%A>oElpDYk4RkT(TO$Nt<o(%S7U|4TL2?-?So zaof@2(y+{tWP#(t+9sJVBEf1b@jzkl>-{qJ#bT;Vhp_Ig%$EuCi)o5E)?MC{g#_qQ zy83Yu!>G)jRH>y5-9QneD@dt(W=olT)5i_`)(f-eM>BI&5=>4VFrwVNlKp`Z&uoeX zNQtkc^^7#(0N#5qeCXB{{thT_h&xj<22N3K4g(~-1=&CvwU0#oA-1<6!2c9(Lxb{8 zHwAw(9>an`z<G&`GztI|K&W!m4S7H{hYH9<04h4``J$W-?1~k=1|RY~OSZ11;*+am zQowr%YVuI<g+Qra%+iYu@z7nx!f3W6Jw!AiRDvM=8{5~{uBMG-L%1<-HMt9}ViCg4 zct#^f3WS^mt>w6f%Ldw$4PHwHPgkK#m=$?L3lLi+0jDEFp7(`nskEKHP|I|`XVM&o z-!#3lXH^2uQq>EboW-v@r+I#28$z)30X-F2o~-TQV~~`?6hy*{i<(wD&tiRxXW!h{ zw4m(CnX#Hh9zrMp5Gvd=mxmJg`*29{aVFdQ+@R?t9fM#&1F4rqEqep}0f-Pj3(<Gs zr33&~$^C^l{fWGk!FDg-L<{w(k)d`nw1^KNZyGENbNau<n=&?(^`!qm-U=xi$EhqU zvE8R$uD>qpEY7{vF?Duhy_d8d`#wH>o)e6H>y{KmeT#it)}B;lmY}#C-thYMPVC!$ z|6JZ*#lE+-=wD*r>a@uDuju`=8}9+CAX^yd@8;YbLj0GpZ~F3PjqTWXl{8FHsr=gv z`{pNpVc1UWdvJ49t_z%Dr(<B7-5gU=vb~@I{%`-N)%^AC@E<0)>c<?&|FQYw^Nh^$ z<B7iNJy>v2uO9ovT@l-z6f&S?of7@W+X1U>6P`|pw6S>@<rH0;!7hoJe1cOU6O1ym zUnApL(I;`X#|vg+nKNoA_hkoH)43*Q8Sb(LHCOdsAgAMdHVph0e!tr7uY^H2#GdpA zflTlg&x4tYcMuve@M_<9SGk=H^ZfJ<)Lb{cM>8wFe$O9oXT!j&JziXU|1<RWtNnK- zSm*UKUQlyA#TSg2Y8e$H8nudEFB@-#Ne&gXNseV-KSe9?<L#ivYQOj#_k6prjLheG z1GO4({UwVC?U$aL7IQ_fS}cwi`%6T%F7;k`GE)59GAhUESa2%sV!v&ZSgEQ*m;K5K z`}aAr^*6teU#+~m&5w=l!LtS#^?8FnwsZIQ>%Q+GV{0rw2L17NptF1TxD0$dxOhYa zJFK@nf<65Cc5qco>C$D|RWgXYwe4d&Oi|NRkA*&?x>8kNxo6wQ_VHm=WS8vzYV+rM z<f}`st)4!nA_x<z_4aQvZQ+s0TSrd!HHjY5LGpEP8GL+vE|FQcc)zpiMB5kht+e?( zrEB6@Z^=P>NsvpefbjgDdZHuu7xr&&2diWfwb`sYTRZ4uYp$hpnf1V+5)nCLB)5oJ z<tcMUD5$x5A!fYD_~A1%QK7p^^m$}aUDUELRSv~^Z=GuxG?}(Qm52L+&!_=@g~buz zW4v$+1OvLy?${6GNS+hSTJ)CNS9|D#Yc0IWRT_<w=hFf%ifVFnAXwR*<^s<xT3ih) zRe|x5f}A`pQ4Ar#pWY6>3dy`oEzL*e3qrk&u*`z}O%xd5TG;9HBQn&7badx0MWIso zLCy8p7A!DLCxuU|rPZ)x{$Xwazo?aPo7s!`$dYz`@mm>fXXnEnW}*bx?OR&(FG)Ro zG%_M^z*<|sA|R&Sb7b!ySNrH*OW&r$t&#_sK@(N|U;5ZSYIWTnC`?$bN>f|_`^xUF z7d{5QreR^)-EJI31jLba6{gm1FZrTG^zJdlPOT>RcBn>wkn)caF@{6VkBnd9lki}! z!oy*=`}!G&AS_(T?(62eF7WZY`C>>g4NcWur~TdBG>7i7tolGC2%_$$cnU;4NxxX% zsPD+<JqLGbAw1F0=b|D2YO{$gC<H2e*&@?y97<zIpxCwfEQO*LLUX6vOB~KaVT;Yu zJYWfk*$wSEgTYc>B2e(l4O4KZtDx%8Jsuz`>&n#u6+;j)Um?U651@VgntQisCJi_f z#{$*&+G|uxt*xny$epDxh<%08V1r(!>Gnc<@;K{i>O#g@p@L*IKxLNhPJhSI9p$)$ zG{i?zJ34wwTvkTF$KB}_<V`w9&=F)jaGmA@oW)ei8;uukD&iy{)G)~%zvqv8+uki# ztW?h)jiC9k5tsfVO42-9OYh6R*j=Cp6Igz62KL|3T>mi}X4~i|(<ylyNd3rt!lzR4 zyXN}yYX3uX)%hfHfY!tq)LbFb6h2%eN^_QDkZ0enb|a1h-!)gC?^pX@YOY6O)))tP zF3N$L>*u&YseeUt{qc4fkTP)IzS_|mfAe;z<o8xADG0m^_yYa7UrR%N#pZwOuK%B} zy#B8kbsq8Nj>^(6!4&s)JmyzlQEg9k{jaFJ*1f@%KID#)86WaMs|yW#G8<nW_F}t~ zKJ3lqG(PO}_a5`tmp}d+9`lS(k*EJ9k9nFZVj5Iwr$Ji%N0;ay9&?)>Y%&Gd*a?qt z0=uOnE0~p2&7I_h(v76>=roi<NTx=#(||~ZZxGq0JGnre#f@UhV%;DIeY5pLa(q&K zR!VK1Sy&!FudSUXDbm_TIm@3pJGV_eb2|H)gZ5}4+0oT7pNw0#DSmMF7(eA61KZSc zfrH&5X+vRI<Amwf%5&R1!OP@#B|X;FXYbiu(E#YV#xf~5?X2pM<UUcIT$ww3&kh-g zg4nEKeYKHme}+Q}=NCWGJWo39`C~kSx3491_;b#*i60TQXx(7+6z!1zEFjRyu<RP% zb+cw&vYt%<RirCW=;VI2$fc!FOO;$WfB9HiPs7D<^^UL%jR$?!y$26$N+(&e1{zk; zoSH0n{kTKo^h;R27=PtOSLvH7QceFCaqs=sRO5Dg?!8k;LVyrjC_?BRLlL77XaWeK zhX_&x4Mhb-4JwL?x)VZgp@SgOn}UcaMbv;a5v2%<Jt!)6R8&wjljr@uXXc#iI&)n! z^UM4V+1dNP@3q!vJ^fM;c~%^B;i}A&GqqO*+-pB$U4KuVpAEGluPrRyecbS6@^9Cp z|9Z^V4aRmnSbpsu^6U|W7hLyi--dI_pLbXz{I&aNf|uHjr+>d4-6h@cHT|B|^o;m! zd%>sf_vq7ZmY>@YvBx7@)Gt{358rdOdvMus|DW&HxU3UJw|C9N{(LNVG=3?D>+Q36 z+A{jxx4CM+V{gCtY$W{psO2OcyYfbydlz~+2w(Vl?ksy7TR<_>LtnsF0O?i2BIK+I zlAQilt#9=Yb53mk9yc-j(na*PR&(VQ7aYa`!cvFgwd_)*=#%xiNW(-*hW4i<!~e={ zYX@q}CiD7~E#W;1J(6#;0(9fuM~<twDdf_zhAP4%!pZgjvO(rc#eq3#39~m3RHfAY zjPcpMr>*J}Zqq+zR=0Rpmv!>{0|<ubI^4s1+j8fQTr~Z3D>I|l50Yt9x4SYH_v@cC z@@JfD@dvPxCu?wRQ;~zpPtP+l6xn*F{r%2CRvS*}F?3e{cWzrxY1QhkTg=nB7PWTz z*(_|axUp?*UVN2&c%TyUx&e5hCqpB#qCiSkKd+=+uLF)EyqmBxzpioT8>hs5G<bGR zZ~m;&*o;Sg>!khA`8t=Dhnm4wn@ee_1}EFFUi*mhWkx}-Gg6|wyu9+9&imG{r7!n9 z9sO2{h%)38ABrzH?aVD(^<Ir8#rIB*XsejFnfRxpgc<kO@ho!rwVisJu9FF}O7V=q zUTo>(xy`29&@KF9#xgUTx9I#K!^p)yZ9K1TF6O89TZfQ$B%|?mk9YaEY3uktJ&RLo z@H7dbJ;<Z#?_%8z#of~0j$H2W7j3U-W7gR=pD>I1#7GYS(bF{@UwEj=<6)!K@{*6C zrqX%wgvka})AYWW%gv6fOoCQdO?BRnZCvmH=!@OJ^^*m)rmKeS2CxB*cQ4l%>zkeG zynnx?>ARLwqFMV?x8GG0y*Ab6_w?4?n%8zBGZA0Tg@Nz=>@*c?{^k>Q_+P!AY!a)z zs~|)xGworbIQsjQ>{#z;^(y}{hiP)s-eLQ-E;Ie;TfArQ@(y5m4^j@tl8=PYI7&(W zXH=(Yaf=@%LfzBJ^%0%&B^EV@-&fa~eD4xm-V^+f$+p))Yp?AM+P!tP&eO-r)*Z(} zUt6oUal6T6P&{A?-&psk*lz3+ZvH)_+{3=HrKbGU-u(p`@BKbsL36KUr2BEV&NPiH zYflX9IH*hP*KPiMxyA2u$O9I8+U#II8oL0C_ps^~ziU0+s~cwT_DtLL(2)5S&!jgF z+pw!q;QaU86K{6SY3Tz+I0h|Wy2(FSlcaNPI+JnWyuo-&&CocC6592|GYPNKll+un zoG`lTxkI3MgzC)5uZ|ah-*N^g7Of0#t;p}+y%wA-_!Q479X6;}9R{KH{8^7TJYhiV zC~AS;79WY-8`tfl-@I7^sGs0HbV##3U-RB>7uE6bV0E2Mpv+*1%MjJ2Zj*#ZA2pwT zB4|^*-=T`cUvulF3deE>-k+6*K2X&gXYdmTH|@mBZ{E{(|DWBv+~nGPoMIIxJMQOZ z?D!D5^U9&e_4~BjDt&in82$1dyeuj?y7IuH`Jcy$xb_zCW03DX(xm+(^Rkc2k)yR& zpHkDzdrUq5*S)?+7g3+xWdGw`vdxjMeB&RTkMHeIG-AIz*mcFB;$sP2RitGo-p&|V z_3cZxR!Reovbxam{q6)f*lbn(@QCZZsUowVZ+5F*b~+&Yl$|Fvzh*yv;uOLrPdDOC zDt2}<Z`+~M&x6-r*0*iFR8DAgS#QZK%GA{I`q5VU=R>6T)khER{<w1W1iQd2?Xlk1 zK0=SZ$sbS8kqJM+j}6~HZTupXx1*KHYet}v$exoe&Ja%olMg1Rfd2irl{1Alzx^00 z0UUjWPpvq;J$Cfm#-)|$aWYC`D|Oqb4U#nXpZ6C8g#YU?zrL>Q`v2rH-|)zObv$4$ z`aEDb@fQ2_=G;G8&A00@UydxSyl|@g^`=Ycn7TdRfPKUEXfi`Qw%Os&=jTcOlr=Yg zJsA7@<Er@2LiUZ7H{Rl3|Lrj!y86HKnBzKO{0wZR4aqjFdaJ@!4B#rqaY@BowN9?a z3|DiBOD6GjsJu1ABYJT>qj`>A5$|pc!YwA&EHd1HlwiX!SjS92S;bQ4l~fnx9(5$p zNPGt>-zk9a9LHxA^W8f69y5HeB|ejs$XX&>QxlI=CY;!nSm6T&%_MGHN@N?Eg)S-i zQIlRNFm@Iv?PhF}WhU*B<hF;6<W-X6W>JUYl8ve$95+6Wq_W`>@5KMeZL=y@V=k)4 zN2YAIL@9{5DM%mmH)}5PVoF9_>R2yQPSRAbotj-FzcwXxkEO|BqqMrXw1(oerp~lz z%j1&Vb}K2pjhfzWq*NG?-dUX9-I;#<NIHHty(dmV5a6N7P3(<Su;mafI2m@8sdyj6 z8B!*>7aUzuK(GmJfczRk#&o3eO$MRsL1yqo0;czfS||{1nDwqR>%&aer=_d~QuYb? zw66i#KjN~NinD)pX0N0W;hF4phfG%Pg=|iSQacGkj6jhdX9yyZ7c+1ViDjf52Dmqi zk>dd-;C+y!hdJC?Qw-s7AeAAjovSIyZI|SlG#ZFIb1jy0UBYrH%Ze7%JS#59HndJ= z%%^!)=GjVe+a;>|NdJ}F?o!=YY#ns?-`w^E%Y0)+!vCa+{oexj{xeix`+skJ6kGm( z6U&;rcm5Bt?EW5Z+kXc)hu5H=jQl6Ksk>{jpZ8z=w}_i~?f(bC&Ho?8GIC5zM*mR4 z|KCIPzt%_N8Nz=DH@jbhNe2JtQ2lRk^FP+dM;LmYls#KeZ?;C*cv^<i8s$-+mDbqM z^miC&ARiT<Zfa<}qGo*VTp$xX(Rmm7KGXEtdM4r;&-eYtp-0CiFHl-)KDd?|xHr-J zvm)MY9FUmmYex@v@6GSr>7LvAX!4hN$D4g`&%0mProOkkDD9DXkJK@6qGes`?c8?G zSN98>zWtQ|`uCwdD0#ilYCiY6w%lI$&%rC=ox8=riL`FY)t$fG=dY@T|IY3;(Em_* zbK{-&#<#qTMFt~g`!X&%ydHU?H;T?BoT;}>czEgf`i&iL$Mh33bSG>sdI%<OV{=yB zwQ-P{9JqCjw(4G>+nuSAv*oFmn|uuwuh2hMy^Yx=JsMv=u~9$6=JfVcfwq<V&za97 z!XN(!hIHrb{gb7`w8mINKl3YzTaVg$r~YmS5K&Sa-nd2UN_F~X?&^x$QR^VPoKUsR zi}^bDz232y`tW^k5!(LSB*D!ajAI`H>NdRWyK=95jnk#~C;dL@e)oFxHVQG;vEU-V zFaB7x?&ss1E6?fWT_Td+L_f-wQ(XR5J-}wFNWYyfegDM&Rgb%udj1AqM9n6fSGS8c z-h26Yt=|bw*V)ylwo)$91X%e_uazH$3V&ktKm$o7gUYaQ_Grt0iDjm&8`#}DV5hX; z#<_aShP})P<(kQEBSZVVKy1Rv$8412aG&z-<dbI)&KBT}4Evfnx~1+4_*xfZ;s}!; z@q0){{I=bZSJArKe_>*_$7ut1Vn6et>9D-Q!5hz>aMFnB<w318HJ$dxN&8>u_%NMs zYCTE`jI*v*Ywj4d4IAc%oliwPVf=@Y+%Ny*K55AA*B9QYcp|j!C9oQuYwKti5pn)? zsgp^Y4SiwcSMH?C^^Y-R1G77N^2>|~-`=$)AM~=(#v|2&1GFr&T2GUxa`&bKh8R12 zn6*5Tu8~uCd4*scQ*v9S`F4S2?hXsrRH6MAX0Z`5yf3ax=wx-t<)UKP>g|i8Q4-)@ zd#JvxYP(B>Y=7xvrwL6L(p`;B)~6rk8BlIxb;FzT&Mat52F6`-7y4Q=9-Wt_7F`m< zNQ&^R6c}mO_;u{mi`USjN5dPWOq33J?GiLf>pRl<qiKJ`D-{L^kTMJ;EGd+!e~e^U zug}R=UabDxD4{eQ6MSsWtHG{&vuRh_1eAHG25NrmfDCfWLo4Q?4g@;zP3|S$&#$er z*`4e#GEwKYISqfSzMuDMEX$#$(c`j7I{)<D{RjHb9CmE-xY3z&{@2I+yOWK%66koz z2KVM|4no&AL4N7QiY<F|UO8L#0d;D~bLpvN%6<373e;>t(^%6@3%l#8ObUzB&d9Uw zg^lMLv9o+lG~N6T_;*k4XuJAQKm4LqkZo6fUBen#*%j6!<@J8YgJi}HYk5GCSRVj8 zly*lyJna?SopDZU_G1bBTkb`9e<#j7I!21O^~sMnwRo<DhpNu)Se~-|<4es4!_x>z zHQS1)-_7*Sv|wf2TAdEh{q)nvxBewxD$Ut6e6$(+5IOKe>yADqj2<NDCnC?^v-gR8 zzV7)M#ZHgrr%etcTZ04JimttUx_`floyiy3H9D(2DVf6MZP{*f!sp%l^1@2C^8%L0 zTfWyFRN#zkezvxoHQDMS`<sA@?r^V;{oqa4FjBo5b>ok3%gMysFM%6F7b{S$XVT&u z7dLczt+j1Si#Pk<+Ekv%$LDl8db}P@9~<5I&iCTK!OeedDw2cOx{V2@FV9?xnnsh@ z`W<_L{V#d0GCKXitOyt+jQ88GHbhoA01|N<kYkg<^KMTeodup^D;f1T@4dI&*D>8P z(OB^o*VC)+sO@T&c!HRHY7QL82BU3(Cp~c_7jZ4lgEFi*Ap#=thAhbtXeLBI8x2M* z2@wf50nnF%-g&8;iW1V5@`W(LR~tp7IuOF(1SwzeUL%4=;z^upHJ}uW<VYe5(A(>U zQsDv3^!ozPyoQVq4@i*9rzMjKl1%=sN=G#&OcAm1%1bUv0RW&y^~6~-9l!(E-Y1!I zfjw+G7|-FanR<jcE4Gucx)=BfacsOL10lV870-sLI(tDiL9UO(2O_yB5F^2oF%vDK z;fWq~A!$Qal7z%4GH`K3lvkkeOQNUfw+T{xl!PNgcE~-<B>^;JqBXw*!6L&7EHa>h z)CQIegoxr>Fcd7YS3L)ieGA!^f(mH@fv2#Of)=Vf$)Og0k|cg)RXsM|+X&W<x$FA2 zOA-3}_uwa;qAN%<5qKaoEVy4E7|xuXDtB4`>fua?bg}R(X>`#qah`iOCjR^Q?EFX1 z$qmNOG=BEvm^d!tS6;a9n;z8i2Jy6&x!>r{y-O~O^{fB9+bsSyt;JZp2E(^*T0<24 z4e^_P@4sJ4Z>-F3yz%Sa*x&D0Z~R#}bz|kFw|M#SjlWCT+6k6@C#0T;#mg%2zx0s+ z7#Rnni(yPBjGKXhVRab*EWa11$naMV;F99FYQ<cQPOjz*m%PN)A@TI6Jc9t9YA1lE z0VpBQVunXq;#vJWR0HS*s!<$oeQ|<aXTpY=1lm%91BvfM<vR!Pm1fjML$Jp@>@~w@ zF7a8U#7{p>5)UQH!HGe||H6<0iuY_LCHWd9MNpG=1|&tsC1GaNiN#6#8j|*tk~!4m z0|CjBq55!fa$INfu>hy5@?e+p{{=%zDNaf2Ov#v$9MzUm1f<klYHEH!YGGVzadGPD z&eXD*)bgd&inx^MrBh9V$#pZy_5UjjX|T@Dw&tW8DOKMog|;cxWHzN(FRhZ4(MQeb z56Bpd%NQ=s80pMNUy>s(WQ>zCiPV&8YGN%Wea0yLQE}#z&dg^snWFi$u_ZZqGWd#d z7{LV}7{wQZDXBB*yvXCH8D>{psQtNnej26B@UoYOWB!m*MijDB8QBQ|*@=;YC5+(f za0dRNKz3O`P|YEBrJhxZ`5l@469E#*+0zXt|F%0WrEF!VWJ`~))5j(mET5EtB|ku< z$#5iUJeQ}O_i}As_N91rv6Q1_iM?4NKz-<6{$|%{DM#^?_idG90!fq1Le6cMd^hZI z)B+Vfo^KWfXf0<3sAdI~6a;q_Yz@pBwnBJukS?u<r8yg4%_n!yW+fEc%2P6VDF9jo z>b1rQZu-b@whAu!oRK=7Y!s<YKx&iytwkW31JMOwMiRn|l3tpGAd(Q)0_gh^L}i*_ z36k;vC}SN$1_lks{Uw2i%3aaY97sl3VkrU_F9DilWc_O}BkH&`4UzzPV!lL63!w}w zXe=xyv7;5%mGuXf4IV8UE=k>$YNot!kjjo(EduLV_P>VJ_eP!+SM2pCgRhT31OkG^ z26<vMsLCwTq!bfGpeh?Iur1a#J}GuO5DJ4XOjKwq`1K*+wSdfb-H2tPHvI%Ph>+pr z$P?e?T*xRt4j==g>F|NiufZS+8YO^&#!+-808aVqwW2jS&_73zD5gDHSQ;t<y(uxZ ztXvEQL8YAa=OBaFAeD@aqE&Bz(S~IIkcZXV-d59oRXeOtel-JVijZbZlvis_h!DcF zvxpUiUA={RSTKZuHcZ<m4OCbPp-@6KG>!@qAq*=}8(k_wE08;m9T_bWNOu9iILeTN zx@?PpXn^6!L2F?o+=w!1MXM74GZ7MJL&ZzP|8W!~LimYA2!H_j695@97{Ua+B$cxS zbj&dn0syU!K}ZVVF9IP7ntvKFq@48{M_DdV&m;g6+-#`mAa$X^j}3qeP)>*7*28nx zf1MMmogeNjBea5E1SEaj2MwQ(ay-M0R8gfUJ}@rRX4iQ!fm)rYAOe7(AY8~`5E=NX z3b2Hbd<DvZR%mq$<wiIvCjdx5g}(^7_zghN3Q-g^s{;AK07Vr7QGy1u1xa>1CY*qL zu3V=r0{wvs<yIhs0Ge@7#%{ol?iiVI6ruvT9YzGefHHY6i-Qb-5lD9B%x=)9yEKFV z$+1DtW5Bvw0F`hND_)PbrX8}T0Hkr$i5(S=YVGv(?G9Vpo!+n8wEH|=gvc8K90*7( zP|HeF_gzm#6A%IK5KG0tHG?zM3MA1D2oZotTH!(+(*0438w`@jDTIY9an@860U0U) zmyaR+X^<NwKvnuu#g8j^7=7^(aB3)izceV*x(_daT*&(kw>IKAki<<ZSHBk|??b`} zlQ+l>YZ2+TamgisB@UFUKv}{-6bHi6AdIl7VfP_r0y^zJ%AumI&-i?2>DBJ5S9^}9 z^rs!(KtS&50=yreUl`6RvTQyQ1sV&Wa;bIrpO8NVq0MfgQVuxS#QI4}Erb%^5cErI zj4~0%zxwIzHQuVu1_OZ0I1?0s1_hCO{sz{W(SYaa%`D?eKMoQ@0E{`%$ZN!CJ+i$N zh`U|BbQ%C*gq$goP{H#SA<~;r-U7g(0=2TIHrBXW?I#q(ZZi~h$uLn8A+zasxyzn* zld?Xup1xz4LQ(~^L4+v10t~BNj#{Sm_*~`=hoPc?Ese)V*XDbcY%TAI%qUE;R4tHh zjgNiPzoGG{eNX(+l779e_)|Yx^c#6`mw2aa3-nd<YN2CYhZDM-2ex#@9Ed7%H_lft z0ydWvo$l!GczpG6{7_uk5TUDVbkl*i%W__1<lxpbS1WrK^Kz4;8+hU?!>JzWhS+vL zQpd;KJ-Hdf`FO#CYKI~A+MvO$g81RSx5eS{xd&ZxtD_waQrDh-(s%wtU-QaHOK{TN zh8!6R1T<Cn(@LflYS)h{&|k*4UW|GjkVRl-jV%=tD{{i5Mqh@4!&^qjR|@yP9lbL& zIwqevgU_7SSmm8he6P6f!9maS37vBq+~HF7=@QCZeq?V|`WVjl13o+AX3Xbkr^OFu zAD^WE@EEf@#Q3Baa?giOPCc1;B?<M#X?N=QH8ZE0;qh0y?vz|Seq$zONIF$vZ;Fy< zrt02Q!d}%YaquIA<n}nB88W7Bp7tYtGNobiW5(oZ#$?GXi`?w>P5fqDSLR+3XszhE zyQ4l`>BNLub2k0X1obH?=o_7tZ!f*q2^*7Zdm;!jk2K*<0qa7YeRH+{4Bze_4-A<~ z*N&7*CRnapA902`)wa2YZ#C|2zGX*2P$Dg6bc*E^d3Q4SO#Re>kJD*6fHDWdeF0Vr zp`)si;wc}&&G=J^hdK+2kfDG!4bs{a_8bXz-uICc>|LJ+Y2lcf3vwG^#M8B#6aIL5 z9rNi>g4z#9(b?dQ`UiV10t6;1YTO*3eEInC(+MSjdMjw!Rgz*qO%j0^0%$0FBvRpu z7odNB$!P;8NdhSU4&-O(^laUekOhEPaWJ$s|KRQ$A>vjac^ag#0~EYI{c9(vM*+N; zeN+PAMn=vYyW4U`DPeQ${7xqn1@TEb#sx-Mvn8PjluIiZG~R%MI}49h>JcEX3X~=p zMO-LrPDi{8L7iON8UTQ93;XaQq#q@~7)Bw;U_=^XgKNER6AC?EM#8uFSD<wL8?DK8 zRLW`UzudPQxyj=;nf7d(=SL>GOLdB>Hv?t@be9H5r(N`>L5AZkK@~_A&@W8`SR82I z&(om<gtZw;yH)4{*E>Dvp;OSBY>-6&)CK4b>_e`{l(*ap6C6uGUKcth_u2$EN&_!X zt6xCCe$yrcW52R!vd#5JE`*3VKyU8eob`bB0+LRt`+TC&n+<A?bL@ZawT|wdPwVbT z1KyvIyyT$sYG^&tk&DtG#T^=d4HoRqMloB|JB|>@PZ!h?egs77-vcu27`@ht-vNNg z_{fs~d@Q{ugwvdnHe;Ils{E%Y;isH~-~(DT`~7hP0!FBFAVUGf5+N(nYET@=Ptc*w zLDpp<yhX@&MsXMc<mMLTU*3-;SGty+@vZ=J%AvbIW-+ZD^zj~>)BX4(uXrsfgPL=; zGyX_|g-+^rzbFuk6COyVSuO*ouK1*H0sgkftE?%&aG>9=Q5%lV%#3_#NQzcS0p-+F zHU}Ot!-5%NHH5krD-GQ)!v>MX3rFNFc7<3VW<er+sPbTTdt}4WBx*bB+2%XhX`?Y6 zSAmY>ISH2lbr?J_O$Sv|VtXd-o|8KJ!fNiHw9DU8;gS0=J=c_;e=Yi?`sL$(4JVDB z+`(x--+n=Xb%Ve<YkS=9=Ub2A(ZuOiROE>tJx8-$rB%oDYnJ#+PA8`C72Vq=8{?XI z$)P^>r+E&r-*`8sa#Tii#`Dyo%W9{w<AghR9*86v(I0Y6+2$Amqz*jptK05-Z7D^( zxcOSPvrV}SkaG6M-3U*r?#;`5ZL1*f?{J)nlX%g&dRSK>reON_O^5Dh$;%2kMI;VN zU;X}!I1CWKzEJfWiEH;UJDl%15SDK6olc&<$pWP8J{dDB!`U6;AFVhT#qVtjq5<-f zzy}w><DSAOlLA^rS`J8*w4M!2ruU^{@QMwcG&qm!$HF%p;E6Wo>Z|-MEv{hm2;mOo zNYX)WFNDT8&0D=pgB4ceY$yVFXMY}ck6OIwB{_>A5fw-jID9zApn2QCX}|YdT0*X! zM5%B25YV>cPWh(NEgyrf?0tGYQQiO3lU%vKdr6x`U_ve)H##5Ii{L7<Ff^*p07BN> zFP_5r+7C$^`|0!t=%Nr12CrO0)7`{NG&NKvbiN3sgJ$Y@{ydAuD^&Fp6Czcu2Zu7y z^uMtYp~7TEWfX@I<Is0YNl9KOoE<;llF*;>PdSNllXG7e6HvqWGRHtbES4hm>zEW$ ziB)%l{iQFVkaXo{Mk-g7qO7E+_Rq56MFm!*M=BzVB0$=73x&y)rdCl3xrWdPc3bpQ z9A(zdwK~deL|Qt@yDaVoe)3EzYS1{gwv6#kvIu1i#8su6v~#M`O!5T|(&jaBeNtGN z`M!ixE38P+oJAc@)y2_7X#@keOhCD5=`9zn89;V1bQllgT9C&-Ub4($RKpfo3^Lk$ z#Symr(lRrVYEhFS!$ZS53x>H%zjh4>MsJf-ECWatVjCTCuTG-1+;=)gn}S&cXUmOX zA-;XS0rzdN7_|4^l(4tTBurxGHRK2v!K)1Znk|95YA<iux_@BJ1EoYN4?wbtwZZEv zr)RMM(MXhN0yVrym9gb~P5G0*K;s!Qif2>6ZZ<7I+iJmGdK$gZE4BUV3}AqkUhuwv zS{iM}5t|5kAijmFgFfU+A=dx_R0rs19nK+0yS?H*f+h~Vh=V#8N3Eqdw|+TmVN|XS zn0b*a(jNz4bdf~6xEEMsD`u*lMiz#46=)avr5HL0Y3aHgW|)JtiLlS$D5CS|GjQ9T z%aPUD&g-LUi*_DsMiUkQnRt{yM=S%G1yA_I%Scvo4ZF_1R7JglMZQVyKQH*I@dOdp zOpndZWXcP4kcY3%zu-f>d7T7^kNIFLM~H+$w4T5gfjar&1-HK}KootjmdtI{l`OT1 zV!qiD-!z}i<)D!=cRBZDP94i2(+=olWOFcPLlhmw{q1-Pc|9n1V7Cb86)vEBB)2Yr zOFTzTScY~+IHyCQY~fPW+xq(J5<36T26Hs>wn)qTLZ1-f_B_@TBI>Z&7r18R%1eFP zcL5%1{kM$27+ax`ha$F;d4DWZXmxcFok#ZGvX*1YAZ%$+0!4&WCWRoLC3Yi4*`N~R zIYN=ZRZ!d~28rqP{teW=6nO!tEzm*`;Hy_>67`)=r#k$yx^alkhL1N2H#%@`N}G&B zq9EGe$)f8YlqOPKoWh6&Mpb_roszb=(iGiu0j%1bmTS`sDbE>m;=Y(uSnUdBg|9Z| z<t-U~Up*YNrUdsc$LQ!t5FuVJL`3^UR(<Jk4$~pmt|h|s_c<Nc+_@oBWh;GN{0oJm zPKLAXWKMR(Twj~ct?TSWSYJETU{e5<x-&QLG_n>6qDF{^Sz#r1xyG(h4tZu7xm%C! zm^H(?2Hl@5?C7tZFl#Re`IKsQMB~g`T!-OQ%-2IVk*_tjmUyr=T?<dCDO>AzxnE%B zoemXu)djQ;7Dn&0E_#mKMIA_OPmg}3W5S)Z0Kbp!dgmkH%(;UvF!{*=811CvFCFn@ zHyek0r%lvmmAs8D?<qy-`{uv=hi*I`s=cRh3pcfuNCQFx2MP>~H6RT0*2eFsJ@?v& zHy~=OVh7s_^gx`}TWVf(*1g)*iBTT2Ut3g`$fn=IL0K<Rry^mWLA*w_qR)$dsh*2^ zm{yozwxC9gaKp$gWD(}636hXHN_GD23YoKM4X#!XQyJdBXrvhEEN>*S@Jl%?2vK(5 zYZ_NXIkLF|1&z>i31-7roqxfK(IPudi~}a3xF(6g1dH<-xOg_$g5KTYuXj$Ys3O#V z>T_9}{r%;=Ujf5SEA3?CRwm}JJXbMJgyiQ%?e@DGbpOC6Xak3*yg2EGXl3IUjDc(l zZ_C{jZwNIb6sZZo{J;tc{N+*3Cq?clrXNToB}frrE~O#^3{Qji^^Lch@L^DonG$6< z2`f60!T3bluAZNA(mivaEOQT}!$Hnm$wKY@)*J0T5^U}&LK0~-WM9SF*H%ZskLe6B zqPo<=M!1J6_`GqwE;yk^hV+=OD6>{BDHxO*pr2!sDbU}2!hM>IqL@upy5=)BsIQxa zSf_MYA&zzpFR3K-B3zXIoQMn&(4an%(86dIhm6~?r$F2jVes;6i2mdHHPQshzl4n9 z=kx(yFiOsFHQtTP{S4G4zT^#Je?8s|u>@#C$wF=2$vC1gexa8zPob0PCodC{DE(|a zOV9@yAiLJYay+$*1NWT}{c|vuF6}rTOqv{owD>}|fZdHy%K}VhuDPO4$ze!5n8wjG zte+saDW3poHQYgjH)vF;GdnEHnk8!(k<m@A5faFwSy96500C?fM@0o^adG1d{NbDm z-C_03gqm<b_f7s@!1}9FhC))w(cO4u90I9^JU@Tb=$7lg1KrctK3%diN9@XDERvXy z)BQf7yxI3pOWYcNL<~P+Sc$S;A4PnZP=O;cfUd8{)%k`rX=S#&vaQJ&6j9;gRh$j9 z6CjOtiy1cofQ%jlN?a=+5mG#3L9&ICT`1sC;(9jspFqe6lp?rsD+&6m*L=TyrPUpj z<+RRJXv`rqvE03G)rm!@S?LWanaWh<dJ4YMx#=Ahc&3zuj$DcM9*^rgx3EjPjEo6o zbFZ`5Fgdym2_GgZZySsWudTpA^A1SG1>`bnQw=m-y$g9-&n+!>A#6>L{>$BNU9zSv z#Ttdda;uLLS=$zJZ$xQ7yms`iN(`us*}g4{pnhJ}(8IkpVBcAQHb<pny_tRJoy`Gz zLq3Fr&l^Ko#|MUu#6qBbU5fHHj!HJ_AZWPMSL8@YS{8btqFPnTaWLpxN|p%{WGUFV zzz^j`Skr?u+lCR3&zXPwR=GSx@?yRM7(-#V>q%HEpm{i&%_GjxQ0zZ-6ahJ6aRO>L zf!A6Ba&f?&5`u(oeJ2%oqN>39hqt1A#q=KJWC>d`xhB8yHWb=;D@^HxisseH3b`Ph z>3>ODS#UO+S7+;18`)+Q#i}FOl&R$R?l{o9u8FQ{)^M(~`Yxi69IQ4r3|Q(GnKV@E zPOLH)@;)skm$||kq1>euIZPZ+z~){K<B}%uVgG=Y<n?2XkdhH_=?m=9$dfV3zNbSL zV;J1f+i;L{Wv)Dg8O}LlrK*qulYv5H9M5zHMlNtMw5Ab~?LAlc(^um-2iUN)ZML}N z!8i}kR5m29-nzN9LUd8RmkV*ApOM%XGwMS|fYva8SdcsVHg_{!?lr+_ECn{zbKH>% zs|s6@4Vi`ufO03KEgUexKu8QvVPVsqxBYAJI4x?aZVt4lUAxQ4E;8TQW4&DzU-$N< z!RQZqT2A`fi-Y_73lb>s2@}J-02w1~?4f>4Dtl-;r7D%(7_(9Vj#sV!ibow+K{gnk zSRrG^B@9&^r{n8l;xWa7>Xh}E;^L0v;*KNhFozTk@Z(j=HfIjGwTk6)4bz7iiBA;5 zyIs;3q><xRh6KPQ$faVbVx4YU9-kO`acJ5IQ_-NCN-0ZMOk1C(!y{vks=1UYo{900 zzai>X*BH^L8Ls+3S9fyLY_F+74%PGBh^looW4kZE6{O{Fu=_^XlhxSuWQbUMOKsH! zz1#b^hS+zEP&a+ADz_<l1M6d2*U8%Jc!L)++;7h2{+u}1`k^NDG&z@}b<xS)JXgQh z#>3}@+lBnws}8w$I5l=Sok=|}y|>JHq-SuqZ|$g_-R-$i|Gsk#$UEcb%hl{gYHd90 zeckHX>Dfp{)rdQqP9s*ibyLxGlVx|RYVO=?_nfx7Q}f}@b0<&ngyP*<zVx9|oq~5b zw-@f7xtP5kx_2@RVuQTqeH-?cRYqoz&NdA?v<<!ww)1Rj_}uO_%6C4<_flQ&{a&$h zV_?JJxt{)T@BV{hUu?$invE^tjb2QR{fU+~9Z5qA0RMGoui+K9KQh?w)^NZ7H2JH= zO>7soO@JXAJbegY_rP~)XB*oIwC<`KQzPsH9z)0I;qQh~DFD`pe0|1bIaF(kRTr_F zuEFnB{g58nR;^}kr2f%JE5mNpzy#^e#QpO=s-CslGAzxH6Hm+ZR@t!(rh9el-TvlJ z8vm&U@z9@N3To1bpEL;>Rx_W1$&4SOtQz8BAlG+=73@^8B?XKK1@Y-d$Oc|7Y+^nG z<oqKmEr5(lI(QU#EuXlslo}gBDwfWVQ@B;>o--}L6e!{pFtQPJ39kWCnC3O7d4DU@ z{xRq5^+(sM*=|@}Z&A-~pn7oVp09B8^pJZ^pQGQf#1{2pP!DCd+>c{@oLbP(|J0tg zQZu<7bzeN1Z{4M4jKJfWH~UEN@+4kMxIrTl{#QbPfl&culUIRh$RJ>VZ)BJt$b}f) zhMkuQ3^_3we%K&m)yPv#0ZPAu^L_U72hJEh=_CkvljLTS(N&dVt_+4}IAioK4^scC zNQ{I{X8L9YQ1U?q3?+xjt;J*SirJTE(gy-`4nbN>2nvviZ8BHk;#9GK{tQc_GH=+( zmTX*1CKKga1&YSNmpBP^w^Na(EO(E3atCb6NH9O2og7neY5{)NU2Mu}MfgDZ0%eFQ zJJz*sWCo@%5K2IC`|J$0l*_}WDl5SK0MM>0Yw`}iIA1W=H`DI-`0^`((nQe{3alUm zr-J0SfIxaD5r|Zl8-^tf3xx44#DJ2$mPT3&Fc_H+5c0n<3P>2ZM;Fk+CXfm6h8%q) zoLSVBi^3#;1ZZTFoE88?Enlnr26w;ZIZntLr*O#<v@HpUS;vjvgr7i_7o-z3W{eU^ z@MqJt;wz|UBBgB|1ZTtX$2O{k8=Eg1TDDwR)=)MgZTq4@aW7RR@PJN-KY<A(iKI8r zo8vqZtm9f@@IorIHxm{x^G+S=SRJV>xky@20kLV;cXv>FAxE{sW^UPHyboRo1vE&A zaNSD;LC$K?1B)dn-aLPDT}ATd)Y$?NwocS)ME*?Q`U3|Jx&fGBiR!Z2{w<^Ck@5M5 z%wkV1X)u&XDO377w44qghJoI;vl~xfCF`_O_t`#I04o?qEzAN}XMfVG`Aa(J;!r#V zSP2XpWQTsa2xr;Uk#T1Vn?$CAFU+p{wLW5AZ@~Rnd6C7dKbl7h^??&etHhPCVcSSe z>NuIQJM>;uijkFeWb{=17rd}9Q0dXx(UpJ9(Q~x>VWtLi`bv`zkP}Wn>TMn7wD@&T zdUU-U3QxGrsjo7o56*d@x15VkFPt<TR<F8_*Z<8QyW`>AH|p%U<(1zvZ<M3?`33!a zR!(5ytNJKo6@7!!2E%4#b^8b9@F1Uu5u<5|5u%7!;m)rcYGhsFcbqdaRC?5qXqS7y zN%;hxd;FKlRo9`46mX8}=>8>Lv6z^2acF<}!;wJsBNKMJSA37SP5;uc+vfTDXx*;E z$4~paOB$8^FhcMd)4KL+7MW(R5m!VQ-%ez%`h!(m<Bs4)0$NKcA=02&oc0*QXi|LX zh-5-fw!+KB82mhM)n%g=%H4wp-yCy(oA0%DjM9SBOTk!RF`O;Cmjh+jD`Eh=w=rx9 ztWp@yB%5MgdO_AD1<psFVFRp7QN=U>?T-r$DO?nl2U^4XHe?`ZDkzFq!RvP|f2YBe zn@4)59PL5<lxCyzrBX}%m`=!;)O~84=Xxdc?06nuNJL-~03#J+CYa9zY}vuu3=m`% zt{l?@D8R=!($jAMsx?dt-;?(vZCF~`U&r%`q$u?Mhdb8^V{q0)xbmER?iQp5x`Jd# z`DlURnXUsBI$O-UWVFYxt`Tw(tt2g`<Xw<meH;>>OuS~=3d==bvQtmU(rg_&H+5<l z$j*5aXFK#!!>?Dm;celkch5$H*1Tfw@Eft1jvJf~c=cgH`Ew@_7L^)$`RJ=7Se{$y z>e4j9Tj9VQ^}5Uez}*I4D8a}PcsLsVECbZ1LJHJu1tD-rTB2rg{Yq2HUZm@ix#0Yp zv#k^A*Y50W;;dS=Q(Eh_&KXXP#%DRHn08uWq;p|3i*m?KJ_74j%1p)l$cRiDPVLq~ zZOwryjIK3Qr&n|yIyTH|dbt^Wfc0r~Su!JxeIU4e)f;L!)s_};_<+Iw1Nk~W#@XZu zHG{CPuiOUjJVoBM_<3L_>nla&8zInJr`}8ab!zl&{`3dUaNQ%{$YUPeaUU$}zhS*F z-SC~Tod(n^y2OHNceO@MR2^x(XXp>S<NmqTMd`g&RqKx|;?T1fuj6FQ8;72_X<kqJ zBmZ*y^%0Huvv)ZKPMURVcf%yacU-GLdCV<aqY^`_yupvXws<@GX|G%^Aim|M<Z%1q z6TNL(m4RBf{T`h2(>k-|Slu;FU1*eH{(%Bi@$Al%i;>&6{;7~#^KROx+f3IMlgJ)Y z^4Y9qWOA;x@eg>*{^Kq^$CQ!`?U-x4)q-wbG$Wk~TCLb|_sIP^25QW!R8TN+D+h1V zyG;EsJUEp%=TZ=f$z<}r&D5EdStpFbVlUrNH)p59-JX1oYhhnX{`gYW)o_nAZJzGW zy&F>!1LAZZUMC2l;=&(=9W(nZxjmK_4!@9==I~Z?GrFVTT%Y1$K}&zY$5BSnH3py& zfT%&|)y87kW_S$&Y`Oz?NqZiRK>*bmDy=XX1|&6izXJjcmsE_Yyg&D$FOmJph-{hS z#~WjU^a-#`Lk7CIXx*9LySUeo75MLY)%Dm*MU0G3osi7}mpTER@RzTZmGyALTa^jE zk;)axpb{**NcbH&K%JPd{KB~4T?X2F%8iU4gDT|CAI@_fXw^NkJSFAX@#?K<aq8;w z^Queoa*TxXpiAFc^VHYD;zx2_Yh7Iuh1=!Gxg9sTQmP3T<aw47XTy_DYu5w?COmi% zw!!dh8a_K}OG-h5pqUx7C>TeE-^l?V>+u={9>sKHl00!|FW6$gUZazzbx^^$_(|qf zQVxXs)k&Lag~JgkNX_nmd7gIfjZ@MA3~WLx9l}TLBo|u_x)v)0>Dge2b4~?dRDhA7 z>Q!1HBtt&7U}=z)Xrr#iKS~@-P9%r>VjB9YXnZt5O|iksaYtW`Tane?cZ<eT4Xk=r z^X~5^_s<7)9QgR|yXj18*if$do*!ligjqX4x+m(-K;r*e8i^cnSr$mILtlKzn^cs& z%cC(9v~&kCGDwZQ^d>yvi3JvaXdPjW;im1<)IfU4-BhG2KPVu}bLk|sULT*DLmoUW zgNWC_vPEBEDOZ_DB>B}Qz6muRHluX3$Qc6N(TvbGZmwz&(GFad;FM%xA4n>GOoMY3 zQQahA7#IN%Lkg1x>9p`SH3Y{<EYHy$EoWT=kVQA8uznd2gg}7NEFFWb-7%#^jiO5w z?tV6e4uEYDpte)R6apC;13?GRtkFr;KOLu&X57@NlWyL<RJB>gw=z)?WaOYhnH9(U zLo7xpml!k(gFDUQIEh3vGiKsG3^itezDL9qLf*c!uw0O+egJY=Vh+fQ!%0cbI3)E; zzr16VJRM@$$@8&(aTO>?`%sMH3F+ZoG@Ktnaw=XOJ)WrSJ=duVY4Up^c8EYYu3|>9 zamJbXR`O9U!ItQh^%jCYQV^fK3Bih3psCP}DAkI`tm?{%A)VbY${|?W3Bh==Ag8?H zVPm2KDp(#oTU0kr@=1sVH!ESuoFXDASPkvXTB*@>B9YO$9Z!$_Ht(EG`^Tc|se$B@ zD#q9PBG7y`7@`+Vc!5==9)FfZFe>0)Cs2eEn?N+cz4~i|kcPnIwdQtXwaNP({{GFQ zUHhxE03a~|z-nkUqg4^{%YaSCU?eRGXdQ$8Vx(A^Ea;W+n*{zC($e@Qj8z`cDphZs z*d|3-l;$8b$q~@i)yFHUS=#N%0Mf8?MGi|OwQ^DG-#xZK>&=(?LfZ^`E?<3XaX$RM ztEGU3d0`o1@g(N9{o1Fok56>?uD7itY|fAfuMh^@aPC&T`0AB%P^(-BozyzH^ekT2 zWa)W=|Fb2iMQwcQxineSDEhFoMNqDe%;ABWm>3=;M=d41bhmsK@WS=us^t+Zf8TFM zY0~(Th!A_d?M=ZyWmC^Ho@Uu?F29kvc5%Xeqy6{kt<UpEJg=Qu7%@4g!4bM~Pf=e3 zrQ83q#%`+={5oMuDoByIuc}rKObi_QA>Q3_!T0Y!KgRz2hB`NPcV5`9qgKHq#9c#K zwQ^<S$;gXsM5I;p4%Rviv1Wa*%<KK9W=^L;XWQ(TDdv26J8j(NhCZb>&OWRW4YYlb zuc8c}Jo`;6L^i4UX3YM*VzuorPc~c~IJ(QCbaP2oLj=r!JIHf4h98|yX?;15K9y0K ze(BJWR^<a1)3>eYkZvw1r9=oNpC5<kM5eRxD9w5EZWYDtk?>eAQ#<z1gU^~S`D(lM z5YkK1*m;Q+3)u@XZD68TD?Gg{1ke@44{GD<ust+Rw#TsU_eI9+4vSbZS%_ze67VaI zI8Q}glg*7Ier>s29|Z>$9LG)Et;j}?YSTduIgwrmNJ(Qr*#OvG+1CnTS=<YG3D6o0 zGMF0yNQ_^3P$b>1r0u~*j>tVBu9=K(6_R)rMWiLRqomjxsoAQ1{ZMk)1{fo~lf7D5 z1b_i~z^DZeFw@Z1h2r}1cRn2965A`#_K~S-1i(;3{{)KNODd-%fD|X-idnvApNRi^ zY6xqc#+4dmdL<I{-Km&fpoUzId14HB3vWv>)+l|uDQ^OUj;7VPuk@P~Cj^G5cnqrO zQ@JRAK@=`>E@4(uf=D1GM3xz>f#$z5G1pACTxyzbHc71gb8KtSHYN(`Q~|8!H~?8q zcXTo0S*xH{2g;d+hDS9{7LJuWF~CB06<-K|7)TmTNJ7ojN$(-kfebfTigpnoF&zkf zY|!j{uaq`{N7%`M%<yDj8&T-vDgvv@$#omzKx{byHgN(RxR3Yvp+=@3PF}fkC6VmI zZ@mpYnP=JsDZX<cB*}<`IO++W>ev!e$%$6mE>CMZ)Sje@q+vFE5dwC<V4h^;V;Q{* z^&$rrwwwngu+pmjexAf*i4>QBScATXUjgoQ(_K7;EVi$)F9`T?9FVy#fUSd%*`KTC zJcaWjRJJ^5EDFHAsItOF8dzW}cA1~yKym^yQjZD9=8J6b5#(KBZKDXtxeG>$Xc&tG z8i8uY*Cu&lKHK$f^q}#;)+75%N_*dy6>#Z9Ac;_sDW_b;$E}2;8C6Y$`8MBbpE$%J zkc2E>fcpn7+z$3)ER9ONe#y`7-MPW~^u4m{eU^2?VO?5|Wh0Sv+KiLQt^A}Y>QQ-z zb-;49U!zN49o?F&%%iIoG^K9dakUCnSP9R$=K!F9x7Z)Y=58$DDVV*?7%@wbLLH_v zH+tQv+pwl-mqY|VfC<Geo~;gPzWMS4MSJVYQ1j;@VAYFXCk}#D%ZLBm+?C}$BVJDu zmUZkI&^`{{*`U?VHUAj7`FMQeb=xbKnm;zN1ydRx;^KyzcN}B32R?bdp#$B~{3-U* zV=lpR*3XWiv|xE59yqu&<z&Fe6W&)x7eB4Nf!OyEA*n${Z|v;c61}D&V?6aAlhswf z4&Rh}am-P%9zeoUpT?T+AXGU;NW08^hjwx144#wwHn)5&xWRA^qC%{QH|zL4w&|_b zfk6$6X09fizzrM{L}0^)<3_v00b$^l@$%;=3k2xrF-p>Lhc};jgbc>DzGZ!Hy43T2 zoA_72wnXb>Uye&Vt53l}Qpd)if7})HNFH;EVGJnCu!OXiq?ZY6>?$P}wmyZyZ^dZL zEJ&}QVOm67sGo*&z3w0pTt%i0d@zLare5rxdBA7;vT=#{P#2c*bzj1@#k!3r{MspK zZKm;S)2rEKlL8*HhAd+!S<t(gi2;wEK@DyXB!nogMH~QzQ0XUbE>tVfrVlz0KPc!B z?wHyM0Y81xmsb!aF?#!Z+=~Mr|K2}wH}>f0WrY(ry0U+LzjXGGU3VWaxBzrg54s#a z+II&hRJoDT(dfl_gy5upill$vvH1&1q?JeqXNnsESTZ@Ni6pf?v^YGiPLO;ML$g^< z)syFcY1hIeRbUQF3)wUkMz7L&Wi^si2#JOtXDBg%og!LYBpn|uRGNRVF}T-FQJBXD zAjT~)P9-lQRhdRp;?tFoVg_ay`z;ELu?LmS0QbtASE?)=n`;*GRLTKGaFq?v7{X*} ztF{C~PM)tZ11vq9@fupP`9u=x?okr{D>Ad2a%Z(Y?F<8$BBvlDJP^_TCutJ<W58<~ zETs{Gn;X^n<oP<}%sf4;D|9?2zWhS0rXDNojeM}`;VQ$bN5P#BKd~pCQPZ=E!;EZE zpJrs0r=Leqb3SRP-TmW!{hI7g?33kqEsLawHwvCxoYbM9s~dYuZ?4h6M9FRT$axga zJby-Gex0sO)@h2D?i!uq>cmx6ywN`?*~O|^vYzUFfV_gI{M(OPsh?gf6SlTT>H2o6 zUDX)x43Ib6qHBL&{L)wS5GXifnKgd3*89)Ll&t71W2@0Mke-apB+^s96D8kgC+Qpv z`BIa3ZeFd^Jj*&q*Lh2g^W7Jn7o}a5#wS#>^+NB;tSfU-etC0E@WX;4w=j3q-mK3( zUV{&HJ?}?kkO5hOv#Z5`K3xHnm=0<3HcB(ns2$r29!{t}-PY(N`7j-yP!;va;1gk0 z`(EsLV36-~Rkd8b5+Y>)#x=lFBq5$b!}rSCtO;@o?)9c@IWo0LbDAlf8oz-Qx<);} zL4bqF{BQV@pLjKcqp2c7B8mop#egglV0J&;huPr`y{_!NOP)@AfB7NttrvHCT=VI; zv<(dzFGkAZVcWfxo`rSx#7(T`0TUCX<Xxyfu}ynjfc6)x)fyUxPsFD9!XGgoGeOz; zbh*)IBmzvt(9!+HdkxZ%cCehp)7~$1@}(h{0JI%oafa3+^6*5#=GrRQU~oGDu%E!8 zX*3=+2-M&bX~Xy);TsVRheXArN%3khvY*EGeFiaTgmxDm$+?(qI8#O{#n9CnfG<dq zbBzIdA!&7Lwo#y`-BDSr;-uthzYpZ?;ZOD_%D|C$tO$9~>V=UuKZ1Mj4pK<VsEWE0 zNlBUxtLgo#p}H|qQQ8Ukb`d~|>OGW%Bt6%CFP!G#G&!p9$O#51T8xtwz(js;nVC>Y z0ElEB#Lc^^NJ7P(sYEkZm0}<U-3vquv3wYd7b?_%i1UdrXN4}9;n}%dVw^Ir4JI1( zl3HPfnJAnQo!A5`A|tP>o~1@fBWRTbJ{>0rq_dO2MFninSSXvWodiB=M&m|UK{Q2a zJK8o$RfY(blJLusTsb>H4GCi7rq1|k4lL%OXj86AX}fA@pLS$KtfArJU>$u}s=MI= z>!rL6KdX!wUM7^Mf<-;P<2{PVhUqa^XMARXo1Kt>O9A<GU>tpN{OPF-I$DGNWWWhe zrRy99r=K(`^q|yN5`f6ffFck<mv{Or9yk^t4Fz*;6W@93;6WspV3v%unN?bRe*z<v zAEl9&Oix0z*nXeGOM@p#G$p~P0sveoRyuVE)N$hi`QrexR~iro7T_lCz=Y8>RL@i> zRrAaX0Kn6f*syINtc-!dl>C#HL6Qkrmfu@#G=#3{l};%x%IKw!(gsz5Dph3q-==$6 z6}yq=PSt|a_Y>=clj~x+3M&XUuth1O@fGR?I3<PDgY%=kw(HT9FkEFA4M_-1H6S)X zc*uBAx(2?%=dMR3O$Cow%)UXBU>s)nJa(VT%&S@rE-sj>NEF6k_K|49i!Tz1iwfn= zg}5>w9Fi={6uTYKb5fbxL_gGmG8(}O0uRp(Y>(^(Qy9q+SR{pyYSmZHcXst^lKbFt z4M0m1T+fS;N84|?Xdv%BF|Nm;nUTHH8OF6WbTnBgA3rLor9Vn|d2ie5nF;6bXK41b zvxu4EsJL4jBS!u)7vhJf>*GdZg5WXLJF8dGQH)R0MsO}W`Qo#ANCYqLg^T8gU*Esw ze3Vu)ANjWpaIoW|g6|%U@Je@`WaS7q{zar*1R%k?lg~16LQ<6p(CJL8%YXG;Pl%2z z{`=N{a6FIIldORJbkvFCums~6!oG^TfyTuB#9L#pE(F_8;oLvr73*}&0c4~zq?>l} zx){(-5~iKllY0>+L^p-=pN!0GatytolwJXTcrV>3S8o2Qe=4U&n=guf6nvm;Wu?UI z*16BHWi@ICx5T5=cw*bFk}SLG@_AXcpMf$bv<&uo;q5)jS@_cx7oqsv$&=aJT4cbL zyW3Vx6vzZE1>-kkPLq<qfD;4*{R7JHT~~Q}uoQ*fpIleX#%QeGvD4tCQvCtUyYT1v z0@DlL;6*E1ogU3L$Mj|Pk@I|qztT4&w{^d@qHUQ2*9G<2$o`q1{WEpZ;?y=dN#XQg zE3<lU+qT=L|4g_!Xsp>BOxgeKri9RN%Gy8U>~iJH`yWg1Z&JV5Slu48eVwj8^@g?G zSux?QXPAw1b;tC#TLYIid_IVnP+$9hu=mzqRrXuk_ky+PT8r*3>24|ME-66)1t}@% zl4gN)mq>Sa7?jeDq(KP?2HmpW6V&VS+VMR5-tXAszMnDfzu^4oJI`YtbI#+_#4mcw z^f`)vv?{$6jezV5&c-;u<oX_;kU&3EgPi96TR6XXBAE=DK;Q8#g~v~&bOn^c8{WDu ztQRhn#0xN`kOSwyt)`}Jq1j5k4Qh`EkG%x;JZUskHPrWNbxkx*O7DP9D1aa=HIhbc z8bKWvw;7n*xt=_?d#=7&gN~-)%|s<pt7QgnO-9KEWp0L&9ZlxQ_o@bhMyYNFtIMKN zjU70G9ffXOk_Ym|PmM+eO{)bAZtU|fH}X#l-kE7^taVeou^<8#FvoJgLnCA~%75d= z{`IW`Wd@;psf{}j_glS!mS`sT?z<ZqAoA|6$11Pz->_@4PINndaL4?HU|Ox9)<c2g zz$L|4A$!e6{l`m8BTX{FZV$qZOCsDrov!u>At$tEC%opHa5`;qlm`UOE)0#wORh)p zWSV=<$I8t%<%cJn!tRgv??0s|6%<klzb$va*>h{}-cupbTkhhq&ECO#svb=~-22|W zM@0DtmeuuMh)m!0BVX<YpT~mMG|m2KE!R)?8*qePnwy$owFH&(tp_%%un6}R2()${ z1sSwVN(w8+8fknu6!E!Zv(g+Ier)xy1)h2=AS-D5VPCi4ShTp$?oOz<&-=$u1tT(B zqGKBj?z%ayyE%Gzggk6=uFqHf=6(o4wBB#_P!<=tf0sV=j8AQ^MaE!R|AR>KBn~%u zli!R-qiI8Ub^fhKOC;o;#`(hOBqH9K{22!B$<?A!Lwi2W`xZySSua}!CRzpRM6;XW zQg&W4K4eer8q5$Uek`8ZB&U(AO;3c6nO}Hhtv817d*^StMN^0srlROzig7sz6gfWO z!WEl&&?arrR`L`*j^)(w?6}WMSoMSGZSF(HvbMXiZ57o@VdXSd9xKVsA}4MlA3nF9 z$RAZB+-kP=U00eFUpC6$5j}RxpYJ$u8x?Cv?F&?IpV#w=y>+H%ebD%=MTkq((9VZ( zzNzJ|c=IFi!#JOYV)39?Ep5%>!P+m*62KyCqdp;%;x0b#3)<UXC_=g2#l#to>yDPw z?u%3jA4nk@G@Fkf=08pS*50i+cDwsjS?YAH)>~Eg88`cBx1%pOu&vnfq?g^N<e^0W z!f>g0L#eRmfUakM^Ru_l+!c!5`|f)e`#c-`An{J1wLkgoz?OU7ip1E5VH@zXUWT)w zaIY~Izjq<GtXc9y+S?LS8yxn|J?t!=<!4RY_j}jiURx~^mfD(@E~K#FTCdtz8BW&y zsP&oM^EMR7pBausATS6E{P^mmo#wxV=3}K+I}tG7?6mUpr2W6lBL2Ugw2QN$YdmY& zfjh+h$cY+4$yR-;@uaY0bGE)Yrs{e7(YM9!#|RqD7ym|v<L<QLe|t_8aMF&sapN!K zg}*szC+RFq{*mE0C0(2oHt?|+SVFQbLXI!fM`@`Y*t}i#6;WDNS}f*mS{XBO8e7%k zaC)uURnp0>x`$YNz2+MIErW{JLOuy~BNr*5+SqR)_6@UEb~FuUg4^Xy;YFBLIWsX7 zrP6OR0B)Xo(csti?F%?Z{myP*K>LB!*|oakwa3iQFL3oLGryz0U49NG$-?jWXj>fG znRLy>6bcnS{Pare1?FalAd*RO50Y?2VINVdL~*likp1p}r1xXK!AqJ?7UigYQ7_&5 ztuN0h%CT<_zeIYlcVBj0e}9bYIS0dtQevz0q?RJ5VDuaP=WoV!_re8ls@?x`Fk=?( zH#TjNI(J}c8s+XjM<?6q?oKGa+OzOCG@rZo5bAo1N@Z<LzgWayk5}RV7O||a+9iwl z4w1*2Ij_@kQb;}J>6qk0Ng!?|+TnE5KX>GGi!lZFETU}G;p|Jx`V}|ted<=Y-&dcz z9Ry7va3kJjhGV;2osB-rhi9s<9;bHfOPN0MlfyRy$P3EOXcxz;sg4&X(h7*!eRG3H z1!o&~&>x-e&mi#64)dF@D^y8ce{_NFLURF1qd|PX;R68zZ3r&&pPhL0Jc0aY)<h(o z8kV~5A!KfmgyJvU5`cG$d;#l%xr{L&wlpyDb~_0M6hr7G(6M2=0;r4~VO(mlXW2rO zD4!jJIV5sq5ZEnUl##uU=#tQ}RjqGOlE;h4t0@su$jZ?*X+>&A#bT6)b#R<oiSQ$> z5Iy(I<;B%@B}8VxLFB$pXmF;tGFc%+(~;-XDGtMsUZ!M7=plH`%Y(6<i-)z`ef`Bf zk?$1!G+#DSd8cdHgiZQzNXX(>{Q5&~s?b5z>-s~nbrNK;6X|>=y1R$W`10?qS`^eI zOBE&1Ra5p+Yze6%YwyxL(fjCYYouz_HQ{LcxllgDh!*TV?%#~9g$%73V&@}ZES$1* zgQlrfiv(!(W@!srZa`)HYv8pIJ+5nfuOFx+N-U}Au<%|}mXYmo>j}{nBeNKJ$aOz) zg;0;vO9TOR$7hTKT~9(!?JqsCoXkG3VUP|^kMkVp%XQ5!A`0%yw{yYGLmw_t5FQwh z@!rp;#VNg{`7CMY6nw3vRWY#5MX%W}<cTg-yRR~-TiQ_cf_Dj--U~l<d0zmy??R(C z17R6<Bv7<|(&XN2;L2L05gF@3mCXqyn<Ahq+N745b_d119xg5ct_XFY5Xy5fSQcFd zVg(H*tYJb|`d$jvN|Xr!(0m+#w}MU^LI4Rs;qC~))8GkS4OuN!rBX+h&_W>wxOrd^ zWDN8UWEv<fz@`If8toRd*%0xoFySE^#sz^4JJ5i0X>{OJf*6~&8U=dW;$c49Dv*C( zcac>I+=vBY59v0yop7#fV!mA_H(<jS$#zK`eEU(XxpnNO1DJ9fv}xSjHv7EFy?*fB z7w_iwS)4D<)nU)pGlbhVk{yt-JAPz1UUKuWJ|L62KXX&As$ts(U7P~kyo>4pFr^t< znl#RD+&r9YSu~08J8hJ)NasW;SKK_07GxqGo)AT~Wqf|aE~2JE#s@8v#Oph+xMFyt z?$~!jpdBFL5#AV&iWTa;<6cQzzBnAM0Q!2~S8k%!36qcCKMFW%*YdAR%D2~M1jq}A zbCf^0d0z5I-|K>IJH;`aKR}tMtJfBS67awLg1|)Ov%6s!fX~4yhhcGnmie7eIJAR| z{;8=FDIebk&$r5Y23dPqfi;-?x+psvJW#r<BL#l$#o#H4jtoEBC|*sWC;hT-FT%MQ z8kO^B{_{`rg8G*60+9cFd*s@~CsaMQf#c7Zhjh>0;zNAN$2++OP0*ItqDw^QO3axW z@N`kKNxkQ1ukxS2%$pq0J(cX=Yr~0W87r8eRAz3&sk3v*WPCt;lJmqs=YcB0y-|uz z54r3wUlT><X;WkR8}TfH;2rIBPB9}d&#our2=!n>YXg*!Z^x;sw$tr#^|gH&a7rPh zq|0YGkk2atMc1mVQXw>d<Ug;=VRTd#ICY>an1vfJFdjDzeQHF)12%BpQ5?<IY{Z4u z8zJE~!<lgsb_#WTneHAdw$sQ4SUIlhx=8kQ<I8@oU|-dTu=Y<g={PQONzkovDK}2O zk5eO9HRpY)q!o`7f1ghdU7H5|nWI0fr_S^ZS;_Pq(Q?QaFH<@%19%USi)U2963sG& z(j*nVbMF0~r^uvzuMNJmDdEYj(wQkwNbPz&=D0;)e1!h4d2{!QMLb$!f44ftY4Qb6 zU`pR=DBr<?6w_B^vX)PN+=*j$tDn%6ugjrIpBJ3l93eW8YYDm>;j}O5qhtF>%Mf@U zg+I{Mb6+5o^%37wSOvZImwn_8S>Era7JmPFnG^Mrb!GAcPy8e0x8Gt(mUbU;<R3kX zhq)uS5G@&8vWVfxk1*4S(BLjO)`Z4!o&?S+CnSN)I}n;;=-~|1EEzxLJ}k2spFzo| zwHPYdtU!nqNI33ugU**o!5<BY6MGiF4<9U$Yf0@KR4wFA9jHuYjc?xJH|c>dPYNTM z(VQ=Gq=g00EQKIy0;PC8$54Y+<B<l5Lr9Ndf-RvyPLzR8keM~1d0dcgJkniH;=<H0 z`!q7OW4vn}!T5I#IjsF2z-^#(5Upc;NzZWqK5EnB@E{R*$SggoRyazny6d54N4|e( zAt`~~HlDR1)VhWpW63J;5ZTfI>URt`>{RJ@4#++x0M3BHu!wvmLf7dCLYdIgG=iq1 z$hu?7Jdwvuo{wP`p=`Bq>fFcveZkMr@#k3Z!TAsQONcH=bYgp<B2c(7I&p=PbqgF{ z1RYku99%~13$A^H$O)!257R^PYw&=OZVMc;K<H)(`j11U??&D6fRQLccMPF76_hb~ zVlfRLQv(>vzbe-Y<j5=KO7&k*t`zJ!CjE7VgQ+}s2eOpw{|yf1^?s|0x%$g6riFdT z!Vl#tOrHsM+uM9M*z7n%>JP@ER%_wWBnTs5zdh7ayV4uSpqj1LTK91<jo<G5(Elyr z^x@X~%Y@Sp9l=)#r#mZsiT@zsbbZhaP_EfH0sp3Q{U4EVnoW0^a2kNhw()lfr$89f zO?*AEPlai+Q_=vrL}jBW+kdX3BqvhOwxlGCNXDtWD#KP8TLRI64*|O!+2$6%XS1$q z^B;(-cy`G4xu(Y=4JnQdW@T49WGiP^Kkf$N)U495;|%Nnkv`6DQ}g}@@%fTN86;ra zmK$`bT>V=<J=-bUZ~%zU3oCUuCCjUGk1oTQesL&&l1qH5ZqdJl-cWXarE)vU`8AgP zK)`E?aE{%+)p3d%J(fi5+XFg*6}wl;btukOX0KK6ZN=WmUy0B59Dl<Md-z82jp6+# zjd;evucRkT!%eAXuZYjem?2Hi?3%y)!3=v>H0aKLe1PnAg!tm|9(+zk{QfSC%QMh- z&(HIIBsW*7=Woog;%Uz{B!`icN7;|KPB#it9Zo-$bTiv+Ry=+yzg2Ve+3|D3jKf(H zhT(|x*X?U&&<`(IG{n9^@E`ejzo4o1b-?)SAOi1VAru>JrFdDmH#~FZ8`d8@bzOCu zTZ#&~LGx+)iKHL*#i?@Woq|)e6I?0fT>`O}I^*>pY>3Kps}YDtE>EY<(K<@rInpC1 zy_Z5a>_ElG^2DXPy@I<Ty~<M)G^GqeE>o0DHPKQdJXb`&ktc&q&Jy@A<M#GpK_|X3 zB$Rn7dRr3CMfzGxjOy8vhjmFe_33uFG<F^o5w6rjPrd_JQp>|n?dxF{+lkPM0uoM@ z<mDbzN7l`OWEdA=b>`Z<cr|lUR@<?6zXzkxdr_|%vxEdX)e1?{u1E#(#F5l=a3U7x zN$#(N5K5Tel%egE9)ky8pRfY!9ETGC>8!G+(ir^L?j@9=kaN$6N1^aAI?I~fP=CD^ zNrsWdqNqHeld+q${wanHQ9Gbt2c(aie3ZhB>o*?xEq#19rDO;bOw98KGc0v3;9KJo z&FJsUur&d+-61n$%k%+&T+-PO`p~$PwV_rlc13(nd}6d+#AB{JYB;@@j716OJ~~0D z`kxY{LJadI&{VYg$I5fi3-Qg~r)f=_EYaMtE|Kd`?k|Fx<>kuc%gn>aQ$b-&Irrdb z#9i76NrZRL7h)*`mmw?}FoD+m0$KXV_?e}`d_Uz*S*sbC%<>dV$~hXbm<uF?l(t05 zPene_n7klmqF61uOs`nwO&LHgF&r+_ZytD4<$X|Y_HkUXyNu$gMPTv0>(Pvp^GS(T z_bTkEh6pa4$6F?t;@vsbmG&+<l#T8ZNlGjT6(S-}#_$kRtlM-66MXKgg|I+73mEd7 zU;%e#Ra2#>wDhmTun+Q*O)E^h<DgicA;|Qt_A=z+2H_G@w4QoORxIU4C<w`(QgSj5 z<a4HS`|-o(4xB2dyI~8N5O;b-X?8j3Fhh7t9Bny+(!)~kpl|7i4DTYiWE3zHkQ;32 zdj<Q@arty0CI*btJ`ZG-Rbfj0_X<(9xfLQQU?*a=b%HjfHzHN=CnublCf{tLK06Ls z?VO<}HH70CpT*8t7F0oMzo}QSsB}v*c9MSNQXM&ieQ%SCr7<d(ITU+~pLyKF`kF98 z_cI}QDCHH8Rh&CUU1_Gv>Py~3j2H&`0Lq1Xz1Z;_+AnBV@kb3g>8bm`DW6xKRyY_1 zzf$tdG$A?#;=BOjGhCp;a+0-q@KzvQNT)p!ZsN&MhY{~(`Z&3ID`Hs1s5W`&a{~KV z5`7dQ>l6O2k0Bf5&8$fKiUODfSjBIKFvsa-U#w4u4z<$DQx7~YCgnh#H>6`RV^wpJ z-$)NQX5bSnKzfUn%<bw;TcDs^#*1&MBRhR9^WEM}q3sWngIDAdzxPA&vzubfrdka$ zR%4rYbYFMB)@U-;gKj=z<P49Ef!jJp+lN7r#`)rF>YA@p+<thru$U5E)a{p~>{vsK z#O$FowvC4^)l=yg*=aF%9r~dB?7g$-TsZ-sjql3?nnU-`GI?JdBQ{!pkW1bd`F~@2 z=lrHr3D*}Nt{Ji@^~JsbjSn?d?-u8c?@GOMZ>{5bbaZc0RPF${;6&Z>1&=2G!57hA zrg(3K1Y*>9bt5DHsTclfs^bs%=no-*z@R+-hSV91PQYgJp9fmwwErO_l0ZL&gvUqn zpF)Crf$WEnaGHSrM}@?PkxL8A2loH6koY^G^+P%kQeKqM=0^T6pmnJ%?4CD(Ky$dK z1z2EgY_d<QfO}<8KCMluvY;MNS<L|ACX!SA2)UhF<@>U&s%M9rTh$$?3!lo^EVf5W zyJT(cbb6S}wdzNVn?D=l$k}~qG+v7Y;G=7^(v9!J*d5BoE-@xoK<gHpOCj+GeDv5> z^o!DC`pj=>ix-cJ+L3=C(1u7lF@*u3^=}vx{!`l@Kx=*!?4R&aR<w5K0gmR+KZV3U z0$L|rA<%St6afU<@TUP2*)RKWdPIANlmS+fTZ)dR-q$I!@au_Si^OBLIm<tQ)=s^g zM{m7vs(XZB@r)h3^Sy&`JD7fS#CbgBLqK>ueTz==I2hx6(o+G(;gGhR@DpQlvX(`2 zax5L_LA_WW`uI{v=pK1(Rs_Ej`Dobe|Dn8Q@X`W%3X%UB9NH;f(}>{uu-U~RckXzR zqUXJ{daYw@XGk&Dd3$1#<@Uih?bz>!B6g$Cy^@4+{baGBPdj!$#I8M8Tw!T=A^WZP z>8%rz2#@b_>+4^U9^MjvG_k(Z{T6^xNuMP--u;qDV{mSeJQle6a2W_52wavx6)Orj zHR||IXibJSzzJ+W(FRc-%k(OvBVkCJE3j?UV#xLcQ~IW(^CEXgQ*yaGX6CvvmvjfW z0&)LuX=M>+=v{E@>M*G&b9--*Cz9vg5h@bs1T6SnD2!&2<whAU5@|i^=Gua;9bod; z0cc`!I}Cz^O5{YyUEDfWNJuR~7?@C0B-foN2Isq$q;Y|Q_ZE??;ekjm4k@mqvfIf^ zsDq(A0SwkMSU_SM(r1083NpS(bo5T5f^CR~?GglCnua=;07(D>oB(umVmsA@;Y8_( zLq$3Wx^hC<tdX$HOOWSpr&A$|1VALWWiTmem2W!~BU_iq5{)?pA%C7on-T3GMFkS? zv=%{QLor}v9tb<66BEhPN~n@QfH%iH>z%VSN|vYq$NV?iZ@w(1)2w9n#9`TZQ&FB= zpAZ@H{SWD6eHk{KM6|kz^pF@$9*YpvgAjDMPiyTqqztWP{4tqxUUoi~#_j+tu&I2y zh;=DBm5KO_h62{>r7F4u6Ul7?h3rI{C}f^eQS@>}1XO(o$ZQik+xtag(QtK?pa9RN z{Sxk<2(%`F>qJfg$OS5IN{t)K44?la_^63nfbmS(booVarBigd$v*~K?})u=%|58H zmj44jigkd4%EvP|pmSK4GR$EmTs}AAa#){@!)dL^K0lFg*ifX-X=_kEKV5g&SQX7_ zf1iC}9x-v))HKZL;8DKte)q8X1rC>G=nZ98@}rhMs>JsRK2M%~jBcG8&vcc?FkRs> zL&6zbpek>tKoy`x^72Vmh}Ac#xR)aoavqMxQ3C>-(IO{?fFMp<&uP&aT^KL|q0q@p z+K^l<x(+1rv5p}2oF#OF#jh?CPzY9z3<^Fvu+#_&5U7#v#1Tchd&rU~$ZC!)LW_j) zdNCMOK!-}I5c5qbE=Zt&4&`P?AgC?Q;v?ZrN7NPvaMP{3bN38-N8cn65Gu5NJZupi zxqby7{R3n2)>L0RT|~Bp&j}TNhZBK{h1h<Q+8b57lW;P0qsvTX;0$(_cY@$&ON+o~ zltm7=oa3!x9LoA&pFuZx4<Z;3dYUenjD$VUZe<m53wPLh6x22z_c|_zp)ylh_jDp{ zq@f6?JQ_ZK!bdYt|6+k1&Suk*Z0)VKPE&RU60Rm#n;=476TwESEECM`{6e6qC+=gu z${W%je8bxRp;dZ+*wh~m708Nbpe>js&HW}1s<(F#?-`{=5>~{|dKN`Gh{ihJrLuXB z=V~Vk#x6nDbTa!EO-Rd-GJ=6pfc+&@&xgk&rm2f$WIIe;V&b{Kh=-O*puDQdHQ37* zb$wdG8+OmQy8Y2xr7qGPYtvWRpDnFVhehtDw4Z<EiET~g=i19y$kL^Ld1Am(wU>Q% zzAnv85liK=l#}0sfz}LfsUJ=aAz(yN5XJ!IRY9E%<dP8X=#!JnRwm_{n<u$kv%Qy5 z>DSe@q{KBvDh`_*(O)^lw!dB1IBHw?{?*f<y>|D46r(2V+x5;4Q6x<QFZO%iLNuQ( zlZ+m}zF)t{-F#|G%Pr1>Rj@Gxt53qI#`k_%u%#XUtQIB}cS~H7zi8d3v@Ry$InH;p z-`Ov?AP5K_9C7800D?xO2K*luG|~Nk#8fx^bVde=88X2Se$Mn_dB0vdBh?=om@hB^ zXQXDS8~&ekMt%sIe}AU;KfxLKJ3#~gEvDLA7o4C!00pP$pLR$mS&3PJFB7Vjo_O1C zmRbZwZkAOv0W@_)6asUrqJf?S$*Zu4)vl7(yo?#5`f*^ZX4Xraw8oBJ^>bZH*(FW= zg4Gsax}N3NPh0(>sV`nSBjcE=4jFi6K3o|us<s?r2VVT5sUNSEbIWXAF<sF({%}U@ zD_egEnxiR)pG?<BBF?X$a&7~0Ne?OS_0h+g?Dn%3|3OplUUwe)M}p>JM9npVk>-2u zI1z7!09-@r7fs#pe&xZmi3c##Q)R+A4919h(ByCNwDNG?{x@gj!O<hPMdzac-*ZGF zDu&<DbKw9x5HuJFl9~}FM<R{!Ts|kd4FWN5Af5O>7MAQGb(8Qv@w0Ose}&<@@!d<` zGFV@X+6_|k`cv9Updz`WCvLl+cORf?4t8qAzjdH-pKtffD9h{+@I{~Rva@%b`<F_M zX75cHXx8seKP2@#Of*M859qu`uLq$=X{PTjK4g4x!krQukBnRMZR!+_DJS6ju41d- zMcnu(0`Y#A2GpzD^c{ys0<{O@^rE%{%&e(_A*Xvv&nIIb5A_UuXr_!G0K(OG67n0% zQHIQBh^1|Z&=X={7zGCqx7CDR>(MB&>I)!y9mj;x@xey=bvJd<moWNki#7=24iG(g zEnFUw=gI@n)Wx(T#=Qc-1xl~3X}}^UL_x?60GG`|TMQFDA2=d-wGpKqWf?L;HlC&+ zm{1!%Np^Sa?Gco2euu{6S&s4kMm%1^t61OM6(tc?sPti>Z;+bO$v{fqd;0+pBA`Hl z(JO7A&MYX668(V73v?spRpKLUX$Hi&k~Z#Y0=C*J>z1r?lvZ7GQ)z(g#&MVN^e(+u zPd?Yf{z22zy3~&ILY`n{HFLi0w4=$7G973Gckv5+H_8{0GszV1@oh(sOfjO6$tvs< z?PYfVWV&K%)B5_x98q_4x|7o)ee=DKwmzrf{SUcpT0W7xIp~JcvIJ#7Diti5`eBJ2 zg^G44y<RTqgAG~UHtnz~?I@~`B}zB`M$j}A^7xgi-8G(wjhx7(6||8T_nwSAb<HDr z!>V}Qvp<h`zXbe?=}Po;C!`qIL#4!&rbRXwX47vjdsF3dP<|VS-LRK!x-Q|M!b+X} zQqVNj9aK6*vzx55&9qG%RJjkc-##jvd9iy??T^D@hQ>bIWkDn&6_Rg3GC2EM?65X2 zy5b&->fC_wVO`pAg_ZE&+=%yKeGX2gwW8|$M8;u5iRr9VUdsF%NN!_IKbF1a!_Y?v zU-PCGQv)QI!G-tu(I|I(DjhisL(&V(TKeQC9DteLn%GgRSv!$yvFf``<D<6O;i`X1 zQ@>q7nfrYEU=%w$0KbK_2y<t++W%<q!^P>*OLBA00LP?}@z+?__(^MIm7pY8tZ4$& zo=&p#CZse<$6cf&HCHpeOb9Y~yGG;lt)}J37RC;oNRS2x@o5_b%)zCM%EPxps`=Wh zyrDM6V`zo??6|i$nKLe2?H&$i^ADQ3eJRm^9Ew_1w3C;_$9M?s0G_kU4MyN=cTWb* zaQ|ewYSjPavRwyasvj;;asV;aM&g1m>a&lA)+NtQMwe8!pEh<7kbueQOwIZ+Ea)Nh z-v$_6nbAXaCpK=}GUh_j0I0ivdIz{53=j%9<kufnspgWBj;K`rcPxSole^Nzqfe!S zF{xA<O2+e*lt+{X8cHXNwenS-s3cp#%M9yn-~BHoy<{au;&5XnRvPu%YMdOg&1$?7 zbLnb=n$V}!MBv8hW0Ib}&BtUztAClM_S+v-3J=@XS^<Z$%=$(Irrt)L8Q-=vI2tek z3ev0wiV8BWDCuD;I)!;Dz#o<5dL%uhBuvgWok$u{Xj|T(kt$!=vUX(=u(1|ikxsL4 z?LOD`F_#0RQ=u*3kNT5z`lYe))uly{m$p$3SOi~NR#VyyYuAc^Et$_vTfZy<R395) z)&P)BWdaAky#!tUQK6@*JeEgQO&wC$q`o}S5zOb?F*us`zmrbiEB|2;{P{=i<*2Wx zAFask7BVobm#bfUwlpG%#<@RsNjmNGJns&tR@9vBB{wk9R-{qaG<-#&Vt_+OgD8** zpC*Xe5uAl_p5LLd&{aRYVRaTRL}gq3E@#F?ssx47Xr^+JTt^R~t@z%X2Chis%|mqz zP|~Z8m!pJ%Eg9rPnDFX%ZO+z@N$q}KYv)G(C#zX2N3E;5k1s}nfrCHIW?8kQ_g3CZ z-1e=~QHMKUXmrg1N;*I~ZLPTA0{*BZj^{glEY-d@F*vHTdxjr|bVyB#YZ@=mUNgJy zGwwL$d$fS454<~X7dzgy7XD2a8&NY#dKk<JYB)8${G$>SYQEI^`mMV7;sVR86~qcq z(s@j`u@b<z@N@{@57Mcw96&l9Ga8=E26O*OI#pEa!q3<ai9eyne6IVP$Uh8u*48|A zZM_PoZ97b4C>PhG@8_(+A{p_TrRS~ZB04o|9{!9#5Yy$Xp&|u8Pw5q#@lK@SP#$q} z-zzTfaj(?8B@%Il5Z;(I6e|H7;tN=qK-*5VQ&c{sxoc>AvUALcEj{(oEIsn}PHX^n z0WFw0P=<Ur4z5-}PtxC~AhsJH7gfN>qTH`yyql0VRKP5JNmEO()IBd?{W)tWQ7dHQ z4Gp~6wwqj&Wk3<(lB_qa!{Y&oz_aKdynVWx+JRlfqv#c4PQI7cr&h$5+CO9^wwFE@ zRU}ZXJZuYqA7+P`?{^##5L@pFw4Pgv$Rh_h$}*#`{hBrGJ=u;bmRMIF^`76$J{~HT zJQ8Kh*WXR#gdG=4qp6Gqk?-fAtCz@<42&(=<mPsF8gV>etq%CDa9$E~;K*TDh4Wv< zQ0^`VC9wX_$58%jL)!oMTalC#X@Hn>atqDhm`LUy4QYQ8bFS74_0eRCVM3tIl7h>^ zSyEK?vlXd%jbH;>k!jnlUxo9^TV)4^w8a0UaL)eOif}R60)_LJxB6S*1Q5|b3g`LZ z*3ZKEmm#fFtd<1F&d*lle#H*ptyX+frrtww>0?YCTImzKX0|)<vUKSG;H_REqLo-G z0YtR$m;KB2!h<P2g9it|koH$AViwMMID0Sk!Qq_sU%ge=-~!oqp6ge{oYXHz9|F+0 zju%5n9DXmHm+OVANmt%#H$0fI$T|CDJtrI((%Rma7F!F>t~%8)t@sKMb9%YXJ~ybw z?0y1IU9A^>J^R^;{4AWndf`@|^xl{v_xJrN0{}xgd%ybo;ad-2y>KynG#;|-7%g+M zQCxj-`nmZIJ@IwXB{7Ud)ZbQtFXtdA;6LXeqyO?8#Qoo+Tm30=7Lss&EL03ORsNWR zoTUsSwOy?OAK6E}2)JCRNGplx`d{1N+FIJZ6q~hl>!Q-N4Ev@}Yne{3udQdfPTQ<M z@mwqYP2~Lbt+LwU%K?-BB(^E(!nBKS>7qzUp0UC#i#bpUax^A>X>L)OKBS{|psb8F z{mM1~-fB+v<s2kEFVX@PvATH|CFsEbGerGlU`wixOErrG2HUdN7}fyhAi!JY48}%p z|I)lz#%lNLtq#t&Z2l>7uHNeI`hyog-|7(euQ>>SbH~1#gXosp|9GnuWREZ3>gSza zTC_H4;H}#K#Wui_aQR!?;O+s^rO0{yZb-qd#Cd|0epn!i;O}jNSE}N~hcf|8ATltH zi29Xn&}4u2CDme|?cjr>UvCxh58moSHTkPm;8iyrX<!xjeibkW@%VcAR!6Mf<)vO^ zqg7lpYg6MspF9o5ByBjoS-_xord(D&Qv6kGoO5=oUX@keuo=L)KYMkBb01Ci-3!>k z1>UM1i{HW2hYN{cZ<YJ!D)5iD8qD<Ito4CoIr2=mBjWq<dNtzW{OB730V2e$K{h0% zLzhEl1gvFQ=?+wHMsz+gq`N}EjriZ=+!YO9sLDr&BnHxAa_*%PS*>9rj)So7D_tRD zMI<6HA6l0aZu1C=pPL&aFlm1*R1i*;C;Yxp@l)hjJXgw*Z-K;LL*2;J&Zd3Mm$4IN zt(H$dgPy?P`#Rb_>aMDlw1VjTPK@VJKJ`(bVoqOmtm@p<3s8T8?R7?UlOZ@hIsY?M z3p&Pc46E`&PO_QDIWY<{Pe=uoNon8^v;^$JA0j6~AN&~|TeDwf<yab28CA$}UwP1Y zemA9MsF2I!Pm!a1*qdHrmiFW%PdX+-!7_*uL`;`Q{TPE(lO7N`Z_$zKt`XY0>}4*> zMMJvDV3-Mee=bx2B4;%nWf>4TTvo}4mm;U1Y1IF8@2O<hsuV6kI&Xzj7U;PW39*Gn zg^3Kxv08~7k%bWa_all+m4o!taQ#<RPF+ENA|2Vkxr%1l^7n>o(<1pV!__pB|EJ+v zP4~Zs>%R!w{zsLQ^(joC4VWOa?MoLV;RBTue%t#~LE3Jq&gBI8r^=DK9hq2G(zI!t zl2wF&ca{?h=CGC9U^eJgG#s*-0GRB>at#=^4<Y0=bGd!|Gp_dBN<E^j&ka+zd!_5& z{8TxWHZ%TL?V(+jQ%3e<o6E{s6)*-Et{yG^Vt~qdf8P<Pob7b&7pOpcSTaY>-HFcf zN99!HsC~-zMf~^nkoIyF?MLP0w!EAmM@<i~aV^&Q@KD^`8)7O8*^<K1i`pBNj(ydE zd;{&l{`e1-!ybnAl26kJjapY2$AZ)*Do~M9Tj8BP^qn9uka0bbLBrB7ZrZ!;9ks+b zXKRYoG&4<Jq)39;j(2x(azuopy_cVO?nLwGs1~5{A;J_%!?svOUVAG!i`?Xs;-aK6 z#U4+NiQun5qe6`3HZS=JNS=fgtPl5Ymit(@ju#^Co_;dFd7I)>{iK8W=QiDaZwtH8 zS8eZ~tM0d(-~A@&yVJgoYq~x(L)gAI&Tn|SuS4zlbyt&lJN9T1QQ~)SbwmMF&eh{h zEOfuK?cP}Wrrnv*^E3WAhhLQwdr@x|AOzK6KSEW@K_>Bp-Q(S6!2*(lX_RCV>1u*V zhjLKa^FjPxj=`lTIp<>5IaonZ2}X%rOwoqGH&CZgk%&&IdmFTQojhFEOq6gdr#q=$ zFe0IYEVK~To;L_?BC$#D)5#_o%5A}&ZmHQ@c<SxSUbF2*(s$KIvJR1tH<gjRIh04* ztMr;r|5~KgW##O9E%dWJT>rrZ)RYBL9~n|%iYUhVo`++AmHTA>+8#35(lLsHn;t2# zGg6BLp)vRO7oyY2fYGCr6>8Gd-RtO7L<-p+3G`jHhkvb{7|ZphZEJ}y^oFs5K9O^r zGhp}pY!92z9~^+!O!+|M0%D0GxX;!s3rdF_yn)JzT`bb8JmQk^*UAaBhjT7LUTk5R z61+t>aLo{-6-rf4K{zEp+CxIMQZ;l*AXh6)tU+zgw?vLbWjvC2!l!<skAQPNY4N6< z74^pw-4HF!7Q<EaC{YV3hBka6I3cTuQ<t_JnO3r7ND=pNsfNeEWcKNPF>ODq;y#An zEBl5L^HN5g)PboYv4c{r%T=_DWKJOJ;*V7{qH6)?o6<3D1lATI{uU_Fj7)7~4Q-A5 znx5s(N{ecV12@?!pOxP}vdym9eM4V#Px<zR%Itu3ZVg<$;t#`BaGi<aPs8=gx<Qdp zM@8mvgc?TBWJ1&-d!O&B`SU!z$MaKkbYJ>xVfeF&1P$&?hGt0Gymsn!i_!(Aghs#H zh?GD;$vHCosv9QxFRU#8Z#Nu-Ewr&13~XsE{r4Q(_3I(y_5DR*o2$^W0t!1r3k>jM zOY+>f$XW7Y{^Z9t%~=C0%kzu{)K-f?R)xTTbQ+WuWwWGWWKF)jMhwwpbJ-2wEo)LR zEYoXQ1G?b>!5X$--S9$s&A<;EvHaGPdKEj?%fVcwU%SH=r)xbfuwJv8$Kn8N8V%Am zT`BCR$pAlg|1aHeCOjKx5dYE*|JpQSU~+mzdLMiG6-jp4P9)_cdq67@^Z;S!5x`*1 zRInppkOMfj8xmM}r8q3I9u-HunqqQ~((ar<kxEPv9Svl?k*i4MYRw+viv28W*TfA3 zl^&CKTzhEZh7AHu$ZA9r6KgtFX3YYbap6Fk)A!d>!uOxkQh_9-k*QpJ9^}t`<w86` zr9$Zm41cSc`-Fm84lh@ZMxwb-_@(e9OmQWI-)(cH@t_lp+H+$#Z|VEtc&}8R!TZJG z>|5~GPZc-Zynt?)dU~_&jK%Fsizbl^U?aXD{qkZad{?Tw9o=^uun~c7Sol#ccx2Du z0niP9s6Cj?#J#RnegCQ(zEs$;uD&NiGJ!8DbE>~xoNcqq$(&2@#sz%eUw`Cuc6zC> z{g&<|LVzo(_n`q-|A}Kp6rSzCRax5MNHhWz#*QGUYXV`GMJGf=E{JRu2i;Dv3rem? zyUxGltW(k@OO_Kl-r40viT*=jpPT$?BmTa!Y~f^G(!;zN5utIlviw&YkylakEFAJe zNr3|v04bi6Cc{_`5p09WG5O|G{`^n;P}sear$1~&v>*QoUA;~%*^X-32Knfu9a?&4 z{^ucvW(jW2j6ZC|-Nc+<3VS!{(nd7sAJ7MEM8pjS4*pLBoI`c&nk|1S?5r^uA>WW0 z`6RQ*>>_XKwH$PwA2#Ajc)%mL3WIZ&mAYYHobFAXOgRi>ax5npQ@|bvk+m}Bh%y1q zYQhtC?X?>cpg(NH>t3bmF(&3u(IBk)zO;YXh?T{Cp<)68+&}*l#`}4s$t8^ZWr<-H z1qPJS*w=x<T!O89HnZO_#<}5e5<OEU7jSGBQ9qt81W6#K+mLfIo6KG-#FE4*(+XFa z$|FB0QBt=>ye|3eKT(}Ay@$k`W2^SQAOE3?CAJ=<Oux%|=#lJdCN+#**2x>cuB@j* zIrNisZ2$11-&H;a;E#~}Je9su`HL^nQ2*^cQPDW0--kenY^Hw>ff~!+l>Zt6g`&TR zq*A?FtGLES+84GoABx0GuB6&r^{(A>Z$xcJv%imksC$#@YOTU>j`Da$KNl_3u7U7# zP|MZ9$t`srp0G|H6gq5I9UdH+5#mC*DGTHJt(ls;gJGoM>xpwMfR`Da)}uy)r@cpg zc`E%64o)agEH1rFkGT1lSEthFUCnEg<#!M!JZDGSD}zrpU%vQ$cD%RsVf5uopgWEE zs2czwwq6WGUw&oqvwHJ2l4@fqSTBXjJ6m;PBlJiKQAvvg4d9G<A8$ukK7mgnv)1)m zJm!%Uu!s_vwqA)AS^L`|P=SFPB`^fyVzQy3Q4^X{{9_1Im|$)H>0@g3C#1jnBk5#R z4nO^oVi&Ww|J)z>b59gFIQelZz4_@kmH+R0nHCs|SN;ev1ajAVC53|C3B`S9T$Yh9 znAC0x0mrvzI?f>Fa1~682`@d%DuZ+9pI)t1d<ze-M*6WQ`b*{S$<y)z{)hynEOGHX zND;^0emsCI{BwLSTRewLnPj>e6pUBnyE`auu9i3?9vYs2GK6uDUs=4{Bz}M@6|yUp z=T)&=`T6kko+U)8Y=45V^_k8j9~DlcQ9-3L|BYLYa(u(+M(@}l7U6nAk$NO+lViFB zevP_Rs_NMg2{&o{K8kvr=4x6#gkI+)PT>=qnPe2drn-PhrsnP-mXMtf5oi=bdGVQ3 z2TL;5t|FQtFL71~YaV<(sde_CP8iIK{dymb31FX9CriEcde0k=9r(U%y=rVLa7&Wy zD;L?9v+Z_*QTA_ijS{UpLo`$8)sJJ7_;#^%x!Jc>IT6qLW=D&HiYRX3Ss&w8`svQ0 zr+=MC&vJiyZE*Pp;di;{@;hWGklJ=6{Uo=U<C?F!m?ximiQH`<kFbpbwU;fR*ezQ$ z%ib#IO}%j#1Dak07#Y?=q?zo5A%569IdY)->{+j2uSvcS(iIAlnAuSQ4E<TM#!XNx z@>c<_^Jd__*WEi19wzSj7#zf%1W6JuJAc_kGHkztmm#z}Mr*pcvi_`z{hZGF285Uk zC7vXsq|8{6!Tr!^rCMf5wMdgGtZ*d(1wMzuXhsbBpxZOD1)dy_kyKYy3rKTOcsgPo zR^b>lyFCNXN|3MvR(v-}mEsn)Sr{i7GKo9-DwHM+f(e!Bb}V1anAXLkXs@O~)A>Zb zKPKj=F&Pcz0M#2`vZNt~@^(Lk_B1Poz<e&JO=~92hIMLEWZ}c1zCj_3`ZSczcf6@L z(!C#`IR?lvN1n^Z`J4A-q?zBEOTi#`=Jq&qxfMt0MK2Mgt^jG=)q)kV)9a;9t1&Xv z2g^bZEearD>PRXI<=RFh`E2qlU7Qz7i!bx);wG`8UN4a?O&SX|F3ZJ@w&q*#B1BUH zs&^$!j{nE0G$A2@63%{KykuDd^L0x_x!L#^qA2$>cJ7Kj4n}+9SI%ZwqKsyur5d!# zU#ONouC#bF?<o*A#Q%Ln;?Z(?FKuDA_}qqUbQ^&Ha&nZOAG5iffsU-(K^ZB=Mgb6w z9~<w+N{_OY&H=1d7;hliyKTK&Rhem<Z)Cgke5-tS9=~++pc+2FW+wPi(Gv48=YBNC z!Z~Jc5Ak4GmG+`p@GHZh3T-+(*KsLBy}1~d6gq86)%$c7K_O%6OsVP^cUT_Nj`Z*| z6gQ$faV@`!Mnt7Fx-T&}AgK<$I~8JS{?1uN=|e+>e$?{7GM-xM%;+utjMfvJJUhgW z@v4PN+2clsin8)|`qzb9-d)#w$V;E~DQu=46X~1RwO4tcT&$jLaVERWDSwEP5PlK0 z>`*&Zp8bCL=q2d2Iznvu0|+hRCH=UgEPV?U+(IZyd!r^Wv<?K(^JJcCfZsdSp+eC- zX8rQ60?vdDOLLKPDzr>}0goiJ=evi5VHRL#DFHp6KI(oX>jWpTxJ!A1Emxo_RnYQt zBIcdh-U!)I<JH-f{m2&Dukv;ICU2qiy&^~oMRkFk_Dh_(EDX?_d@|F!DXhYxbkr$) zxyz-NH7@Ch9?PJIa$|P~xbYZ=`~6&MySmnGg;u*9n|QLDJ=U&=rZa7Fx<+f>FpZQm z8s@Z#)^akWI&$)Qz<V3+MR7e|4Us<>r_fJI%4c2d9s(*z!9>Qd*(9hn7Ksc~hNfc6 zDTIsBhpYEtUDR&HLChIYa%yDrBsK~H#OPS~`0mg9+6ApPFsvtNl;3%78`LKn<L%#v z{MkOPIZAk1!r@Kh1KG9OkPbRBQsruyI?!TT27RepzaNgy=K^eWBmsveI|o}BmH;k_ zGz|MmZv`>jiJ})xkw7k@($PLvTnR%n0J-9(DZGw#$xA50?q$@+m`uy}^++Dwh^#O9 zQxtP%2s$jyXuh3@M;Y%)h2bx_G`3yVxz-pvPmJ&bYBk%?RtL<hDw%e-^^LPc81>L! z&U8PB)hw9Dv}qhc$ZVCes||rgTl79ma9iCC3uI8d8F&O<!EB}+hNipUsIYXi`!+)> z%kAAf>9f1^>ZW1l3;rQ%>aS@mK0SlBUhg!)D+;gujId|gC4*<*+mut$2j5A0i}li| zm}Y;wim&kPLEA}<&&6I2-t!Gb&C{B@OLI6zwx3pdg5KOJ_~KyPY{>e3SE#&XbY<r> zgAjB!u<AD}gkSd1^N~8=lJ5e98~rO5(4lW+(~W)`-$ldstEw?(@Kew{crdlTpi3pT zpg4{&32}U~{S=L%Cw458AmO65xA**zw|0x0VBur|adABQ^5SR|aRG+vv`l(ceB`AL zVomL_h%55eO(JwkabVstv!E0C)&$Gz<l2_yL#>foOn}y-*odr3q9_r(Jj81-fF5|j z=x8D9R`@%IP!><3$bC@00`xA39JLk|5r9&O=1o_k)LLY>FdoQUE5(rv9iL_@Q1qvz zdqkrhL>BK#7Z_m58;F@3Kv_#$wiKZ1hOA}CVGiQsCZ&?@g*Lu|1$5Gr_Yp`Ll9>U2 z&m(HPKG-yUzy)tuFLIz>t;?=?xROlxgic6CC(^}{+V*{7H4*qv`gb3PFJktR{!O(L zmS7m+78stw$|AB25=x8k?lQ}6VNTny&ozv6TnWk8vCn}$nAw3>pdhVHY2~BSP)LV9 zTZ)_r0WUYO&@M}IZoo+S!R#&2y8EW)=nR&I1U&^I-Ad3LbQtACRM7@ii6Q|tEjKnV z2vs|pT!zf3+ZgvaN)(xNHq9Kd7(k6g{-Fh`Y5=uSg7zvwk+<>qXKgIe$yHcmq%9xw z>^=t924S`!%^O174PmHe!7Mc~By<p*u~1TN5Q7eAyUQ$<h&YQE%)N}X!|KfdCq0Mb z100abRODA1P!(tbgpNO{B@QLt2sbwllP;8$C}^VBtzXX3909W@&rKxhOhh&3+bj$j zScl3+Xfp&w@&zWr=#Wrs@K^7Vl?z7Wibm^|K2kACHYBq}5QH1eCEq?tHX}>15KXyf zlww5|(c+mBupDlyOvQBVIuEbegI4M_5qxz~DAfr}S2Xp5b}H&pEFN7nMrX2bE48C2 zRGti9B`qzqm1@-mLU9N^Z;CMlk&?ZRB&`LV&Zd2aNqsAXMkzxjZD8Vk=|x@{CFvPu ztr;ZF^x+s@jM{Lpb_PByxuT!2*p17S0jUHKNIMxA<1q+;4IPK<`jD%*SHr&*mWcto zre)kcX9oAm)PaF`l;cPPy#th>P_z5?H!>l$cBTj=bqyzqu4}N3H0Z(!^qUeCPY>m$ znZ=!^tf^K4ey3Ed9ebue!(1CEeF!<v%_yB?$Z}r53>hq+EL{NoNkT*_V%v^@RECs4 z1L2f?kWQ$d1|{yG??)%ikpanyJVBvT%<6PJPcc_Ecy!zfB{arQpo^gv0FQ2fR~4U< z7?bAl(zevcXNL0P)Fe;^LS^Jc@TB>8tdJzU^OK$FrFv3SFsZua(lpzy>4+8LYZr!% z=joS`bTXwe$Ov|`-sIl(eMPLQ?4A3h4;p@qXVa1jkwKnb*2$YJKm-KBd!A4%h1@l8 znJV_^Jhm^<hbo81P)qy2g@gD?HPlxMZy`3JdvFxYNPO9`&}?Vj;fMgyQ1Cn)g^nDC zwU{aVF_TgOx{ey!b;1cYf`Xlp4Hso-^XZMZk+Jw_M_D29r#X-%NWU@^+qSTtwFEOT zeM=dCc`9uGAbQOcA{q(}RDlY7f~F>?4j*5CQkGrN0(CjTdt(bta;BJPRdgkgd9IMl zuHvW>00o5fa0ZO51C(|G)rbRit|bt5l3+Q(yWwCo6@q};R1JAq>iSA3Z!FaW0fN@X zX1ly_yaYctj-$qoe@u>84Ek0iisr<Ha3|@o6t;C(f$c-4QAS92R?B#+ZVRP=x%?)% z44;7!w24fgE3>XHx6qKSeiX4JO#@3XkPe+2s6}zE6>6u*n}^~WMS;ic?oC1&T>MaE zkO>B%u%r^11tKCN7}Pp6(<nr>+0F)2hL9cRbu9yPyb-lF$dHylK(rCgTk$d-%0Gsp z!9><>6(bOVba$}~!b{(OjAyzn{V^jLkyE=rYj@D1VOvgAdc*$^e1mi>8_%4N+|ZSb z=a!&P%N_H0QlDE=k#(elHc#wYN8?jof!hjhwdJkXGHDx0%vC(MZENc+A&oa;5kW=9 z;(CEZzcK4=beGd^v#p<3GqfCP6PF8Jf<X2-dj!D3g^5{P?KL|MBg%dv$9RxIJMefO zBSYrMV~SxBhLWY{jtE;QrePJW1!rFSbM^6dMi>Mt&A;dBu$57cwN$k6m}ckJ%j3+K zwmvWJbiO?Bk%za*Lh_%VvJ*Qos~JL{VIXA_b<s)8J*AfExS5iUsSWD6)lrbq36tR= zu@8A-jAD}s^&#&f=WT%I#$Jod{@McNJj3JQA?Z-AW5$M|<a98T!p^NZ84TM!jbXDQ zWhA^{iT-@aoo4J#i&Ob7v*u!%!EOTV3?@1N?wPnh58Y~MW~og#w}U-*FF&~zMpc1) zBflIgUg6lLN16ggCxW_lSc9mkhRB2tr+Y(ryD_w1kxD=@&+y5#f_yk&yQyKD3(#BO zc6;x;1{qKtL}o7~Qm4|+ZL;ks46W8EdxDEwgsCR|8Q6@d2X&chBpBPh3RzWh5p7Q; zs7YykJS(7IKD`3VGzH2)W6tmbHhPLFiLeE_8^}z0l0bGzuTho;5ZhJF6-5248ir0r zvb0=ffv>>k(l4&XbV-mu#D*oA3<<_N++2*)G0P(E?0Jec^yVBwEl@EMHLRBF?V^{; z!q<nhW0%jwH7f{(@DGELhBl&zs+r7>#3N45M?q9$$WQQ*&_}?2q~U_}-zP^i+{e=B zicw{T2;v35<^?d@_u_IAQ(?CdnvY`cRA_>RF=PhFIEis;`mpH6^X;I6XLur{_7tWQ zDM(rEh_!L3j9!q<B;Rui&(%Kh?~~H+9?eir1uqc{t4<j#O%g6abY{7!8Ol+VChp`; zkv=P0Y_%ruM9#Mwn^z#5^H#&pN@c)`Abm&HL<B1lMy0_>)S%^JiwYs>oUU($8fy)s zn9rc(PN3#a62egH)#}s>Ku#Qvh;391-dUO*J6_-Ccu0fzo$^g;VSV}u!^J5CSkJXS zLvu<3CR&;?%L0I1dwW%w=2#3w460f4D)0nqNUJ9nal`TfREQ1M$kZa!E_(ABl59;b zqN8L)FQGmfrf4Qs#7N082C9Gaj4ca#t%J*piR;lh-p*PJ=?xzdrx8+<LMRzb(+Q%7 zk9r@KR_F=K8>QzHQoK_L!ryaAe%M4m)@c4qiF*A1zt?C~4{4D@VDz`W409@etkKvd zLoRKi&38T?>RnLu@ebdv=Bw+Q-nSrHCi4iJi)-3Ha!Hcw`hVn-h~r}XvqU{6%%Q7X z5;6}k4PX;F2Vulq=8`l9u8rjbiF(i54z_0N?S5N%lX6Bn+1r>*wJ(41{FhDSe~f*& zx8;cNy|jr?Sr>oWM9d|Ne=+&t6ja1kCAk59_HZZ-br|b1oH50EIpS14Y&nu+69uq| zUbC+JVH4%+Ie-2S?F#>OjpqMk6RnBf__^{XJ8--F&LINrpRT-dgmf__eOASx9ApNQ z^VU?<PelrFDns?KSQ@T5mw#!-7F_t;c+GN4ALVVKAW^How|HCwtDxOisbS2>s<uUP z{cp*8YZThxv+M@P4$j)GYW+kaWhaHbLvgNB)Rk*o_50MmNe!Tt7VZWt3S#F}=>9F1 zw#W$kS_PUrNww8fEQEFa(UPC<4`Ovb#s~9&<@XXr7y3giuRYCTeJ$>h<UA^iN8y^Q zgqY{+C9bp|f2PCo;6OqC&U4FNq5OMQ?Z)Ap?%8Jb5E<~C(DkMoqw4Fn^`_$GLOBn% z2zTn-C`6hUe2)<Nhsk3Xep>IDIo~zQhS*^^E#u$B;aYJOhlr{ptNW8;g+F8wQGCqu z!o&Ke+&vQAfCmRB@-`2}cG}S&a3wCKkJ^YTI8(Sb4Wf5)O?~1JqW$s>Z^|KVyE0ud zajTYYbaJznd(*Qu5%s%75dpu{u_oRq*O@NF4sROEM}0?syG=^&Txvkr(f*{K@7wi^ z&*e{Vp0Z5DUVK;l^4h2TTjIUzzS!HQh~uW0A!?&MZ!J2IKeI?Z=X`YwYytyk;>$=9 z#XTg-ntDx}AXBTZrAXt7`IcNsw$&*&gjFrqkz=N_Cru_a3xf{(1JN_GE;j%BeA&)Q zLi{?7PGM4?qp%SVlzK{6IpIumIVExEtW@tuJ>*S@2*mk%Satd%^aWtV^?k1#YO5a0 zl+u&-ZqV>1>_j#3tvvB9R!CWd0=vQt?u4wpV!#>=b1C?8ji$z=CRPhL`XwL`3+l7w zAk0w%foI9ZL|o#Cjj+`5F~}Vocep%Df|>73l@p3Y1g5U4&>WA2<IeRW(HkuWY7k{` zlE?EEMlmrG5UN!7?4}@i3TthRC=IAllW(>ba(n_086||_^{FwlM7QP&3(2Ps+_Qq) ziV&NtJk)M!z$2{w6mJn`nf_KTiL2X-_4>ZGv@T=u%`T@9>Og*}PjAt=-=xDNLy&O% zPkO~aks*@3P)m|brMsct0vi4*OrllJ0sM&*;lepf*`M{gC@^iu_K#iY@tit@UUr4E zMIoWZ6oAQ-a(Ye8W$aDi-B4)=y)Us{ZUd}9svn#u7$x&m#O;$Ly9$d0t4xaDMwgt| zK(T;pAg!xsmqr983lCukD*uKok-`|b=(H3=fL8WqB^z;wOR_de<tW+<m1%KV_KM2( z4{C!0jMb7omG**@#w(XL(VHBn=fE&ng{om!P~G2B$qZpz)XB_NJs)_@{POz77PA&B zqx|lzt^kN$lgt|L=X+iWlzWWp_3vA0?~w%spk!Hk9y7qLgee$M?)4<+T<^0r+RA^4 zNI#@0me;T(i(7c~)}1zmit_={?kzGL;)bs8XeRty3ro!Rn)v1`Eq%7)CX5Z*x^b%R z(X1NJ2+4&nKB%(Iq_`EHG}EfJ`~R_b*HKZgZQt-G=@>#l1RT1%rH1a5mJ~!<x|N~3 zQ9@8qN*d{sA*34xM5P2oK%}H)o<Xl&*S@azx$pOWpLo~0|J{4-wf9=v^*iS{&*S^~ zI(kf$6>J+qTDH9P?kzbbL+xi?vVW+|Uc@)$@|mU|PWYzcdYZSQcf|F^T*Uz@naYRg zZzVV!0mg?}hL>kB;O($HBjpkqlcVawYIc)H&{(G|=CSZ6$3$w&E#%iV^~B^OZ{G~n zF{(U#P3&HU`7s59FroU?yZ8hA3CvbU`^)T^`OUp)NUwvl;93_oNnUKXsjf8--dNi4 zk1xK%#mLmAfR&LfGleAF>Kn4Y>RC8`UN}+OjD}lB?#rapa9v{zAEg-G&#owEzTkiZ z{kCgzuu0cL$pdsX=x`r@JhY>~<M${Et1|5hpM$io!$ibw*XR4I?@pC^%3@e<7I2c@ zVI?M=GML<n{l4*0_tqbxp8OtOs+mfcGcDtlo$NYQwVLa}np?NS!lMLbt7~ZMzD(Qu zzZ*|%s4Ld|>UityH&M?uP(pO~{4nw$j@0`4TGDc)MaxV=@!i_TS`>bbZJ#y21-w6- zKOSv-bu{wr!P(iu$)PMb5pO4SUuYgn``El{(KX^8JJ`<0Pa_Audu6F?d4Y%4gfVe9 zF_4Cx^0=vA_YN@jX-^vCKSVt&)x66%@$g+OOq}?9O>C@r)OYk(oS3*}JWA`}*|i_* zD%vfR8KYh`B_&_V95l@MU}XEqZ`WC(TI78yQZkAQ-odZts%YhXk8zV?)6W>7cTfHP zQcw{t=<|D=ILk?F{%G{*)!9dR9ARHMor|NcYZp7w+HGE_%Hv*%2T62(Z7VTelP|1X z_X=c%*F?uoM*p}bntXh5P@>(wVKf#Hkk<OWI;p+Zg7<9h{l#I^So^l`SfCb3+YyTR z)i{Lr{Au;e<9_W|dl_TrYZB;_yQH9lVws}Bo9NTou~&zUV?VY9RX@cNgK7KP(JeV< zx#ynZGN;XQei1Z4R(F}`nE~xU6YPIlJpNN&`S?G+cwG8ll-&ODu!fP`eqTKP$HUsM zymH6S#pC~SUisd0ya$((+q016pOV|T=fC~M^#95r{y(-B@h=vS*RoLH5DLfj{6F%_ zc&c!AOh}+b7ffjF_~m)F>jt}e?t_-wC1^f`y=p<MBYXafCs$-$s$QXEjmlgnO*tT? zYo$(kP1_rskBM_mH)Wa*Z)_EJJ+Uo|x{6HSssVAI71pSzwiea%=;D73Blz$J(C~f@ z*R=^-TH?_QbiDd@&PL^?CDbH8PPcfj1rrkBco6sPAB)FB#rIH~YU-uUklI<7E;;Vu zoo>N~vfOf*k+XXooinsbHIpG|x9{HcEoKN|va`nk0U^QO;H}cF!hWv4txt_Sf%>(> zVxP-v6G*>p6?9AcHlsW~f@lwHrMercCzKyE-OE)KHHU-otp<gRbk%=`1T<&fTKozL ze1*;0d1iUr$j3GK%>4vd{$dbUT$y`tba0sHLQIDV37}siz)04g2JtA(^`8I>HZ9*> z+D+XN#HS?lPAa@iPTOM(u7cTyOby;w%<CGR76G~((TxF$bYqo|w=8!n&%SwmBs$-@ z`b4WO0*hAL;rd{sivK>xVW;E)yV}_K!J8!e9|xGEK<ZBDN#&L6D;emq{rO<a+2zF~ zgNw7ZV#{lvh?%~<Jv{aeE?)0*MUQ<yO?#>lsf5@C>;&Va(}A8dNpIFwN$f~io<Gw^ z6|w8Ur^yzh`T<x(9y($0QzVWIABH^H31>@>!M)kvrF3N{#665Y*><+;;rBdjQWI-J z(UnNr(;aQ0^L&itW}gOu?aC2KUP^8Xy*l|ZI_H!iQ?ed5HD=#D{%0f=_Nn<-Yhp2j zff^|a$?Z|Yq*{=8bu2nh;L$D|lkTON!BG}}nIhFmV&N7lm`o|6;AeV{P5Z5%PMq2! znUMZD1EIL09LrsAE6M2VC($Vg!yWnzFWaDHvDZqDq~hsY&lKjO`n9+3CO9bIuo9|P zs}QlJrw-$CaqhjA#@nM05n}d}#7!|<7I;|n0mZ2JVkov}@p@l*9A^coa-`c!MtlHE zvRX`ul$>o+a=I-`nUH#+vmoC9c|QSMe&n`?5}uiZt!S$_Dws=<&l}a9Sni+iL3Ee! z>UbFDzYDGELlmBU(Kd1o;0C&{#F{7Pe^+741TM%yF6s<G0PyCXM;)>PHwkd%M9C(A z02FAiE?H4qXtH8<jDv&_fZvP2CVF@vfAPUyalJV?V`G)j=r|Pn7>Rw*Ui_49X%!K^ z!K5(f#UFr@r`>=fg&@hY1QDqeB=D(lI2>q{fWw?*N+GpwO?VHfZNMvFcrvj>=x)#M zPKq*!J=TT07~G_D8q9>yu$KCrM+pxNDmZLUar#O1Q?p;4?a2OI0iiFo)^7fLUfEf{ zr^Mv=xV|<IO7dFnA9-cX3P*aowzqWOAeBF&`D_BO(W5W7*>_PS0!r^0t!o<ZT?M*D zsbdUc48WpU>5=g(uRNYm`7^Jq_8J$B6Y8BpHu{x8*~@aL(yvc_elPo|ZC$e}U}ord zgSbp!?qu%h)$t#BWdKn%5?f;tbnO`RCxci^mn)o=D;r?NA~v8e_aJF8<&-57@?*8y zNl0Vqr{tzp6Kk|p)@7OzT;B<bV-5Rw_5G|c>8s!K$_S#Dn7r}|!?lxNdFA1i-vJhl zRSt|njFH?PJ!V|yc2a7!_;X&_Q_Ui8O{DdN7n4`6&H1c>$t$0X`i=gcS4I+f&HHiM z3;H&W%Zm#=3zJ*UuJdvJv-xqkf{qLRwOaU}SwUw*bN^SvJHM7w{#T!&|1%BsPqz;L zKRrXWA^{Np!#`=L_D@Ne0@k0!>m4925i@qpAg$QjU_yd$_M+?jR(~v~aHM1{r*FKF zuxr8e`&yt6?4zlAvPp_zejDtWAa3EZtd6-;yP}7oS3|0=KyTfw=@*zOGaVK=D|#uS z%gG&?W1+uQCPW*^otk8N#vMlxEwSCa_5_nq=HM9OZsmN0|E(#jNTMqGTWP?(?8@wS zRhg^X**9NJq;h=AIo!UrTKQwG)ut1^i_5S2ZknxHlZbP8xr{QY#RWx7Q@-2J=0o7v z#Z;_O*w1l^n9aLnyBn}{ORf%!$e4JJ8f_2n`(HtG{Yoesx6u8YpdIhoFvjusT=S0M zj4)rBwd+`CZzN>O#b~Hby(o}p-_P)lOD<giMngSXV17vGr|%*PZ;Iq0*oMuGLS=K8 z2>5vJERDbB%Usc3YI8H@wB9zr!!=(zUK;U#kh~T<r4+EiTH#s*F3%vM*eY(JJNs%_ zVcTj@#5*Ukjly1-+U}xE%GmD3tQOjo@DkI1?2zF7VK||zaDGsv<!n0nwtGuNuHRDo z;qeGFQc7p77@c$?l`6x$_qkR<>6~Q)feG)l9>`v_G>^$Re>hV<@)JOzUqs&Lz)ko; zP(m?zrJDcx>~#eSW14j6U~pyDb#PgzY@DQy%5`URP+>SK4u|N$HHG9&xlFl3xb}T+ z%=NSlCcLv;5GLY<NA8g+ND)~PUPO{ZjP^e!`<j3irSK;D#1N$LhH8S50D%I*c8J;a z_+zeREt8XlDlBv9GHCWJ2h{l~hK8rWbJYRhQNIphCEMs8+y#VHKkNpPLgKE?^U!{= z*TOBj@vn7Jnk)9o5nj74p<X&yp~n4%>l0dz`p;vD#Jfs`_gG?>lE1=Alx37Alj6)~ zjwsRxQqw&clG<#TD>4vjpvgF=H@W1Ldc8U#wvRT$K5@>Z0-y&k!(Zj(Ya4o~C67-$ zY)v0x-u1hp%CV9*s&PkPS5M>R@yo=`p*5O%2TobTT4r1XLaa4R<C(L2w%QAje%Hx} z3pFXzYJtY})A8q)m8|iT<ZJG0s%Y({x|>-a2*zcuF!cMmMn3&<kWd_bSEtl(N`{w! z%>$M_K0i*xJDH;`CK>>9kFBNGbpA~LJ&P*VFkJ^an{X-+3wspVTR`dIU{pE&m}PE~ zzFniASGzwsRH?UsRgqZxQ_L8H@ImqUiah3aCGYtw`<$&?A2o^hhC(QMUf9X5`)WBD zBrSTDb_UAR93Y}@yjhYKXrGcP%YNlF$qa-d5tKwoEHVfp<JCJh<Ani*q(sL;KWhM_ z7l6br$GpNI0fzqF!*yM;6<J#xCKNDW7ljWY6CYx~pjM%;7q2=aoWdH6X$s4;u34{3 zgvjw>0pTcYr;<>JUf@%HbRLk9oJt<>MCJVfTOQyV3Q1u+9zjNqc-byI1_U8PguLjR zkK7Sz#BPA~>CXV7l1lH!p^w`EN3Dy5Rew7}8`YWos)AZSH3j=Qy*ief1IQ&Wd}GV+ z0N9aRfd6)e!V;^)W%t8_ajd%r{DF~KVG+UM*4=QTn&?Z%Uq%dEd{P~ApKRd@aq%mj z#G3fK8lR}&ANPul{>RQxNQFW-+D-1Epl2v|n9|Un&QQtsoY`dZQ^Kt$_eYfXxc=oC zT9=2dxh{9@bUa$C?iuCCx{}1{L~^2#p$_L4wNGmuk4Ec)g-5=K`CKAq-!tEEZRp|K zVHIh4`*W3S7`Fa#>u~A#kJeZEj%-?-oz93Z^HxV;ZXM26aXu2_{9%S%p2$FO)X!yq ziT_^qzkCNMvmE>59pEqPqW}IK0JAPiWmmEkN#nD=6b1kN9e}N<1oIBiu)h4)cYyy@ zW{4h3XWr#hD~mBh)@2B|20w!#%o}VusalS|uZxy46o`aud?_j5F>#2xntp=>{45eT zM6b9M6Mc`XYPsR0TQQ$~8(g!ou_;@B!9ic92jwhJYNwN6sQSmUKj&A6;a_pu&08-= z<+3-^iS^64)t6Ie*PGTU)SO$k9A`KhzhYR?z@1UdR7>{g=TsX=UAB43`Mbh(xh^`E zZQo9){Co6Wdk6rA-Hl&vrt5BU@1y?}r~LpMxIB?fxh!$^hE}<&^@oLQGS`RW=bSx9 z5!fFM!8H3^zlFju(RVW?nFMA$JtNj|FGjRk{V-JdJ_UtQ;QgHGTeZ=i#kVsmMAU4n zMoQkh&AhRn(`ux}#Az)ReCLBC(89h8NXxcHi!kg&BT%@zbK_Ec_Z+5K=cb|G%KpiD z(yE}AR&%zk^JSd&T8aF6fjFWicmWfA-!QA)KK)n({(iK1>62eJ>jbK0f3qOF^6IR` zZyX2m&0?eXv8wEz1ZH)Ae^~k6-p(XD{C-fhrOcD>y*GIakLD<`UTuDgTJShoE7s1# zE^x1Upv`+uh7NdbS%BF3CK_?Enb}={0HMzY&ZpDb&+8TNv`#F6g#Ecc1_nb6Lh}lp zrzNmNibDrqJ~^|vizHVaSHsu9rx>l3b&k++2|8BB<L;LWe!CRmZBMT+Ek+5M-H8-U zr}vKT?S4k08D+?xZ;lpG>S4GIi+*JS0H^o&FfycwQbpe;7lprORr(Ah@<Rfvqa``1 zKLc=d5P)7jEC8kx{QEwGCk+D0??q1l)M50R!$GnJ(I<MCeFF3@A^|Ga1em>lkGXXK z0D!<XWkbT#J|U$j;E628@;G?N4n@*pfQ?Qki5vo(f(Dh^=TJa8SsjUO+zEO*d<#nC z1pt)53CyWN0mn++Ct_AWsE*tfJ>0<+1pqL1Yt@6witEp2$n-j7lt!iWS#ws|4|&if zWGROjarI%wxu6H&YJoKGS@hzrX|Sd`z8Ljs`MVi1u=X=f`zsWt6XcR7WW%<8ckqSI zgmG;?Ea6uu>~h)vZ_PTX*#`w|nlIFh1}7i2{A|`)DyIw!VUsNiyvnKt_MFPagu)QN zmi@oxRF~YlO8=Ko*x!9}!ZPDNwdt4H-^=Ya%S>l(Tw}#3T$qh2v(K^AUKoWdPMpKy z2;-BtC}R{Z=bKn;vt6ZY&XIo#h5c3G0{6Wd323MaFEsyi&g<7O_KS=9&kbYz|2>TT zAI*9Fiwn)4)f7Awo%s<grS=NMTpJ~_gpz9Z1t}sN>`yq&OEIGKFD~kaZGl({2Sz=y zaA1$7D#+Fa7i6RHiV*4*8ygi(3{<j}8nP&iC{5(xR885X_O=p(NjrNJ5VZcrMLnB# zzLXR&Nr4L`hsJCRd<+)_vUkQ*Q?NP}<vn=3-Aefq|6ALE2is*eMcFrp>L;y#RZoUD z)%H04DoX!SPcV|gec?+ks+-v(7C*ghen6?F{AD!fz^OKvpu>58#EHKeIVyIvg~<c| z<f5t`dQ4cgAiYd@YOg@N3Aa8ROp*>t-WxQY@_s#~EF&uXmi57X#~G^(?zCC4G?&9U z(K`u3bIyI-qVkSoE{%q+3l+XS-uP&{@AF~be`LHtQf`xffUUY<xTtPszfV7ycam1p z&yK}byh1}RC56OA>?hBC{MV1^wE`SspH|*58Liwtoh%wkzmcBW;d-`~n)Dzrkn_u{ zvu{t%Fc+HF`{v!h_KbaY+VkWYlhne8!+z|)p|reIPrhY=?l4qI+0XNi-VfO`yl8jo zdM@-pcIhdv#o2a79nkv2OqK4;mp)4jA+>YQ_`>~N)<rL793ihplABzg*b+^Hz)>Np zy9)preQ1f8P6$!wBIGf+BVt(VCUyE0m}K$A{L(;Bt_R}jVibxnu>jBwv@+B`uHhud z4rNHm$N$MijjPdLUTAI_v_jV1qWfj(Nz2}pGTTK(Y88wEVSKMSlrZXI|1*jzF<Nfd zl(@0oXCR_QBs_Fi%tQeR=5RxDJ>lnNVp4&Ptfz6^umV^k!oYLuy&q{Nl=>M|R&UtD zNPAOwG4!zNdL|h*4glMTs_O~>@OqTyC4IaC4iT<DrMz5tTJi2fR!WZn6rn;0z7Asg zO=L$fjpoB@ja8Xbv2^~(B>;e`TSm=4Q%%V>?mOc(E~)jwo1=S~#pjHce&W=4Oa%Ze zWRcKw)e#5N+U(i3B9YpG5to44$BXAhV%@5v?$nDppB0e6Hv?K;MV`4k&UYoIOcXgV z03){BrKEuV_34jb1&`}Qu;wj6z$yp?hKq{4aq#og|HFSQb~!D3ceq4yqFLAb)H4Up zUHlus2(PD*yMdY{^+Npu7}ch-=IV;X+FxjS4q`t2b;XDuFLc7x-sDr)m#Ex#z<u;v z9(Y5~(h<yj4#ws&DAoV1nga9bZw+|!lI1S|V`Ypfp))GHW$t^W-w5Uj__CVfdlizf z+zMNLwu}0(I$C&(Jaark2*WlfOLbo*{UZ<j3t+6Oig^QySDBm0Zm27fs&KqHH21cp zp}zWlg|m(N`*-NMhK8p03Rlme_a9Fw8lfuPB>FHg1-UOFp$g(&#@YKdfurWp1Rk$q z&W{^<M=jGMJU;4i6<BaMW+k<Ytfwr39KLw(9=R5n0FH!X+;Bb2Z-e*@ix0+Dg!Fy@ z>f1VigK1GQLMkMMR`Srrg{b)aM-){r9~gX{N*o45!m1H~JJOjVbbJUvwip?ynIHYW zO+2>Tj&;1`*XtpW80^Hw5YpCTZaKg>K*c$gq|I2!u)QX+R$+k_12FzSUucSogAFkk znvKJ&Jc0iPU@ZSv7n%~{cX+9y$<8%0$zTEeVbXsLW3Dhk#`~1l^iC(W`GtzS1;0Eo z_QMQg^(D%h8+!jFN+;Hr-~C6a+8@K%<N$wll*=`1va{K&6QP$GBU^Ugil;{Z#S<{5 znu4gYsZVp;<MG*t!Tg$>KX*m^s)YD8yZu)yAzIAxYX9Or{@bWul~wm|QNRDbP5uAW zd;HrDSL9ut0uuqg7l=oCr4BY%K1@3lKkiC*_y=3|#LMAQP%ia@!O+bcX3t+amMPa> zQb;OmgO~&Sl**~vok;y(d5_$dSSJB4&j^L8F%;5;ky8^q;OukhS}Nu?^|0{wN(fV@ zFHPSsy~ke^l6oHk6V#^3Y22pXvg!J*5`w=J{3q`*h^d<n1A3Ujhm3do#UI7*#mqm6 zXV;djzy!5jF_G;Nq0hf}OU<l$U?`-7bl6*dx7rECk#X~(m0m6?3Kim!gSUOA3E!s$ zR6o{En?>E9LRk%M)z8`&YwEspY;3>s&h@eq!fU3ze9-5TEsO0!4>P?F`UhJk7DhxP zo!1a6y6qQ+l;QCojUk2}t^7tIi7TZ9Z<CQf>j?1qQc{eW-S{yx*=BiP<<6Ivm$O^Y zL}Jl)lVxw<Y{xaKpl_Gnqd6W;RnT)>Cf?+IsS~NsI|1zDL7<^~PEv>O0+sKVE-2$k z<w{1(-}hR3iY^6iI7KO9K#vZO<Gq=MiQ~gRC?tYBK!RQ~kOh-A=d<#_;tS^>K!o^A zd<3S40`TLl3HV_MAR#8I?4`pn`{{`VEE!4sgc)Ee)(PlE0M6ZeBVK;V!}a{sNPW>A zDb|)x<k{a%%V7n?b3<TWB-wfxNOz-^G#E%TFhOlh>PIV{fgGLE#G$tvYdFk6TGRiU z%V#&vf`E~#kF8gLs0ZYP(+R@({$Mdwyc^SVnolZy;&U~Ler=x+dpODr8#U491PoX5 zRaDriUnWOO7BDo<b}Mb~q$H-(xl;21K*oRa9{(292IfJy?Pc+xI0&HrKT}9)&DIFQ zqT~oJ*nVcO28%#O*6{6r_8yBw8V7!Y9`iY&SDx%ZSS360<l!u0Kf9&=nB6J`MX@rw zXtq%QIKY1cJ%0BdFAs2{TzQ%{SlHD?D=ZOY80{e@O7TZ4>gDVPeya&4utGxW4hne^ z*fs8QOl40V6p4(mYx$N=J=r@bmL}xTiQ;(kjP!enlIDgsu3I>N(@Q*4obD?)JH!R1 z1~2|aB}7-cD6t#jKPD*ey#)}8$-+WWARH<rFfxJ5nw9f!l@JL|^;FeJoV=y$dI)(u zI~>^sApp>Z4FKp(4w*sMQ;1=XUgAn5m>YsJZu~kjf(MHfX5+r!nV<>A+d<+~^EP*x z@OVX~g?zyX$|(#0+-iIpR=1;8<!9IbcAI+CzH`}%s=jdgj~7Xox{x0jLHV~A$>*9N zEUoHL%Hc&UiQ~@8+f-JKCA?dI2+D!Szu%@_c1vBpNDePkv>w0aOXLsMgWJ4|uKo|- zrY6QT{(O<VyYi7c(1c&~;$>!^hTUO!^RPWeP~Pos!rZ39|J4DG5tK16l6e+8O~^l4 zpO;nQ$Dm)e1OJ&q#w!wkSFj9i|L;9CC7r@TSYtUYA6&!U|IA8{uq?m*x5elG$rEJl z{d3kuBr{ZHF$CwI7oY#{xbXZpg^a&hpM#WOV*8C3DJ17)8^yn@Pma0ELvwD`z4Frf zd@?!WSca_sQ;*WWvp#Q_%GP^SULwgpo0voMk3z<OLX!WYoBTqO|D|qXbcrO($IJEJ z=FZE;r-|b7aGgv1s~`ANH<`gqy_hwgKMEPW#%>V&u3-Ji`mEr*VtAL<4$JhicHl48 zXM;UmRXZIRcjtf@q#20F>T{udhy+2I(WnD_G=OLx<i%KxTyRDAiY}nxJglEy;qqjC zim75&G<<N=;&(srABBuA{!cN7W_jc9*5{0?gj4e4%+}WIIEBWj)&&DG+4co3s-+j# ze(EOQ&VRE$$8w?5j6L3m?zsHP5XK0&0?vnw>yX5Ohd-^)OWmZ87mcYB|EnK}IW)0V zFi0}y6LzU!T~>+zLXufkI{%d)c!?xeE7*wT<5}KpyV9}~!55!T@S7hvOrLK0k3z<H z?MmlRm7WH2ID;wMvIbV(p9&fOs+;V_8KqwPsbKx)2mVdL`e)rFtCyad$)7C-NZ+UO z>a~@&$)9&1e*J3y12FyHSLF7;X^-%~z5@|(vbZp|P<Rm>aDe#${Q^4vFZ}?;>VvRw z|FTE;v&fA?c=2X_`cI(a(JZo%F$B*Lk{f%1dVyz6P4eQ6!A??{-wSlhO0i|i;D#ne z`i)IQ2`PJ7rECnI^TV#9H)RMIj;&4&QRj{F#~spTck1BGXT-IPdiVvkKKzKO3IWr{ z<PBr7t;r3OmB;Mh^&*VYZt-#x);iyXd2tb*zLnB;e7Jcp`SoNeX)~I_c_#w$^Z?n0 zyUDTh{3~5h;VY9nZjT_OoQ|%&j*92E@My~JCikT{04MRWM_?~=aMGayL}=Uby+PH4 zHp(Um;rOf(Ayyv{1>1|9WHML;J#1Jiqo|@`z%@sxW;wQ%Z$SIji&{BCF>`OPM;1~U zZ7?Ck_uTWnP5A2&li13c8;M`Z=2W|AC%bXDhf6-(YF$6n@vB9v`pzR~iXD5L8Q+OM zrGz~AHg7;jw+H@^`sMf&0sn)^6*r2?<F%ZQX#hCe*Yz-MK9YxgEq5RLw0?#M1=xVz zl}esA$$oO0QMKTDme$%=aPOPv2EK$1eu-g_;Uk%>^YrddOrkr6kLGpu71o}d$-d!L zlgOR7>$rJ@#t9A#>kH)la@YxWy*S<y#4vp7bi`=oY2s$-vu{Vo{!dRB@h*Psm(5>* zFdv|<KJQ9Fc<yO2A{LM=hkyJ5P&0#K@=owxl#f23>X!(l-?_ebt$)ArJAy65)msTK z--t&g8NEB|M9F1{HK5lufw1Nyh=$`bi^*diF+#)%ZfBq!jme2l)gLI3lj3of&|UXX z)K`TV?iTg;a0Fnv=*Ca&y-Zc)4A_k;`@-<J2S@3%-%!jQTb14Z%-$_At2hJ6>BL1g zQp&EOXy#|15@$2Xm?FQi5ap%N@yjVT>*~VoZFN9%vjqx!BrJkV(PWG!?EKc-$qcCr z3?u_8t<E0sIIelt2(Yw9C3A`l-ip#RTZU?=n|R6AiV3Os;7X4kePcQv=N$*So77t= z2|<Ooc4qU<rUx=CbeVZO!Zb)))Pt1y?V>46)V0(+vvBj*Wa<Wz9eLOuowl&(ZLD(N zp&NXd!;~Uokg4LnZJX?HS|Ca<Fh*Rnp9HG0Q9!;x_lED(s<&#SifpPXYKWxSfIk+= z)$8j7-_d?*dRjpC?VXkiv%c114=dDq8Q>WjlZxa1IcwwHSft$wkoI*^_-%HXuvdF| z>RmaXMvo`MqV?r*k6CXvi5KbctUMEHVJ8e`ONqq$uE6I_AW60|F$lK;GC>oy@z+)G zLdm(fq*U|+({6@38x-1PE#C|ioQPH-FE`*X0-4DJ<Aya-&$c!|^DVk{uInWfot#gz z11Q_)_r?7pO0~Y0!myn6s^&~M&2ZJz3OKw<nKf~4PuUpvimbfg?sit{6MPq8cJm3b zyEAwwTPxX%LRz=bNvuN5@VftgJy^VgJVHFB3caV|`hAki{Cd|^GC@O1<_~2z+DX%o zqXrG%zm(g=70)J*;x@CARLJK^n8Rp&8?zs7xl+C}l_H#RFZsZ2F9OS~&laM0a^aC5 zmLSbA)UTNozNzlCVK6qC(NJ_=X6sN!x`D-vg$B4;EOS2GF6!x^AT4%fy!~O3`k1q! zFyTDA%;L;2one19S{<sl6nAh)Pg|*L$VqzJX?unpv&a%2#jx0pG=%duyfEq+GKRzz z;wfFdgF}*sgcKMzAs+E7O%5$Ev?|op*SWJ?&s66iZSEmUVbS2sQDK`AeQj*W@0Xs# zw$>7X!ZWGyT2cKJFP75I0QFRuEmOFw<d1H@K2fDuUT(mB*Z&E}w8#A(8WTl#arU5j z)x4;*RhPreQ6}+wF0TvhNzq~bZwv1}iMX|1D2W2U&tJ|P5J@+l7R-M<s#D0@Isl=W zd!yv48iNj^H@wMI8^PmgabL(%xEsH&o}jKw{*A!wGt;st3zejNwJrU$m}k8f`v|Re zn29|5o3kscocV;TtfyWx>amUy63!d0p0ls$zw$LG_c%93zIzu9+K8m>nu5f)BJk`t z46RRH6<1G21C;t%rpjyzI3N?`C;agyn+$iRCGOelf9w1PHW&iMR1qZ|KO=(g#@?b4 z(zYAzic|O+7uFBR(F35)4phAYbJ*L_7V87wZhUyyO2cmA_xI#QPRvO+YV2fkH@Mo0 zrK19`m*IBJ!{@wgVz;76k)+>Y{VVG@y6?zhZ`bA9Kx~^yx@1LsAfd1+CiSC~*}z(# z8aOvg<}@x4Ch$EL`H@LBxdowu096SxeU*ukkPqicX}rhu<-yF*J1IS{dWF2*7&Pv3 zG3CkNt&6?Pv9^CsUI<3o`-`@RnU<eon_m_-OPK&L$%~_j!!d^z4GZ{jxK(=s3H&_b zQS2F>b^g&KO(~y2i*qo2$H_SMkKQoQ-ukUy$%{0K?_UGaXN$xg=;J=^i@nF_^L6cx z)0wf0L$YN1?WB(L&)VqI-+_+ceO@|x?a#1sWiqDML05snKYXv;@`dRkNQwFG<Kze8 zu2a_CCAIegiI8Bi@P%a43z`CjXsAN(?gcX#hqCyEvh}kvWrp4$K}v=Qa@Y!RQIS_E z!(<rAyk}s-Y%qyg62eRpnOTx5Q6z4D5MDk+N-Ruq0%~_eEFKM$Fa}Ut`{C~flB9$a zh9C*@Bk*Ozu|p!%GD*Y?$+g)?Jbg)eZGncAkzSp5efwZ6jieU#Bpj$nAHOKS%&35- zsG!*>clXE#$JAEGBt20uGpgu&^dZri)JIc3=nrntJAR}#(J(_564hvdxTdQSY(ZJG zF;9+T@~C2;MSH##jV<zHN;V>46825;i>-`i)jy7XDHc~}9M{0cAK@3*(iA7g3TW#m zqdJbWq8HNc4DX_%TrnWkO5^OCjUPRZAE!!~6iawxoWQdb3I+nm?<U08gnnSV7ImC( zQ`VG<K7v6vWH~c&qbZR!Gj6MdQs6l8DSz}{^wk67q~j*~&dj8gn#l9xB*4{Vka#jA z3x1YKHO3lmlbjrIL_A=eoZ&$+jFUp{K+6w{G7Cw(^5x14dopAb`=5XC{@Y69fBQEs zXLNk<<DW}O|Ct$`jq~p_`m_JO*#1Ael=S<IuAsD&^emQ?sZ%CN4gR7aSxGGginc0! zA)7SX$X=9m`$lpJf#QuXFVcNXVb7xndr)8k1iE?xd}Z8mvy`}cu0)pOg^*6c6_v#@ z-)@cqr%K3oN2iMJ?SPc>m-7e6%!%7VU+ba5J7aZF*|Vg^MZ-lWNPDUikL=1b&X8Jc ze$$ZV*CH9)&vrT9aJH<!dSBLbzIXPuW066qqG3)N&e>2gug_gcva;dU-5PtQU4_Dv zNPhOzu5>rxs;|awJE^+lcsG;$@K;%URx`ap#(SH41H6pne2^d0W}dR$(?gp*lA`sl z@)VGSsTLVdsDQlkb=&<(juB^A7q|S#9q`<Re7%anr#iO*GtQCPm*uC_do#94YU4#? zcbr8=ZR2u<3doYoxn@{eHDE&~b}nSY46<n2ul3_v68n=b#N;kDs+%8ldIlVOcr=w4 z;tW?{suv=I>F)`4)^zXP;%*4iE;yRPOGte7g`#~fdE@P~`P4?1zU>`E%B?4U?}%Qj zZ+K)dru((Hjy?7tU=%eKp4Vt`P2STXq1hh@3B0K2d>g4=`yuk)yu??7e8RWex?eO- zmLiPY+WXOo=Zzn8qefHC<Q#@jkwHU)lInfgIsWh9aUb^;GB;2%kP?x3TMbM{t_r#- zs%cNt*`z-pXOIab6Z+vBJkQf)5pGp|V31@f^!(k7R&V1Ee;1jvPZYJUDCA;B2+XiH zt*|)7NT^M}D(<WImsPHj(9OHBfElB^(S}XD1jcYM72+9bTE7Alri6_ugn^tSH6++M zkBh45wrr{KYeEeY2EBBgV>*y@9rtd$W)A@CK@pc7{pKCgcwC4+HfiYzOosBqAOVm< zo``2FXxWi|gsU2;CcBvYSfYU8{gLEhK7nK)B$t8pgj<0@0Hj(6s9>3v3ub<qL@Q}L z%ph>%)jOC}F+`0{wOOr9coA4Z9#ekMSRSJa2NPPMKwg*CfT<aH8-;wq%>W!KlF)j` zOtob(GKp;0C?5h{qO#P^l#t0J{&T~sygRQntl=31I2fs#T?;E^KWEtt0TzG*O=HH> z^4si0EDw?TL_Pl8t)Fl1WTELYHTU6O@hS+~<!<9dNLIrfpgdY!!(6%~pI{Xii+oin zn)Xf}b~7Ww`p($t`BbQ={@@P;_E3p6+2i+n87KM-K>WP@LRi2T@tKm5h5@p|@6NXJ zYV19QROAn*hN)@!OEKq*@bl4d1h@@K7A`OZB8|3}XJj&nq$bNBERRtll+!Pj_4NL5 zgCltDNcaARg8#WjKb@t|BvB>beU45P&7B*gnUlh~)QnGGN@A-uY@{>LCM*Pn;!M_E z$d}(Ba6TmnZA(VzWYu-)8$_rYMC(z2wJ`AA@eBPT*Mme011`A(mbvfg-u_Z1PS$}p zx*rdw1%64}G#|Q3`UKs!*HAso?Rqcl{rpBl!PP7mG5==+=$eKKRu@|i)nl@gi1aed zi?%Y!?Kjn3-xB59dES;DRTT1k&vPZXXUoX<&T>!y@-u1^`1pH^XgkyKvf|*-5Vn<J z+Y&Rb@As3bsOb8R-IEfpr)6o5l_E|$Wvm`H#++@hy(??4sN$?p199|^yC_E8B3zy? z5!p0#(ZhK)aG#B;YLVvnGV?SlL<`QGrqsg?HrZ68(k4<K!ol-N*0rs$yA-y0Xz!v1 z>avt!X@i~v?p*nTAtcOR3`Bu^8Aa){G=tpi)=mVFl3AHN;o3-67tZu$=2JeMo9VCr z5It3{v=XB4i_Vkg;ZR<3hF`mGH~`>@c>`e)q+BSyb(H$mxjjA^vN#LJFqHQ4G$Bf9 zM@ET>Ud1%IFdvf*BOL3uuXUc4M)2*^=dO{z;*d&Jc|7+9wu6NF_|MX`v}C^A69D-w zuj1q#7jn4LfL-br$400+6P;ZnDjx~wWBHW5Roswj9BO_|akXP8*2AA{5dhqN=}5qb z1eZo5mqwFV$*lkxfvU?V;_oKNqq``rPyhkTrY?CA@5a(|-p~s57x`GTzT5<jK35BL zN9E``c&Cv;GLsByn$eI)bM`CN#*Y@d_M#dkhdn%Zp5R&mA*4tbrdx-@<D>T!Z`}I! zxq+yB0PVACC~9i{z>s_FaDYGL=9$?M;k&W=y}2;U>>;9AII+JDm`qF>1_gxR`!0s! z_l^J{(Qs^~ejuKY>U%>`<OC@niu4&Ogx4$&m=XyHz^{CRchh7N){nwr;scc?Na?|h zjUt$LK+U4mTM3c+-S~2A%Cs-LsHkM?eI6bu1tNBOHv%E2+iY#(oFGP(PKDMx_2f8D zCL?6LRkTJ<@XE3`nhf>9cqkCXF&rv}K=5Q_-^L*qwQ%v;9p)D!|D3NiflV}yYNP(t zJ(?BiK5w7&@Usaj@`E99vXA`huMy$^+I3ntWK+Id)P|8I1P`YeC)O%_`<g7|qs0Zf znH~|sjmp~;MYV2{xP>!vSpgZ{x<KK4U@Y>W7rpw9U{ZKEV*vtBxf=MjSSvOZ__e{0 zbP-H4?n;ON>g{Oy7VBd*xizpD;k!Y2VVtaa(1!{>hMvAuIsj=n6zX=b!AB+YC6b33 zNC4-c=mlVj!7O`1E6G8|c~EvMfasgh<{l7xGQif(`kKfc$|*ZCAUA2THF=*7xJI24 z8_4Pgf+B(J<Lm^B?t0&ek0R`1!6cz++`080V!gV9N+b=UfkX`Y&%cum7ixb9_1y0f zk%-dL7sU423G(NIGFJzCTHSxE48?{4vG{=VGxzxbT8(zW@za1?R#=JX^=P(gwz$4v z>pZA54C0gwvVmc-jzdj#poDG^Q#S~`8w5)S$~gYOeh1Sv4>g5D2zMZljvpY{AnbWi z(?tk-HI_62Wa<W`a)X%ffb`s;=5UOx4Ap}J9mb&zJ|G)6XdWBH+zmoH4lOBxS|@`9 z-5`RCU^EJJZ4n|;0%byi&BrnScF+?)sQU~+4ThDs4zb>Wkmo@~*`VeCpqLv3?FL$m zh7uwZ(THHKMTqe@=AZJ-rF5X3NG>__=POiiXaHQzgHZ5++1&!ndIP)+G^%Fq5>6X2 z+876cJ(=ADeIM!C8{cj7jog!uBp?a0nYEdabCyBdhEsV3)u#p-&#J?$Ff#>I7$L0k zIZ7XXp8ydZkqIV;W4_2vOXQ$V4?sdcRB17q2f)7R3(-pknpcNFF@GZSVxW0YK^WFW z29S3ga8?4nng_+8g~TO^Hj7{zH_%r~5IXr0J|ET=4$$!(6z2=3r5TF?4wZ#r$-%Is z-5}CB8skj>b0pY?59|N~+n@jji(opwczYda@iB-#4@!juo9;lg;82)OmQ6C?kuiY1 zI*E%9Y+em8uFfRo!(!5b@*+d@_yn}!u@sA7BR9w!Kaf`pfP(K1=?sa=dJaWH_?6G$ z&FKJooyT%+AS{HT%s@ERB48Q)P|pF2<ikVZQ`Sh=!@!}UC$Em|F6vB~LsKbg%mnSk zD&Ja3dGk&&*nh4Ic5#auGXm3&1F#U#2Y%Q(u;?)3XqiP2Hp-K}!R;0tTM-U2Wsf0E z1}MWIgvc;+IKTh~uDuG#{Q^9&2jXA|I2f?;gqRKnQAPotQ(<wzA@qx2F{>~!9Vj#} z*?b&eod+p4g0hci<1RuHPBQ5ck6wGl*_;sD?10d2aaeg!E<~2tcsv0d%D)J#qRKHC ze*n%)G=~B7;1Dbn2(y1%`~u1n05L{nk?ugGvVq1s#Pk6WtsUY*svHa%Nr41w1Hxfn zlCQa!BtCL1LyM%~kF(*rf#@(S-429n+=Y()CS065)l;<1NAo>M5X;Aq+uwfQGqO9< zRE8xDm)=$m>#2ypFm8s*XhT|KsE#zdf&NYKogK_ZGhp(Fn0W^}tqjG_OD6<?Wp=<y zd_W6DSAFG&q;3Gqo#?A-b`+>!yl5yDA6CiT=MFkhb1R?$99pst`O*IjqEji2`Gb=O zrGqCZR|n(ou<;{8Kg~hqc0e5}AiZP|NgkBI4I+jFqjjLy7QyCLAU&%vs1B5M2V$@T zDQpJRUd0mI0o^#QdN`Zav<^|`!!pl<uqI>mW@ggmC7B{BLma~hQ5F3rP<$OI(|EBt z8VTe=#&wE^UgHC6p>ifqtjDjq%c|$DeJ7rF5XP|re5HiYBLPw0b2FHqnDxVewUXBT zlGUXi6Fo3??6kr;IETM!NvVO8AGZLLHlu?mM+o;tjFu!nRN)K2q!vI7fa)xQh!Ec8 zksuy8sPWLour^v51&thn-iCvkm+ezSReS4z?laFL3b>U|*-CJ-k_Iz2_cRUEgc6k4 z<7VvXQ2?ez+oUeGq)7myjw)TAQhwmQ)F>ojH4y(rMD1oVU9}tIA`o{6B8T}a)gS|; zLhUVUCu|=^fM32uvR*QPtdN^386aQ^mDOR#@heGPCyAYNdphG-Cv4V=2DS4pLUiv0 z!y=t3`(B_u-Cs7|E%lN=BGccAqdyK$D{HB*a8yS0mJU4^oxBo>i!HnIMXA}*WXTqQ zYX!JCBgPs>RrER%lml*vnML~;e>(ED!uFvx47Y7yGZh2vKW7t%0GZ%G`eY!5i0wjZ z3-u$Zb&p{1(Y*=1ATh%`_@Zw3eRjzpA2b5gWUEMDtxxV3N_&2%oD@WdVrxwWo}K!> zonqrIw^Vo>Zc5R<s${R##HVx1S<lI0X&^28VOrgdvdVO0_L(Q<an94PEsJZzI8S=t z33LR4ZS3D0p8C5>erou9rgzS%P~GFW$0=iA1dI1^^ig&Q%HS?Vd$a%q)e9c^(zQ8c z^uo4Ya>mCy#N-SZkcFpgbtcF6n|<+9z#c>&IwaP%+fKK;9@-RVciR<ehdpASUFJ;n zx_QLzEP>Ux*Gwy*Tv|b`C-Baoa;|<S#u#vJ9$9-26kj%&VM{Lyl6~CSVCUpvR`$-* zgUi7fkFl3)pm&C=m(|GmEe+|_^N>ldk*F0#vqup}2QAxeNOLR=OS5|0AniV`yRQk< zySXAIA8AJ@K3xEgQ!Pn~Mh4DnczSaM`aJLJdOLKb20+DUeJvSCW<EiFe}c^X8b$jA zRf57bz81w*%NjE?oV1(mz0%w7HTIqEHu;uXKc;Q=BLAT0EQuDH`u48x$7bmX!P9x~ zVQVo|o;+%VW~^`xNINod#pRmH{Ws)a#|dRE%SFbl%z#qnZ<$0RPuj-p+IpEIbhmNI z4~wtOwV90F8E;l5t6&z}?J*Sp9(hmQh;jFUht!OhrhUEcjGxQQ3r4e^x8lwtvUrEQ zrHW*CS_hjxd+^eaKgm}oT)Y$OLds*L^EGYk-OI7lv%vBxb7?85Pq?zstzn9~smvcR zX_vQ2BUg*=k43Gji*nChhrZosd^?n*m+kTvP+Kp#Qp(1fHhM*`_y?(V?lrCZq|HII zoIfVvB&zwbH-jGD<k_DVc*qUa0YDHRr_Ddkx_o@&{&CI)_7SZ*^C9=+vN@n!a&kKS zX%KW)puntCiPUOn(syk#`YUM%AvJ{TgKI;8g7uUg)U2YtSDf26Ubt5(L5G*|jk$)& zQ8=Ke_&HG`nD}Dx4RDFP@;P=sh};c$^~q9^(GuPEqF|nAbwz~!rqYTys)3NFtGsvf z#f_QU#`_86*6jhu_pgNnk)7+0x0uahzn-7%dKL6ta$M@Rp*-N;IJU}@6}49@Z)#Rl zU15IX<z#%TWI7O!#TBhYY}n!*!jCh8Zwv=>C#AeTh|?|H8~$`)KHW89U{6Foqqw%O z{th-VbvkWQd!HLedO1=Mpq#jBOhk5nhd4xfJ=9`7{K0x8`pJ6qtM%CV_4teRM7l4@ z(qB?7zJ!mGJaC0ksIA^~g?Nu+2O(GUD_7}-mzQwgjLE-!Oo+OOcvpEb`0)ezX~jZ4 z{iyT#e2mnno$IXI#d~YIQt1l;`9v)W+m*cS&l(oASr#yF_^Q6^YX3ZT!M0scJHIs1 zY^Q~(;JeMDmd(4ln=X~tgtZJS1wV-E3X3Fcuk*}Rn9ljQF3Tna$xE5|c7L9DvZeWI z3sUoi3<b?i#O~MHFtFJGxqoKc-tKREJJ74UOtY;>zZ~xpOsc)vq`L+-T=0A~)b?Pv z&;04TCz{sMTc7o}l<78(=++tYu{k>SxEA(!(0hE>_XW^0`$CrcBEkD&Pxm=3Nlq__ zgT}YWk|7rst44{dQ`_zAc3-V6v^%87KU99|{kp>jY^aLgeJ1<qD13pxeNZW7`@<{l z-pKbjW3u9+^8R#VuygLi2YV{gq(R9Lr5&&e{76OT$Qw<pk__>wI`RoV3hFrWUpNZk zJr1`#jtoAIetI0+aU8#J9GZkJiT(_&`69RQ<*DnQD$kB)^kI$p&d!6yy3{$Ziv<s& zPyMvyV_pllWM~?sJu9BBHSsjvc(Ca<3hStx?%W12XlpSAZ?Qhz^B#kSbd-B`l=oVm zdvufsJcaZwoR0>dkD`gkWPZG{{4pK;WA^EfIrRA?n)k<O(s}ar6D=)Ro&~ld9}sg3 zdz0v^`hx@WC+wizU6+yhtJlvyx=!m8Z!c8R#1<_8Iu{pYLcsW>&O23|ogsv@(&1FP z%L=i?*Tpn4b*;OxaB-zo`WHh~QqXWAq!sC^8V)gsS@;R@+7O-qw}LSW{#h$m%2Onq zZ&CC5GsOhDip)BO>x^c@ZYhj?!}>1_o?oO1!b;x;+da$f%=X?iVw6eFq&@!h)U?6r zV?)H5p{rSo=hx}ifkyW}1mFFUEv!d@OIJvmMD0DRtd)Xm)})bXRWPb6$u70mvvm`W zg)QLF8#JEEqMpuTAO{yGty7x5hTjoMd+Qk@k_b)Ab6|Yy&~?83J{pV8OiX#^niQ#w zw4{T_rx6#j@CR-6O7UP`(~K-yJNxmuS_u>~yVGxPb-<H}FMZ7VaFBjOHMK{BwD@MO z(vMTG(g%HKo8KCV5j^pTX9zH{0-r3D(zaR_`+7KE7i8o#gl}PX^Lf7XaY-0IBh}+P z9P#*4XJFW{yt^bB_xcua+$?=S@oIakYxA0^AkK~0B2R7h4OcIoe!3{8mnw`&K{%pV z1%j@s%kbMos`FOM?r@gcGZhvrz2#Kqj91R8b-Ydii$%kul58dUe3HW|QlK+>E%DC< zwOSJ2dIYtlj#g^5Wzdkiu7%m*>XO&gfn4a91Jh+(Awxp)``1S$&-5htIjshScp9Cf z)!1bs>{UOy#c91^lT{QpFfgir*<`4FM|fcQ!SF78&a9n;X{N=qhMDSaJg(%fo)EFr zcO33P73n7)<sEiUBScIciVGV|ovL1o+;VCBXqdFfcivZWBOZsp8m7GU{AFacqB{`B zI9|8a(x#1vWd+%@ThHNc{!rEQBth6J1bdsCk(E+zT{6t$W~zRu<y8GmYHf*;p^UDT zZ9##N@H(5ka5)NoLwv$U+f;24@jK~8hRt^#S^9|EW!`<%Z1<>;z=Xedecw$$lEKXj zE+m*%Cx|UwEA%P$rXHsM)i7|+dY;;K61@~r*n7jNf;H6J5MDUn=oCXe{?NJBGTps( zJN!<gG3V5KzRwk(i*9Y?^tlWZcqsNf4~5D(K9=-d`XTJnz4?%R%R7JSt3{3Oo$bD$ zTNSMyL(n4X{OAI~w*y1WYr?y6ISt#lw@vrT1s}U@WUhz28O~x06%0=}OqJ>T(UnYG z$Q#waoQDY6jGQjFSJUh>7UI+fv3mu2T4subi*vAv>*n`K2Qo4*oNtC45ni!O%>H)Z zW@T+Fv9lYWAhD9-60G7wxH|Ld;^Vg6Fn@pSA_|C2q4!j4{w+g&7O^`Z@L^)hkyz+1 zo5x|86(q157U@6g*<d}pnp2!Rsl$QxzbcU(C#KZ)w2jENCU5~^JM+Y?B8n{t$0&c1 zRTg(`OD8#m0J~JV>j`-Uh+A&{i`mPzn22qU+%l_fM^7ngk%<@^GD~mr#^>56_(rje zw@wH$8-fe8?{9h1zf9D}#(!N!?1l3wav2plP(FTNJAUzFKlCb<8%hmG4qw8vm)?rL z=iw>w5WFO&BG=m+n#1_8JK3)tAImvR|2B1II9oRCQH;0b`E2%z5);)8AR%}HOp7I_ zBo&`e6kyLtCxV$J$2;Zj_H;+Cqq^iA$0FgS&q3uq-A^^}qSN$Er((tUL%8)+ec$Ae z@=x}gicDo04yVA&z#=j??#4x;H*fpx;Ph%zsNy~C2_sF%EVa^D<JjPIQ@SC;_%X}9 z9MSRwljBgD0&4>8XyCO{WEfxFK-Rl78=`Mis7{h(3#_f@@a8^*!4Lc(bU2#=i38`I zY&H5`=MO1#S-Hikdtox?`ON-VMPxp;%6vgxtP5`8!HZTn_Ym@wbvhCJs3qJl0wEOB zI#F5D);NCSp%k~>#%vYeJZiNe!1j8PoI*_;O>}IPNg9=#@KP<NymOsDp~avQYtKT5 zG}VCisNTtAA}-|9+O@a>=oK1kLPN1GO6NiCtRi|MgJWe{x8!`W;YD0iL>Re#o;Guk zUW8eM#i*D*1g|_U4;*iVHo2nL;3#mQg8zN~A*}VC9Yc*Hw&0qgFl9<S-reWVhqPe2 zpGn{TunDi&%*PdeVaV_WNbJ1`zOHaJiWRa%h#n84JI;$DAi;|CLxHc4kKgKw_K3`> z&$<0^Kq$ZS5v!J_xqg(`J8Pd}l>{4xPn8?*Udzt3kwRy$cb--;uzMNZQG6-_&NSpN zQfu_~OQ2iU>D^!B@%a*pjKSG6mg<_hv0X@$Qf+KvV$#q-90`Y(Wf;T}l}l)caq!)o zNuD9)O+#zuJ6mO@f8N-B@cBno3tfaN0l~_P(jNvC3G1}|)?Us_5pIc5o@JAVo3Vs; zJMzJw=HpSKue#+n-zTCKZ|VQQP<&YY>4hKYf>}g-m~W(<;suO5Y5BxTF?b|*bJWvq z&JKUAuTd1Fl)59w#V|UwgDonVOw@hY&1UvC{d?PIs_l1U47DDk4=Cz_h3a3MYtY7* zZCt}+b#8OA$ap&{>9Csa@AN@^@%lUbm5*ZM{gmQP@7L8!jOkw|xCjV8K8<%|t-4`S zC0$Q&XWfy%Ww#`h$n6ohaaG%>)=K)eTM@S}r<(Hk<Wq3PbNOoy8!3h&ZrcWtBrZZk zmXj?^xi0tP^sxm%zVK%6Xg4&ln<V%>{R*9^TPLCXJ!r;9za5H}4yk32p;r1v7tyAW z%?kJDXH7d7*lhzY@6jHj1@m8~8=I4ExwRBh*>k>XC@{lhqF7ues%z$+vpY+vQojGR zy~O`Xfo{)6{foObg-3N^CMV-vvVmuY9%pr$Oe>Qi@9lfSIK?slpWk$@c~v*NG~ZWS zWSIF}-1c?cm&glw^x?DI^&68ebm~vvpMUWezA^4UN^j)&V@)OrOzXTkDCXAxrTE~{ z+jfiZkFjSqD|1w07NVShpHgPHGgz+dN9<L*W)CwOS@p{hwWrDxPg1@;_Pat=|N7=b zC8FpC-;$46H<Z;H;3A|ReLRObtd#4hgl@LGC&W#k-!`D5<!M6IGaqk?d<EX~ofYLB zTwC`2;I-b&W-$A8CIcP+Uh!^#g*ooMd#gD<r?0Cby0+Es71A{qU`x3vs+y&(oeUCJ z@ep5kTOY8|V1XfneB}%Kl^I`6P}#05zP-nk3Vvlc%5vC!E<N2=WkgTg8GI2)>*$kU z`c|2taS2rT9gZTTM=Y!HERj}9>!A2Z8x;q*sRHQ1A7D#^+|UBV71GA<I-+2&eEj&w z?rFInIAWIq^1<aOoO2Y^jCh%v2UH-e$63!gR1cgI=-;USg6eohRvR@Zge^hZ32r;& zZ2KOV$xwGaR-nUnu4&YvEdd#mip1^rOc{7AqEIH8)GR4ER7<56|45uG6<3~+UjE86 zT7IFc$Luv%Z*-%1&*g5l=JKbv3dBDZQs}-)F0{p2=QI@a^|2VIP&PKQ?Trc{S5`t# zE&skc6QgYpJP3zAsN*<IA>}#C8JWl{!Nl{;=pSiSys^zfryUHk%#oZo9t7gN7kC|` zg7U!UdAHa&Mb_w#FQ%v8=((AI;s1>xY}DlvAVxTNswc6jgYF<3yEKQHT29Tm=MGJ# z{4=;n+7lM0EB0Y+17tl8o=7e)+B7zHmQ4}?waSwJ!O&TUHPwb;{45z8F&Y73bazW_ zba$7dQ5peJ5jRRuN?NH&w={^sXjDX66vcsvv>+kI$3Ff!|DNkQ?|a_!ocp=&-^1Ov z^!ieFM_+`HQRq-&d-0`DtLo8f=t@DsaQ&8&Lv>DMU+Ykh^-uL1JTK$TFKLgfuRIz{ z7*@Rz)l*qK7CZd34mDOOI96)bcf))v;vXyZu3+bbkJ{KB0o>8}z8$?T53Rm^ce<dg zzrINV|DbRBu;@SDCoWIrp7rB}iVJe{3b*^MnzVnR$19hfeA8=bU3&6FL%0mmS2;KK zn6>(`+iQ}PX_=cg$?Qe(kZO~l)_)&mBX=%^A3goF{k+YrrCzAAxwHAd_Di2_U$nRx zg|Zkw-g#=>-Z$wpUa9$7bzfag?UL)x1J*{|Gj5U<g!a)V9Q3?-XP=+1Z|;{goaZ|+ z6gRwCFP4FN^@=s^>hsa7`kgW}qpKeVOQRT9my9CJTGqCDC;~F}LN9OmU}N88&-##O zkJvi}Uph+l&1=35U+Hm1s-h;EKbW@=-}F$IHDx|3S`dN^=G<T04kF)vMvlEtp4NX` z>!$T0iZMM&ZS`PCl1~2(kN#`AS3Z%023IEz=D5zSAivy7PJ%GE#YZ1b3|r(iZEp+< z*&%vC2H~57Lw%(>U#<TA%ZRpPbAN8^IoH)KE=FcG=bPhoGci1-(<~HvhZx}+x9^y| zVDeyXGHb_}`e9;w%RKD4v1E|`_QcDerE&WI##z}+bfNEta;G??-yH=%AFi_5eTDFP zKAp60{AyLl`#^`v!%Q^CUJo+Z`t(R$O6BFw2)FM8iM%GBj0&$?Q(PXec!<-IU3|j7 zC+Ehk_dZPpcd9V{oqDJtuHu|1Z=9&?458k-H2Y=n;vW|s=FfV&ht;fat#h0aujeGB zzRi9DJrNJF9*G<7i@<n&vVr_8pDeN}YJ4XwILljav?^HreS7u;zcu$KWgdO|3%~h( znLl;*vX-E?mu#N1ZRUH`WUetkwGWxC;j+8HYLEn(Ld6ZhJLg?T=H2G!-M`Iy%+K4W z&u+gl)@G&MdzLA4Y;5y%N=0$r-(w2PHqUh|e{s&{=3`w)i@D-YBBjvj74+0^B0_D1 zOR!o=SlT+~LpyfISTvdG+=l9datLIz4+s$f`Ix73nfQLTwBDXtTpbNgbg)!Nx1QjN zELBpUAJ@Cq_QrnN&qL*A@}jAa&V>v|>Wz&455OG%5QkouBhGv-YkuMP>VlC&W|;EO znZ8TTMa^p?_K;+$N)vm_Ql`Ow86$C-_nK|*Wh~xNV7j&IVmSO>c-ko|IMq>jLF3T; zTeu}#m1>RhqBDOB6WhXeQu7Xv>zhx#rSq;Utu6v-PVf+u5(mTdw;u-Mti+;bu1+`_ zjF|9U{6L_$t@TiSTD{cQwe)Pn?Wvz(!LeB^@q=EqF0Sgs{tbrquEn7j&WPxV;m@uD zzg=#zJ<@gS&){}VlXo@0>5vejz~rZ&B<$E|F#XtJA@`_vEdSGZh`UkLRDqNTj%{gv zq&E?#DMshsbzCmf_u1g>E5m&C-d!eY?`+R9bm28_Ci2DH%hKmXe($s9Y(6xnzBh2c z5%PJ)`_o)B<Lt<C%DCsa@)LvCP7ZIUer&vF{^K<9RY=KsR>}JEkpaZc^usUM4F2tq zSM{t8^fKEE3Ft?uy^K%0S{~cSABUvVTO3|(RL^XRD`gl@cmB5+Jnzx-?epKN>fUcg z(IrOT^?T_~RO#0#^d}Ss_zLi8>FcpU@Dbm`Z<bBEoE!NIKL@$kdEJ1Qp0AF-aMi3( zzcmC(y=oNx_$H%wBI65hn!%kz@^j@?K|^mgp5^?~kIW;MKHt0!K7HYqq2pe^d|}-c zvas5|%Ot~4{yxO!1I#@u1mFF60b%J%U6K318QcYU7`~KVQF!^q(ql!Mcb>C(S$4r& zYLBV>g_q>n*So#mseSplU_#>v10VbB&u_X!dM6#X{90wjcg<g>UR>5R&=m!*S=4xI z@2zq!_;9j2%tw0-eOtA+aM*KS`V_Ln`g@vITl__muWEs7pN5mS$$N!`_v<iwS^s<; zwr^T8epWKfmMZJmNl#H`SF;ma$BUPP6~BC3rLf;C26wJs9bIQ!SVyn>-*H>bs`TB? zNn<beaqtt_c)IH27{IgV>s{ul(Xv=<z~*aieq@&+Gw%m$1!@lTmG&INELI8Z8^i+N zi-|s+t^@?0$>YpfquJ+1*|7O}|Bs!)e{sb5dVG<u;d;i&<up!T-D4ho$ED(MZ)x8( zC6yeVp^a2Tz?(#X4$aFu>N*5v(^2tAbq=r`-Nbrs3YMfkN&ZeFjbHQ=*nj)|_DjE> zgMfSoA5~0ZZOT?%!B&0Bmb31?GD|vU!wt~PH}&|y()^7_x0gvGTN<NRo1b36t#5Sg z1@4A?Z>HUh<lRJwZH6S38fw=wZV(wM+b>VH`{BVaViF}ZwhI;p3p1}geVKX9F~7ur zd(3jXQ+s>o;c%<)HVLkNq?8(T4vf>j8ej7c-fEQxXV97=k_|)V_CTsdJH)PU1;^7# zo`LFnGt(6T)`mIv{7p`SLZ}w&SGr<$eD=Oj|N9`I?l`h;-B)I(0r7TTe>J-vBo}*C zZUZDo*n7DLy4V}~(sNfMIAkd1;&7P{>x)M#Q-N72J4f)f6`8%|v)Yllkjs-kBmZq) z@GHsk-O!&8I3R>nvxgWRdsHWfUc^8yX7BN0AX_ToyWOGivCxH>A5HPQzjJo~?M>o3 zcX7g$!Ed{#qaie(_YrsNPW;1;RSvR54vtz7S=R5>Ra_IC*Pe;&QhCA^7K6BD!=Z(H zo68X!o*_)-<-e<4Cjev-Z`g#8!@btcFARGum$ysL0x@5tPG1HyX1xdd@enuC?MFRQ zmczzAex~kuygh%f*Mq1R!?$V|A~xX=m4HL=_fQ1Q&qVev<hviYcxfNkWE?-;)qWD` zRTd_G$1B13d`?G{ecI2oz@G+p&aV*;XU;h)shmFyYZw@`dqZ~@_86z4EJee&*Q5H+ zBE)IJCiQnxGC%CPm$2TA6b*=SbPB?amFm+t(9>+|-0?{Ma2WkG0N%PUYjri*Weeat zU$O1ElkHvhXmyT=OFwip0yeT1Bei;P?$m2<3XZLa2^VMgb$`X^F$Pgc(Uh3u$grSW zFcV`ddy~5n>)M-lUPf6I{<=|n{U%@ZH^LX!r6${7Q+8IzES`(ZccQO}UUwdQ6!tEr zy47oL<SS!OjDS=YRVvH{$CLFBeuD4Mm`?d+Cc1&hiw?*NN$w8+8BR#mVJhtW`T1=2 z&4Zn!o{X?xCxx;d;f2gP?6C>&H@|j&j&?eabUR)65?jc~8J{J6M`xvo{xo6ihUj%f zA|q$`o#CPYo+OT&I8VZf<w5eDZ3pq~yzlbbqKxlOBCFunoZ{USzBg37zN)AsXg_Op z2)^Nzassc3%@Hd&1g<_A3#oUBB%Vj9TW*Hmy)kh2&%NwFchvr+pY0a&#j;$Hj<yOd z|21{JCo1*zFQ-JAitC8Vp3gp|N7Y7Q#WZn!CWJK3f3vdx8s0DW_y1Xt?OeG0BQ<dQ zamx>PqX!RK!)Z<<sShs3bbe`g!{Ic1?^dp?(t~$D&W3JnUbGK>QfzSdzxUT~&tK-4 ztBoIga;A6p&!AOY!t~A2JHhuCe~-WSyiW7ybz!{2^gjV7z@8>{DST(8W@lF?O7cbg zw&=gZUuR><|NZwP-hd|c4hqWrFJK=tn1tj|2;P{&B;H{XHEl}G7D!CzQuU9b98^MJ z>=@^@@dG>r9QJ2_^XpIHi9*JJnWig;B9kSTuK(QGRP>r4$sJ%h#ipxFh)hz1;4NVD zRU)UfWBTb~!w}JxHdOhwvX>JPHJbAuSB&IB=hgS^A;oeaNN?oVnbM#hndPU<D|;hL ztu0HP0dJWdH|8pnsR#sz9Db*_ZT=1#-oz@QB)2~CNcCFH6&JBG1T7b5T=1oKUpgei zEqC+S@Wn}$Z)da56lM3G_5JsHZ};zY$7Y|)EIMW<z2S?=_wT?wkAGaNyK9isiBuLe z&6m;{irOoAr?bC0l*<?PQuEK@*7U7kZ?!~hD&MP0_`Uv9Ia>Mqf^F~*t`OYBjeMR+ zKk@4%r!(<hj2kVslRN3D38z<*vU)H2>Z6N+?7r}}f<^D_(wHgV{1@Mu6HA(Vyl+ak zk9*&HSbAz3SeY*(kcrSDeY{;wyI6AVnXnT716KAMRUz^cPkk*6`C~t2aWe<v^Co_C zatE+@)qXRa&9I-3qkd?fn@KZ&bYne7v5%Ec-^;aY?zYu*;pID=?ZU#&*g;2pek{`H z6OOh*y)K7if&D%1I=`<_r7<`r*CUMoW<Ys%^EzuParKllEwBCq&Ev=SB$jHGb3~?U zF6NB;lw>;Ga0sPWS8H_0__$RU%E+!R@dPCzM<OBV#{!7)NJKSpXzPlf9{0y#;i7DL zieL1hSAeyt&*WmGYwYmjySj0d$27gGtMX;IoBM5hz0^Du?~PA24p(hLJOh|Yew8XY zq)^4sMQtPZ41@=6vo|(5gWwXfL%Xo;?8i)hlO;#kF7<6ZPLcWeW0d`O+Sh6eznfpL zq(@)%en|gUpN5MX)bs#85tvRK<&LOogY$;=;@}r9{rYssee-nUaPrbKo4c>I^Cdpk z3pZXxLz`3_BJ(>YJGYx%oZQ>0;<TzFX1p4YgTPcIs%mhM_jyeD*xu&%aH_ndL+7-D zO0(UZ0V=;}sah(=^811f&BdgzIHQ%j{a!M>UsWt+c%$XcV!wV(K*d@fz5ZT<GfVzA zt;4(PHa|qY6lCW#F0gd66ojIq<hKoFs;qbYP{Qmg(LUT*aQ!Reby@XFm-yYR+h^0` zb(e1ctnGdRdvaJT9a8zTUV!!Z0P}Fvq2bQ!j~b`_s;|+_b+Q~<e-s~NWP>|ouqS`% zyq<=)+Vz$3Y*U+9iu)Tyf;P$EN6dW-acO38Lj^J8M`cIy+18Ib3cJo$)U%R;2^C8- z*M9o;z3<IT1W8W*w^!IbCms}2O)SS!oK#wsTa(+lR|eyb27egbb2ORBKOLmeZit43 zvHlzH=Q(FQslWBLKFoXMUN_7+z0GH_UDnVlI-G58q5nzJdo-$ONcz&6jSFb*Q^7bU zv)Ul}hlb#XkH2J<Tjb*Ve-<KrdW!Cjtm7fv1zXy6MlBdA1+~}4fEF`(KFKmH>Jo{C zrB_;BVMe3+Cc*x6p`6yzCR=?lweg(fq#W9w)OhP6^^{YWIiWg<mOCBy@%m^|-AsB* z`enfv*BYo3I}!0WbgTbhDzc@oM(9G@T$yn2ON>lR_a@A|rE*Oql$l1-ggVL`DhkjN zp|V9;ZC<iBOt@2(#q;>=MgBOB8!F`-=C8Ydm0min#M;zj#-CPR3^L)dY+<@b*cr#v zstsTD5)wzuEqo!1TlZ)x<QTsqeb)^b82e-=;Cp34<Ui#S`q$S?_tOJDEvCKh=$#3M zN0h6-5uZ`ImzxZscQbhLq5Hm=gdXR#NXu10yCBzl_v)jt-fHtjTNi8;jNR8v5--X6 z=d7h^ri;K?+qoVoj9#^TTO(V|EMA}UAYQ_vUOM?v=dZT5M&aWvW1~x!5rYpJ{S;Bi zFD9giYt)E57z%aCf@TDmnXl31c~ydbDBUk@-59@Xg5!@J&yd1Awi8-&&;R~p#C9$* z6ec`4DWajsoRraZa8+`MYvxI0Ow%10kK+^M=!axKfu$<5{fb8hZm*8&2i)m{lQ(2b z3<>oQ#BC0>8<&cert7Zx5m>|e=Dw(Obv0HykFh3*Wy~9>|6~aX?C5jz^gAgjeIetl z>NdI6pn&D^_@?1;h)(!ymAk%Mr3|X`)Lmu+FMPBT0DXMFIn%>WoX_e)1`#prwyDF( z8#k0c40OJt&pHu&!(Dm{-O=@+s%v^D#_X!&gi36af3xgR1<E6T!S`vKg6-wNuXB1Y z3hq&pN<u8Dx6DZi4I|WW`Si<DUpZ%EM^#$nGsBv`@*KvFY46Er-;r9wu-q6o+&j3R zwq;(XE8pAE6%tYIs&{6cFI#ufSl`%80~XZ#hI8HVuZ-jhGPkoYuu3kOzsV!VGL~P+ zTvGGvxu;v9;8l%H7{K;%`Io2U%eZfog^=6Xe}6ueFY|e#XD9r=c{o~~Qwxo>OZ%)G z)SVy5+wrjZmRBya&&l)bC?(?hC7ws@axGnX6&6xUtg}%g<u{d^e5AKsX8RVpUn;j; zqkmMPtynaZ7ZPj+$Bw7=cJ&f7V|#eE{BAv+eStiT{-ElwY!y56p*qIs?ZelXIvA5i zkktK%^#)I^A01PR9~!~Y&3n-u&pz+Pt3Jm;Oa?rS`gvzMd{W+W!mvkb6m5o*+}oSx zK5k75>rF1Gvw4I1=?`YZ%yojiTdI%#41}+!_Ls7|owPsdHPUx^t|#;JLGJUlzEF`X zXK#uw)3{C3k$WNc=v6XIp09Jq^jb?lbH0+5|BPPya6sB(^RW|m$M=hG`ZXRNSgfcE zQ3o5J{#O!u?%UXM?7#W^KrZas(zE_2!uJXJnae6}MH}bT<pH)mhtDf<eXiZ=pVC+g zBVU$0;>R72CX3~KY<Mo;J93Evkv$y<Y5`fpLv0<j+`rcU$)AXiGyS&M)NL2f|K1^X zkeV18Ga>r<xh&rsOVvG_x?=9nNjh3vc45)Y#oXCu2iZ43smt#YpPdw4R{SVSAEjJ* z!6$(25H2Yjr)s6W=MnSm&3A^SQL*LWTRQ*1XDxp=?fU<0WoE7Xl^J<XQ+%)AHN$<J z_V<Bg?CJXVG$WSz@VoARze}**-1|}<5-D(dr>pkG%muSQy2Z<X&Zs)TOPcMjvKQ02 zi@U{($)9gL^!V4s_amB}r}?u?DId%eR%TpwAV2nLfbmze)1f%|@Yv(%KYO5nM0>_} za&h_OHvTj5i-<Bui5~?vn(d%v4qL{%Dp9_@x?Fw5^U()h^!gXBUB2?;FSNY;%*>u~ zXewp<0v-+b`k4RluNH}+qLh9W!|t6z%f|P+I@>rJ!<mA~Gr7!M@c4pbX?-0gi?Bj7 zT5{@#XCHlRu52E&S@La!@4GOG_Yv$;zT5VNl?(6+Oy3f7<mc^bThW8Zyl~Ee5XX03 z97FsitSR^A#~&wP$U1m|KZ~|eFLF@r{QPN;Uq4vE6jX>WyK-GEhw%W2?iJC|Pw)h% zGXjgq)e2#W@reuXQ!^GxoFfwv4wgF@gp9X984O`-v@K8A?1CzW8Yya5DjEtZSyn1J z3MzY6D*FqngjTA=2&%?cs-_64Wmc*cd{yg)^4gO>v$}ejkmVzD1U`B`BvJ-nQIVZm z?@8g0WVi}{d|nOPS=9ztVc|kJ5dh37q{~~SD<Y&PQ>CXOq<?7*j3Mhg3K>XL8Tha1 znF<*gav97df%OSc>=)nR0r4^+)7Ou9<uZ^h72w5+KdEzumcDvds|*c=EJJ-Q_k3|D zYuGbiE6*$)Z$s!tmCfFojfk+VOtr0wuzo>?Ub~I{%QcM{HZ6(Ia*y6?=n`N;f)GwJ z+jBaubYYi*YL_x$*P3eA7GbyUYPXld?xWT2lfoVg)gH^$6G~VG8M3kOH;wacesv~V zn2eMc^13AKtx)YPBH|<Cug4%9paekG{Cyln{5)&?CWQ<=t8k807ow?aBFXxJ3aemW zf+sI8gcS?Wk*{`(1ih>Y8WjnitO;Ha30bZQSr-Z2s|h_32|KF^gNueU)P}Q*M)1}~ zFc1(bqnXd$9q;+?G{XZEME<!~S@?_i`-{eeit6ju`1|VHT&<0b6uprtYH8|?Kl8&I zW;mJpLo~^^Mn&T$YvUF~Z!g#0UKfqutBpSqy>nK32QEfns3Wk85qax~B4P<LbqOLq z5Ih!EC5l&Ab(pE-$`?&}6p-Rrb3Js_cfngEMJzS5F10``t*kDsM(kco-MwzH`!DP6 z_iaQ=l%{R+8zhjRc(NAmOXSbGtP`>9v$|}!_ydOe2khcG1ypm$TAj$}jlg@QxvsT& zqhjff;`yHS`TpVsq2g&V8~(v{DJkMb3hQK;|A(qtuss=W3_z6##V^H6M(ax^#Y-3J zOP9sV);EhUJt#Y=FFz9}!5c^n5|7!hmS_{8zJx%Mc%^HgNt$?7=9MbLszPu074wEF ze~Frynmk9}TxLN*2Ac|REIhlRzCfa(tf8SsqOql+v0I|)Wkb`bMDt`r^MXXnazo3y z#FM>-CnplEXAQ0E67bIYXl?$y<*FK)?V8AdYJYf#VNl0C(HNJ&%9nzYo{in1l07kv zJ@JygDUH3El1~d7pO$U+2oQS8Hs#~<J6~>h3aoeZQAer=8()kDS-xCLk8j8=bLzj@ z0B)@y!=(long-aV26>wXMWlvgnub)QhP9i94W&jbn?@X^Mm?KG{iVi2o5mt{+G1w< z<0bkfw#`<zU(_^dPi|Y)HNB~j(rO3_cr5vLq3P|i)Z}{8<et>K6v=02!GAf|G%BQ~ z`=s8q8@yQc4S6m#>n-BY5Hx;OxczK9BSvcYL~6mmc_CE#J@3~s-rzicq4qzG2HLx? zRHQ%N`##;BtSdlRs@aY4_nuZ+o4RNBwjt>Kdh_z0^p}(71>Ne0gS($XH$FBP%xG7E zgs`hJEuSt`eUfSZ7%H)L>D!v^`s_@V?v~_oLc_Qvb#2yv6)d%*;n@78pk=d6=1Y#u z5U-?zO8rYX|FX7pEmC@pp=CE=b5%k{mwnH*b9d>iWl6+$A1QNy3~^wtIam$esgOBT zd2*;N+Xvn|V3$2UYr(nxSo$gBC={}{AfOu))}a!5YS{Q8Wyhd<ZyW4CuN(5AJ*+l? z)OSzjXj1mSg&*>|(gQIPXMI1u8HW5_{_$a^Wye-_T4Yamy#=%_bIQB_`sxo0{lNbs z_ZCg%U{<Yja1lq(#@Ud@Lt=$wyd3wsMM-*ia7HU_xg4^#75OB*#Fvq+ZJ+T*D_x=- z{gC5Ze>u2YIP6C&!)3XnOZ!&m`B6G~CXO~H7Ah8mX=COf>j<^6$jY<ow6Pk=vstyV zImxqMZetIS=ioa)>l|=!AFzuaFeSEel*@C~wsAd?=k96a?w98oYvXw*fAM|W#d7%z zdJz}wA~-oBc#98sv*bBY3jB=i{2U4bhX-7c2rDHlSPplglPF}RAnepGd|5#xpj{+P zLG*gN=p6;IyX|6G3gU(B;^hhwwe1p56eN4vCHobm#@eMWD+nIy`(WF-*4kx$D9HY5 zm!&Gm(R9c$D#~+o$nz;Gh;}H*Dk`dW$lM|-8g(dHDJna4C|_1o3FuG>>yUZhZiOa* zSg~qZ9cqP&>g65kwThRXbX@9D)adWf7^5m`zU$C@uc-B<L+iVu_KyzjUx!-U1V9bP zK?mq?bn5VR;zX5nWjl3MmGpEv^^BDCtvdBoBh=iY)Nd(T*^?n^Sfe|gMt7BrvpS6n zl}ySzO=^`)pLCk`D4F$lnvE%$zw0!AuVnG1)8hM)xeftbLgox4GNZAu4JDheoi-fG zwtQW-qRMu%U3RL<_BvhmMqMUBoen)7rcp!~K<0E`ak!)Gd^eiio6JQa(~<^IoLC3p zj}N+!Ez^|U$GUc7mFa5`7n6}-D3;Ec$a)GezsrfdQH>X^bl+yjb97sYeRbvDbKUsn z^={Zl6bcRZ%d{n&TS4LWG5$tWviIRweN=a;oIb=E>vvfN?tJq6Tar&=jMcCKGKt9U zj$;eNah?)Dnksf$0AwR3=j_2f{ut}eD&ab2QEGW0PC$RdFRH0qUre>1^_TweJAJjD zYkI0tssNbh`ZX)n>tVk#>{V?;u<&5OKY#$WCd0G4p{eIau9E1(`-$0bA41P{$&(mH z=xrlHY#0D{#?~7G^*O(8xm}Op0Ne?x(M!Ls$)0+$0$iu(R5buqM?f|aVQSO%ltL3J zG7#71-M@J^AgTD?>D7R8g)L!^aE8Pur-Y8)`#oyu{k`d9Y8mf(Gv2FZe(BBp-m7Oq zrcF0YVf<w<Zs8M5C7{o9u+Ou?51B-`V)a=GuQ>0+k^qrWSfrc!HvT&D6hKJ<F@jkA z-sVESwIc2{+9blB|3j?41^l$<ynS6iibd*^5yJrLR27aVv?;-9gRvky7BSvjsL@Um z3M~>Om-?(aVzD=Sp3<ZfV6gy06826QU~)<uQw}g-V*^^4S+Zb}xi`*Q$vP8c&VNyC zC4J0NH-f874V|%Unm9Hd9GEj!T7?|JLAKodlY8ekU_U_n4-%<p2q)b574?`-;90w< zMu*-qgq4g+!hyzBiL_5;ylkPyMA!rt$%;jk0N~cm9Bncj`iC|a@F73V?^0_C``sx@ zCHK5fp(!E2rhX*^{9(ak(a#Az<=7)XGA$MWPiVyCl4)7VbgfuW$?v`=s_<YebQsGK zOQz#F_x=zVPqD}~_4*wBbX6>f2gEKFhenfoxB-+J$VmZfE6hfljRj+Y>T|>_VO-xC zTUPvw$({&>;$9zKFMHN=pPS6oiY<QgydnpH>SK}FaCkNVNdjosPQk`ljw&)xLS{3@ zu_b|MIRTT6z=$9<j0+asG{8wYM`sXd5THlpSmXrYLm|@*!#)dQ5$8FrVFJyX76T{1 z&_wL#o6F?T&f?Zy<$Jj*s{K{=<yX~smJUK^){Cxp!w?=21O7b!P(@}s)kIYR&{G1f zI}Q>2hbfp$M<FxC65eY<As904;>r0-%XCUc`4U)$v23xL7ID?+?DJTX4H7|oS4(CI zzKP%&K&`z%BXG!8;L~67$SsRI0RRmDoH3Tn<V;3QVA1%O#cqE(gs>xH*iCNr!VUs! zEP)Y^Wpf4!?@$lTaEQR?jQeMSg$=Me?C395EJZD0Ko^cep9$OdW_u-qb^WUXDMKc3 zVQm#2Cb7q+_c(B#zRqNVmq{|i<*NMyStysV-U3v8Kp-I-DrE7<7fmul13{y$*%dJQ z6lITv(`<!xQ-t`H(Nip!pqRaqZ320~i$uj)KDj)Q!lqFW?9vf1UE}bqAY=*3jci2- zk_QvJuOF<>KfC@T;f{Do6@qzyfaVbrDJ!xerxC&Es#f%1LgOMFZc7ofrldk4xVRF4 zq@Qs4O^F_-^ZwMJ9=j}pr;Xxcm?Vfsn_E8ih3~$mO5w-xe~o?ldA%u|UMt2(+Cjl0 zhHZ3Z7DfshPe=42FtTHWb)3UX4FFLO%)hg{#1}Ae?S^awZq+!I!r7Pe-;SU`(hxL{ zyaNMH4~Yb{$o-ZkSQYv4Jvun&5V2h7r%W>Vr-pR8AQCH>w3z4o6{^G@4o0z$W(z=+ zq|hW{9Z>f=5w2<OL!kRjeQh&#@y5>d7$1uSwt=<te5ArA!QA$h@PR458|J*vpTc3e zzb7Z$0L@NfRWRj;(PjU;2ZCB|O!RXYBLtGx8?b>*@*p38Cd<1nC;0-inm{5tj+Bu+ zVcR~H_<;H5B#Ff~RshDH7d{B#Nl+VvBq)%Xq~J)w0fNjrT>_NFI50g~LTE|=at8Pj z6?u}#HVO1ni})mtG6YD;1l3NSdBSsP6^dX+NLwKm@+b(FOgT&vx`aemYsR8BkoF-C zffpAZReKEZR4pFcf=9!>3Cfz7l?=?XHHe<JYGXACvk+TxU!sKUl`aUz3Z^Jk^?Ik% zFROt-VGpTNi<Cqr&qyI%bv;NOU8t$^Y8oo#CxVZ+D6o|#j=YjYZz%^r_~p7W2p$Y# zwh_+Esh-NI#;%(Hw~f@rwM!ZP=Hp9BC4GXGY;)?Ar5ytanPzUrYII_;nVU>ILs%GN z!V)H-oeN8O1Mb!bX3*^WL=p#c5eS@_7>jqAAi)0$ofO6AC(zrHTzm80m|~IzlhlYw z^hfa+5PK$Og~*CtB;V!O?@l*oL<AC&dj>fni7apok6shKT0*<1oH2z~ylRn>2KV3Z zMTuj`r28^b=+!}=*{O>Ab5+I#tDkTD_<X&T6QO-dBPEALs`x+u^XuC~t2YEFl4^_~ zZcuTQ-%w6N%;WFxO!0r94R_*Icsw~5rJz%c%%J_Q_b&-hvMl!R9ddseKYVcslSnVO zPXMo|V2E^|=%qjU5PqE<X#Nsj6FJP~gLD*-bFdi43nVV86j~A`_D*U_?+bWwjQndl z3xuNZF3=T`n=W9_O90)C$<^#)PK+_^{GYhum*$v0<9TrHEuCsI2t=0-z+)W`vy1eF zm#dR3l4dyv(Ic--2I9;*E0~|<@F)DIcRz@hmxH=eh`<1%m!DtOHU8Pu0)28{*yXDU zfd+)o$7e=Y30~wUR0izY@cZw0vkz<-s)2L(QGsO0Uf`H!L$Fj59d%8RrQN`jK9Zk4 z5D=7Rd1dU%obIw#B}{w8L@)m5y=tXz;v52+4h>9s^lAbUUgGkGGEGTHetT&u(ail` zTESEIMd8`hDkTwLujFA`>H9a{c+2QNe0Jo=LhEN1n8NgEAj)6rp^!;%Xm0UmbCg2k z?}@;hxh0ymekP7-qfsq0>7HHzGGD|sqhBAE9GVMiY(BKQRmM{O^HYG%tcxX)A&&&J zV8;HvVx8RX_h^DHKzSg|{E0qm#frY5L7I!ry-@qgiyk#bT7A~%=-et{Wf7xWS8Vf_ zWgjD=uVC*!d|f!1SGHfZX>p!szS9>~t=0a<iVCuS49~CAQ@(0LeQ?wM*->8o((tBa z@g>`S5^I$`EP&6()S}Tb`jOj6pt0hk`3OS?*-PdGm+701T{Zd5LD4~OZyy06Ir%Nm zm+Bmgot<)C&em9cYt*`KI(rU|FH2IE(t$KMbvfIDL|cb^__<wPSr)YCcQyGQX5UrF z!?)Z!-pMKZ;}UuEO~vY(gweIt`RAUU6<%7qLFeO08t<t{Bgkad@M5>mdj&l&j(5Xu zxj|?MS=}RAMOQPH-qxo)c=~EMNFhkwA;_@v>HMyrLvf?c)zR+CPsuGok0m|QY_C6G zQ2r4)earK>rtrmfbl9zxzn;Iluiq?g`*HiA`0}}a-+vlS2WCIle||Hly@ZME6X{Fv zP+8}JbAxE&MV^(dn@-Q(Sjeb9x#C*7chJ!IpJ{9tm-k)M9w9#ExAK+6tJ=(VkKRQc z#2j*cWsyA`RPH`VesJq+h-uLn`XnNY_|J!*=Ha-WO5}qFalXQ$4_}$ZMCLx;@tr-H zeOfekkl$9~Cmr@Qul3u{!T}zC`K$|_^lD2F`NCE3IS=24#2gl{?2IDt6!qvD#ZqBl zUhT)jcehVEJcThtgiy{D@$B#iXY0u1qht`Hab@K-+D*g$$e9N<N>z!EHcVByGR*u^ zJ>1hajUzwi7a)~6SW2&0JN=nzjyd*lRULzWashKcuOwZTZfl_urZNiiBzcr+P4S5% z@=ESlrU+-iNAMOuEe88fMX+?9l`PBPg1ue;;vv^nTmI?BCnrDczBFC=E2P1rO21ni z%(wpN^Dg@vFx0|Gbm|SQtuYP^zX)=Frcn%WbCjsPoxlOb6iz8t_zeEiHn(|_Rc-i{ z(n^3pd+#c!sXZ8P%`tNlAwwMy1CY%9q$Pqp*fbW+aJyA_CRzlpLR-vi{8KZBPSWOq z`gWIHIE;T-_`2Gwk94h+L~scSDUT&HmEaZm=QN;9Uw_S(xBP$ylfO10!NziOMz{4m zOi%<eONClpOJ|d|{L~<wR4V~p#Q>7s$AOIri5CKqRE-(K%YRZ|C7_cA#I=ow3M}Q| zD0`6L`|f3(KFTkeY&_hj_t|+yv{VjFh6Je%f-~h((7||dSP`zj0Zm{n!7D2|LujSY z31z-A%KYIT71-KWuxt#(3qyR?iQ!{4z(B=~^$-o?(JMV%%Tb@OFIw;y`2s;S)G1Y( zyFUb_16Pnvf+i5={yG^k91>(~<KMb}o;lT`vm)a-S}`#2VzP5Na=;|-_A|-FH#9&t zmP0OEK(sCc$~*q_iwOanfN|A^fdTxv?jk260+?e_=TE$kAfH5z0aK8=Syoj9=o*a{ z0z;QazMF)n<HRBy1J+Yt(GHS8)Ik8OCJZ=JXpwjz4}(~c{S&<Zu4)oeLY6}kKuNv; z%mN%5ZscqzGk8uX+fc9tPyhyS76vyEfIci3AR#R&e4SW?fH0zu{4X4cqgWsfjS%b= zKp6oB$Ixd|yx|n2CWUW?08D27okY_c8o2GtLWZr8yktl#9+-R=gCH2^w4%V6LrW|w z5OKGGgxoU#c!VOsQb8CJ(jO0iF&hZHe?zUkCDwHi4?nLb;Dik@`E`mM+d$JPhH~2E zqjk1|NWg>2tk{095>lZkTRcB6!H#u^Rt1ZKlTZqHw-)T0uFPiMU|56k2VSv4B$>&p z21!lvhIrnEN!Une``$cX;b#EI83T?O2N2|QcsZ>l24YD<brOIDCcSX1{+hsbiB=>W zZ&u;W=|Gn6qaZNyus)1{KZdR)o8I2f62T1dC!x3~C(lLQ!|{;O*XJ7Bo5+3IKUJV4 zYZMCxA!#ccI1SMx^m2|1*pk8NDbR`$8FoC}KjK{C6wW7ywETGBJi6=qmCtu9D1qdV z4vT0XHxa4^bn!w@$MgM%<j^D@Mc}9L4?br<`Im`8&!O=QQ2rSCped+g2?a(+fPoVw z<H%rmtxL)ztu6_84FmB4wp(A{Yb(gKHJu*4h5T8QM^d%|BfhM)OH;wY@vU1QT4|Du zy}i((w--c-Wzw;aUMcYmrkDmQ@*bvyr`|^-`>lNk0qOD&?*l>|NkFd9&bB<gNxTyM zEs5OwtfAtJnZS6Rg8YawW1#$#X31dVc=l%5=-iegda$ORxIG?bi$w+x3SPI9P8!Q6 z)Rs$`%(~Z$Tt?=#yvr@i&9yhVRDLbLDmSC^Ft>rF{NuRDU1`n3%KXej&HMLdXru*m zCTa7?fmfNdrW5+e+g-k>XM2h|Zf4rQXW#k1&E#BN_*A9yMz<Wi-HKMi(cZ^ih<aBR zHkGiCgV3{aAH|Qq(Uw=zDMwYP*z1V4>*81^T*oGjS^wzHl~P@iB)A!lBdU}xsMS)* zaHJ`JB3IWhN=H1nTQjc<OZQyY+(_NrFgeQjT1J-bm66wVHIyquMNuY&QKfVBCQGkO z9<Uk)-J3~OGV5a9QZs)S4$p85ekOC({2{GW;Lecwpy6zk*@sSxhgVIfH}6yC?*Dt0 zzGH8hHEy;fP;<m;@I}8C$e*4PH~-veO`k6-WGXtk-APum_|+lLy=BxaIl>-o<6~y- z-t;)dWK;@i8}_Oz&cwV@yqclQ-XeecYzvD*)&8k7uv02`RK{JaXmyOTV~QGL*tU<3 zc6xjCwCa_fqLQ<ugR@3wC%{k@$=aPX?|h@n<%YxTzgIQXM|O_otgf_;b1%g-{zJN5 zGp+G&aP-PIaF}y>b?jnMN5j!|S1D88>}@vZY+C#5^xmd=m^WxGdd4(R$kf==DC1+V zw@?L5(vgE^icu`M3IAg3)+4)*MbR!Abk6k+?!qVb7jnZ-B|r)kTAu2c%pr<vR}~$v zd^D{~9TmEq4~vMiRxV(^#Yu)t9e>~fU;MAav=<!Bj-@Tb;|n5%c)p4-12i&M?s^XS zAV`j(0*-};jt&ku(e5i|$DlGiodC9_YKVqIVPDN3-kuWYeqw35p{_`Q?fXI!FfdL6 zloNBzMGB|Gf=?k}ODuvQix?#bXNeFMNGN@OI%;pYV(&L>A0d8KMN6S_(-w;mu@t5w zExV#=%1H26Q5CK`M$MZeTZdlHP)4OO*FJXw__0Cz*&T1p`Mo8QFz^N}YO)p8f<@kJ z1tADrT?CjM27zctD(G%>lKHv_p*jbMK{9y9K%kFIJBkGxCIc9XnXxRW6OfU^GCBM} zXomh3v6AVoMunt6jR8onA=A4JiyS4>dZjCG5KaSmj`f{Z>OHruSV5fxW-WR<Ykh<i z0UGW|SD5@)YMKU(0rQf8Dh$+{tRWI^X-ESBlXsCAIxvOqZ_<xXkn^*H&Ks*z5dL4? z+ne?nB$Xf1Nx<%ZLvD=#RMs{iiHT-d1i3;JZ;k<LWjr1AE(qQ<la8|Zta_K8&2)-P z1IHq#Fp>7TZU6z;dQ01ax8Lxyw<SOk6p03F;evNj<!VS_0L9skOv2EuCBWik!Gl<V zP7K@`EBK5gBCCfYWZmy|K29Ks$EboYQ+~vev|C63HUkh4j!d_=rgqx=$0=PAZS^ko zcJyg>S5vTYin%A=UYc+uMJr$oNVHK9KwEgXft@)CQ#X2zk^s}hx)_gY_lCP@8X**Y zKt*~1amnd2iO@1~YI_QFIaE~$A6`X5#-I49$b!wWmp6@QRVcOr&cjIB(v6N37rMq6 zlaH<w=lm;Vqd=jxpK~FW?LpgxiG=SeWAqfbfAK{KgiCl=W$1QifZRZBs`i3xNr)oz z2u+K{2Rho7%#4pOPcHper|?R?ZZr$pWK=qo+G}re*-kkw$ieg*t2+yqRqmX@->U`# z^ClM_Wu4SLj_4|DSFh}t@EFlkSCp7$ADt##QCvFqd}>!^Bh9b>N8~2@^5-u6fuiSy z4i!-gw`&uRbE1d3O>4!Y`?4Ke?m9fbd9z!ouP!=Wqmr$hMOvfl*fsZB{fD~x(!=`R z<C>zI*$&DYY_9Ibe;TT9R*bMUwSBC6<=Tm5@o)<AdKsV$hkGa2RtM!Kue&HG(8SA~ zyG6t+s6TJI;8@~ihK6G2(zdvoZIJPlw1(yUg7l3-V=nSI;@an%wQp{=Uy+RUPau7p z^9)%1YTMF$d|U{Xx?F3L&kTUWNwJz3X+^;x$KrU{I&|-s2t!)wxLE8<mrlm<d=Ysv z;u2XC57EWq$`mc>yFIUbsM@|+uSb7O_7_@voff}IXpw*+xImg12(Z(aSnS}JUoQ6d znE?tC`62r7<}GXAh>5A_Qbx$QF?g*GxJrKu-rU)RH;jLE!vw|y6M>wK^ht}7@igEH z0k9S2{NNDk4?G#x+vR;0oj~*K0-ivJdE1KsVaSjMYuY{x3`)Xrw(uY2J1en3s0ijP zdfFrvy!n(gcod-F>CGh4dQ<2h{FC+*!n|$brZE*$;1wv0Kh>1+eIod5P=W4wMo9}7 z7Er;^$?4xm;-g&1X?L#yx+G+dGi^nkb_0M~9*H?`UrteIXC`xwL?(`#QLjb0ie<R? zMVazB%yJA+qok2i0;qum8VuvO=Hgz4MS&A9CIVn{eHcNNj&Oi%!Q1#_LltY0Dz({r zB`V10$RuN=ZVi$Xh)N=GDSFetUkkrLLM2py8ZZaeLUb);u>ExnQXNw6-LwgY9zRAi zcwPnW!PZU!nSyGA8{T_$y@wo+Czm!kkKWLO-~5>vKZLhL5FDvZ)v=8vn{!#E1&gY} zY_>u!cVfv3iZQ}DK$Bj)IV`@Dr0fi!7P3+>VPZT6h3Chc>^sly#Uz?FSQW`$Wbk7a z$tDv(*}tErFE;N4vUHjQZJaJ{veSPZy2eC8+G8YoIce;BV_U}#lkmh!IaKX`v<uTB z1ubeSflIU)2&24`?vIuy_lL!to;!NlH{V$FDr>s=J}Hip*%9cra{!X7L_x{4!~eFc zw64oh_@rKB-en4IwZfY_3u}mC&0{0YPjz*Hxa-pUqZD!%h8h?l2H1jUa^5H!O*CTG z67biT4nLMx<|4=u$wmCj0tQHoTY(lZIeE>)2u2O9y+h}Y9G>Lo5xUk%vQNO$_A<)5 za?pITL;evBuVkVDV`<m*|5FoR7cYOu5C|D1c)}@&Bb5wh{EwLH_|#lb<U?4_SD2+n zAzS4yPXPS{6ScK)>u4BYwn5qB(er9DTN*L2(Lw==vdmZ74TGusE!SEw2yH=WwxN*5 z=eS{&XesQesAvY4r(F!pu7Px%j43=1<fJlbH&8&HBxD&@k;RVxQqDem56YPW4acY# zRSPNzs+-rMk_adB&af@RjmVClpw)6R5sKo{OqF{)m`ulgDGniDF`ULK>H0iXzH;;q zj9n;@K*A2d;F=1U-(jGHJG9K0eQKS8UjmGmo6{JRO-{H&hn71{14NC>spuwmJZLDP zT*rdl!aA~+cn5CT&Wf0=eoc}I;PsPh#if>NK71riAd5gA(2-8uF_97<;BXUDhqPbk z#-2F40v-uF;m;XKC~oa^wYJrfbZ(7!I`#IoS5OX3{1hGsX?3;=oeWkv445cVR%FxK zZ~tChqow+JLP>hNoMcif71VttaHjai;KGZ!?>j4<%5E}dg?ov264@dxC;zI45oc~I z)~0JcJK6p8>=u<l`+02Q(}xUFS=ulD9Ph|~^`ySMee285`K<mdo&K}`{{8(+<+~76 zNbI%`D9DF%M<B~Oxttlg;Z%O&!|Gwol@|G4d<ti1;Ku;2_;Gt8^7d%SEi^snG@j1A zd-~ekF&v++Flp?Qq4H<U9t4Z?b#w`5!($=Rr713u{)`hB*Qdlh?0HGTTI_<(USoDv zWcz&~*wFum?}N?*Lpy6(<$ZGQ_A&cXE>v07+T_Y6r!Vg9Ta$A;zlZ2liI@C!Q7|;B z)2}S?LRu~9y)aD<HZmgGr!rF;d8I1H^oVe-p<;?1#J%>1Srp~MVGIt*bGaZ51-yiD zJv&+##HfwMB5i~B8EM5?$qDRe3_6j$kc~7<i$X*sFsdd~1|Tsiq_0LbHOD*VnC5vK zn;LBlKr7KorY0~JnLZ$f^Qe5V14DcB26Z^0(eparBTwEzj7l(2kea=`o{3ZPupKz~ zx8w|yLpFM@|9d-Br~xL&odANjVhqrXMO?L+;LVNcNZ!Z7Rpkb3XniP^vi}aQ-I^`? zJhx>c@{LUY#Ah&5lAIog-M||u29MaOtrwT733_0m2|2w+F~M_k5w1Ktg^`K1mq6oV z3<5!Qv*qkK_)j}KK<rU%0MzFcZ3r?-VlqUI_-B*p)QkxLt*(-J7=mAp4%Z`^d_L@% zw$(bB(Nc37h63?K3=e)&#)56Rlh9CFgDVjUpqwxCL`HrgG!9CSmy6-xPVxfLqCZ`v zf}!H4cu=D@Hk&~6iI+baMh~%YK<LJ{0&k@>H6dX0zu5$KHO-YI*swshI)m5WeO)*w zE1F32S~VTlrkG1VpyQ<!uFGkJmj{aF%CqACY(060Hm($vS-ZhlyRr$OQP$VkY&D4| zESG{JprZC5l<Xpzb2){D$hjX)H<i$aBqX<S0w`WFEV2^|AWHC%{9Ij*7IK0T6o;ZK zBC@vZ6WYAUV4n^wn<YRTZ~)za6mh+%BEf_g_n^(s@SxYeY;RdfDE9C{R1^oCnT~|) z+0upRkzk_fD^N?$5*o{F5OeDkZS9aQq!SBf^7M-O$4#cOQBi?Vhe;@hx&+uDA(0h> zryKZ5WUnY9wn>waxa<UGh45~AO=2XhE`eQvk|_Ak2X0k2$V6UGlz&cv0z5;Jg8&gx zLJqa?E*I6IeQj;{T2P9d;NMqR3!We$;RGzma~}%eA0ySsMCJrc5+(|V6uk!il7s=I z!|A|=0$8>MVFJe~9vJDsnzW*cpeg``k~9GsPbJH_4?vs&;9KYgI1EZmL!fop0%MGX z<)#4-43+~!c{`(p0}RePC@rMk^3xiiyGa+4fbG5j#iH1DbU{_<MEPO7r#3<tT~nJ= za7sdnW+#A(#9%I$9*3J^$!xlE1is0AD(&N&AQ_M~fC%&gfi@CY;s_9M-~a&b)jcNw z0E85NIB)nG*ph6-=#E1XXTgB>JqSO5fjIzJj<S;k1$omv`{o9RCx1$FeMtpg2rSza zMWT%JTsERCC=XGH4x!999FB;rws>NXNP9JIgO}Tz0K_~3Kul9$b}9UXs6LQjiOFTT zF~}@-l?byv1R<Vb9qCu)Kv=EsoF8MYgf+cVIWc4=xOj4M$Y}5}*c-=7fQ!#%!*b}b zg4Bpvd8|A<JXw4j9R%X5!q8pV0DsU8$4Vy=Dtf?`AWOWhcq;{2%p-%cBonT4VG&k~ zYv^PGAXRmK1W*w}bd*#gNBRJSHx|bwgiaAn2SFHi26dQC0J>8Z`a*TxU%`p<|F*98 z{}Y}73xz{3vQwY~+;p}Hq$G}Ph0C(xVA>t_gwYi;t!6IyD_tvy-xv?lUIZ*G(ZpW$ zJUnx(7}!)(i@yqE+}Xwr)<nbKUI1wNLI{jW7zOv64EKd70ceHXgaLBYHF*4B3L}`A zJ(vvetASBc*#JUw4x)ShxsW13`IIPDmj+DN<I)<>w^H14JBh^^quCn*M4;u!s06?D zwi1F2s?~2u#oCD(k7+ZCCBjR?8(D#m3GCTl;goc#{Hgn}iGhK<Kd4P(vzs%BgF>q1 z$9A~{=RdO8*CtMjen9D|udp~j)^th$eI<F#gHG<)3PIvV!i<D@o!5({7NjzFQY8}F zI33{aO<Easf+755i!CJ<pTe6Gg)R&@<i3pEQyD<>AlE9X{c79GH&$vU7>DI9z%G|d zh&{L4BFdK~GkXbOjHSI+bz9!_&8_95maQxJVUdqfn`V^<w*B>AtEV{Aj4zuq20QE4 zVa4OD?|S!=Cf;j%eZR7rqKkM8t!573*jiz}dpg3%R*-aGQ=MK^eN5H!M_yyxx12{7 zcA<6`80+EZQEo(#?|&>9t^hr9{o63PBTklG69X=y+MBG*qbkXZ{G#%+HwaX3pu9vv z>!3cXKkhK+lRK@V%N>*4@#=T!Q@;EO{Kl8P+mAXMZ|?>NjOY5o{YbK~IH}&^_3#-M zu=<9e*>B^1-n<(0DMbN+z`@JbSXlHaf=}oMbj%6Fxrd}&_(As<1EpUa%^Q5BZ&;RD z=Gp1cQt@397ia#}w0AegA2(U4ThD|;!T(a!dyzvro_K<&F-{as#%4G8=OUW!gU|#w zs6Y`nRFiO>$=J;yGmw?mmr!adKVv6|?t7_=wZlXN+GJ7^^Ws8<okU(igwW9!X~{IE z80<6Q)>x=BL59|t$m1sh0+S=?9&RSsx-t?#VuZidQfegFaXa;P2~k2mTSXLOVI>D> zIl#{Mna>pL9Cq5#dC8TeEY%9PYL!_k1croRLTDh&0g#IULt70k(V*AIP*gY$Lhutu zEBFv#M%kcb2MsSdc(^j$E-KCg>*fKt@MqhL?1MphU|k9{FalSh2yxC<p;EA-&afX! zvdIR3?6-IbBE?HA<+~4yxq(I?KXd&sAwnN$g#s>OSW^<zG8}q+&B%(Rq$>xwhO@Og z8cSJg(?o;gSD|Vc;EW^MqZQ7N1{yo%WCtWXTJI8aft(G9_P!{N00A&i(^g=#5~?K( zx<Y_USW9VJOYJ%VPIyVtIY1T$u&h(<Em9y5YgV@!Xj?#(&-ncp8~4?0@7SV~pcF{c z8s=XV3`{Y7ssJSVfX*izT-z{W-)9U<h8SUhz!4T!W#IV{BYUep&d&JF91Q2547QIQ zRKg^y!kMfyp~`S58frz6v*ZM{_o1Ki?1iioM61AR7#Pc<k%2rh?MSy%2)I3G%SnNX zcU*uHtRJ$A*Z;cDcIAQ5n5{U*IxFuAhG@Z&$`UsRWF#r*Cqg2Qb=A;d@qO^gPbbuV z;yD>M#2&ZUnd5=AwmyRX{K;sP4Th5MUH^I6i2&0Mw|1aF5d@Gk0Rqb=Dz*Y@QQ+}p z5Y8I7(5lS4BKzzc70XV7Ii2GPDNrx87LT*kIYCvj`vP_3E?~r~=*`O^UU<zUZ1}n` z|A2@Ljx}h2S?vJ_lS4?@G)vW}Jg$wUNQC8zSCK&*yH=Yn_WS?Doz-7d4Y;<~Bn?A1 z3<}aPbmM?@4vmC@DAIy}fPf6$N=pg|NT^764BedqDk0K>fb{Epv%iD=FYMzvTEDes z#dF`!bqSb>(cdbhzsE(NAm@V8<n*kj_4m?O^@QnkiAbzb&n5#5p8j@5$mc}<ur6d} zb9VJ*Hdcl;y^voeBImKaH=Am*&rVLKvl%S<`9oDsTSB4q*R9b%&$_j54Q4Srf*G`E z*kO$9)8*m}k60^igY=KR7r*+L4RAoGZX0ePO^G;xQo|$acetT<2P8VokGy3yz1!sS z|MGJ=8t0!5Ws|K7;0p5<lk+nhxwfbat}gLh$Ib=W>+i^h3xpjwf8OWZUdw>L<(O=i zm7MZXqA8?#d54ws-QFb!XG`I2o%a+j?|HBIKK*%d&F@_z<_&p{%<0OjCwZ|K!y(>7 zhl=wfP6Ev~f#T2eXH~q3tqNo;iXj5UB&4_C?~B=Py_1T5ZzND6CZ0ySP5Wz#j&g<@ zT|;Nn!Z6^-OMJwyNZ5k7N9$=XphKYNP70LOFbJVhm^B&(9GEN>;FJO+jv~G>zqn<^ z@k;(Z_NtW4g_A?)eKYlYlZvwV3Ql(}sT7l2>#<KXaSHiT4EdWN5+qc!>S@>pL;wpn zM2N72L!4H_m@zO_lp1fA9JyzTk`z9;W?k{&rc7Fzvu#yIGl339;saeOKHB+M<6LaG z^ikW&yEoKQYq+>OyBKK6sUIqv68QX$OM<loY9dB2eGW)eec(!hKTiWYW8`#j8r^B| zsS~MRi_~P3*5OT-7M_Oo7#PhF*nSl%SqPIzN;F*6Gg*`e_yhOrq@Ji$J&R?93BKFm z=k&;`q71W~1yxh%a%{$yY?NcY0yvlhtEfh*f69I4B&%7Z22ewf`Oyqz-CDHjK=X8( z5ZdV40qp$&reY5WZqgby&~`s22+|WgHbKCojw=EJ_msWc9B$!h!yE}<Q&ou3YAwvw zBwfsyKm_kcBwZN2*)l%o&wa+9g*gvd>u=jvRWUdCR@ZaIH#l4SM9OFxuA14Uv%%~% zdFep6d*xf`Alz7(z!{b0q*C*i23Zwcqgm5<GFAEsNV@NXXatN+5^jafc;l1ZK`(76 zWoMc6naHbQys#S9+U!EsQmE@pQ6R0r1)61I=uVZ#1Eri@;8Y8L!?VP^`+|nGpzuGy zhj4%&ArkolEI6w}outlfXD^Co)Nuy;c&Rl#2WM#{KUAo1x~$UJEq?FXzM$|-&X}IR zFsIIo*7jvd*$098OIn^OhO5VnZ7*o7T-fYs=<VmkY!>`pHC8hOR?{hzv0ODTj&%OV zs)Lv={gjM^+~8UM#pb^(&Av9z(OiE{Va!5ITF@!bb!)wo-mNR2JC`D`jCHtlcj_7S zRTq1kEOH6adck?euZusS{jQNP>C0l!FwNFSE}?zVX6<~xa+-HsA}p$IwIrW^PSLp5 z&|EJg)DoB$1-R2nyLH)W-Wj1MV_7Xym?h+kE-qh8mcLg$re(qbG)XiTEG!aSApWWp z2G0)1!uRf>5Nc0(X2N?rlA8&|^EsInKWBeHR)BHv&NiasvIBV=`QtSi6q3=VBke?7 z!r5}PzM%s!6&K4w=I>{NG$@{4U2w*Ug5IYg&OjQo0_ct^Qo0d@=~o=;w%|YnF(BCx zsF1BXJQoe27u(-AB?VCQJ+9WK&!hnxCc$|I1#13KlO$;=fYc#JU;=$v69v(n1Z<C} zI~a#+*R(#&%c+Qk2ziZ_GCu-~g)R#s)N5&I3WN}~8F)<u6HeMbl$N7PkRoY(KTbz= zDR8!E_^2E3o8i{t0*PM&oYY{uKhbbc^pg`QjkX~oirgo}npsy~S)m|JK=pyPJ#*4M zW@M-+7I?@E6-u(2Bcf48R8ZJqlLFBlec+a8Q0ta%A0NzhO$}zpe<Sce1YpE!xF`yU zxef3lpdKaw+aNgD?6uDAjJO#9;+Y8cRDt@AI`@3G_XJ~UvtR!W_nKC)^~4XU(T|uV z!N+GBBHg6Qvp?I1!wgVQLCjEM6k2FfM*nQa3h8JDsG5Li!lGbIND${K80)>jd!Qly z7mNx9zav&@eAG>xxY*f@eL@dc;z|Z5%RL`c#W;ggOtox}ptG~DMM71rbzDCDtRqj- zwJp#k;KDUg4~z@IW~(4)Boy<__7RurUOLzn3)1==jdD*{uNEVL0skaY-wwWU>!ObR zsn6v(ZFLj}&jg5{d?|Lv9JRDtpFu<21Fevt8z$h+BuqHHoKoE00qcjin^8fII$)y3 zFfb4xo^1kyqTtMg#J1{#+0nf~TBv74u!1<8byHZi00Xka&uggAR~f_ZxlYD@UTt@x zO{=T*b^I};0_Y%N^0!k7_+$%a2hd{>LxJ&W^qg!V%%xf4UK+>{WhAFx$&Iw;#llrq zl?ESi+aCc%wV-r)_*L8+E-u*`#zsaT*^@9)%}K${9=6`5@3gY^L~@ZY14l)%px@iC zeOVeWjAPCDUc#kps_H=rTZASPyyYuU^~okl5Y(JP6MG7tJvHt3fwI5TiJVE7s0Sib zK~%upcXgn1WI*G1#@c(4Ok}&0Fv0x^iJpNGRrzsw!l-F2cw|%Et^m*wn8XvBDdw;& zsp%92^p$D1(%rk=0}k$8N?#O^@Pvt6P}xM_0okPR(sn@MtA)yp#n=>s2fIZ#J;(wf z`<+envL($50pdnw`0}bhUeWN8H~m3DBZ^Jc?+2beNHpYw7PIr>k)Ye^2n0HX7>U*> z|M05egT{SJEtMUi`Ca#7Fv1h60y3>NP7s|<6l~beWZe#beb`3K6O<AK5u+7RVJ|*o z5DcYNORi^AVYupMlxw3Wesff|{wc<cp7#&UbFq1jBgu5oC~E2`or~tdz+;3vh@-$@ zMgk#dB%E!2^f#?z(TZ7O>abjw{!cARa*8G{mfm^I{jU%0-`?e{YMPKWkAJU0zj6;X zLz4T&xXS%lfL%hea0>opDD;SBH2|NR5t>hF!&PXXt;JAI3BK)We9MO##J?IC`C*tP zx_e9Ixf;=PH%`$9KhCnBKL4HkY<}%*NXM&Ow@d5r+~J}itfedbVOek-(~D&0kU!_~ z6Bo==$ly-zr}A9^(^+lW+4@!=;1$iZQ#pRq)rnMBg`J3@=raA}iTolSoA=Kw!3;Vz z+*#Bh#~WG%=8iQDyH+6`nDH#yIGe4}lh&_|^&C*UbJh3khBUOII(H)bmZY1SB0!fl z)#>`dSRk2MlI>VXNSUE2ObQdq@Rp{E`V=7YXwtAhLLG{7ctZ1_+<ZTr(d+c{-C!Ez zD$p!ti4Yn1g1_bz^@SrWNbxtWM-z78VA&R}K@2jI4vY_y4Mp7>PGuyEkabQ{9ZH3Z z&MQ_|6{tW`HH+O4NFG=y!dR6KchpM)5oQjOBrYt$MvBPR-7NdRSBYXqNaxB@udBTU z^M#xKslpA>GMJa3WmRt7i$ge7qWx*qMq&ZYFg2;g`2*`Fug&oi>xJL8Z2^COZ!Rw! zKE#E>sP5P-9@+QC(u+E-G>L@@@RJJJUB3whF*sMOG99Vv09^JJPG0XL>rzB4ML4|H z!&NeAss1q+eCpMXqDV5~Mi;=M0U>2o$tH0}cqo$@F**sM(hX)XZgERW>DP?AtrL_x zS%bsH3kX#}jo#yF22x{{D|N*tH(}w#2q9!{p-qFs&E?<2tsg(|ApnHV6AdO?5e%hh z(Xt~Px#em>#5({81;2*?@x0m3Rby_yMjk|vzazGXbHTU4ASjC+C>&IW1Ytu+%hn^n zP()ZH(CviAf?Jp%(SRi`3`lb%1CcRw4;GM0hRJr_;jJeI>S*dc`JudNcAzl9pv*NW zKQP%H7RrE%#m2@+dg@Cr`<&>@Zlrk|$U}m#*xL~(KwOg44ktc3&G!*Y-t8X>6%NBy z-V?4Sz6IqmMv7qtimO)hWgM9Z=jJui9^m{yW=}4B>qv!+3t83;W~AP}1%@*@0U$h$ zJOu<o<ynP<(ij{eBP5Gu-}4GZ5Zg;qw@$9>KFQY-EQLL8-zOa+P1&1h<tP?hYGj&Z zu$Hb)G+&k<kvg~WnKASG*7GY~3QRu869cXKrwxQ7$d6WGWXKqt98}eA?FSr*#TC;c z?T`@Se=4|eIu<)5h=yr*4h%8yoCL#vUT<NbLf(tz#G`7lGIY#NM-k8tasFnSJRM}{ z2TI4)h?J^GT=cVLu#CAU1*z3f%e5;xr-IZoxyt;v|7x8_qTnxg%8L5WcFN-&{ah<s z&#qjnPEKCzJKcLF2ny6!1>D^S=)cx@RSSEoj7*+2fC#!HFJwEB4sIFm^i*TVgAV_i z!6{Z$0x3Yp7=t8UVAEJNgfN`GaIcA!j#&;_d3~)iIS{3AGS*JNbTD=IaOKqFo?pB7 zq6y=FJ~j8h<Sj3|QU&^b4?O?R??vjnC96UQeH*KdNW%vg>$S@N0(#Tm{`21{Ntg8+ zzES(<Qj+?i<LY;o#rLN>IYbY4Pi7{pg8y_8{R_U>cpLJszrRnpa>9Ee1mAG>@ZU+- z<}>f`)O0*K(?_DCLo8X_w_S#9+=@G87<qBQKOsvM__Sd->rXo(r5Kun_A!@zK^Bt8 zE%qgUDp0g_{wMRrW@yltNN%=55_j2-)2zcF`8NBDmy61u128f7xF6xEr=$eQs|rFl ztkC4b63vz>UXS>kv1@nCTRZ=w@FW!fNsW=AP;SgKuEG1XUzmEpZFYC~WkW$=e-+sl zk=I_uc_7|J^jG#OAEvrhj;-xxViu#MaPG%kmnQ1uK5HaaNw>~XcA@mg#c@<exZa-| z{ZQF0kQuScG=p8JfE)T5gFiaH-(+Zr{xO`Z>MapB7E6aMcK9NIBdJP~;Y=|MZn-I( ze=(%{tC=Sny>CzP^{Es)i*eS-V@HWg@oI7>F1Qs62MM~QBI7G06^%hNrXj-AIJzLZ z6{_Uq1(AZ#P?(b?379SeU@KT7q1PU}TZiDU!4830i6JDU_|*u3(N#_}EeIvbJ94wB zg1acSz#7;YnEz(vo4b+AxzRuQ?@8r*W}fU_V++lxuj5aTr?+Q-ueFVXBUuD@t8V&^ ztdM`I3}h$2ywVd!#uWXiKRKD<ohJ;Eu$E3z28J4|0d*9o;`WwU8c$55zy<E1Yo-c_ z_$Y!Ic*;{B1P0N7soQ+Hp!}q_Y=iF4ubX|2bpCABST=8NPuS|#kYG74i!yJLHjHqk zFVy|-$^u833?j7e7~v>5^rC<?wN?)_N*e{{9wdPsp_zg_BX|iN3X1J8vc9VVkz%{& zwu9(EY3v*`JrX3u)I<G<4g=YDBbRjGc8~4F;zbZu!T&w{V5S2J8eR7nO1s3)|H z?y)&{Qy3kgQO55n4w<3=LEq=3-=^yYBnGv?{YPQLmjD?;D>NN}&90R#EC-up5YYuj zFzKj}oOP=b!%^Y9rgxgIH=l+4x7V6w>-gv@FTH2d98ovq=qMJ1G3Iq_02dG9{Bsg} zvMuc)OphJU!T|ky(jO@-k)TSw-4OktM|7o4HZ43_@t2Q2r?#m#i+G5|D-5g)NL!W& z{PKDeeB*H2%GJreS}f_><uNz!{h`aOYP%Q<^(M&xYXxP!WD}N6?=0sb>tDyOrp{!V zEo+gF{zXess5**0G-|Y{OUN>*Q+1}se;!+WUX_)fv2j=Flf8#_GAlEZHTJKW^6-BW zD*uFp(TrA)&bewnx#T|8;Ow2s=)$6M_*f+kTZA1&YKvyvvczs%xxBdZcShEBz2Pwu zZ0qRz(RK;T8zJ4}slv5HifJZr8y4>Hqa!*UMAvx;cg5lFcXP2=<|-^eT%aFik%{dS zv$!uQjw6+D10b?bkks4bB)JGETN@Sz%Y6DJrwLi>TbZNGr1j<C$!}=pvceM`UD6dT z1gWj{a~jN9Y9M<J>_Wquct;1QqQw$@TZ(mW_U(2KN6d*h_254wR4#Y#lRy0u+xU*6 zf#N-M%WdYqtZdjT+u-MEv|d&Czn7X!gI5eBK28ud>Z!Y^y-=v<wy~^JBI(a85Y*Be z^am;j?>~7XM%d3$1!i#M!(b|ZKyZ<*2hMO*EV{nRDZBlPiQAh4zz&dT+R;0*3q}$p zVWHYk2?#M3!b6S&8+dl#Eq=vHrPW2k6cd0D{{{WBMe&TEm=9d{4@`n0AzJKSHd!9z zW^gh9J8W-}bgx2(F3=>bNuF6^3f_6F=xT~?v;_+inxI%9rED#1t|<h~(#nHHg@lD$ zd4#IP`N`$!2OI`ZbanZ0NoeH#{l$T^%__E+A@ojJlLKM-#e`=w<>wb;X$7>W8j7OC zJ@lk3U@pSQpKJ=>UG_Q&PSaEYqIPm;k@h4&*$V)jBvmN!WcH>OS{Wh>W<m2ro*?C{ zjZ@+1)Z4_s)-Wx<e`o>m8^UevSB;R6Rw$~BA$2>f6rBd245P3E2`2%Yq)g<G1>g}_ zyIK;<-7u!4FlJ)NP7G;8OsH4^H7|zYE#F-;E)dsID6x|=$u^juIJ{n##EK+LY!F~x z0jQkrmdb_|>taP>-oE0Gg=N0>xmFSy?f#xczwaqmdX#mbN>z4*zH~sN0>U1A#nsF4 zM%!cQEcx<LSQH8^tc9iQBK@-=Qj?>?(3FO1Vpg^x{2ERS&~p(3kX6JjZ2{;iC6E+0 zh~J}OlV!N;{AmP?6{#Y8h=Voc!G#y4OvK^LK)i^*8pB|Yp+MgeB8F<E7w~5pEdv9S z$(cyNjlbk}W+-xvxP7CT&Yuj<9V*}%M(cl<69B-LB!BJFK}VHFY=W*NROF9AJOGyG z^gW^}jC)P7sEYB~O|-?7su!DPl{2=K6s)5H0SjSGF8NKSz??~hAt>mVF<qbw6C_52 z41<-jYlM}h!DPb(5FbT|wYap>#L6nAm}D+f1jYrj1Z2USM}W}k>x2Lt7@bCSn>ZR5 z2GR<h&FmFv0&fzl&}4QwPlwUrLXioe3^oXZoi<md0zYwE7#gd?OiGSthL9xzBNhC@ zSOKtXsKBJ?C~-KPi^PDGl0mi#OG3|p)Zrb%ig<=0jzR^u!<ef8AvE<YSy;tlt_Vss zl)pIy!NAE!$GJKb(hKl*v(h7o1#fG%eA1P(zg<_2)#Vbm6bD(x4l_Lh(X3L0me;j& z$Ix0zQ8iIjqAKVHvCt;E@K~&J1U929qfC;R+&`NU1tN<fY+Am>+L!dE0L-mv)U=;r zC=g9d-F=eKAR~or3^7d%u=I(CfiH%xjJpv-oluRXT^u!(2X*Yf7dU=9AF5ASq=Vyt zV0+LYw>Sd|)NMnZZ3jZV)QkM8YpD~ebWKaV-9zLA%&bbrl-Ur1u3KN3DDzdYWo<I8 z35J&uv~Tv<(z|mQ*PECwQKTUD#>sl06UqlCh7yJ3!h&M|ala*&U{1Zy8qTL2JzW)e zFPYDK(#0B}!hpTIQ$FEXv%BjX{bfPl*of6*$?uT}6k#UIZ_T}oC+=w+vYR3*XTx(7 zyQMNh+{<kC*y3ANDXg0=$&I<#lh8A4%npj&>2=|mAEivD3;3sb9ojUCSoov_xddy_ zsTpx68N{s;h1J#h&BiS?#<wKu_;igW^k?{#Or#SfSWdE<*^K4#Ohf|3<=baC$cO>1 zODK#Kzym^z02CmBbpL<pt-=kfR#ib)I5Dk&&0tkwPc-7TPOet<`@VQ4373_@>Y{-+ z$a`^Y+BL;PseC3CHbXTfBX3a-!@1hEAI5TIy?0lJYD*{b(cz@*I(21JMOvu>w!?Mh zGo_d!ojjfTin))LwJzU=>pw1hvFnLr*KPRpwbp5-!gi$L^Kzr-#&Di)W97G2|C8Ns zBaL5vbYdZ79C}SvYdtZvf)7TUsy7CbZtK3&Yp&TG$&_&YKH6NnHBoRco<qN-ZfB;< z<l}>}mioPgDu<DG`mGHI%T3;U-^W@T4}ajo$v6$#n*MAIrV2hBZ)-l;nk>@IH)wD9 zySG^D`eVGk_55(PCmzpf*wJ=*vOV+h;Y3IK_4(0;=Hczmj{mYw5BGjdbavwL1k&Fs z7RunX8cKYpY&DErdV4h-p~1HnL1*r?7RlsTwifk&BE1bjf)U$0Tls`AXS*PR!DYLU zS)Cxgh4Jr}LGfq-eprfzi*re)PQlKHjOP(MB?YQhNo7s;NSbnrV4dC4cMn?1D+>GZ z!@KC$ET)1*w&F+F$~I*T27&;t4fA^`U4^QtOq2F&hNVaLYsWRn4(jNUrU&(SyN~V- z^lFm__20j@Y&WUgpX9fyf5k0QwCu9%(LiP-_@(Z2d}P1+f`)9rgY<7j$rmD!;ywg{ z*#FoCyH`-vHKmFP?LpiX^6I6uu=~@;^pwq`ky>j~tdclXakBAmiEh$h-Rr$S!#^DN zk4I<+^s0L&?zDM!6SLY(cHxf{F%UuUx0Fieueyhgth|Y*tp{;zznl0@p4K$~nqE2> zJQC0QJZ)p`CRwLoSocvy)sX)P{gg8hHSTuL_0Op1NRU?_%E88{o<Be_={r*ZJ}3PL z@t<JxZz2Qk{-fkuD=)gBd3g<S<TtbdUwNt9UGo`&Z4al$XnqIG-*-^J%;7P%S34gV zxnJtt+F%!NR#pEjzpt3(p|CsuKrgBFUFWCfDJL1-<S&`D`j38!U#>J&E1kE=)<tWs zTyGIMk0lLJ%<Z=9v#F!6^ctf>uJ$XRnf_BX3+Y6hTjsw>`CDOl7;s9(xW9jrsqp<~ zgU5K>2=Xu9;^Y*T{9{hg#v?Vq4;|e&7ug%U<hA;{sSh_fba?;!QZ9&{=F_?g?xFpo z+;y6#cVp5q9zG_>(bc&QQq?4Z@>Cu2`gQpWFWpG*)WzjHj-8K%_g}>=|1iSe;cdQU z72^->vT2hXR2$Quh@?M_K|{smzh=hAA-KNLDZH2Z5HOCl3*u6}l9b+%>P?^&;{foq zxC}l+y9<Ym1-Aw{widUr1FHh2saqXsF^0h|<y>^n%DNvne{z($y-1~*iK;6}43Ugw zJD$DQ8_q<PNTPE44uxvnBRTH-U8%R>s3eeac1>EDVu^r+9mxE{ar#F|p5OmuNB$T= zlZd;X(DNGCQ{42tee#C~MUoO4npwdmrg-O`PnNp1d2)tXc!{L;*I^fflkAUmSSYp; z!P7v^m7|E5<YuOOr(|d)8;|4TDL_S1e9Su%%23SOQq*{jiBTLW4Lu#gPrSUf7obhP zt+=r>?yqB)7TcRu16%={Q^kotbALLW4W`zFqHeizYsn7XF~r<bd$5~^12dtfQ&LWg z@96XESX4}Byo)J8xjXAUt(Ycu!?~Us528hfhip}j6YiQ#$aG!4DSWS%?+&@Oj6#Ga zi?5br5-Utgb>=E`=+(`~D$E<NOo<;O3rD*15mOAbMYnoCEmE^g&M(bG0jMHo_Cbwk zo=*WRy+spoX|Tt`7TH%)C4yHU?XCr8!pBFDI<pp4THPjfVFT6DL%dz^`JTQ2UkjTt zH%IH@uj7usASxVA&U+psE+SgSWB-vSo^R@Xw&v#yHDQ(S73PI__qxi{8>e<5yHGgd zMHP<SIsTRI%4!N7WbQq~BUp<lPuNW9^I){ivOx1dd4|$I*Ml!BF%$2k(rWB^2#?}b z(~0c!icqC5FN=nksYPb(wDx&*D_fVs(b5WlgrH%_U-N5eyVNm?Dv#1W>kWqU#vZAv zFq7fgckbgI>IVf?lDjhxrp})JXe;&&Ipc_DNp`Dj|Dti_Y!xN`x^dI?O8^CU39fbC zC-Pb>;i=FD%gjapWOH?*-=__Zg^OZ=-)@0q=2kSX8VmnRbJrY}p4F}~>s^*x_C5cY zl;D!$5BiN%3T(0_6S^4b7LFlOMgJ1dA*@{*)MihS=Sj6*;>SEGLrK&~f2~UU->2+& zt5`ewWgFboIq|pF$JRQZm-ecM?ZY$e6h+)o+)-~J#c=>h4L}}&wx`CTKgfLEG4Q^c zc}FQ#c9$a0D1K=M6TVcgpXW>#fv$xlKkW({nLF#SC`^4qpk;Lbyf-qpfb)1$=s*B# z*)+BMOR1`<wW)nde}N;&jq7^YnvGvxIqX0FThXYr8&<F++dC~?>Ri98?$tVzMA{WX zvWz8OC4Efo4|pXnPmcWw_!{pn<eo^XdQZ@5k>!c-y@K54-?!*H<WJ0Cx7_D^MbXcV zd@n+7Q_jT}opX{c0w&+a%3z)e8%V0=K~3f7)?PO@{P>)h89U?hG+L<HHxuG(7uDnJ z<sc(zB01=6-lK~C)?zX=ptEed=PyV$RIJ|8m7_@$LOVCabv7YesNjh{j|0WEpVysP zfQS?oK2RW9`Vi<nm?RD$DZt$&Mft$&*uf-NXBF`yGe0~8{%{ZkTVZ$6yN6s3T98)! z8r$sYXZ1XrV}9sQz4EVQd9Lvi+k3f!t;&KO$R&N#pN20k-sJ|){F-lAzl(okah(qG zdF2AN!~g-QrbZzpezna(&p;1tTd?qo%9ri=dj^-Ej2KCZhGLFx-40k&`r;4H#6&6n zv?pcH^ara|MJlX>l2T%K!6E?UHWLU=mnncRk@E1P3|a#lHG#m2{eC0~*o_0q`GJ+O zf0vyhP#P!fwKM&5t?Jcj*)4+?PyLdQ{i^#74l<mRRYM?J*f?=;!!+N`0^e)#5cZSj zA&uU*J)H%^1(~bB%!48H7akORBD^zLS;pr|$==AfVM2pp3YxAI=PKNr5PmE~h~OWc zG-E0?V?aFXe=DKs_gHtqr;E`uRm~vw1*eykuW18fC_{Agg)7N|@58so6a@hLYS8#o zA{Q)xF8~;Du=%IKrjsunWkBDzf@#q&?nwDDV?dXUP-`4Wt_nub@_u`d;+llvx&Z?; zn0pm^T#BMVTE$HRtdlT;LQ@&P3Sn4{?hV5(K|%jh-@+MC$w1;$Lb}$)C?>75qCg}` z;0PuV1))HQ1InC0u=J42b1M5)zihbBJEo9>I+-%dc-cmCYV1q&36#)DhEIweFvO7{ zz{*t`$=)v7#n@=Z#1GOhi$7rH{shGGdPMPhl<>Ms^u^t-f60Iac&p;R@XAH-1fuDL z&oe}w>Yjmo0uPzo&ekk{{`7$^AX<Jo4Mh74%9x=y025rK?KXh-1kjkMCyO9TEWlkA z<?0VAfSGM9*ooM|nPQWTJb`^85C;lw;R$1{f*X56T|EgVOqe~PE8+>WtOBX7f(Y7N zE)2{H3+KfHDON{-#3alRX{@pZ;U%>BCSe>&@Y-#tEegVWM5T&=;;YgK$!Ntkl$Tk^ zwg6^}0P6?97(AhbA|}CFYitLyLJ)#dux1h<82~ld0o^Z$QQM{3qQF2J*!GBu7yDL& zA8J(qGei)Kq<|$7YJde1EWiASSj&PqWkRGH04+NYOS_*XXP=c$60Z2xEF=aH1!7eL zpvm*RL%e2pV|@A=g<AT3bQyf37>v}@-t4U1?Xa*7J3}-{VQ|xKQ|rDDJ{Xfv0+dNG z=uQxWH-ITfnjc6aDgYyPf*Da>_R<KSQa%(mS%U!Y!axr+{5gjRn%xv$f@;$$32^oV zOJHD{lQ2OnNC*KU1iTVRs3<|Qi-MQSLJ02O>r1d93T%vp*sp>NS0S3%a0e{p`YQ}l z08^bzF(`oPWPvSlajRKiWkjJNkZFc_X^$nWl0s}zaE>If6$W^D306VD`B88ZPlDeV z&I@F9m1k}?r4t%JmPcSsB<zk381xcKkmT}W2`2+eg@XU(FJ?f%moADI7u{v4O9~s^ zX9wM>>|O@LUOycG^CO|kNRS6{;Eun~-XQA!oyZ(Nx6HSOCl}AI3Y|FMz898~y1e(* zq8@)Ydq&Rag<l1vFuCq_FNl!fVL2kwRe%f)n!pd`@tY^dJx_MTfi$Y}uC_cV5MV1i zz-%&Q<0}k?g41|{2@+@U6_~6Fup+#tc!CN2CB!6QpA~kq10e{6g$QD3M1d6!&^)RT zEg<m6D<A{~F(%cRU_!=*=fr`^GeHssX_`0)KL#el0vJ}kBWOXOM^v(_F%ASxFA^a1 zx;`#Ne{xE@KODpB347`MQR*^g%H=Z+kZE8CS`&b&AhSxcv;Jj!%Z6s*b)Jh^X47ki zQze0IVnJq;rj`rg_kFX=<f_#Momh-YGkHCAiA&pMtUJu@k*$cabWxWg)6w;uAB%ts zifFtPu9pPh(*aXVlnoXP$5(lXV4ws$uex1rrA!_kljrv~nJG4!y$HpDh1I?U|BCw} zgn-*3;4)h2A1=U_lQ9e^g2x(cg#`$)wF(wSNUqCW0K+4&833}o0^8eVm?5D;NEqY@ zisyx8zl6yWuBj_1dKV<-3H84Z<3=|UW72FfddyWR1b6R4>{|n5y)y>p&I-3e)+=Kn zqKJAKrg~mnBSFIL^tFOu$SxMhq`|_BkEkRrsZ;=vRg$|AORM3_#M+OE7Q-(0cN4{7 zueqN93>cW~DuhS<gJh&lfJWq5YR-Uo4LR2v(?(=ZloRJKAGYdj+MLpXg;JAx0Gkan zne=7ATa;k{7@a4;5DhS{f<@3EJAW_c0aGd@_z@0vIs%hP!k#vY@B272RmE_xf^gzs zfDQC_2V{j3V&Ub#lmW9I`3XV<6c)tzJww?y#Kw0)hkh|7#rzp5<=nUs1Q3cqT4jWV z+;)3=r^2h84~IwTkR!nA>E!?$fA)I=E1W6KQ8!l=0Ju~J8~6ORcrI)iijnA*(Zqsu zvqWU8<Quan&g1EJK%Kj$Fo!A(Pc<ED#K(Z@N)orKudX$*wj3ko|G+h-=7Cn`_f<26 z_;f8vurC~+8j~jhFzkybL}u^;fb^)A7Z!aL9beDq@rMz_tmhxX24-Odv*F+R2SOy{ zY65;W@QulOgzySo620tCaaQf&OLh=PrzZZ6R=mYF^m;$GX__~}&ErGcOVt9IN#d7P zY#!xNmh=7rvrKfRF0Dq{ts&}9dC~!OGvg$hz@aBKr0N#;OP?s2^<SIhu<0TZ^f^d| z_8#xjz_`bYBc<kg$>y7a42)iYnpu)dD7lk2`(hqjqxeyAn5dsPbtu8D=PlxgKsCzL z6@{?<8vjTW8u5Xzcp4x%@;J^7qp9{M0!=7(^^&#^8n~II*qHq`_qm@iro;P?*{HNi zyHvA`&0dJ6PTL8*@qvrg-iiEyc3;1R<<m)NKUU9#qF>Xf#5i&GK{33r%fMpaYgp-Q z0(COc(6?ffgsp1b7^CQh83pPYE#VpM;2GV|vpMqscR{PfUx3|mu2uY5-{>3C$bMQ! zjhnhaGmST}<I(e&nMa@B%;%2LUB5~Bbw91ayQB`pj9l<hT6kf*;2*s3GH)T^8(UEO z0`|X!u=a(F4AAn*yajm#ZDRJk9`)>q_H=9Y#MBh;pG74HIit+cQE4mliyQ%Wn;81V z_ezV!?F$oPOJ%l8VFzDl8titR49AS8FYio`+03#YASZ5IS=?ty?Ayzm=a=Fat@|F8 zTdnj5uMFm`4Ck#(Rj-Wyw=$CGRW7hX)4rI{-skaTe&f_WYhalTZ)>V^fmuqFeljZP z{K<DPM>bE%691(C_d#1*m>Y6r?n2|o*?(+*^M0J={pkAo;~vqE!vhndv!y$%%fk(A zUC&V&;f8IR=6fn%Dc8Q?qO058$E<Su+{UuVFaQ*{#_@d(`ETtO$2zz2`W=JyeWUen zR|tVu>uestbnps%bzPWpJv*{*-nLqu*q-jeLx>E!EB*JO+h1otD#k^Q@{ld_jV;-| z1(=Rvx>z^gDr_1**ff2$Y5s20vV+6&RWoJbrrmFdfF}WK_sh`$#D;*_a{TJLR<R6j zyWvxW)VEEh8`6mM^Cd4g+Ll&qF1sjIGe0oHqXFefqNrEfF$C#tT*r38_wDF$j>PYX z*W=qSk6^T(JDIO`9$|@6JGS|O4eQ7aIghpFxee-9%N)V;rPM$1ur;o!)!+_AB4v!# z=kM-%CgBgZgK<Q8-}gEyw|9~`@ra%72Z+-@d(q=W{z=fRcRMy%0zzo7eVmAQvf~Nq zmMP!XLFOv?tB9BHXg;S0R8FmGTpXMZZi&7q?WEZ55`G0M*c;?HY**e-8s8@4I&2jo z%J{yYEkZQ?eP@=E!2Vv8t8^8U{*Jg)W1G9{_ll+K(zQaFR$Upr+>x{MEr<WWIO6po z8|TjNwLipNe}XVXqvMCPNBj8S+p``AeK~WCR66(H{?^9-8cjZZ*vwU0_K*5QhwY_e zf8`Ki|M+(q^Y;49Z}yPWSc5}U=&9b1Qv>`d2EUD5+a{U%6I5`R`Jh~G@{oUG8${(r ztq=kGF)IIJ{$<ArD`=1U8Owj)cGt#Fq^S2S@7P}2?lDdLWT84Vdb2NHef|o6j>Vtf zQrU-lo!)+U{M`bY`T97u<9K`V*z?siJ?^Ra;iGSTv^1M%pAA^+zn)Z5K2m%|P1NI{ zg5T2G0@MzFzvR3yeYlS(B=SdG*WA6XdwAUta@~}F-O_p8_T#z(e~sh3X~R=>Kf8Wj zKom)J3=KWC=sa9<hQ{3mJz6~!_!4gS%#2~u7xn{FjDKjF<nxeXqR*+5CHu!2SH`95 zGnyi*X+QbM-@Y|u=N8T5S0@J4K}fhl4*seWfAa$m{JFP^4uer}sQDlLcoRv%tn9-? z=y}A_^FOG|q~6d-WPyq3F^O}rD&zIu?WY=-45!|)=!jsJ;Neu%zN3eF<Tx@$Vsmtq z{55)l1d3-8lFg>uF(#+yQ1slT>kcnBE0p%11j5We*>c`ovoL%bg5!r9)N;%ZtQwqI zQU2Fw+%~nI2N_Ds=7$eDg8%ymW3xP3t@j_}kj}k8t+hv4%R7=WA1{7!%r^+mzJCHC zq8CCwL0Fw`hroiM>UmaDqanfI6KZe7kQ?`1ywi`$VC&WWusZjXe)b?g&vh*(PR)00 zRe#pU@)j6OXoPn&KAN2*pKN}h&Q<Ii1hIIRfr^U8q8l(>U5;nj?T?i1XYD__O576^ zO|ZQC>fe9=;fW@TTj6ORd0G=xQ8--hqa^W4<i%5g^0N0Rfin48G(W}Lt7z=ZCx}>Y z8a(`fNMv+%T}{O0nu|o_MXh@yy@TE@l2BtkvDlDIg(2Bg|6)RA;puX<7BW%oSc@n1 z@pEn7oQPv>{-R=<K_>53ab2NCZoZcKFqh9#)KAunD04i;Zxg)>B0VfAB-rhHKD?`$ z6!<8x?INhezhR;b!wYy;HW7ak{BoB{T@r7!N#|hNIdo<%DPGT_uO~FZ=O!vau0j|d zPAjuXn4)YU<PEu_Xd_B9qfJ#ai-+k&W^$vMX7eFGaXoX~b|t=Z)&WwtWLE3AGjtu| z)z2)Sq&|6Z|7lL-*?o~j;xi)A&a@#OBl~WHR+0`>cxz6Ft4Yb9;XTv3)A^A!CFPwW z(`k+C)KMd?EfdLy!RMRtp##Khs4nP<xaki#YlNpE34a@H1({O3cX^RK)Ym#*lWugD zwnyD;;emIs)Z7D;TzV2yXDNpTvq1Icxz`p_x2&>C@|qp9pEbxmeOgYxZRO@bbMnZ0 ztc{;UYT;%`|9wJA(@xPZAAePaFIO)3iSQqr7MPX<mbyI%)u_B%^|`R@gT7yZba%rx z>l=;RmcF@}gv|V1kSvU(tesu-fxPbH#*j1iKecCzX-s-|PtmK7@oAga0B3ZrOnyiQ zYrRJ!*@D86x%{~zbn5}*@3HT$*WagSG%6p|PN@dFEj%>*?b-;Ov3&mAsB!87Z?0Hc zD;GAM2qVw)$X*{7z9S}`obj|HU@Jdb`Q=V&X~)Z7%}JG?H%y9lMmqy``FFB1UR&~) zg+6WSR=j@vV?ymve#rH5CnX-UcsTIT-QTeBy!t|aYoy3@ptI6O$0zp>xv_F|<z$dc z;QL`#yG876QuE0$#$G$PRFewji%EPqC)A!;T~?LG97P!%V22TDWEWvewAr}*X6u(D z9hn-|mPk#{oLIK}pSp|t#~zD+5wdEVxM#04i+?PTM=Jc=t~5Nlzj!E4+qRbe4Aie% z7!xDQWUTHPPvDR-^qHjQcoq_`lX7Cd_eu(?QiOKsK7{qx(DPdD8rsHl9sn8)x4Wql zLZHRgFDy|iG|y2G8(UEIb2Ri-zlrzl#BaUCw?rK&99)_oPqr{=8LU4`@faR&!k9*Q zg_e5%x{rjo_}`nNpfUbT_|y3D4I0d+#MI2(rrG2zsKtJcJ@Cd@t}defVy5C~PbPUk zZ^$p$jb?qC;@0hz)VDULH5$gVWuN!r;P1FWR4<X7e@3^`qDv+WyrI8--$?L%-kE+C zDV`*?c`1Kym?q{twB*5lR!^fCjlgTYC)|QjV{Y!#DPyMklI0SHQD@NwswA7xIJ>A@ zO&Chv7%qV^T6v8Y@dsDSTbd8QVp38P-+mf-qO-@y=TG_JwRgnClhGX%R2~PWk^M!V zdWk_LQWVY<Q}XD_oAxW#>3x?7XPT!QmzIB`l$YgfHhF1$-e+85(RX_Zs%Bbw?CNes zv4h{`VG7*!Ois{SCFhd6r+rN41mCoXDa*>PoSzd_v@K-r8VH3bqNDOR_$YgHGQYf> zO@E>ODeT5~y19<_W1a2@o_u47u_BD;gHeg|Q#UJhuU(%4kMuhd58rD~N0Ag3MY=vR z+oOq$s}5Y<7=o?Nel3;zn`n~iGB+J7)pa_R*O|^P8r*EP-cN&#YUj1QHlBaQf$=C; zdkaw+$)5ckN%hqv-lsA!W#5*u6_4|{^Ot66J;TBpYP<H}dI_fqHdp$m=3xhA`VpMH z&~cN+>iKtXxv$1YIDIS*RbpOPs%Yjf7mPC~ZKdh13WfcEiCVRw;Pq8pPyv(*(-PRe z!}Pqv#&^%iUeH?l#R~&N_M^NHq<X2QQg7-5|2Vw4uxAn6jy}yRvGg5nQOTampD=Uv zS#DXS4)7P|xetM!;yqJj6GAEP*!QrkV~M2O3MsuTA*{C&;KZ|Q6tIGDj(%(u&kTsd z%l|ohu8o7VA#X2rJITZUSRU8I8`5vh3D|YZFG`<Z-W7+R-YgjpjI2x7=E|Ym8Ix8g z4Bnz#t8gj!YB&ML3wC^kqbDXTEBdUFQ6_=Gb&AfUv-T9E*dFRS!Z-hH7s$K{OS5YS z7A8<(sn1TLORtx5l4MJHJKRkz+%zvuf92Vb`P9^AyE=+84g^Zu+6U}QL*gh0CnHCa zVr{hd2z@}_uF$AFyGSHP7VcEm9T9!>hAF6v+m*m9FhH+K2HC@Pw!2$;RwGdUcI4dK zs<poDd-#}P=H=f{cvdd9I^nY?U&$E#doO9<s;a!`y!y6lPb{o=FLef&o5)lYJG$ES zX$|DmPf$Z2Q87fUk%|>SVDpoNYdG{9%ReF(KIBdaAC|(LNi}5$0pU;Rf_iOtvtW$b zKgdWpeF&D<&8-xkubD3}4!JXz_xkTlcYVC|5AMZSou3QOSK~SxgiR?ZxOf{D-*mS( zC9J)2i(O#HC`L4B(aw0*VulA2+NASX3l3o3)}lQ25V#g%PreEblbyWB9_9(7Ehr?j zXX>H-M;#&AW)1u55K0q;fGSz8k;qzJB0N#y^I;A3pE)m`qUE1w$Am(NFG%yKDIe;L z;bjhGDc^sK{IaDapzyWf#PwKs<WJU1wkag<yFrI%KidiFxp^594!y9b0*BRz@33cQ z{vv7eK;)*YQ-IFy(fkf$)_+z(tBcNGh-kPAdZ{4|jwUy0%3|nCav9~-E5<ga%C*)n zeO9H(SM5s6tx?`MPTh~;BMlnfO1os_N?PH9{^6anpQXycl8f>MyYlC)-0;-)d;vbX zpDm^FEzJTd#$I<L<weVS<Pq`h-pOc|8m{l&xONj<^oGO@8V!;B!e#TmpA@}8Muvxw z-T6sA>Ir<DOxwDLg0afo>g{%IQTZTVT^A@C7293vsXBbr$(^8(@u*bDEtZK-70+!- zHk2)k<SyXw!F4Engv6o0<>1aF6o0M~IG<lqkfLb_Q9aVnsw-qnH~gP<KkL<?(c}s) zI-hoWRFr1BB3v2eXVv7=O8!-;$(r^Ev#7pQL05GZNkHp<daLr1_wW|SvA(Pz#&%F7 zcPxhIofUE0_<X!6R1;ZA3bDlA2;M>UCWxD=o2m6R-II<Z>r=k&g-vrt%~Zqc?&$}i zaU=KKSQSZE`ZP@uZnuPga;ezfa2qbE9uIbfSn`C_^mF{|WsA>~iKuj>Q&;<10+PI^ zB(LFcde^)nu5>*?!<f{rSY2?XVIj1jfJKwqCb4W!eo?oJ+Ej%$O)EC73oj<7xkSbr z_7m~pNY&D(FL-6(v5>N3uENXF`loDt3AK5xMg3|n1Fk-m(700L6%FN6jk=2-s%4QI zzM5c_UTa0o3~n8T@SMz_t#6@8#%@DT)rPpNw7)$16vRfCEU94`0bpl!CJ;%2EqAL> zgWV&Uf*&CV8_glIBdHg$2}WcGGuqlSkatBSjiZ$tW#O%+x;Bt6bv9&*N4h(Fck7Nu z?iP-4?e@K29V|x2-;inP#diN)9Y`+LS-Ia(syD<&F8<!<o>Gp6f!eSF9ecK0d`@nM zvSOS3Bt)<$T%Nc##Bxj?Ju<ivE>jR*(>Ai?rhn9;yXZ5fY&W)WGlmao8k=*|pKlXi zQPY)0H@CKl$RFu$wT<NC!k2n=l{^i0gABAk>hFCTlU*E>JQ-gu9<M15KYlzWi>~Df z4ByEeZwd<Ej2LSYqFtslyb_vNax+|L(?3=$6y8<$nT<aM$TY4-{S<S$>~zu<Wk*Ky z%YHKExWzxN9sUW?{!Fe#l+@Q=)+fkKKC7mG=rbNtF#b!emN3VXw=@(an^4{!S3WYx z=1Wz!)ISxXr4AOCKGI#ZF<j3bxx68g<}=)D9r@d9L|t$6(?(x#Z(Pt@cdKrk_Q~`u zcS9vR$X>3&#tmjSL2)feTykdYxM&PD6aH*>e94q>L=aiN5j=OE!P;rfph6+<$%L?) zUb|CVNYx~1-lX`7=wk;=nkl9<ccA~)N6rZC;t1TtByYEOU9MZKIJ1f5XMGupDgHns zp~N=Cf6=s8<A0Y8B~SE!tQc-Ro@(kfWr!TRmL!>HoA_orwnR6_-ac_aH#c{xe<C#g zAKQ#z2_!pdR?By0HNu$hU`|hXX8Y#O;fj&NT*q+`Bzt>Y^vbXUfq9`ed|@nd?@>Io zZ`5OK^ll_OQG5Q97lwOjhD?1yaZ{&#aWb5n`nT#xYK(5`Mde<Rh4#HM<w?kbrFh|@ z#Y=ipXMu@%C)z;v<fBQ3y;P%+xrHOl;-2^7@8gAnW)Xa|n(lth0<mChqC3fckwrk{ zNZdEw_PUPWDUvbi7ASeWj;0w!{RMAW-6~{3h}`s<zUKAh{J5g2tDfnX1aghf==?_s z@6-mfN^)U6T|oM6*F^1}TjU;}zn0N6716VL{dZe3x3waHAltd`TMtlB=xPdDr97W? zRMh(@6`OHj<@3$zaq%el6Ilg?dU=U;sET!P%NsZKgv|Y~>YEzx#K#&2XY+#e8=5+{ zZ^$0f8|2-5`01&ejn!vTCwpgow`)`Pz1i#T(Gmap5BSlqsb%IN!*MTGIPqfN>H&3` zPs=Uo%N0-f!iK&y=V0FcwW|7WIeK^USg=!%-DEi-9N%O!Hn^;R{AuiKg25HtxE{<v z{=!x<Q~daJ?EDm?m}InNGqw;kHfZu-MUiU(W5AI9eJ|Z;Be!O+&5-J^_<o-0+MIG{ z(D;vtACIKwY9bcJy&h~AKYS2ev)8UGsII%sHZk|p_@;Q`EWrTW@nBPSxgBG@L^0T~ zIm3PYrOn-z@WPv8h8cUTefu$M+p4vj>FgAA$zwFLo85Bh6ND|#@bHtdGP?HK=er=q z#G#smtew%JkI4ekjP3J-&d1?`Cu3r^(}#~A{PH!jED5LPGCM04pFbUw?b8*k)qmjo zV6oR|R?TFwt%lKH?g3A1jpRJ%H?v2Z5ZMb7;T{NHO36qjcumS~OkZjI$85M1U+vz1 z_L8jMg}<9hQ5eFM2PULqC!Z|o`!u=NTa#=2B&%Hg)VyqP%!AGPR<B<D<;g;oZ+n8+ zL(!4Pvpxojly)m>`XaW52p-+-+!|)7k?kAXx|?r8zl>{4jgAxTFX-pB^QM*iN7m}U z+X@?P_&j)+Zn^-S8g!VTO|+N2Ga*Q8%+_ys_;X$Iwyycy`mxWCWg(K;(-CHALs`2A zy6lEqD?_dCXIkCuw4?6F>Gr5QPLerpslBsO9h)!q8R(#2TjnXlNv-5JDR<h`1gPuQ z+SK$DhJN2H4~j?@Fh%tdQ@_QXQdgVnZ*-Z`C-6}sB$4x5Z+xBVS1ezb#J&;UzM8X1 zqqw`%<n&u8_Q8QuNQPmw#}A&=l{8AHlwX!1^STRd%6r!&tHKXzp`9B?EA5EKV0|5h zV!L}DTSdRkeZRlec*pyNTAK(y7(ytJa!Bfa@B2x-rB?jW=49~`18ee&GA~Cvxv*WL z7uJntF3tbVe^%XX=(oEp?BNW@BL3YEgb&pGeG_ptg!t*oa=O<6-|zgO(ni^rZ@vUl zLdv(rNA>Xdz1Vv(zgqW?_Cp45>Fd#&2X8_KCv_TJpU~)hln{PybI13AodS=mchqQO z)i6oMeyQHK!RPynQEob+WRpTwrO&aW3}Y?*+W4-EJ70dIx~26>r1u+$ZC`-2#oY9` zQx1M<?9O*^=CfD)=-&UbxL@&m|M@7>l3KXbk;h>a<WK`5jfTkS_omQz2niiD@NLz+ zwqs%y*opGcpe*AGa@)$l5lmNej#NL#4>Vj7sNpu<ufl~`!zKBi30;RtIE0IBPyEq& z_JI5MUHC5Pw&u@w-QeYC{S0;29naeR4=y#*1aEoS3Gwf0xbJ;%X>hWr9%Xv_y)rKG z57WXT%a&zLo@b&O@Lbvb{Dt+!?_!!~BwUPt&bu0X>|JlpjwZZH&yEgP{zdzK-um8w zYpOdI95@zQI2PVI7CAo_CGtkS@q`F@_)|W{lT92*;t%_OCN!-ct(!c*F?fDvg>e!( zrk43bvv8s)^QS)Puv+C$&HO$+Ui2e;B?07dy{_AA`>es~uzpih<@&wSxwmqsx0=1} zH1?kS!{_O4&nY_H$F)xQN`E2<@H*~&^{w~AUhHNvOXB(7zG~i5hQG;t(MoYAbAQv? z2Um6RsY*mIl=0s7(RpZ@EtN)F<sh&8$A7E6{${zK*8BSqy*k8t<=Io6xi$Jcv=AD& zlh|x0YB1sZ>^~prQeVD@3-!`upn-3uPtRJN|JFtMZtGCNWzWf<oh&*2Hu!SbN#i%a zc?L|Kh4P-+%aG{YrE~DJd%WfLBqULd$^-B3_acDNb*6uYE_(F8??q~27h&iAVTTvk zH=3^=YA3Rs-%M-bA-+bXzQ%9<GRyxJ)bl-jf0^BQnKN*iyKtGeb@}f6@+r|m09DP) z&hzw;3Ts}AuV?2I&dB9UKRL!rJaGA@^rbuJv2uRXzY1AWeXpnikLVEp{H@DmhU*%c z>)OVExCJkc&WqjGcFHMN?sqRLO0Ub`T-{X&fbXV3`PKFPJYKLMw3YqdPIP7dXb{tU zz0rJq_s_~x?yL7-FvVYFdA597h62A?-~7wG8v7FXY3nBGt!8gi{O<Vvo}<^j0o$pR zi&6X=CyRLJ=u;n&T^*{kX8g@~XYf2@H-6;sT(jcF^VyfxiDx`D@s&z`KB9laC2qQJ zyUqVZrNFOFx>>(X?A?8FbKk-{=<bzr_iCx;bNQ2hZ4ZM4R^KekgskwsSS}5mwbhum z`14qFtV=6g^5VDD_V3?!4yBkNV@g&(K`|j<A{rs5|CQbzarMT~P@k1M{khdoklsH3 zG`Ix?!^y==FSb^@hSK;fDjrYbo^-*%j5kHGNq5Gx<-Lzrc4~Pi^Hsxt<vN}6O&9CD z<)Gg={V`L9Db@L`^Vh`;Zq=yzZFue@VQ$(*`v1tf3#X{w_|fBMlZK@mmXL0clGsIB zO1fRTyF*x7k(5Sa0g>)b7rufhf~bV3;DV$Af)Zk|cYky5%)K-BAJ`erVb47Koagg? z#rrH@gA_|}cLx0FNQNa@>nMs4>IBwDW5ut&$<x#FD*7xVoC|j5IEacN3wt4htkUmh z9tvBuw;s!SzT%}BW%{$I1%n5CY`%;Caj=+J`7}A=CFz{$P?gtgd*!ekcy>7I=eWwL z(rv<I3L|fOn9w4b53$K=|L??8@(@-HWU!L_`KbP7@b~#$-l*f)(E{n9E4AOJUsrmB zKmSpWuUp*>`pXvT{$lrck+{;W&OOu=h4&{cjM9TW{6usRW6`VP&6!#ilV)YxnSZv3 zvTs}FGOX)5TMqADir~I`&3<u3J9@8+|AFN2Fa9jqm&yX!*FV?_q^Nuq$-A!}*#E&F zcYlY^flKxHVd%h=Ctrb^)h}cr{fB;mBCByPWHHpY%){)}gu7q{@r`kVS%l!Ze)a7Q zyCETTcGu;OyH~MywLVq8J42}?dWpTn;rHq;HkeXXMB7|9rm@COXKKsFsYb9oUprZ3 z#b4m19e*ankilNgqtM^`H%sO(zBoEi7`W%pccpEmW=*DxwBF~T6l=qQe+#z{z_;HT zP;E68gM%-_&B|)$OP)0JO_sEF&(XR|M1~8wGr|`R8+fbu_shix22}sF6?JEFiVwA$ zr?EV4uKkMbq_w9E@GR4PCNWs_#zDIA*f$dF^+1ZU+<+(feqalWxw6#cwsV^Fe<!k? zlF!yQzdr0(0gL;a!kAmWyZI!nbb4GQONcy=Gw?&0E^YdR7!u=r#Y3LS5*6j<iX`)7 z<|#`)Job~WA6Xur?2kMex#qW9^5jr-OyQkz6dBLrX9Mo*OR>Kqu4mf%RbF4wU*T$a z6P+I$=m#*aZiIPXI@V06j5r<5Dc)6&GN;p|mS2}6(+hz}bTIilPRM#Wz5l>{{raY* z@c7_nw*1xLmwfr0#pR-?yF)AC;#SdmZy6f8KTBFvDDB7kB@CM@-JB{|3wioaH6S2r zyC>mWH)lzUPFQ>XXyc!&KUyOz&%b{#iS_8m|9;VX?$`G9?`UCrPrK^zlCXOeII1Jz z;`CF=)!pE+_P^qU{{kf9bw8@iRh=C=q$lWBLCAi0)GA?AuZTBeaw|S5t{!Rtem^>4 zjq`DD!wf++4X8w#x$C)xw+`<KD(LRhCd9v}xcRFS&K=yD!t)nNe)AVvCNE1GHl%;Y zWUKGgiN=SG8lx={O>aI#8B-_wFrC9z=KaR2h?X09KuE1Rn>Ae=^^Eg5ZR4}$q>lS4 z^mq1n%rrJDOw*;q@9{i4PLd4mdf@z*pKatlgu772U%TQSvpSfeEq>nqEDkW%Ez$hj zH;>gd+N77&7N@H?5mDwtB0=oWR0D(VQ%SIX<ftzq1J6Y=x|_o!-;YrH%4QXhK4yDC zE<ArGo9^?Nug?FTSh2)g5Njw8-Nv~lbonGVgp;Ms`IwGq7ujv5uTc9fuxZx%>-VCt zQ%0uG$~pwg+vz^df<grp)3VFoGW+5`3$J+Ns~4n`#cS^WN_bIkEqCHM^6U#J=+bBr zl!m>rvBN;~;w6M9)PS|Tvd%<KP;WCQInv+@35g|hPe73c{%YWyk<nG!LuRQ1DYUW2 zI-WT_HSh^xkut%Tmi1qgUftR%FlT4xwXUyt`_04nRg;9hYB*oa-yH*sO!MH{pTcWu z4bo39x<zOUM5YS2w9i*{Wb$gNF~R?#sD^cFLOZMfNr<ts+rNFNWmz7;RXyB3Bpfi= zTd(D~DH+!Ewk<QPNjG0hd&{$D1KQncD2P-YvYW9oCtge1eCh3HE@#Rw3xLm3x71Hm zUZn38K2YOsM*S1Dl-t8nt3^Oe6Aj@??r&R+vOS;rmR4_BEf%sx2%jo{EeoeTZcSFm zbBicIt_Sz^if;=Usyv!UPcyl$Xuo)w*$ZUR7X-)7iE73)n<a`B;>cjlE;Jt@lMDl0 zHQZhnH|6FE?OM9MQv$eLimjJSqFUA!BqK*+9n;IMdwOSojJo0A6xm)-6mWOfZ%f67 zZt1L@B~$S4`OCcVz>@|5)~w0M>6pmC(sjlBm8@`hO+)c|cTL5CHxh>4R*;VMKirFU zV4d0CdD#l_w2hRH|M1Saq`nz8e~WAjTaH(}M(nO{GY)t(?H2nc<>n#5jLz3Km4g`% zTHZ=~UFxVf-!UZA&Q^7g(RJCnXxM&jJO6s?)&bu&B^A#+@e%Ru*9?0jeE%Brd0Xv9 zVx}VQ7d9Lk`Ph8vgOBeOeAn7*F_L0op)O%ME&$mQ9!z@H9`yOAyneK;ZaOe&(cft+ z@D@w+ECzi`<23zNoRh|Y;=LWtuKNOq*j0FYzo*=ecK6_pu`u)Vw8+mn85V635i>T1 z?rq%cPHT(&!%NkHEJgQ!?Aks5@Mi6gf2vK~`k<KbtHW#Zwyz}A6vR{M0(VZI(EavR zxmi5#(Sipr_c5!@O05hj3Ks*$-^AViyqs+(TD34r2I}mFyjfoFsnc_m&FoHlyJOMC zOczxbGqC6Ox!t)j=wIjU-0ro7?e(GC;>W@1BZQIBfwrrI!`JXok>0?;ysipA%m30R z`u{{6{TO!j;vfAo;n&~7hVkl8jTh&YGE?gM7i?p#@^bA=xrSOQ%$iZH1@v0Z<0B0# z<(I7|Cuu4R+>CR7fcl8P8jqSU)sE_4bB&-g-o4}<uWu}2exkD@#5v^8cjx1o=lN)_ zpvu)L?zPGm?!IEPVb$3ZOXXLqj_V<xoX@&Cn)Z#JlAJE*wF=YNUH^;AvVE!O<b&u@ zJ=W6oo~(<hk7Fh&pYuNn(47Q6y(?@f{KJaaN6Xpnfd3W^i;JJS`W08=)a~8i=co2P zq9l1>q|z!nNigy9&9}yrtf%TjXY)~pxva<kJyBny>iF>AXPJ|zUiBZ(Y5sD(7{3%J zGWOr0)1P~Ow(0a*dGEEv?`_uMQ!)+pIQFIA6uH&Hg;9e)hbj|}#6>QTyoQG^N8_HF zu3U_`X|86BM}{*bDolSr{sSXSZ1Bb_SA%#6r>6{O#*fY-c+NK%ml4Rxm}+hGqu%<e z7bg`UJ|x+2C3HLkNXOLf^E4k<`L6N`-z7l5R&UhM<nM7GO<{m$WKcMcCK5U2!?PQ+ z9_QmY8o*1V$^x^WS#`p|o2yRwaKG1xB(10>Py$P>Tl1%>9Q;0qVwrc;#h$l~jy19- zO0D47*oN2#qt3*!`<5`8=z?YVIAbw(OShM0alKBTSJ23=`Wi%X#XkGSRU7w#qzh*^ zACEblsj7xA);85@W7yF}wFa|6?RwEgI3B`f6xJ{~*S3Jj1*N7qBKeu%{37!lTwgJe zA4q@lkN@m)#9V2`+iS)9`6b3{C8qf$=W8XG`K8utrFQtG`^_lrZfn!Kz(n}Ja&OS5 z^UKYD5Yn9%)`Bq{QVQwTMZmaZ87K&+&McdSHme_Rsu{!YI<P%?$JYOGj=T2H612c) zQ%+IafGbsa+%0OtO)eB;|AOd3p#{K8UCS<!&~rD<<q1tZ>C%Iu_L4HG-Fcs(xfjt~ z;bf?;dzr@|?RIkXLlBzd@dN#>%wGa}=Wa5~Ww0mQ3^`kBLIP?+cvUTJ9Bjt4wMJfd z#elh1!L|0pPT=2lSH;N3CM>kPf?JqY5Jwi8?J=4)E6FSe#IXS4#-TZIB$a`QU3=Tr zzyozz!t=MlQg{2VasAT4W1Az|%3d6E@fRaXq$$qQP;AN|VbeaAAJpbz@N!+`2a<gp zsqxjV^W=-oQT_NLi05>I^qH>DCOAagUD`oBi)fc8Xx>jHoYY$u8lLX<g1pK*n)_&O zU=bC0?M|dnZ#;3Uhu-bFZ)J&rEm9QaXzt`tykzji!(8FZx|-Xq=0c<LI;p!h(USSz zu`}1JFeb4=!ACi0xNyjkhph>Jv!%=1B~QDmWlNNR4ReMcj}BM_72z!G;3@2AQs$80 z>RYt~#ytTq)>$uJa}e1Cf7*ty2*>p|#EtJZB63%0+#D=x_#X--Fyuw2??#ndMO`&S z`Zh$^?}q=Te>J!@`z-%f)i%4YSH$5H?{z^{75;eZ#x&=~5Y-~K+POd}uds3!6D~)d zeeGmlgCvt@5%vvO*InO0;kF?Wk)z${=HeJtAhy|y+qE(0NF+B>&^sCCjS_j0y(Rn7 zI}zTf1}46}LF=8VxPRXyRk6myq_o~aqcPig-}_XE#q&;XWK&5(Qy156`m%7DSXGLm zaJbaog_@6cuLzUe{-em+%x;l~vBG|yUSu4i*}5P1*Ss~_g-hWi^wu}>@7~G6Zj7sF zOmaz8KVR0kM`gcA!F*F>w~wt#zL`EOjOVt$lpQv-IPXJ4su+D5LvvHr*OJU8<=WJ{ z&P}2191Y`c6E$x4&5OeAn{O^OJ*wKOFcGWN@{MZ$R5xFqKQE$c%+cL1=DWGKThrX5 z@eRk(+_ccpZSo-+WL`(vQmNHkcqr!ZTdX2h+;Fq`CISYQzz;oXY4iM={Box-p&%u> zxn-W%QoJcxq9s1Q;}_Q~M(h$Ba~AbduWJo_KN8w3U(E7kGj+J?TS%VxO$DDpU9pGB zeg)G_&&KyE%ZsXVY`TYiW3PO2zP8Nd_=gy_SVQ-pK4A>}Dx6sRg!G2wu~zG#uJ53# z|4k8zVQ|{8&_VGhp@KJ0T3`D0Wj4bwU&bCvycG&iKL7S~+!sInwJc|Ec=NzSLW0EO zn#%Yi-ur851BMBQn%K7Y=>hMxTvq1~-anCC9sly7U(%4$1bradt^3G;9NKeEAf?zy z=&k9?2KOb&$7QMc*AEi+o_z#oJmhcs*e>~M@?f)BazzLV6~r!C2hQ6|?KrpZcuMW= z5Dz%)B}XUgx_A~AhQBuUGlXwRer}ig=1loi>`h~l)P8>sgj~X5+I@HDXy>T?=)8SL z_XzE+1Fi6LFqfE8JZk3%nu7a9G5ZC+m8yQ*(t-8w>2E)C4l4Z}AcDpoXn4;i1R<|= zROCq4*B)ky1wD)8Kdv=`7`1;Nm;OF2{nt8>C+(SiPJ7?F(LO`l8`lovmGs@wK=G-- zcRNAcRvQM(--YKp{wm5qqK<y^L&01@Cod&_mrGxI$_yUuaws-;Z3dl+eLLN(x54oP zB=oi=Kgo)4#c_N(B+;KB-SO4;H-Autb7u#?bb)TL(V+CUstiIi7(sX9tJ+2-PsCqU z9qIk^q*Rgxs5(y(!53dU){w#2^i+h`3F6{t@P`cAC>WgD6_I{I^FW+dx`XCX2wCFy z1QPfCSNr*gU2^GEiW^<rJx94R(3daUw}(QgXT3Y5L_ffPu&*3bmz=PXs9d^KBeQk^ z0lYv^m!MzBQB^?X_{m_7En4uTR8YHVT~<Wk@P$Y!6Hy#(S%b2bRWtt~I3Ooz6DTNu zz)$x~TpVD_I1v!;7U=Q5oNWEUF9%Po{W*M~IVx-Ns_j$*fXireXLQTw`twLX<9XL& zsw_Pl8qAT{0-J4};`yQYv0L)HT!F?9i5A`W<3H#c{8Ss{hc&uy^pI#>q7az1C!1EA zYUNw1+==}6o|&9bEz4Wc<#OmndDU{skCQ#(H)L+K$g3)av%c=Wxe^+o70Ra9%XY_0 z>f6_6wQhW2J$uR0iQNa{b0TA6Sh<2@YXy1Dj?*UH9<75eaIaYP*VOAhvU3SP6&p_2 z66JL)0+pY3Pd@x9q13ITbgHS{i!wX9{j^7L1uA|cqMl!d;iJf5XehB;!TRDSM>dqJ z?-=FiWBlr;nD8k?`gFVex*2QVjglTzW8cl{pEpc>11)=Rxb^CNlQDVPl*JOJKj6=- zX=L=#+vt(P*=B$>uj2S{xRxz&LD_#-it7%YeBx#=-yb>Cr#+_cuB-YH6+Jo6%>L_h zi0b#=g-a-%?(kf<``*5{9EjrVx_awp;CS8jb$`=uc`YEk?@6~hV>qhgnwGS`S9OH_ zK$v%iqJwlqNN#`Vt#JMfd5@Np$A<k`v<q4AbIhY&AWb45NU2mzQA_3=bL0GRnwP%8 zh5N3IG*!3aw;!Hget5Qchdv)L|MHpfZwg`$ep`AVVOA+vFWk4~n{Sj1-lWg!&y%mA zO35P)0ld&a)?l$aP1rx@iHu5V7Z(Y4eu)cQ+=TENoWK*^ex+qdK2ubPC6jYV4>0-| z-eo?J@L?Bolg!ZXp0kj0woPLcFEsj2l#yO!Ov@m(-_KanaHm~4ogSjny+md6FT5;& zZ?X}Tyr1@@b4J|Oy9^C#x6`}~b_hg|xXU{HXwf)d5DWPhADUeflfIr&8Gbfe4i$Ut zm+B?FD;JT-c#*#{WdGk;h`><g_e+%&@%x`6I6wC4e~UJ%R=}03)b{LVb86>&Q_g*K z5uxPcG<&`N+fe=YD3#rd`k>*;pHdc|rLU)`_(#cU<;B!it3ss)(F)P~-Iq^e`ENe& z4(^a|SQ!o_?KFNIu79VZGaxU;+Y!#F>eAtE^h&vzcf>?07On6*;?FM`x;;tL&YNNV z?YqB2y;O@G;`)9nbv)`5etDw)NUDkPfrh}y&^KP2fk@DUhHPJ{)_26%;GmKI&#Dfy zBV#Giu|b_O4TI5?e+=G{rpia~vw7W&&>lKPPNf^Zk;lr6K?9#}Jfk|}_xnAn_qW}l zjX5KZnIAQhXD~#kHgh3aUeL|7KX_WZGZZ-5;1EBRqTJr2_9`lp=HkZW%4iO8M5{4; z=KEhShFqR7>6(_o&RemsSpUVBgw1lQ4>+`w56FPC*dyZAUYm|JHpZeYA50G17^Ld? zD>Sxp=l5*l*!yoWCf}l?DdTFSdq$vYO9NxyUN)rIqFy{wpQ9Ud%vE21uGGJ){`q;- zUzV2TU4J9Ze}kN<O(W`?n(0f7&}F*up2Q%Zi?OYz5o4y~+omHY)5P$I+J6z^^7Xc9 z^TOkM-=^Nrq<;$2*mdZ9d*^DsWBe^~jPTRz<v^?CO)OOA+4Sk-ql<~73ytr@@$Y1s z$8=ARSv601pPmS7{*Zq9LrL?e=F^{gny02uPi-{M?mRv7(mW4(`u*pXbwf<g>#Kx$ zjUDIl%Z#yayJI;HojY|2(Jgo98BvHVjepe!l)>pdugCrbX-t)CqL3tofq+VZ(eqfA zA~rNL==gLCmGfP79<a)KE)M3q>E#kR{yHc><TEI^cDu^*g&8Qhm<oX}Y{Kk-%asD= z!!e-ADLA>Ba!9Sa_w8D}Y$2UtOCO6Trj@#Bs#d;M%{FbGQ^Qt7Kb!VDW9hIP*8Zyv zhWzgSc}bqH`c*=P+t>>NXN#gNcBV!K2zpNwL1Zjy?>n6Ti>K$+ZNkcafl~4)k!EQ_ zzmT)YDC)~#fTa0q^$fVWeYnrt2IB_ZG5ZL=<qoIk>FN%V0UrhecBjW2qJq|+T1n#v z@mi@bpI_5U9~}*G-Oa3)7F4T@jrg{L&P*LwS0#;l?oTr37N|K+v&U+<cVZ`=o*i;3 zV3E~V@qf-vKCe_)6BCI4Kz~h1Q-)j%crd-1*#wlGG#w7-i#MAj7iH>Hf54E32R~xt zeEr`5%HKfy`>^<l%z>HF?I~tH{x>>|^*0H;#Ud8-vRgUCFaSca{3m0KH;##RhVL%* z4|Tq~Mhq{m75P7WAzYco@KUtC_2EnLwpR?Zl6?mcXQjue8DGgxNff-2fAm)`nfhwt zM46MZ^Gz4){z0JbL)%vtuhrEleFP7WhkH7bpiWI@Q?yRr+9Mn-21$yV3PB)hku+p7 znbaK9JLBtzh3`z&X_yyp>qr(YS{NHMFIiay6fM~}Wiv0^d9)QRI|R%z+n7jhhZ|E| zso?(maW74@`xwtjKdoAJ{oZS@n(Y25)FWnnLDbNH)-`^9Sr#Trxp6o!)r{oIr?5B1 zHfs^90V``!8`(DNG5c*R>v1P@HlOca_Sq!&;$cxpdSRl&GRCvs*mi^IUn}V$O<`Zy z{#?1R<^6GdmcjdMX2Sa~Ip{0ftvmys)vbrOHSD$v?VMM)i(L}zc1nG!R(Hxn#_e`1 zV%9IWhuM0R-wtLOvy5hN3x#admsLsa7ckr{pH}%o&8An<I&c52ZRqI3w~h%~hl8#c zQXda`-q3O!q&zI(*nd`@;}Dp`VS)!nh(iuRDSZ)-uGNvf6t#1`p<pjm5`ScO@{Ik? zr;};EM8_X9qSc>%yiBwD7+jNWt>}vXmvEzgY*%XSH1mfR7S~v}^T)K2zFF3_vr9<% z@MFkpr;GnVZ!bP~^gA84u1YDNeqlAQTzFTeG<Gz0L1ZESJ$j;ueB<Lm{m=d(%Tl23 zeF{bC(SAIU?PT`NbG3hGOF`BDF4l5+|IL%_%19mOUXiXWFAGKN2uNfMs*sDV7r6Ho z5sms!gf3=1e+@sX`&0*%o6OuxfXSAkX$(8V9K@YJ{#rr7g*vg<9PQWi!<9f+(y@Gw z_n*C=Mwb$D({~F#&neg{l5OQ>sB3?uK^IH7gdh@=TU@AJ-lK{-5m@4_dz1qnTB1Tm z_pP?7PLRL)K13{JI6)milms2wocyeEKcmCpbF_qgSCU1zKsCoPR%kx|e#GN1+=qMG zkC*atwNLBrVcGP5O=QV(S&&=<T$-$VdscQhu>i?;zgyF!J2!FzN&In7&)D<f{h(9# zDkKJg-g{VBr%*4#SZZk1{;;Smd|TXw{g&OlT(OjUog^~~U{0-}G$aSy1KEunXf1qu zxoTwd%Zxmv3d+bOw&nFM4SZZPKom2RTt7N9)ci^4?dguv1iMK{PC>=C!mi4jGLwk* zg3812h8wF3AfR=E_IvNH`bnAT-J^o)f2X^eAm4c(+Co(tTNH&a9-1aqSVI%Bcax9f z_I;DWTIRkz9oh2R*@1<1+-G}C%QC5KxEgATvps{`<>p20h4qpV`?p*;-rZ*?e3EkC zl#x_KtUM}gP(Rx@P2#Yup)G3Ex&D=e-j-X|OBFTg8v`I{Ub3(<hzyKGS#*_KwFMTn zIGug9nc%SQqV0R)!Tbusb&O4H{NL#9#&7GP>7w?qK0l|ESevn(qK>#TzdN8mHWTpT z&XnsC&dk^p+3*cYd$Y$3EXUYMlk?7^`U4NiM|Q6Qt$QlB54_Yl?HBr&TI;VL`rP*8 zhO+@QTFPi@TRfP#6=d7gcNh@zztP*q08+FZ0hhF_>2e`Y&We5HxGhyOG<VG#!Uj0) z>y`{R)E$N2)WXA=Fn~nfBx5|OujnXZzZ!8A6G!EADz`F9?*ha$K|bg7W{m#WCck?P z3<|wXNgDg@NPKaP2ueBM=R2IE#YnxoLn4Qi=VqngTB>i^neh1V8^JDu<{M{$(KvV? zPe#PZ2lg(#u|qp7`X-q7qESy7ad|txm`QN2U04tjY5E{8+>LEO7_?-B4PRwkBWa6c zBD8Y(4u9#$-2psBKhqEr$0yX_C7`)~(%1aQ?eANqk)^)x2{jc-<XLtT=iKuEI&@88 zrF1r-%NYX4ky14TD#)`SJ%kyyLIXRDz)4rHLH7EtE_wO(C?J5b3qsnyT$3V+uKktw zXCW+1PkAyu^sB)6>90Vlnf+MpOXthX59;4x6ksh<34T<mL3n<@d7sno_UqVXWo0b{ zKVkobIQbYjcp)DrH<!$`SGY`P)(Io=Ce-dIa^-s{%4C@oH@{N;r<G_*N&?7A7`K8r z#)47>>Y#fc^xz^`Itkz?Ljno@TZE?w29lV_`Ctq<%K#-UpKA*@8oo&3vnXZow<ov$ z<F>;hB=Ty+k3&i1s#N*XLo7|I3$@#z7KmKtCCHZU3zT%@$q6Tk;nVM`^0g@8_%$dB zGr3rNI(zHFfh8*m@J);HVI(E!B#=;H6rMWxIG2<_1_|E7cJg6USUWk%n)|!*?>z&c z6?ifxXFSzrHo!89ge}}X$;)~6)sU6+G+G#@W5Xsf5s(lntWvHkHl?}&Nd(Db(7B1w z9dZJS>P6KAJ*j!el?UM2gNL-OIa8(nra;jojRu*WA{LE=(kPQS2Ow#XC;*Z09)*(A zg#h1YD9k$nS`z}44tT%gD~hMrBIF^WHK6kM0E&1*QsQGQi~%!2O<V1P!)(Cd_#`^g z31;4B*cU`)^sxXq3Go<B#YR5K=!{R6dW8X@gSD7X#bKh_0QkS9QKooo3W9*5aEiv$ zZ(<=36mjP)!}>bKak3N>Fm&Fr501xE*y4a-)P6AG13!}71Vwp;CbvcXOUAvem|yhH zUQVD|hlBTcj-jbYXghL6Oa@vv3*_J-e`&ti;>n2SB-s@>uOdL@P>>MRdrC9%%%JJN zRFJAR;3lxagCI*rk}D#~!i)tHT7bKlfBFP+PZa14Ke-x;N)h?5aQ>)@0D2n)=hvEe zcm!LZ0Vfm459XfkednV_k>}vaWbkA;I1uR~Xc5SZ7a+|Ti2or}2Khp6@>k;#h#a*F z#$M<HWD+QH1dbZb4`hi0%Qz~<|3NQlv@kRk0Ex}*l0yx)<H;rg8bu_HCqUDSqngCR zmI=_)1)`;_3j=Q5ghV`IVTcgsvRx1h0Dk+LjGu7kiG{M^$xJYl6+jjTj?(-X8Y^*t zmzsG(OJ;6D&W{C>Q7|F|Pr;93?~<M2IEKRU>Nyxz?qJ|)J`C4M^E&Ta1+Zt1Tf7HZ zMdIJ~VqvKmgc}mJ-nE|Bb|&N67mtCEv|#gN^8P>s8R3^Rc0CnWo{arQQqhL-VCy+P z4%~4Sfx#3B<9W09`xfurTELNtzu@?+_Xq}{U@h}tPZW)fzd$pdj1*m^M3R#zr+z8W z+gvEWqyQTZm?V&slm6x{$_fmPC6b1Pz#xyJnnb}C00=<fodn1L47Dwi<~@`~A4x-w zf92gJZlk?3jU?|RP)s73$3ioaC<>nJZ_psp;QjYT6OP=Vf8Ek_I-OwYV+wQ3Ih2l! zC`cd=#{5k-f^u(aA+XRY421>ofin0Ifuc|&#Q-`b(`aBfQL}6SnB^5II1AOsQ%D`c zDo`{aYWe{`9tzyGI2jlw4`hL&<iPzl4~Fv|pJ`Zt?X%X{Bp_O(e@JPXFoe8vGW517 z82bjOz`rj<!VHhesR{fr^EYykL1e%>N2m~QFyM*VRRzyaqbSHx4C+{#94w7Fwx1-5 z1`{YGx+tfSVsUc70usI+)`cX{#N!C_p_(>=fIdL8j-tAkui3CSCWqT^zJI}`^<E7L zRs%phsQ1<;@7Mj<dt~L^9vnqW%deSJj2>xaJbP2#{@fh1|N8-ms73%O7J>{FKqd<P z8kWk-&z>qgcKl7XdO9y4hXNz;U>*gw5Joyqg52GZi=+0ZET{`P4CJ@;A<(KUga7y; zoB9Sn$TJA8hI(~10YL&wo}@euK`!^`hpH<iI$S?3M^6?Bp+;V-w-8`ZfFcMme$+R9 z1j%y(8xf#_Nbc1y%PdIPcs5J|Npo(T(|?4Z2*2F{xn_W(T*h83=ifGN)T72OX|#T3 zLCyYvFG}@+ZyidV9hf_0Z>xsMct|cI`G<c{FTZNjYxe2WIOClbH;`+Sxz@e*%g-jJ zNLXX@3$@s%SjnKtLt(DTPYQ?jidOszTTgT5z@8_3!~-FMhRHhxH(RoqcfW%KuvT`a z{ub8&vf3qTx|7e|XU%HHH&~F{Tw0@zy8{e(3JDaDb7m}h=1klaHYa(|1j@HPR7k2j z6yzFWmSa*9Q`XEc_Qa>LThqQq%0@;pw$#%STEppC>Xh#mW%><L{rTnOQG@2f*ShDd zyQe7&=B%^Cd9j+x4+9rl-K8JTPWO#lhfbY_jcZNrAOdDX&$R&K8Qg5_+d4N`zxN-( z*UzZ3+FyD<5_S*iTU->7@s7M^JU8acV$xylF3MskHtEyiw#b#N|HQ|!Eycg=-2a-K z#^SR7n@F9|EdKQ`)1!(4Y>I(jBK;mb_Jg^x6NidiBYsS!yYZjOaDMC$rnv|f@AF;z zCe@;7C9mkQ@gT%U(o)zar0zVVhQ$|s-R-8CF!zeD0ga_7!bUWBR?AAA{9V6MWJFI& zgwsHT%SD6-YlzQ4B=fYE6Sa1PO(18#j3iT31gpW8_4Dw9Z^^8j*IeBaqh?dxqkgi) z6upV6yy%^7i&Z*{ZBvTtii+zSh#M-2TV0Nvii-d47ba>G`bO#Q(uLIPsJm+`p(-|^ z9|yud4<zjNzcIu?encgn4UmE)iT{+aplB@2Hu2{QXhtcCIa*ap!9O=DhBMNIw=|f~ zHd%ZyIVNh6^fpjwFeO*ez(jnQ77stir4o&QrQTLfvx-i$Q%?Jbdwef4$s;-)X7f(t zC_N3D5fPmcGnf(bKK-upy~M$cB-?x0zwYJ#y7xf&e%avt%3t?uZ0`|kAdQ2WZND<R zlppj(Kj;|*d-G>bC}&MYXT2EAn){XYhAq>_Rz{3EIqFr)MrlfzQO=k5(Q!&q-+l#h zE9c6x4Ji8*kWPu!d1X@!<+TaMK4J})WQ&zo&ad2x{x8z+kR{rJCHkpU5Z!7{4Q=WP z%ky*P1C7-J^rDeIyRp%b;pR@E)li{bOp()2k;`R~hf1;CYTi>8x6j2>QjcReV_d3P zpR27#r42>Pt|nbXuhj}ZTvKMAlj9GLxkjwMoR`oloMI_Nzt`_xF7AtYG^ApBR8l^y zQZZ0w_{^?PaoH_os7!kD)sAv$k6r!}yG-k<^ycc=+sj80G2=O9GRf@0vzOHrDWI7k zoaB`GBrA@UHQ`IiqP|UtaY@Z>o8_u=UtycDTP0zp12qOw34HcJ-)6^A!(ldOp^~xT z!sVVfqry0C%CEDAN^gbHt3J`J1qtGw1pI#D_hH)og8-g3SC2%OFgISZ#l~D_>#<j6 zt0rHlG#&Ow*97J>vN!V$RSL7`KT?g2Qf*mLF%&>*G(Nyx!-8plSL*~!^RFaq56qYx z4A=U#&BZQ1X_?VFZWFg@-{-hXFMXG&!qIk8-tlj^ea@x@_Hl}za0iKj=pwsd5wB)U z!Hxc%E0<%gwOZHY=6+F6eJFpu{;gY}rHx{R1TBH5{g(9qfS8OI6SfAdzo}c#MYkOV zCZCOgbCw>{&Y%KhT(V~r+&*cQSt<3E%bb5%7dP1(9L)F~RW{t9$=O{t(plF^`Ita{ z&-FcgxU(#d?i%usC$(T`^GH0Y3PPQQr^$-WCPp%RdSxGAKm%ejrDPyL0Y%UUQwkna zsvN?z&6!`r02v#KvK{|#^aHpVM|E`cIW?Qf_&Y^A62yals*YNr{tDuG2)p`7_Cpux zj2XO|AnV0bAhGQErj!VPj7Wm(+3*xsoRAzG<s|0)(eDlywQ2T?;f^>EbsXd|9`g7P zd1~@4svDBtqkaO&%eP3VKJ{Rh?4Wb-f9Rjjo_~im6DT~9APHl^bx78!QJ@kY7)HU` zNlQ;GtUZKU3#A@n;gj)+DJ1O99L<-RT<BF2fOjPKmZPS|(ENu57LK1nP~^=yV_n_l zy%;zg$xVga7{-9AaVB0_%4|q#!U)idJyOF-aN;4;_}5aGgV`hRu9pS<Q<;H{bV{#L zq!PAlG0?|Ia=B;2I%{rgos<>08OL5K@*sFSumV9{a$ujY{G{NzCGyJ(RYS#^n+x-7 z14!sMKYpAzf+r&pe!ZkM6P}`%z?%~UKjeH1Ay7QK&Uy_6pnif1@nor_yMaQP`V(_d ze@QMQNyvp_VOJY4DioNd19%LO#Trvi6L@i>R5JL$WFt{l9F;4Q8uyPk2laY0f0E69 z+ADtZT2<(s%AtUYzls=zpYnytd23hOn`<pcV(pZefUms(0L8#lQD9OGxl|o6Y5%)` zpt%umnkaEI9<$rGu*d^YNnn7tNa_#*iT<8=js%)9a9A$Xgq|u`j+z62C~_S-6DSPj zE)Ue+uGLY2Q4}+dsIwN}9u-X$3P{D1mK87FLVzm5ClHR3E7wd@3g|?d5<_rIR5&Uv z95NRPq$@RwvK4BUKCHiZ7^5^)rh3w2x7Aa=nBuy-^cZCK@6Peu3AeF`@9eW?JR99Z zS_<6vuMSkM0F7ietQouR?ylbX_wxt0@6YiRf=F_%Zy=Ug3J$`bQgxpf34@g8l+#pM za3o|Ib;PYD0!6M714P1d@6>lwIamE9=i14x0Hz5CX;_JnAbism&9i(7Spt-a3-q{h zQo@8XzI~D_c3GdJ&Q!Id?!4}rYPi#|r@;CN-;FON5;Q3UUefP{rvhje?L5Rr_5Y9F z>OP?1M|qbL?oiTEGZ_Bz+PDLO@aYR;iG<tWTP&iia?yAk=q9zGiMC9h)?_lZu!)*} z9{*%=qB8Rn3<fa?u2dF?)~Da(1(U0CF8Z^BLFtU}D}%=SNUiw-N=bcGXVO$Un9rO4 zn36Q2MFmsqjK-oSQxd7QD)ck+C#L@|dRr*&FrGE^15M7t@e6+&hX(O#F(BO^sq}qa zYGs$g;09}w@;XY!t?vU9PhtI>NSV&?O)vy+BV~+obV;i3WR?@bm8!U;Q6+o}M8pqF zej0B1w$+CCbDB2FDJYVMzX<(0QSwN->fgoh<<oB;{||c0ip<Jeptk=NoJwa;@>tOn zC(kh{ElY5s)y+3(9hU$a1-<pOuB9hVH#tnEK4om8$z9W!86x>&wkDo1W)2+c^0{<f zzpyv4n6P$>R-R<p&|>Z1!{lkvk`8+6@~|htWJ0Es>EsEBl!t&+w0n`Y#xsHRd5;$! zB~C9(>r<VR_dUwga#(lDe9B*Vh6RMicvOVW8+cWQns`hUI-bETplpDT7w&i23|~Yl zk0F0;rqIj1+8jm7{kqgiHqq2%=S-g`<$;-R&<rT7Syc>w>I9~uDz>alaqNX}xqCmQ zUu*Z|@8;sh^-RC^;iCb-h~Y1#L?`yhP(ruJTuk)-OlYZy%X8~;|K68cw*vg9oF4@A ze+Zl<26#5-sQ3-uNfr+rYE51Z82;Km8#uD6_|-o5gZfBoSh2ZpP}a}QZy!d5R7W<( zr9Yf^)V<qpX&s@Ieii&5t&(?JAGMC!`UJDMZdVrb4X<}oWFLKHr+LC8x@TxT4!%BP zy!AJjgx*qzy=w5RsPyf(vg~=K`u$bdYmFPzq0i}?*u$GOd9%ac8t#fo7Y|Im7g(HY z*O%$}qxwK%IZJ9TV#PUe?XX0cF}v%LhwrGzBi`4)-*;l3(nNg<^|E%buzmiB5f3<s zN!AvUPG0#_a5a|(X0vNVZDvZ(N9%NwWa3iA6U9%t629-T>1v*VF}s~;B=fFH_B`H6 z#e<eu1Y`R&^97vZcARfmHoI<hP@%-6HJ|-`KJGh)w+2R#zA6AHoV;Zru?sXAJU_3S zoaKTR_=4BN>ZQ#{tKlsnbx4mS*#uS1wly9C$IwqgY@Q*fLRq--f#Vu<0_zscdmCa2 zL&{+3&}tK;9yK4V=A;rtcMnyDz6O?OOEJ?QKyc~TfZXtS`oe`WVKqJ&6(X5YLWcSC zV-$rc22W9ifWiqFkf1&Y3fIRn>Z2(bq9+(V^RU9W2{I~Wmmm7LG_Wm>N_k;YlM<OK zK<cd92UpTHqmsc~8x**cBnI11sHi^aw^-vOHTXDLj7cWRU80VC<$8q_k$g){@&^yq z^l_?~1n!;*GLPXgAw|ZrhH6j6l{v@kIoU4^HECOoq5=y6@gxCGzx3EF5y=9iV!H4i zSZg{sRUs8gQUifT4ET{$DH#N9l*D3=O_P~NQirqu=iP~%fO0)k<0I64oWD2g_|@D( zmHyf-a|A;X6B6#Cj0Oc0QYAEML@eU9O!F8>PZfX+D#lN%g-a7tLy?rb31AWdh<4&A zCCG1*%b39c(&+LBKR}EETe*V3XU@Jru>#mvfOidwiku(Zi3EIW3xE%@c#7ocStqgZ z8tQ8gW0JAy!qhlQZ!E0~B}pTI0w4{NXV8oQOL$KZDc)0qsi35}?9`u7Wz-YKVL}S< zc!C1j=)tCjOch3$Q=!=)6jyIxe1E@C7?LO3OEh)C!zaM|1}N4X)Jt(?G}z|705~-- zJ@7XYYJTsNP7whDE^V%Hmu#^+d-t&Vx9E*A*IQtdym7Ko0_A$^12Y+1A-MtoPBB2k zc?i{`$6HXA_gK0`@+7A4X-#2UN-7hCI!hiw%AT~fM@d4UE07=-{fR)z%hZEDXgIe^ z3!SS?@6_XB6QLU|es>;7uFQGfxH+4R&cUWoxxBVB_P7TMXXO0+cN!2329xzMFid@t zj`g^06dO;~xPZ(MRYpwed0McfLBsfFiQ6kWlpY<lD!Nf^P4@3F57tjzGj--d9<7G| zsMzlGwsN3+{ozMs)y&+=_<^w<=WT7FeRbn7iInfFGEA~Pe99g|R2(yJBW1~MnRv9k zHBWy1WS!b?&_o&Z>89$d;a5lG=I2h<oP2lzi#7M4e;(Wq?BWab)t`lCy#09pRJYFq zy{*UfU)M6_vNP|}-c8H6!W_o_4MA}`eKj#`oJ6bUOiWPlLA~t0u2+@KC0wH~Dd);Q zgZqH;=z8VN${n?pI}#2LVy9{lEgFJ%r0PX(;bl>3N-NH44eTJrmj>Xs7Q>&_<{a6a zyKCqIc;%=-Df{d^hB?7d78w+!EJ2>g`Qm~Ds&Dg7`~@nKS)d%D%m;z(8GxoKKu{*R zunRv4T78+6PwqJR`0)o%=z-GBzcI1+7?Z8e63(ChcDj^jP+$#ZW!)taP(K<)*^IY* zIVLpUNx!8)1q^p%=)~S~I-cdd8-<VJ<B$?4N)s92@na<EzK8Yck6za%p||UX0KEAl z>_+weJ!KIg_iBACY!N0Usz2dK>jqG9!9jv-|52Oy3s7aDDdW#3+>1C^$ir*a=n>bT z(|ONhB5O#RGimjM`R;cGfym3`!t_Zysf%gi(tsy?{xIpF3kg_}Q0_?Q#f9)D5U0#N zm>d>DcbvWje-A*eh|jR>80>3mg2c>!C_vO3w5{)jay3OIKly_+-KD)n8H^~E65#`B zu@Qi)6LV&T6~{h%$+7P_QQ3GQfQ-hthWdC~V3f4={)=p5BpAk!!$%FMRWbMBU@xAa z$&I#elgl*Olp4}e8A{`s)sPI5(GOt}vUr|+n>4sLAJ|1%i#%N<O$q@}Ih9UOO(N5T z6_DiGrz&6UfS46OI>^pdhOGffctW8l<dGBfuS8McNEcC_!AZu<eW<Y7gmi)da7giS zCQ(6#+TON-PG-U4hdhe>avjgc5dL257xtkj9@YIvu`O}?E~#FmkLd+$fADk22E)8= z1By^0V2g!4zHO<8PcTP9XSBhxNa*igP3$|sPALMiV7&hXMv8P&k@j#=(Y6Q<JepO& z2F8ih)!l-ccY>4&!B!Z+CKwEmXbU`Gn+LKJgrNyotvq9BsHO*q$p#s2$IpRALP>GJ zMJBj30;sS7;ss6IkZ7-6h}!^H`8ikvYibGrf0&?X98@q^j|Iiy2-OnO2R@Pkq!6X! zHQ>M7@*XKde%(PnZc+bsGZGsS2$>kZ<Mj4aSvC)o>2R<M0%XbrX2+pdm2~(JAc!^+ zY!;W&1^?&<IAOs1w_!{+fGx%ehPUvfPnh>m(@q6BAs}wY0M9WI%DF<)e06N|z!1z$ ziD*4NENrgO$P@v_Mcp$9j~C*<C3+oj%LCK0nwVlq=%Fr2*dyHomO^coV->RZFnUxr zeivdI47DPqAfsW*$Q-LYP!JOshJ=}50N4-zDtB?HJdghppG24&b|&|)H&33eUV{*{ z@VX&sV^q8lsCEG~F#0+nY(xaq9K*)8z)*jVrb3y&(q)7f-E~g_nRJ4TccE;g5N{qh zl7$B&%%L0%m6bsVM);CZM6+N3?Gr$D7m6n2(Xr=<qU=WaU@h`OTuV8k$54$t5IF`^ z7pXtQ4BjkFf+2!w=%Kh1uz4P+(2|KofoPT9Rm9V)b&DPBb|0j%n(KAHxHyCdicqPT zM)<8dnlA?|-c)~+!ZVCkx6(7y)3#fz<ALV+Lt)HuO$>j`OKLaV^}>@(B9q^_q-Lsc z`oqgM`EH17ac?B?Sdpn1r}13ssO9~~B)*IYWe*O&^m?1(xR}D_-^5nGubNU&+$H)b zC*(%j3q(a7pKa|UZ;LXF`6C-$Irq?8eH3@F<_a-xkJ@yEcs2!k<Zp~!Rv<uvPPa=3 zZdQ)jRrWMhe!O%lV32;zfBhHOxu8ITw_8M~IMK>N`o5g&?o{P>it11~q4*gAOI`0a z2%p)B+CYfc&8X^D*J?&MJ)wq!B7#W2!d^`=oY;qsfLKI~f;dgcn7Jbv6_Xj4mbom? zWvOt2@DM()6AolEGYc+T(43nsv)1NZ;HGtrXlzZyO$G~#$~t*ALEk%0`ATZjh@;|4 z?k5Z?v5Ya792$m?W8N`Yl`szT-3g0)%#_K`Y{+KJ!TGTsXJx2+#RnsHs>j^}iUbq+ z8=*fTT;=_m<2$M**4*+yjf9-3Z5{(%8Q29Czb(l0Bno`PR^N3BoVej0ugjJ4vtgaF zECC+a!Ka=t0C?#cr)vXd+7WTyUg4Jw5B5M5I8F~)$2WC8^eB_VpXTUehc|VlQE0Bm zU)@QS%!X5ko}|(<(g1z|@yYb_gs+3m)pjhq`JCCh>bU#rvwZ4IWKlGDD`gz?*uDPw z@C}uG+t$<Cm$HzxJrLAPe_;bn57<j%fxKed4^ahvG7l-RjOvBvWPC8eP5^3_Fv9$h z2d~F~(zeIMx)FlWW-zWTbip<Bqco)OF&KetBQ8W5r5TZ0o_c_V9)SsT27UgEpPH15 zwP(_M0c0DZ$mJk(D6rBqU^fzco(i!Ej@fnteNluk1nY?f8<`+<q)`aC3P922{rFs4 zV;^FIwEXZA>_=*jVqt>E+C0H|RLBQf*IRcL0i`H#lcld66RSA_&MOP20ki}3fV=lv zZ9ZO~Dj>o&%)BNdd`SV)`<D73OlQ+qXx=W=Fj$R4K}Q2;nKr~jhs>@Qfazg*_Wtun zinqCLG1KKSIBgmE5cETt<7o1%5*}Gm1?LGbhACr7x3mv|)%w87R_z){UVp8&2Ie>g z-cy2$Apu2izy%lkpb?r{s7*q}d1`Fz&5ZcYNR&7DAl%T60CmIb^J;@#aPgxh%|%-v z!`)zMXp9v>A8HA+!K$&z=sQ{^K!6xT-ffLPP<xCT0s(cw1q+frKzT68pq*{S$M0AG zt)!U%7e=;g>3ZQsYBufOdszGz==PowDZW~&%t=}r3(IEeumX}(#k{4Q_N4cJvVyUC zCtP#NaP<eU-wF`(1=LiJ>1r5qoAkIA@wt2gL*Pt3hC1cI(Unl!ff!#ak64KXm^2bt zp4Eq;Ob$|+4N+Rt{Rq8T6LT!E{K(|bBCLKO;t!*lfQLRGkO~0py3jE_jIR@3vqqWK zSzG($CLZRHU@sG@qmcHF2?`whgD?g`+m6rV$K9wE$4?5a%wTF6@M$rQpj16L7Nl9y ztJ(z3WAPz{WoxI+wUB_f1XEC+8adD{`u;yCrt?`;zgCUz>#3R#tYC&bINV3=wXlB8 zAYiKSu+0W`U}&=^1|svGQdnX>Dplj`;r794qtC*?_&5e65oT_N*1jH@jt1ArGkxDn zbwb3E^3NSyAX~E{sd(^P4!s!aR|aojoTqf0@mMQd!I6mG7J2EP(=bwi*oCz36+DM3 z8lypEqP01;>tLO&3=42|_pJFlJzZ5(cGq1PB@3CkICLUzi&bkCM8Z_*5Fo-=Mj`<u zS(`0R7AbN;Cx`^4xGgmF+jX4)G7}8Tk9;4U(tluNpc=5D$p#7^bH?hZ38BE)O?J04 zgyBP$vj#?|uk^x51V6}b23=3YsUt8z;UZAPMEYiFKYniKbYlDF3oBb*utE}p7}`-` z;x(=ZNwYBIEDJFzB2~T@=y9)8>BGhzBE}eqOqBFs>qqlWWAfuq7@)&-HN%`yAv{X* z%;mZ&BlMoPl9W|`I*#qA`#8z_RnD<^I7Buf8izOuNnD@15JMY?Rc88aS*{6pu8gsj z^e>8FPoAOM#n3eFJ#?9#CCknR&-*a>K@cyVZ~0rz>Imoqbl4H<o6)<y)KsZ(qgZx; zom=W5|GBN~Dm}MAH{Xs5pEAQoRZp**J6r)<&J%a#80lr-U4DEnSvjH8ICaSPQc|J) z-zSaDPnu#1|FJtZXRm40rP8tRcs<ET>#qpi5rRf~cqMxly5O!&SFFyh+xqd9iAq1` zE8_db`F>;VyzOJ#f38YeYN3bRt#x-~eh`&EdIF$(vUp=Ta#~Em&w`n<y2MCA(i2X- zH|xypI290+CQOc{(_3QUe;UX6zx@)283fjgErhuZemmsBwBQjTkM2Vh_SLl(Y>5c) zKUIhoC*M+jfOHo_snhZrO#Sl)i1oRnDt)v3VZnd&$t%5Dyq5(mQrq1s%rEpUK&9L* zi;P5k-XBO91-4gZAecUwEmjsTi(@(uF!Scg7GAw4(%>sWuw=^v$-IGCue@BEVHV{> zy!goO{mN45iXq~*D#Jp~hRaNCYoG_8U0Di5ScPTiUfOLxp!>l?i=2ILJJk*E`0_fg zpvR;xbDJ0}{%NBHD|I|%6PoKs%r3Y<)yhH;?8Xp5ZBYq84`qWm)~mU0Ql*fAmbE}W zfHkv@^fi(Wquh#cFiAWugq-5dkJC&#HFM$&12WQ{L_>cw#YKdCp+f;GD!OG-M+tlC zvbfpH^vClqfGi5njsg^!fS0#8@`|-rnUch2!K*yl7fP9e0Fc1M;?9Y3!2=+(eLn;k zgu=S^aY0dFnk+S^Yq8bzK-~!#0IbE0jM<Seh5>lSM5-VX8m|TvZ;e8cP}!pIZsZ^> z8AuSTin$=v_4?8E*NMHStu9DF)e0rP`k%|dy=1|BmSgBDYnG51sJQgy&>0;GLk9)x z3Fd(yICR_+5%%`zl`t+=gc{Vw#+5lSD~5U?Ed&4eleAQV+TiNRHgya~Ul<gEFB71m z_&9FPtc_?}TunsL5$N9H&ni6@Md@ELUObRa(B3(?K1r4e3xZ#EhK1Wv`(*F#*afUG zvSZj*f3{63EAtc<y2fZ3BEU3xMuu~5Efc|(WQntd-D%H({9>MbPk@05B>Befy>2`O z3NT+i=%V#GFCGi6xtjq337a*g^?=NQN8Sp*=AMebcWI^xX&>p}`q`sd?AuiL(to{X zd3uEhM^ifdl*ijQHC=#t>rF!>d&#N}V8{`ixWnyld}H`^ab0<rNuIBH*+0JMM@2LU zB9ut`_c@j@kp!m`(|*6Oaq}MiH93sPn@yc8_UnOL@85jU%j46@5wv@|Wl$(;)&5Dp zYa$uWOhp+lQ-FB|r(vJ|JAm_iokZn$)pGe`_f-XDniS41Z^E>il9w(1<)SF0)EYKj z@iLFJbwj~$o^{{q$!eKxTotoeXMkC6$Y-HmF`EE~o?CQZx8rQujFZFcX#XGd_I;O5 z2~&jmW3jRyRxeAgQN3y{L$AIny%A-?5qrA-hQioJckV-v#~bH6;{MrXgoAfo;+y@W zLuWhBC(`JIoj?5w*?OTQ<%B_gcOHS2e5iC*|Gow#Z+A03j*lfB8bFYb1rpcdW1cS8 z*J&mujICd+thEQ^7Hcg1-r3kGd41Ip`hU<{g*@e#GDvjttffFMe~oKqutLpn*xY1^ zYcetwG5jzXLe-s|rv^1AuK^e({|4x++lHSgt!aHZ(Bbgw?dpewEr#gv#GT$owMvlx zcc1Ah#^)(Hhd%BGyzc=PbXb`BqXkygNf?G#MZX2eSwwJ@l2;THr1KonKoYB#J|3Vd z6x<+(x_+HZ246MRV#z*yX&wIad-J;~@z<-M*QiyoLd^kMNxH`2-rpy;^#zK;%?$+@ zUZ==<M(_8`vEWhn#mup|Oku4~tR<a9UTtO~L*r&9(iQcEmq?9ac%5O#i$OmSV_49- z$H)=v3K140uX%tVM<g%7+EM?JLChPIu_Zh43%#V;YFGb~ss&A7kjp2QPi#Gh{S$^H z^wufz<NsppzM`56v@ijuLVy6FgCK<75d@S@=)L!*bg3Ez6cI5AEfnb>C}QZng8~AE zUIe5`6BQ7UF1;w4$-OfV^Dwh!9`llZ&N^rBfA5c_2FRK>UVwp655_f8gtx3v!~0#A z-!NTDqT;2BvL7YFA>Dkv&!|xZq$CnWprOhob}jJ>3<7AmwlY_uflVphWCJ&)005Q} z0^mSx`$Wx>rATqL9A8_xby7fHQjHE+Irzh?%m(_Ouc^LXsGls_g!z`ddU&Of5{7q8 z1bL(RO!=u4R;akzL|h}KGDL`x(rEK;DjI1FDj}C~gD*0+Sb=v;icbWYNST|RACG|G zZ_tu>5h6=*Y}6QHtc+oA_cC)0Aq(49yJB3*A+A-{x0u_u=rsBvGyJH@)4JMuRP6ic zy9v&W&7)GMM}I@+c>0FHl5Ip@jBr_r7}@UDee#)E+WrJWRgr>=hUEDWu%IZSI~X#a z-35RowSYjZZ7nNrguBQ2ppr%=T~Fx4%etwu>l6xXByWgdqSO6<`-i+?`W)wTI@9p1 zHs|CgPeJR_&j-&Jtbo9DS@5?QpY%x69j<c}Om|;_0fPZ%982S}4OB=em|g{udZ+}E zyx12{LDDE;R3iYLx2TMf`)N>ov5-zZ#@>;<2P2vYh9ZGI6hBy~C@lUbdP^Bp+Zf=5 zJiDHz5fGX#s5>EKyh#0*8P~fLkP@N0>dw}2t|M(IEo=?<;1~_nl`E-__k>e%J`Zli zwHyeUUBGqG-Q*HOQ4*)y5AJ)iNP$D`=l?-(r-}tYuA{uho<+>xv-2ZG%2VkRmf3k) zd&5{Tx1P7N881H2fOy7=dh+qJyozkr6|>0Hz4A#T%hQ0dlY#fHaj^vdroKo`T6(n{ z@nzzwh!%xac8_&Zs3uB4hr1ULLQNyPZIcrAHQ^Qo5kNtyY2s~J3l#MM#F`6bDa@mD zcoCY4S{Tf&e?7+e0hq5Dt5KBXgn+05kg6gFL`4{ht6ne!MUh^Bz$!#Hiu@NS>f!di zOAmlVD2I*V!?73#9nhGsJva0n;+kZ14uj4hs?Z=s-fh(As|=YVWfO+vBDED@UB_g- zL50DpM7DU-ofQF;96>^eJ8?CZh#qoo4Fp31>G)g$j73OOR)TPeH>T${MI!XEJN9L_ zG=?9h0a9S+U6jD|u<0W~YWk7%3&%Kt)@u+_3W)VOra+wB5_Aa#rB*BfYhPoaFoZwY zuQ?N>pg{$(2dMJc+EhG*0d3YSf7!cU!|D?$Irf>gXc1A;Rq`OS5Nm3C*I_t0>_;(3 zq?vBDX%0b08ACUyGOjSgH<*D4BEZ7|g(KCE62Z5+HJAG_;0k%7qrBkV`_GLSDcDg^ z4|7ep1Rg;HTejmkuZHTUh?YED4u`TwGJB(Oa$G>Ldlxkg;Edkf7YlJq=_Yf#AmJ8c z8dw>Kst6?wM-XU?80Wtfk&DQeS~PA7Kwt(E0*u1sL9;ZkNQ^5>ECDEgsdCs*yS@cv z|9Yb5bB#tpC5Bm|l14aGb8r2W<5|pdy$8Ow?(#E0a&Y^Gnmvmr$qjfGg9Jn0<Iu?| zII464HF)DL+?@bDSr(PJccmUONr+<R%BObG2d4iaSFYGmr6fK8YeReAj~Is$4~hVI z+c-uVg#<cUq){qxl^i*cmaI+B2Use|Z377c&8_RGS_z*X=;9E-4S}Ig8i(@!K~ms9 zVi<iAv2r_s)h?j`Dn6HJ%3KUBEdmn-M$93Z3C2Gj-(~}#+o9TXlw|CrxnVsL32-&# z4YdK{FkneIxpD{VVUQ?+E~?%TriT$3xVM|d$PA1b0QCz%_@*F<0_iDevg6VOMYT~d zFJ&Bkwj_YJ?$|RU>*QIqE5MeVXnWg;VuKJ}0F6t~Y-mov6JHIGbw2umK+uQ3l2dg{ zC*)fZ)E>2~o9G`ToJwJa3BLg49YIlZ?_<!M`vCCV9vSk<3u;3|LbT7RgH$oK<th|c zYx6xw)<Rv@{ri}QZ-@|vmRcs5G*~hv5jq7jGA{TW4JXY~?JMJ0VN2sXg7^Htopucr z6VNRBKuQ6G6b;IF;+ZyqMh_tcZo*&@Q9x}sb{@L)kD!Lq<+!g^AXfdQ>vYdU!B51M zfZeX|sx4GhhIYH1BggMvx9Otf&32@|E)U3h7%R;5XZyod(s_>5+fK-S9pAmJC?2CF zDm}vP`g>+btK<?iP}#dW7lk_@vVkfNyFlLNbBH=3l^S`-BMBwU7@#I>COJQ)wGRR< z0b&`Ft==}LVc^JLJb)xXSTw;}jGEl4Ctg06`3Qo!X1y}4o21Cwe^e=fI@QCIRNG_X zBZG{#o55X2a2yDDJK1(cHuMd1gyAj|{-3^P$}9U`trg@xV26sAW=V|-z{7)ngUo&< zBgP?ICo`CUqO#@};l=DBxWtBw1Sg7Ymx)YbB5-ONkaU>>Ll<3Dx)QHEohQbGF;_{E zm)}9iq9>hgT0rn|{;NScoS2A7m=taam7yWF2hMH_qcU-9<cElY(Alw%+1KwULF$O{ z_Cmq@crV6yuSq)c!<c+FkyfE=i_~nM)bQaVdQYL){DQR{)Qx~1*@|MpwiohpjEY6Y z)k{V4O+{;|J<1ZrDjCI!tD?FUS~rG!o|LPWq+sL=dz5pF6%%`GNby?g0opcU+WPHO zMnyd`FMEuGwahNHr5MTD7oYStOns}+xgeguq4)_Ey?MBfePUlGOfc^Xeg{EgAxm{_ zQ`nW7S0<6;wr3oof!9Ax$3sQea}|HrkR{d?Lkk1KF>LVc0(Cz=!4=V%IRL9P4C1OA zGYH^v%x9jfhNobBd)dPC`Av)BQSOACQ1)l>82C9gD<aXeT`#;{Pw=2~;V~ca3QvLt z=FgQbC?FpZ&s)GwUjm~Szn>wW09fUWY&F1qp)P(_hLmKl&OKLx!6HjI0WdtkkxPt? z3qwvY(opjrAQIRc^5vBWA!uA@Do#sW+UKKQ?#Pe_$rAvqdzpDa4VIRr<Ha!h$lH|T zn1~X1aqiBp=EOv-d<v)qm;fCFr1D|`bsy?Anm`+`h1proLD|k$ne6BmuPz{50my4E z&4a+PD`2HU*<na_))aumIEV+25l3^dwp5pEk&h}2UYsle179gqzcx1R%OJ97X6=M( z@IU5RcPA6_Kv4yG?jLF|AxxH!aU4EIpm7|`HJ;&;k!vaKnngud7Z8Y&J9UU;+89#C zlD`F@FxhM$$H~KR2pEXxyyij-a4#JrUdMiZV3K|Sq^7}$o2O^HamNKU_vM;y3COM+ zV5LOLITUbF?p+B$OpF^)V$e{WRF4rh$MFML4#EJfU08kuV39fg_Z5s-Hn4oNp+l^N z!)G+;FjG7fSCjjq0F|1qT+)E$dD&~)#Q+k<U{-pu2d~;nt(wGO07(TPrw0H8!|@{l zy;Y_NS_^mgJiL>TFsz0ho?R`=BnbnRcmmg~O&!xYdB{CIA{LlZgU|pE!-2OH8FsAe zq&Glt;+XK@D+vQE`SS-2Q!&KLNcaGDc;n@F*iscUr9!c-%sI`i=J0WDUX+TEj^ORb z91N;fa#w}y0+M1v0cDzi)OMK&P$>mF?=yJvOV`p^-_E+w_=I%Jo-W>cm<V`WrX3Mq zh{Fpoz~09JxJc}ZPYwvV_;gGK9ya*F(%8!6t2IBahd4)V1`-l(##_)*>tgc-adEZ_ zG!fwV3(SklKSd%+X+#lS(+(SF6Jv`@Ja!UqJZj@gYg_7TlQq{9gPci5*}A#ddOsyl zHw_5#^@+Wl5n728;Ok=%!!TI))e(^v%vUyjZ0}#4)iA^`qjCM)BEd}b79Mss)!kNx zm@5zT)38();u3y6m<*MCCX7g!fi}%`fGY=vgP{IE)jn#ipbmzW!DFTMO9WpEhxm!6 z@nSg!ON+LWD3yU*FR|-C;<mfh<fyQ~xwa(^NjQNpM4ilm#F9&R&3^A}ft+{~`&S(f zbEH<$TaR&Ka5xPN$J)o-*d~>42$XCA)o<2tNVk9SpcbrG;<X0|5^LYDstChyV)m*H z;`74i<%^H2I`XsP4lpnK92&_pehzcuM4+vOa2s0ou^Zr|9`N4zjoq^OJBRdZ8i3t8 zYDfzxwpDB`ybX?^zX1>dO1}ldaN?m7WM2y~-e6lvkeb6pX*!LJIvcv>?QFgvYEDof z0m5at5GRa>#+$nL@}lGQlp8p<Ll&-3s-*fC5;~aN-+8QoigX_xVRLQI<^Wvg@84N5 z@m!_P`Ru%E@=dQb)4bex&l3hCwlm`~qX~c`W)Ob$1G7GcZK;1CI!_oq&q%rt+J348 zCa+9T#BP?0F$RI?Q(E2_0@ggaMUmJgnr3>NTYtaa22KbVMjOA|zkRLM&cvOX6s=+F zXD1ar3$^cNa_p9O$Y*!#UPp06Zp};is{Q-wN=K1W&R+QW!nGiUnlVPupKIB-xDa>l zdiQlai_kJ%k{gGV5Kv}0!F<Ny0h~*XPBqt!$99fsVVP5HCYhbyDNxsaRoE#W2Iz-D z!tj>N$^17yuli^nU}kv6R^~+Y@eg1cy~P*%dQOnfxkO$Tz62wsG+K)rT!#We)VlG; zjN~&b-4+$>JkGJLyv<YAXfrOOx{nB0WjrMF*a?UN$x^`;eTat~=`PHyElw|DwZNS7 zsR{7oXLsWW!eYQgwkBS{AuS=;iR(c(jX?Y})GK|zaTcZYXZE>N;uyaNUt(o2;RVfd zEjSRTScsniyUx3-Pu{GwHzVya(i)->V!G_x<5-yB{svt=x-XW49b<_{yJw_5zLjE` z2ARW1qt%JOO@@^@BGMRT;A^o|3ARI4f)D8u{eQ&Q0pQ(Nz<4W)Y!NIz``QW6^-HVi znCG**FUL>b0@%SWhZ*InSPRiitH(I&$Dkr(fGCE=p&T^q$PFQ~h++VReR9vbj0(h2 zUKbrlarv@LW6G7;aG!B$c5q5pBS67!t;t1VA8YGv`IvMB;Kfu?pxV!lCvs&M7{Gpv zh=#;GtawXXt~92kP*%{s6JCb9^Z3X4A@H|h<g<(7h}1z$T%ANYhz03IukZ$r;4bnM z7jkK4%dU7D2Q2VrKM2J#I$@ZIpm$$51?>S>J~lpsfobp<u@u#XtE11jcZ#WK>J)Ku zu6AN!03L$>R)t>qm28}1Hf_tDnEUMfaoLGInE7oS)75r<_Q<-tZ3KV|p@os&5R!x8 zWU`gzkl5}hQS(C9!?rp(0H)HU35jTk6o)Na<L(#%E4x7OGLUnlk?a$kl>JTiSL+Gk z_KPfal$CWjk<<%nFvWjtce<D3S9lPBgJ1CN!1pFk45WIjCPihr;|gE=J{&EV!ONJF zSI<y?V*q7*%&V8#Wl{hNvV)(FDn`MR<Awk-LIGg27lHlFXV`R^1@ljGZ5|9D5bQl0 zv7L5<AVSN#!b&5EQe|fvl4SxBTo(C>IP4MTfC`tinzE+Y`0fZ3ME#8kA82w2tWWLn z;V?@O-TO3s*N(<V(A9MI!A88>7s^mH>l~oE@R}PFuV*?ddt;3+2R}2%JHuC_)#ERb zFu;6aYxNL@fjYh}fsJ=gl3}*!vnr?t<g8jLR<;$#z$rt|1h_jRQ|E9EbT6H_@l{H3 ze}(#gGtdF#Ard6G=f4IziHhq#20A6h|CfROvWoEkGSCh9jQ`IDdKQ()b@Mq_Pi*b~ zGSHpk5HKmE{?Z!|&i;Dd>w~xd(?FLRy3QYiGnC4c-T-1#m?QsdpdY%@gJ;<ZExN8( zv2OiQ_Hzzyz90W<pf7BKC`sp1iO7AbE*bDo+YHTpJZh2l={xTK8tB)&%mggz&?_;e zssA<5L(+(pzgzyV26`cDk{Q`R|0DeK$N!Ik-WMpu9EjR1NsnRw*Ywq#v6q$43>hD~ z5`Xjg$tMRyn*t(;gzCRSXLQnw3%<YGRHz}hm4QXc<eu}J4X;@jS={&?j6q2hVE}%5 zeD7BMtk&^XDc_d?87~}7ZwSVwI3N+RT0{CwFU0D~rra}WFTR4j7>Y_v9_>Y$$59@K zTE&6nF(vnDibAI{+&B!m2xYW}DFu=m0Fk1*wqZ=gS>6?!CAkl`HcJUHVq0ZJS$<pP zx-QtQimJC;Ta|AjNEF*uc8~SNBf~G#w`<x?hqr4x#uf&u_ty+1O8aenw(F70T|15A zx|~)GlQAs;&F36Ol5ZCuZtuQZiV@#yX=>2eYux}f@9M5!(bj9*@AtRnI-K$U)p5RF z`K$Btbo<u_@_^Sq5yBR*-vv7g4(x{C+}ZCz(8!_gGS~%>4fLb;=zgw8I|l>ESc$_( zP-4L0kVt9O;jqLzvVkr=AaOJzHydy?s_?VwXiVj7=jaoPQu26Qn=MeTzwT;vFg8(Y z_jt-&Px55i+Ai?qv;CdwlNsknyC<`*v682Ao-YDV=Y2|_Pvb!ynCt~PvkUqc-(=8p z>UTMrqjJ~RNF1q)piE<dMfxLJFOBZMJ+GbxFeT*&+M5h@Q$VODS~Lu5Vm9@Jm{&_R zA;is4Y@rU__g?tx=2qRZ<h|e9bpv@1L2ko$|LnH>togIoezy1LSCSC|yH97}8m=j* zyX0e@`0{c7k&Ju?;&_DQ(S8i2G7H!I*h4Noe5Z8$sg95{|M!zx)g1eKi;_hH`fK2g zP2BVo?Js{x!6d7=xq+yX%P_|`0L}+$M>(I6%lruo!?+Z#&znF5h5%8$lLE9wO0kE- zjF#-!|I$X?_`T^0eM_17JDNIzi6bKdrmuDwSoahjM}YI5Cm+b8k<C_d-z{e_2gTRI zjTD!(Npm+*cmUel8^`_6nDGP4^(Z_^WJPQECW7Nanpd?+pB4O8OJbonhWT>9^0KK* zgjyhyqi8TZ*N6GCBboPz*X`eWSqgcH^AqmNIOu71$680~6Mn8++=7$ZH<gML0}_{^ zE((Yn!*$X0_J&D_2Yqi6i_;FeSI=(b^h5_t@KP4>X%j^HwcUF&cx2qP%^hBA<i#bW zi}LHbiXiwVug5?{jn2nsQ_M^u>6csX1kV*>q_%mYuiOuci8+MBLT?To)?34QelRNA zSM7-$le|`grp<MMI1(mLPG?1BL4iJ((_#5WG;T1eEIG$p0!Ewcn^6xty7g$G;F@3> zi5Q(*8{Mvg2N*nN0KSzK+1Sar8G;);3GB_Ps&b<x&8I||u0Hw0H7CgS;8XhIej!sp zK8hNQ)e-Vc-Q^OlCbpW-C^Y6vTyRksRg5@}NlWpt6q?=v8OPmil28?#JrB-7B=GG6 zIRsrru7WI5%Z`N@T=Xd+o+aguo@%yzLmJAH)9fIdjE<^w3-JX5Y)E~f;k+naV1-~> zUTU};mv2%oM@fTYZ1M86$1SI@*B6U*`McuAe+JpjUUi?uG?SO{hsE1IhBn7&jBeNm zIS?_!K?K}Y?*GX0V-HSWJ)y16p$obhrB>7wyIhGf{6jxX)!Uq&pBq5g0ECmKPkAev z*R}1P7$^VnHy6;>XsUdfhuZ_d;sRxwV&d9y0w+AV%y^w=SL*UWEJBKbuHem0TTDz) zV-pq=+V_N^cWcNky=gF1T?9MY-}Lgx&HEwCcKU$WV2#qIC;dAGhr!>6t*f#~9Z@Hv z5eo9`HHJJSSGNQOC-c&JOM}_#^yoq|B}Ql~&)FxxyMcD%UE1#&t|uViH^y@~0&1g# zM^-3<viq2Bp`J_#f28WSDP0ew^2m2W{3-dE2Q^rVc&d`Z?PyJ;aMri`9E+vYp6imj zJDARqh=m<*bW^zP{Ve$6@ki~&AmOE^A>L2;Rmyq)TF?dx?FXciU?=rI|9dsp0gmk% zpUd_iy+5HHZgFX9P2B8}fOAR<Q0XZQ)5*w1a=HR(Xp~a*OA1oX#9fNQI7a?n;YsmN zn|ik=SK_#3k^UX-p=}pD#!mS8a$fH?*ZVf1`+GxMDL?LH0y5h&`+dxXUlUz)mB!h| zP+;Z`87sT{!_RLuW9zfsl%e<M9`4p@xAH|n4iqOuHsv&$#Jk$KW2PnVQdtf>_f1ZH zvM7+#_%-Q5k^Q0N7h&K*6GxT~!s$xJpS1@VnljJWZ-+eHLJy1d5jY$tmp6r3C~WvD zgS%Czx&0|uT0Tu@{Pz2@Ph)HC6KPjttv6L4#W(9O(ayG<E7x<9E>Cl9G(lAO*<tBt z93#B0Yf7<8QZVO>&_{P2LQ30u-7}D?V8g>Ke7jh?B%(*r?|{+Fneg^lju`vb^XHYK zIVvoM(&w(1N{!;W(5u!tqdTRdR@rIS<=zw>uI_vOY|S94@e_E7Lka0#vzb&h;pgFj zW=V^mf8{NkzPP@X$@W;vJ$lcc6%)#BcFxnrE1P_u9aLlFItOQebC@yvVa4Gd@-^jO zIpxWY@h940Myq*GZhZO;OX-MDzH=Yq+>3#1Ts>g0&-#??pltj8=<{ZcPY?ThW?%AA zINB-Up3bpfVe|+{ZO=3Iv)dIczz%fdl?PSj0-y>Uhj1Yn38FcELJ>-U=^`{7dTSp4 zduqNl^Ij?tB0nJLm;+2)Xn!LijzBrI0;S%0-;xXCnQ&h9@ZuJV*wYAt&xO=dMu244 zXppx&fIt`mB<u?K0k-{A>NCW8n?d+drq?5uu1EA**1TD^VKG_^%m#7th-k_?s;dCj zaf%>mO1~vf)g}Nd3hIoev<3jFF^_4bfjZ_8CKRv<d?#Zdgc1RjMuKi5MXD%)CYEXp z=E73KDn1V$^J9R#OThJX&``SiaFDJ*3J5@MPrQqs35uaejb64v`)8{!L~2N#MgP4M zv-%@~njx$wNS7l8#6KQZ^$s*O9k%6$A3nk)lS)H#N?qaPSTqqND-Gtv0BGv~4(y&~ z{ZHc8o=^hAdGDLe3O<HLT63~_Hunc$)=h<HxvYfIId)*L6v~!tN(Xar&QE|7nvw{M zqLX%`1c23DA-eluMHG<sZ5*Sn+G?o^7m`8>37Ym%b*2Qm)S+pXz-r?FOEi08$wTjk z+m1^>a{jV&0xCcRIApuZ#R6$lK-Z+>7%_lrXo#vna^nkEPJ1nOB(y&gV7UYicK5oR z1F$dgQ4ye)X(<ka$t(&M%b(*|FG5(d0h;DedugnorP>R<xEDVk&<<j@EYj%g5#}?l z485+A=k%}?Q1*RYx5<YLDROcoj)a;}wUF6(Sg%Z}NI0)WaGan)Eo-Fo41g*H8kCao zc$~tR++)Fjy4Vv%>RkCS5raMu9VCdFaQC~_;}-)^Z}Tj#$3W}Q$1Z57OC9jGG{v<# z3Nqj9I1bGoOyx&_WnIaMOE$ea3jT3u2nR@j0JTSeXi@+abs(}d?ueiu+t~iDK(%qG zDe;A+G?=WVo7MryAbF<9i&q=um=jb10kruKLJx9VA`8(JE=Zsq3S=t%pV(<;Sq|ti z`3Wi5m$F?j;Pe(?$R?O|KilGv-Vq7?Xpo|24n>T=(x?NJ&y&@4h;Uub_z-@3+Awhg zf7<K5PU;D**#s)2fHcWxC?DZBErB{z@rOmWY7RIZK?|dI*DA{H>)H4ctR0ANt)f1M z$56OXEkR9k63j(2rOY#lco4Y*<<Oexyh$+C4fsJB<T(U2Fwf#5hB&ZO@S-7EK@b`Q z1&9~IiOBW9fVCJw68r!0=XnWGDg=c98lsoNMo!@hAfXZnh#nex%MyAw66lKow=hu9 zn&;3WC?upQWK$@F5w93s$$uHh$TB4Bf?m%Y3P(_IARwkls1E|nfS`cyLo~>7Y-tL! zD<Fk^h|Ln@G96$i1{6(6id_bim3j|!2{#&=$^o$?0$dOfdvkyrA*YrU2e^#_&Eqkf z*tE1m44t=+WUH&hej&dlRz5D^rlKVp8ftp%&qB#C)#vf_r}V3Jt9jk{y$cHk9fX*0 zBoz@7xRl{%u0>@IR%cIiHU}~30u_<@Iz%8%%wx$@K;|7UPb#noG2eHd{Hj1TBxEZa z;86##$ADo73Qi&@Hx2+>g6KSeaF0Wwh*xT8NbV+B1`X0n0qy>Vh@wF`9HzeeAWdWq z6j=fzKuOXR;z)>qc{QVJ>4y;L$m2M^-^Jw4g&C^kH#>!Gd|BXc(9<E1rFjYkpaw=( z!BYV280a-J;7&+lCqUr@XgEWmf)c=Ssm6qy*C9!R?N9(0X%L_cztQ!2Nz{euM&9`& za(xq<kgkrL$t(2nFrlgBsITCPmJ!+rusZf1W=jAXhJY6mZY*WUODEEz0VwlKk^M|K z8o-B1By;K_7=TQP&p1Bcdnlj#%4=2(I9Y~F+2_`YLWGI0$h?z+Ih1p$5V2H3jteVD z*SeTPB~k!zb3o80L{}Wjjl5z?fSRE}_85S|5`<zL%5Dy|0k~Ap*LJ1?ZOpUn5#U)z zz;>B}?C*kPhZajfPO)!c`vg=E0W!sKbaH~~HeZ_7H7spFG%!Fr;tQ93$U`xx2Li0- z2!#?0Qw@XC#U5r>q+RcJl_ZHG@~u*2ms~4munaRkbmqE*GG}aBID#QVt54>;G6pGg z`*6CG(xS4szfxWrYGn=%?slgjhpYimE(9xM34jd)k|F{h<=<_dt|FO3oY7s*t`O#> ze4M9>qcDOQ-RLw6h@!&C{-zJSaN;DWzOd`YJW%cCPj2>#F3<8C`tg7Pz>&5Blva7h zDGf@yuE&p3e3TAE>_^Mp1cADec+CNtVlj-;0$P@=>H(?}ivT+Uh?)wcQmLRZ4t+S- zT}5g16WEmJBdo2A;3Yt=5#n-Nn$TH(dlwHoC_|C?1~zh!Q4XF-k1FW$z0A-2gzo5q z7F@r0KY69`B$(t5pg^-Gyz`+Z4$=u>KZWY9>ILEWM7DMGBKXST(x4YNRo1mQ8O`yi zaEuU#>%|M*7o|;idU+$RvmUVpt(A7bErM33_zj&|c~gMrY;40;v0m6TUUSp&kjJw_ zT(In6n!ygneN0$@)pviu^=K5KtyBJUXEF5$_E?M4ZEpLUT-kDC;kgXw?*o5}n_Y6= z)#32`7t){7m*>}AmBy!!W{({#%=<MP_wwE20zE_$pX$Zgr#ENnZ+;?*B*MH7Qcp&B zu`RI_&(#(h<J5vbRi3?86lTlIeVls7t8Jj^+T56<rn}HY1y#1ptd|b^ixB(wfx_>Y zcdZAPUoie4ojnj78nFCh8*zPvFM6tSkZB}XCplV;RCZs{gnKJz$l-j1O2#WUR4BAJ zS|?<5w`i1tf!w#rm}D8fl`qDUN+IP|V29&+x&G*kqtg79OLOB`awsFs5|EeZz?lLJ zQk|95nyuEEeQh(MAnZj`Fa5sM(>HM7xLn5<=tM0u15RxM0~NTs<`(lmR}D^HvJT=| zrkwo;C3$DVp3g~4&4;~qVs%TOgX0v|_00z2zqNlBe$ATF!*FX7y~{g&D|nh#BV#bi z-k&zYxQsFJ><d{tBmVuu&oH+Mel*a5JNRPc{B*`(c}_Y1(TdyTQ;GYT)!_g~E0!g| zb=o--(w%Vh#H5NGu7_15_7tJ2=uq_BohN!>b~hl6(lvE?@z1h{s0l;MZc}yt%wu<Q zz!^Zgx?~Ang8chFe{(U8iocv`2~x9k2={o9yXbe?bmSXy^ym7CznRIqd#ZhY9!196 z9|2#ldeV>=sXkeW<osfmz9P&`UMEG*h62i{{oo?3&~&XtI>k*s4d4z<-=S^h%l2$# z)jm}WWZ9E>>%#c@?U$vQ8FvAI|2U<k+FB2zytUfe?scGJ=bEA`#kM8FPHOGGIRFh` zzI^BMi()mR6jA+hRlLzcf!T%K6C>3TzA*YVM|Dc)2EbyB(oPCt(<x`Y_cNS8>74>5 zk?Pjs$0$Pg*GPzUOFByEe!1$ch02n3j+yi_yzE+x@5AO*imvZp`hTXV$-DgrG+&Fa zS@R}P-j3LMirn-Xb2nhC{P|>&zTP7+N$U77W83l9KWA@vlJxoVetw(;6z%=AHkB{E zyMgcAava;(25ml-UeCzuB)M+Ni4Jo8yQ9kJ(nl#5nrl{g{4khnQhM;qUnip??sc1> zt#T=Z<1L7H-CA|0WS!J@9{Ye<#+Md4L-pOz?-JHp6DWEC-B-*z`#+cO>Fn_584dmW z`72^AI$|TPCO_dD`RunlW4gkfy{mrrCn>|2Pc<A^>v5#}wP$smn_>&fyQMI_$4I)( z{C<)$>h6)kvm>Q9M=BqV)V?2~NJpAH$J*-0y0?$@pB)>%IX3=qZ2JAED~)kKZ_S$s zjgR;RPW|QC`3v#w7jGX5K(c@TZQ)>DRPQEJbNc?TFT3kK`;x2s{ogzoKI~}mQo5%= zuDm=8{cslc{Vbex7Qu6lQ9sAsK972K9`oiL|KU9T`*|YiJc;Kb;Tomb#188{h&z!& zw{C5cZX@N}f!EnVmX!U1O5C4yQ-KYpJJ+PdTxO15O%b>abT1CK#>U(Qj)Jc-KQM;` zetAnZ@rS&dl1P8q{rwMU`47bHa#;Pc=h@{5>2jRs@1*+Q>Dzy2p8cJB^LPICWgy8P z;yuo2b?w(l&4%;RR<h|qedh_i>GmzN_)YnHdL~~ILJpZ5eydpoo3Uv)R(|c1LIV!W zmOfB`XO5Sr^zys0v{%)l*ezCi<HG+9$sF=iy$~=+L0&L08Zcscjs8vHCq0K!Noi4+ zSjgH)y705IM8zW^ojld2{~%YaH_QpwHMr&ZVmBtA(Xbs(cnA%ApwbyJCMscR^P)`I z`bGDNypd4PQOEP2gzgW`{v=fl(ss`gMvJ_xbh0BXzI&SU4>}CkckPa*<<ZTxzu!Xv z=A;R~G(&p~GhEPR{6STHCs!sjy%0*lJ(Lt3*PRpD`59%sTe2;N*LYscHj!MuM+6GR z`D2?}MdXiuy=7RexlN<T=hPA?tBayr%yIl3yhZzlUnY&=$^I6t*-=-IF2P31K{$J2 zYT8#*0m?_ieD!;ycIV5R_mb=t8(h2S#UI^CL;@&{M=3${+UUC9$YJpYO0kxmnz!HF zk&zT5V*bEbYNfKuXh!&O!RJIHO*$qM>pi~W{c$k;GEVmX4fbeR3wlLQkBPnn=T)s6 zYO6&4!LlZBy*|I_FqQHyUTgn7IdP_$#5eL~xTm)Jig-`s<jZl%maW2%HD{+=<Q)}9 zL5WzI=$CHw?3Ut7#)^NL&|_GkbYs+Cp>DIrcbAESvg0fKqfJvgMf#-S)nLw{cT3^v z;2YnZ7s}omw(5`Flu8_*zL7LyZ*4W3I9@*e%2Zz7#@f!N*~a#Eh`g=+oy=xi$9pC$ zf<-OL`|tN5-4*RsE#o~}r;D88o#X3`RmP~%;Hoj@BY52)3DI|>02zLW{PO0C{gUSW zKOY}<;g7qwyRJdg>PD!qO<QX98#gx4-@D2<p_r<M+u(mjnKq<^xk{~2fTKFS=@!lA z-QpI@6QkfBCtT9vp1|*YT|>C|_W<n1oU|FdCKp7be!k*GB+vc1SFXKV3FG)6KP1OC z@$XdJznr1sl>^}hf6F5x9mTf80^g7h6QAtgCNn;bOr5r-NIKd!60fLRw~~MLyY)8z z+7A@U0rdky?*ke?=_&_Q#vj|LRHS7i-@7L0lqH|`N4*4k^E6y*{4?Ip>RU*axU*33 zQ;x93e@(>LL>@Y6iB|THfPHO2Msd_;t%b2^HQXqg74M^5iA-WL(^C!kY<H(4WcGHf z>cjavr5z8y+>3opmoRrqEtVv#-;EcoudvKNHO_*2Wqx*_H_D!ku5uVoZr|tqr#p}* zJXHDZ2;E)!Jg-3Q@5A4+Wi+oHk9TJ8e0X}s<M$q)<jWZWa%Tzy&&M2o`;y=JM~F$g zUk=5;>-*%F7GZ_^CI{^r+=51v`#pD1>$R`NF7#+3Sc&c0c!)mf>3pL;jKr(Sm^2<G zsJ%>OldZ{GGafA&wM^s1u61Q>JVw5EnKp#IM>a4(jN1du_5j0@dcyl`@W|O=yt`eh znkFnVk{<GDRbl_DfiqQa0jO}T1MFfHp3QrkFj6XU{JQ^^gSN+&&oIJUDgny(<veWX zDeCPS)z6A9zBh(jw#dq_WBegSx#vE8>U2I~wDq}dD-YPPRnW*QP3DZs_BTr*lW8w{ zi_F9IS!D5DFoz5FtkY5zDfxTXK7Hh3_O&e$y;Y`;OJ!q|Rs7h^ephRvAuI13(yy+A zMw;>Sd&5sO99gHbvl73nSMjk_tzxWa8u_0dp5Fv+S!R7D<;=?`w~i9Sy`Lpf&HhLX z9>fYfNJVqt`9+xx=*B)qX0CdxtZl0C^qbf_q&hQNWo7C8?u#qm$zi6^N7zT0W*%va zn4cbxM)Q^B8~*T`B4;rtGE)6^wM?|fvL|FKN((`o8+uGimZ0WQm35$9Lq;?<Q#9}; zuqd7Fd2q*m>U4?L<HR2o!nOAs4xO2*kV<y8ShzPjlKrJ;#|)c5ikRmkA!hvqNLoq^ zBu>Xv2ewHFv#PNz%@ZCiJ>)aDt{-1}bDiHrJjAeXz_+pT9xZ~$cWb;}&i|TQ6ik{* zaOAj)>4}Cpu0w5lTDFF_&O00g(MMsWvn}d)u1Jua1!>sR^W=*EG<q0aoKC(Qv@S`9 zR<DROs=i)nP?p!a#U~RxW~nv_+|jO37Uh_qpmlR{anNGhARy!t-DraeJy*ILW2Bez z@4jV$0r$;gr4qYZf;T{%bhy}SMO|7ZRDln%hc;DFpMzN0{ncL!vtdrDWOEJ7$8I^O z?!G<C`jc-PUhgnUO00dcR=DAF?$>`py9^7N(u6fFVU&uNfi4Otwn-xHCJaR_z>af` z#DLc|F?15=18|%<C8a(V%1Vr+u8@xEiJ$Hej=BA-JJK?*Tey)9?aO_3=l}@$)gjVf zKQY&4b)i|5qKRb<lOL!dTu*yk6CD_nMlv++gD%66#YE2E(hx~_e!bxa=n8tDg8JBv zmJ?CMh(v=}xIE!*t{RAbG)}E|8RCydvE?E_Kd5gEJQCWm%A0oCj?1i)5^oq8;au&* zH`b)x7td?vRPZ;AC0~90(*E@BdqUFP?vH(uRQ=<WCPuszA<`OI9{UtDq4QweNp09S zG)93Os|!E@uGXM&Hx*oITX*9NSX|~me%tJm`S(4M^Y8fd`9#x=4o$nKIoT7Mx@bis zIV;xQ!Qj_ZgW5XR+ugUb$1g&H&Cn<qGa}|@C<-d$!$6md#!1|3b@G?SM!g11Dg_XG zWR@aX(F6$7em=E?f`&(kDw-r*?<TgRI{&EWRach7pEz2?hI_xfq|b{R3py1z?TExO zpaO*E&Xt8Txc=;?Vf)Fh#gEb*)h(=4n>?Z8U)9IaQ3@%pQ_jn&N&oU=kKvGYmD(P} z3>wNRQbZTR9y+P|J421o1qg92_x?LD@5Tf(lN+<8UN8Fo4CyLj$Uew^H%wNnTe#TI zPsW`>ay7g8wby)BQ9$PJ&eG0HYCVLq#d%5$(jKd4XxHXplvVtzW+ye`LCZAn*s#}Z z!%jLc+oV*UWRt$$ws9)%$%W64p`)m|jtrk$11+-|XPIyP<?fqX(w}oZ8^HfQIx(CA z1ppqtofzrtkm}IEP6U#i`Rt_47xWfnYhIaY;f|h~(`^E*{nmHkW(^vxf5)bT&7+LV zmA9$x_ID*W?0f2{IJ-*xYf591_D>5xoSnTWu6uK`8YX9@cJIN&&zpW?wVkIY$>y`) zO^Oe5Iz|iBIeR(+7CwL%QyMrEyp<Ezv;?sV*Egna2&O9wX%T7Ugu0lDl`Xi-gF1u4 zIM|i19c{;*iAes?l7sdVS*8{GvOl;gD^5P4x%?<{>d+Bdp~1S7`K_LFE=XpcsjHk5 z^_8D`?4#;cZB3p+)*>0X0yOHtspuUie#1zaE~lESmwV!(Y`UjAZ>gKvzXCg`p7J|k zu%S_Ul`3?&OG+-0#K|Q}t6e}RQK8<Ia1fb;^i&}d_#}C|1&(_(uH?3Mm#ei`E>wOn z5Lf-z&0QvvRZ^Gc94Rr7rY*TzYp9Z8(5oGj-CJ%*Kj7GATqRJI)@ugoGq=`m*;41p zfd50#ej;i~U(u`*@8(yzp{`BTQ||0`s1#qJqKuMRk0jO;x&@tD2@_x?e54YZ;m0I6 zdWkv#O|4oM8HLeRtLr!P>mS&P3<&7=So(cQ<08UBt{^67u=ghy+`e5{k5-}i?^ z4OA@X`t0<VWcSw)`U9(8MZp+@dTZ`LM2!n8rpyPTHgx^k`yU<aK3R_R-4Rn5Vf<ml z!5@Uby+cD%5$Jk(<;C+wo?A_Q$%_RQm7-nC1#EJ?vE!BT1#&d-E0u=*&j3<C7-3&i z#j?XA3&AxC7=y2F6`tBkK2>1yn^u}L@Gk-vF_BjouzFTSDj*Gm6Tz<~1|IB05}c*N zyTGLah6#fPOJS|j%!aDt!=3`e3U&QA*<qyu9}5$Pn}Uaxd>S7F7`ABZzJ?Efbx-xU z9L|k0ASV<Hwc5Pl!<{N^HwQa!u4<5as%)II0L+@~MLKcWIhEj{;UXBwo!GL_S9VYy zQ#WWAjCZRdx(68W4jESNL>5~2zYaF6v5$P;JM<G&Grd^75Z+4AHYy2=JXU~t$?@fZ zYe>f!qwLDzYT`#iB3Q*fG733N=pAy`7^}({Q*gzXYPS^{kG)!KEtKW+a<2I)H!zc{ zTf}dwibz(ouVH17Y7bz@4;Z~^Uvr~pG-fq&mU;L=5m>YmtbiHnF&4pd3C3CH;Oq43 ziGyP!^#4!_jgj;pgUvrBTyqi|;xAJFbQzl=p;oTgH&I`48f@CyZkDfNxD-6*k=R-o zrT772v4jKfV@!#QpN<J&LW0R9gno(7?5DK}(bzPb-;l{>xUkohb@O9o)Wjd-2|_?> zOuG>q%VgG*R)J>x8|D7OFN&Vbmc$IPB~4wnK7+y{@IPaV^3@9KD*pay&Vk-SlD$e< z3$=km__#uKIn=Y;-f~<;F6UD&Y$CT)Jh*3Kvz6iSQ~APG|6GFveflzXyf&@%BsRWq zM9n|EqLkWNmu333)3m0%wN{|EDcoAS?}fhVh(+HEol$FJ9UHxBWvvcttEb|CH59P; zZG5gOSW=y09NBMQ`DsaC@#M2ApQi2;k>UOHvoiBo;`kp~)f?7alL8WP+10xbDt0)v zK0le6q7jWJYI+OCU+b-zF*3H{q6I)q?BS}zKA3@&amU~fxBu!Vw-;=QzV9DL4o_Ic zEm;k2y!ESoX$k2IJFqh<>cz<G1WMTBo@<+E&qWLBM4$9VugyxVcG9YFkQ@ZZ9c`?} zQaSFoaccz65)Rsi8f4C=m_WHgw{i8J%_3RtFPL4FPJF02p!TZb0|6u2CqAixRkB^~ zy+#r`$y?K`2Fba7{q$Jf0bG2c$pDsXE;dBs6?7rLc|M9|?p1Zunaq@@hLv50ke2pr za3(8QpgdU%0j?v5Pg73I+n?Dxp@z$4%4Zqi{ZF3a!v*nA*K7kUhR<_{SvA`Jj-(RX zO|XN*tJ7eGeN!(LCAJWTAnVb2>(MV&!#6_>zDry+wppwkVG#N|_H54NNj~_72<tG5 zA)7&R{w1Ztxni!0lCO%1aipTRgx-&Z#r4Z!@nV-Jyq}6*TV{v1lIo^iR4|`pAAFtC zfgNgF<jW0AM-4?>jvWVlEi+uy9p$#KwwL5E#}mFV7^@3j+AGep#=&kwEY!ECX3}U4 z#+8S#`tuW3L)z^N73G#K;RZJphF^J3dIk?ycp5f@JHH7YQ)(IdD)(vTv%zt$g{nQc zTh;KB&7{XFm^3<BGd)x$FwF7U<*V-?$MfN?9ZRmj#%$(^R_0s#2$zE6i4VKqIaqGV z6q$NOeNqI`*AT~EXMDOLOa4*E2%eE8MJ6QyuBGiJUht`s@Wt(s<=JV&t<1TTjV@Wi z*&0<loR0{|y6J#L;8X+X80G}+`+O}XYq#1d(1_bT(O%i$6X_MRtJm=m$LH7Yn3u&^ zCUZtUG4I{(lXMZhx>A)p2@(3J_c`*_u>tAx_x;|c)h0Y))llH=B!#WX=16Lf{7Q+l z)R(JMFSHi9X&K)Kn?0GQzA<LFp{;w#{IM`Ha<$!T(eq=M=hp~kqbZiO*5FTnMh&vx z4@r2fc)y-gXtLjZtr}xg`8=Te*I!C1Wa3>19ySE^<W@c5!cnXyJ^jQh)5YM<N!HrS z<w7UjnidoP-2UT5#oTShsl`Qi2GhH&X^5B0CQti0`oD4r-T4+c=<ch}N|m4Yqm>~| zSNp1CS&N<l?axsgUGr#aK9dDqIHN(w$JbK^C59U!Ueot(43I*SCPPjK;%zrfGOeHG zx#c%kER7h|46a4c+KJrNk(altEq1Sqo_ZpB+sF~)An08%XDsUrkfAfVo~8D*xU*fp zzrxK%&T;ZJr?2AupArq<uJ_-{@xBe$+?3n=oRb7&9GA-5n)B9W{;O}-Q=bfXd`n5h zPy%TCogMszHq|rzxIQlQWzd&Wc)!{5`}(K7qIIi@JLLu4%TYM8;ddh*Q+=I#RCbKD zYIq>0+5gON>yyJ)+<9L_L5_>cj<Ux(MW26OYsbJKJVKM3646!n_Co{fj-s2*v*!W3 zj{dj5IKI>6_I)_@&?d3+bZ#;$!0ndc?1KRO`S$D1FL}D#Bt^H6tH&Q@pvHl{Qp&P> zE4q6>Z1+~Z_tqZnt;g)GWd(lzvW9mKxP3PuW}9g+?=CYx+j5WJk&DR4o?xvh&DcZZ zPu#Qc;;wI5Oltx)Qm{yAd$627SP};QGlMgUocnkBi<I<zFAqQUuzs4Z-!-@7T~c0F z37xlYrxp`>chY~XE)e?3w-K<T_F8#I!y=HPjUmM4@q=G5vmFX0nvy)Hh{?NUYF)6| z=C(Xm_BXW$B^*DG(hrn>y)(aOYdu2?_46;fqnlx!=b@b^d&sYMC}4Lec;`^)(V=kc zVZp=uvB-TJ<G?XGO@<7a)tv1;%&tmK<y_w3&dYtZ<!w^`$6c}BFAVC8e0D#d#~g8` z9bGLrQjE>lxEl1UY!A?}m*8^W<@uJ%K>grR$q$-)A4~4r%iTNfe{hv;`(*C`aF%8I z*H+_RtypYuM;B7J_H$=W4`<NshkbjQcfnMpfyYWg;h%lwf9~#VTECGBc_nsm>-6Z$ z!?&p95USb&{P_b*^$#DjXlft&f&c0pQ*7(~ygwcjqL?2HcyxLv_TddSwDHgTCij99 zcl=5trfyt?v;R8L`gC$C7F774y7Vqy?&c3K^>pv#(}#~9J<B{)d2^yRu&1|`9JaQH zKD%4h$(?8TURpR&b?Bknz`^aB&sT-F{pfZ>27=P!&tys;lE8O@kEMD$_Y$Op;WB3- zPe0YiJ;|kh7eY2QgI}ET#T};WU1Zo@WZrv_^hq`?-@aJwe*d0u_zO7gO9dzGgJ00| zU76rvTjdhbd#-N>J5c9mue-b?A1e-hc<vbX!i<2wx9wkge)v!_?D>cn#SwS<eROOX z9s_E*Qe8jr`CVP;2kr}^?IUg8-P%t?)nuEnXL#A0V%q#7wU7QhoehmRyA^%?PtTX& zcQ?*Gc>IfI%?)PBeDxpqwBNSOm%86+I=!#uP`!vd=hyuH<gOv02R7eV%c?rBldE>t zG>gs}%|b;OmNYkh4nLc@_o(d6Sx)VvhT%u;vr-b-H?`YPq;KizHP2vLl%Ye3g1EMn zfbVcs!Ek-M(^5Tz3gMR=3M^+IDVP1vDe|ApoaF3m#GTl`X)_CNO%IUPft2{!s$YM| zKEjuQdIYlk^@pO-sdB~3;HCle*SFoYc3jzCls7*#|E9nz_|J@MME>OIj-qC}9<cFW z16}yvw$}eL(04W%Jl>@6X_4!luH<?riM7bn6^PTKr1zW*Clb0$D0m(n?ra_jj}tUw z8KcXlHq>A1SqNEE9|(-)(3}1%{Qarxa}~X`ifegB*JK5FCXv~}TI5ZW--W>RQF3x# z^Mjw0)&6HvWCMLSZ+H9b*LcIz^JA<P0XR&mb(KMm#j|V=<=EX>2{4}Uoh!oJ4BFed zko6(ri)Xa)CvFtE5_Z=Dq#vT^$FH1>m;9~0vA0Mz(D!!#+}vO4rXQBNn_K3ZCS+0J zyvtakRZ(2bU3>Sh(&-MDjQ{!`vs+Mf(SY(;Jlfx`ZmUNvRMP%^PYab~ckMk=gilu# zt&?ucEme=?%$p7-$p#eP48QuWzrmd=o+G0e4yRGrB8?13qbkwWD-Kc5A^G7f6T-Z4 zf-ld_A3V+Q%zQT5d_1Z3W61imiSR-wf71E=Sb`xb(Ka6pq7LP@yHzcm_oQBxy#Oz& zbRm#oVW=pWX}TWjW&WGxp}ji^nmwLELf!g&JM^2|W1*M6zoVJ3tMW~Nn6Z;=L~PyD z76GRto2F8or-v7%Z?GVxGD0+CSXq7?Ut6h@pAxm@1M%zcCKJZx1w1_EZ*hDpeEs|6 z>r?Ls@#D#N>9Va;N%b#QU(;RR+|+&Et+cJ_csRQjcAMHEGyCSKVrkAk)=<1&?Qgu` zt74ONL~e!G+=4&%%Vtk!KZa(uxAT5RFRJ>+UKSKl7i)_eN$c9>C+8?C2;+9c{@gX| zaToT(1^<4ugnfTKW$T%K+R3*_bn(f|TPSC^bT_EyPoTq}`=T`!ZCSCRww+Q%mUVqO ztr=}|#r1Xfm+PMtn*1DXk<g-(d$rs`;?%7yin1A2ksOrwr`&t6(q>;%OcS^H!&fLt zX{(S^db*I2(R=(w`{6CUUz&nbo`)$W2TwdTcmL7^Mag~&ke!>G|Bbd{I1@&83cndK zADG8(1;3QJ<bQXYVNw6Mk1Br0bz!m|wm$qo^9%3n*(L)eN1S-4!jI?5-VpUrM z6iBKyLF=}~DGR<o-klA?1W}5c@c38nzEE#zH%%8oFYL$5N@nlPR2fFR;ZzN;`$I{6 z@K5;{-QSuNy09o~rNh_Hzuva=rj!(D6KVWveTPGK@M>M-<Zj_h)!Y45-x#pmoexXh z7E*@qt8HIju3i|h-Rlu<`lC*qN;dyRIyvhk{q5s<qXPKr-fG}AW-0M|9$ORnt^<1w zb43QFSCNuh?2{zIY2~7|aQb3|tJo7x7~3{&uAP^^XX6yavlq<PezEo`;=GY(AF=X* zL9s3d<-lD7(B_p^>_=%hxlpK2)t9)9$LNMLF>-9={4|IWDy5pV0hMN?el~C<y{Esl z)>prZPEFt$?@|vYs{e_bh<20XrcEx>O@f=>Sq(FtX%I?>n#WpSxlCYuY+bv*cK^9> zLAS%hC=I&nP?5kRf;Bs$8}U2#w&1bd10=Khx704$tl%E?;4^w@V#*`e@s)k=jR6Zk zNG#%Ll8&u)P-!>{&+0sm<kU7K>1lLb<9{#66I4D>AUzSAf_49$o5?KJ36I_%TKP4& zKP27%iPm-JDmxL;@3RGfy9z|IZwqV5jWxVt^!2cMc*=E@6Qji1T`0vgIpCt?6Z~y@ zP78m2!~W%65krF_vA#9^6BMH>-OE+VFoH41dJW~6HtYrqC55rl6fMmz@Sx>lEN-U4 z&B;Bl;xy!KrE#ENNvfA>H0b8`@=qYQ0^N~*+)dS$2jK%(4E64SIF9u1XGb<p?IvB& zV<M3EVUIUVL&m{Z6`0_|z24?b)Duzov;xyWONVY2)2t3{pi1u8LO_mbmf8t5br(_l z7wqHXVJm(vZ~}Qzj9FzWDdkPGvYY94&s6lSG&mxp%;Kmb(oiV4R@Y_gM(z3Zqn8Z< zWpcFAc8`_FTgtQ8a`Ws1&t;<6pF8A(m+CVV<PLWa8h8x8Tr;zp%9<$8zCTKLUHRhu z^@s!VoqdVl2a$p<OXgh30x<~lzILzSPyQFL)0Kl-=MO@r?$Xqww6b)+geqm_O}~Pv zzdmfA)u>Mm)Y*38zd+{o&qPe`+&##0a!UBNmC@=44=I0=*Eh-JF?!XPp-=pFvIIK0 zYi;Y!#|tIa=ULgi%97-8<X2$jjrOD6lEBzFr>}c<9aO7$qq7aEnwn!G`MM^kmd%J( zJj#V@D$#MO^3(Q9^Y<jW?jG~^Wh*TIgR46Yhw}dezJH$QEQT43ee7djLSx?<`%?Cu zF!m+Oh)SiOu_nn*6q<w(La3CCwGCNPC^ZQoN|GgN?)g8t@9VxEdg8Dh<1?S{_k6$Z zKO9p22jI4XKRfZiH4Zh4I{(7P@J>ihO?riD{?IOVl+B}GG%oOT-)*BC?VNW~hw^9( zl1uU~=U%$Ew9|q`f;DB!LJWe)`N7`vGtub}Ewp}>P9<@%`(d-REWfp$G6=k9p!WEm zt9n(m>lf}SfoGChz6k@9L0|ioUuTY?3iO}2WoPN0`P<XLH<h?z^X1N~Q|CF#3XX?L z+>4(m{<m#8hjBI<m<?MCIZ`=)UhKW0;G34GV^!)eamF{h^&124)k__$`QHB(zPhbs zCN%$9rl{1lE?V<m(O<!1N6T(sA4Xj-QQoLTsa^0)Te{hNBXYe(sO5PTL+jyd?r*~S z`tP$J?c}P9#MEgnK6MyvDhQffSu^T>QQ)Wj^q_wo^6u=*Nw-c<v0E*!jvwCa>0DjR ziPVYrQTkY#@Kow!QJi?!hfX6~%W~%x8>!u_?tda-5`|x=(~mnCf3@;^>b6R5;9eiJ zxb_a5_$G0|dqJ!Z;+H-JN3kB7fBmnezjJhx`_t^Q<t}RIAnIpw(33Y)KD#z%w~Km5 zk62aOdyOB9SuZj>T=DCD{;K!Mw)E8D+KvqX8-H3PsHB97RJ)M=U)5&RtC;uZM?bv# zWmHh}E&uKD<on&m9~-cVuP*31zq~lrlGyQBSf9+|@^<=;M3MfZZ^Y$ST@3D2<y1kX z*8$JAXS6rIJ@c{JV33~B1x!<rH8el2I{@vZ{rSYkZhez``u&gRw={krB+gD4`0DiX zr?P(XKBubjNg(ZGfw6YCNs?p7yA>Eu1on5N!{cPjYl+V;9ZE<gSMtjB{(jlp?Vx0w zJfZOS9NGZC{D9@ty2<^$H~w&ld;DPK_2J14`Q?OTEK?{!n~jLk?-%EOy0W_7x~XdC zy%kaXNycl+ZeohhDqX?*&}oqQDgN3p#}a>+1p2RN<VsRmLx|5F-;F$x8%uWAOM5bw z6$XpiGBB3uIh`c55UFNy#5E*0fpF951j!-%)1hjWQv!AMv$$i{aatwAZ?>W6jo{_Z z6#qh9BCuRFz(=oH1x2yX%&f~zS3t3ZD`xc;IPRN2=Balz=}j4azfv;xGI;g+gfo6R z#czvnho=8ly|sdo5SPusa^Dgk`{bBIrOTVw$;`6;5!mk$63qdH20@YW6zQj+OuLE5 zU>|N16lw)U-=v70;Fj+O#nP)~QX~X(Bo#6PM2oA@3sjQzbo5U;EW1h={Cq|vz!WaP z1udA-7eu$<cjN<llq4)>0-g{h#%1^czfqulj%~rq<P9j))Q5BJ!=<P2Q%!IQpb#}h z3<DR+>9hALbaE>+lgSm{<P)R>=&9N3c^B%Qx^*NweSpN^eRR=ZxFs(P8}w0$V*F2v z`0vY6egvvZSiHK*Y%#!L?+c+FV<u8fk(R9a?91P6A-7;6N(vU;G_ibZB664}JqZdQ z!o-TDac?tiwoGhFrB6KUv#F9kkt7*Y?9bshR@?STN$l!1yD|rnnuoYsETQ5%V8|Et zU?*VFmQX`fsr|QfQ`I!xO(GrYNEZ$i$@R79{X5{Q7Bs*``eXCqE=~qhC@}k^d{UPt z@#p6GR!dj5p;*n3=c=`ykmZ;CMKSIrN3~l=*=o76^PGnRkKrV}|Gl@h7GrbgviR>h zd)ESbEX1tIpL31B%!_I^{NB7w%x@vYl%p1}x9s1+Sh7&64gV+eUq-08Ctu`Ku9G4| z->mC`TqQPEK6;#Ae%Bxo2xl!@ef#_P#QmB&^EU#A8~&n-G7(1RKB=<N=ZBrv1G&T& z7g(2AjKWklYDo5>?$$LuGNGr0M1$Ss0<w9Iy{SkD^*84Y!N-I>uPKThuKEa<c2*17 zmMEyMt#kABX0?^|j+BY2zTpumciyrhTFo=YeI%Ea<Kn67|03Lp-m+<8@~8gYi7NZ* zuv{Gvg-FQIK01b((&c6Y<d)`z)8B^Lsj;{@A^uyC3(>p8vtu2~7MQVIn}+Hms(gOV z1k9Jk6LVzao`$8W45rM<eI<qbSH1k7)|Y{d`m9`rx#4pDmI82zqi$HR-rYVzb=U{t zK2t0i7C9My`NPE6=%kBKVR~0MUNSh-Z?2-E{<dJ9WU74OsjpdU$1mG1k=B+uQ{=F1 zD_0~JR}nI1^3qF-CrtAJOKc>&3@xoi{)ArmdJ4zYor%2jv(5&YC%F|oKF&i=SG#9r ztr{XO*)-Z7uDJKOI{%X?ovW`ur7(jR@GP+}`!mG#&$C>`FP>DN$`@E_+Mw6AY988H zm+EsiCcHA6zdrSn%8mkF^5dob2B99n^utZwL6oVy$uq%%b1ioeJN1u6!e@K#<gzVZ zoeO(akEsofC^%EA{;zQqAzwMCkVwibj!|%4W`sMd)k}m%@C@H^UAX&zm%<eg5nd)2 zwj8i<Yt@Om+^Sf9|A|E4pT=%QpVqFsFY9^g>*k?w@%A%y;%}ebjk(iYr%>`y{&wiy z#*gyV8Jv+S#Eb4xyiRNRRY&TenE_eh$B{C{+~1nJa$ZI*jlGpK6T0&vQ|X#J?m=eM zrP;L+S*P6)EB{FGVQNGwUMZV@xnHb~O;-7-Mbqe-?2zA_Yv8)LqTlH!A<r`FA=1jT z7WmxTwV}C{r%$7wo_brKv)+~!IhHB+$i4ADzewYKxwmx^UUO24zlF0KbIgp6)i0dP zBdnF~$T#SjS1&KDRw}PhH$H{lt^OH|P?Veb!+7S}p1HT$*dMvF_h@y=G^*k|{YqJQ z<$t^jUFmM8RpMVFXZdGW#pJ60Yx?e|^g~in+^gmJ!bzWgVO2%InP0gG5o#-~<lQ~E zz8ThC)zX2ee`A#SuF!oU@Y}db^k$3PsqB&OEzSCs%KNtU-P}h{#C-P>IWi-LIJUyS zvS$7*SEZ%2<&*7?TM^ACzf(U?Hmt8L;U_EZjowm@xl_6vvtJtf!@1?-Od}-KJb~PZ zoxJsOXZ`itD_bg*SAk1V>rJ5gTfxH7QKU*yWO0$K(&@s|pDkp>I}z9HyuBTj_mZvd zlCA7FH{x)9VK{-+gt;AePteNTFHq@FjmUMEvGR6q-FP$dj9wE;%6|<Cebn&@8MJw@ zb8qzDQG$y1#fE#QR|uBDBuCFo+$Ht{*-iGZEtqFym_tj?_mhju@@V1M<@2-1+aWB* z_X+|(^QhxlZ(QT3Y|W1(O9aLu?zKKX!Qb_ku=M9UCZ26hOHD{_^Jeu=e`|mPKX~mw z_~(n}vJBYqU<ywT@gh^$dpI8kD7}chTivK;{=9`txFyD2mTA}XB(MD4iMzgf?{=RG zf2`8*nZYkzYDe^!PIoj~M$uMU0rPw{3p#Mi@`xG!epD3and53wcjBZTY|IVcU^fm9 z>r;JQsJIfCf&bFR;uDap*QWAgOI-Nvxe&$@DRQ&9D~qSDsYq5@X17IH_?xs9)99Ae zx?_{q@zI|4Q7EeYOyaZv&8nK~KIf4Q+rBNO_zk`(1<v{QzwPn*EP}z^(eH*&B}yIv zczyx;Eoigtrt}mCoMNeYW!N}D#-T;%-L}xD1gE)83GuDs^PchbIYrztV#(x@>JwIv z?-%;HvIbGO92$PRk651^CXcD^|683{(9k}*sm+og@_HR{0@$e200)*#2RB!&LzNts z;>)ev!xPv}%{#sRVoh6^?>0}Cj;t@dJC%Jjw_1Y+g`J4Ebo~?am_0!&_P&?DlHCJk zqaPi{LPsTT43Ay^Wm^*;<@Y%X*=5zsxbFp7yM!&-dd7yXYq;HQn_Jj67OvJhsE42I zGCSzpsOnm(*7W|BZ}#x?z{{qS;xm7^J`8dcwXBscol!6NtGWCAO!{I>Kzyg&l~_lq zt)QZvhqND7(|1D5Vo_4s&QrIYVOxPoT0Xna4^p3rghe3q&k9W??0@`r{^V|*bwZSJ zJ2`e^@U5B|eP_CRxAb?{Ys@Kc&Xa++H7=|@xDM|SOZ^pJbmsM%96ia^^u(@Mm{!VE zsZi<zx7xuet!E-Xw#mEI%$<OTu&8IsPcPc`W8g*-=aIvISRX0)e*?eMU*nRE^YUdg zuCwjh`Gn3QvFcLrWA84R+!2&v+%MW<Xh{B;*fiBa{ff)sbk8{2{#>K0$g=%s<frpD zeuy>#58F0ut(7lcW4YS9C#kicG^$gkkNmHy6IRoFr09|O>UL&q;x+NBg#y3TyB}%0 z=^Rdky{`V5`$acYb8~^Cf%{0C?$`TeY4z1gf2s-Hx3%?ZjJs>B^lBZtYd!Sp{JZPI z^zOuV-#Pn-DowQ>@2v5rMeB7|x<^*79ibLYx*yS!yc2cpQf{G@-FBB=hTQ3MefPt} z?Oav%*jRqEf9ZBf8B3B<vJ{uUk!cZggnHjtzr*Trhl75n$Ky`_gN}jfzUz8rce-1v zH1F~p2>I&ri0L|rT@yR1+jUR>@q@>Ydl~vqo;`jNzuOY_=IqVwG24)*$%$E44tlqo z)}7Pcln*L24xWe`^vgZzKWZ>=+y5ah>X8NwBprbk!;G^#dxg0ku?U2J*Ef5kThSap zkZ17X+LISIlRA$^{K}u}G5g+Q`&~QiiMF6V%!>~?92oud#9a~yvTjTjG<eC<GtOx^ z!SXkI@Q0o46KK(3?ALn5w+m6bk4G+z#-sHCsYoLS`189gU>za~i=1H^=$8y<^Ll2l z8P478nY&~7{$9`f2ZkSddp<lfoPXUj|IYB^r=E{Y1N}$Or`?OQy?p@{K7;1&Mh|LB z(h?mVdWLs9K908`?oOq7^C5}Ep?331UPjMytkKuAPajXE*btL!H7JM`a}VvECaH69 zb)zlUzr|lRGgY3NyHeoT-{&<b;2u#R9Q?8S^asOelcjf))A*-A?@w{#ExF#UqsG6q zdw&@lZ(H?lI~e~KX7DBSan1ZoCIXtmUl;Q39e-u??IvRCT5noSWW^7CbnFVK0|aIL zgEWZDR1h%U`}dvkzfZmYz8W)r7!xtr|Ia|r|7?1RUBajsSFm7yg-_M*O<BPg%REt& z|9Azt11Jy%r)2%eIpi3IllRbtN@CJE8gU=rL=@H8-DCtK5qibpPPeTJWZk-X`+Dn+ z-LfpvD~WWw>(LfE-KfFnbHC>tmRVU&G<jDYc+0Z2l{>`e0lSz1Mc*UFxBKh{(?Iu# z^?#cD7l}0RBnR|gVwbag;u#k-oF{6PY2elFi(>x}YWau=A?w3at}E+%M~&ROQ+wT_ z=lbcB@9y<zm24!eM7{3_@VP2@zs{*rH-4+B0Z2ihIlbFmt19+SeI31Jd`+zKPr|q9 zHve~3l?P{j%=aY=h*upZ{#u&25=IHw06)@_pZ$nPcrgCKJ@ymw&-Q=G3<h|7<7SJi z%hkI;kz%ycpZ-Ec2qT>Zq_W61<@ckNN3a9zn(O%koQ4>#K`slWf<Yd;<6J|0Zczn8 z0=_w1!-64A1;fJ1j2x;uD?j~cAM&;2vARj@NFxora@_faO!?r|uEUBa_l%~J8f`kt z7mFNHU?LP+s;I>OYoL!F=NZ+Ujw%|}p3mVK(_LyR8q?nx;dyQNd%ftj@m~xRE*F{E z>bV|MxT>wl_gA6*4>q0K_I6U#<m55c(GE?7ojO*2JiGBt11z`tl&zi9@5nk=ujuJ% zhmD{FW9Qq@?<R@pi*E0H&l$2qaxxd4XGoVt-DjHdc8bTU0!6dmgfUXw=fWE{G~K)_ zHQ)3^JgV(_AKSw&@F8wU`Pzs0QM+p=PTn_t@LsW;&;FsC@dXX7pev&SpX6sZ-uY7{ znJKswR)*LNDWyP~@HvAortI@2(Old@#*lN_)Rl=y?3b&$-)Fw$nQ(Y57N`!p1r<8k zdo7iC#mp{U3-}m4U7)ODw{Sylm}#K%sLX`@$6(i+MhH=8Bp8SNTv%<n-`r~5t^d3u z7wTmnuHEGtX9blWeE+i+-N`Pz-ZrFiWBvZCsuzZx>{n+uiXSEUe1EjsBK*DUn3+%P z{e9W@-<lrOHGI3#I((iqP@C)hKLfoYq9!A^!mSuG!lk?te*GbCRM+@J=v^z0C!1F+ z9=zY4GW$4}(&-dC|NC8lL*<vrd;GJ%vh`nI{57P?G|*FIIK`&@FU_4hJ73`cB(fI$ z`g~n)10(dpX7g^SZ{OO1z5dQSQKq@3vH8*O@aG2d;QZ5B%Y(p<hFGz0Vwa^v{`7KM z9_}3!`3nW68}fZjmXV-8e&sb50rBGhVV~<DrX50l9l84Mxj^5wzXKpdOW{vtnl-$( zsiNC-7UN~&O7r@eo6NQwYbcS=w)re0{#GHq5U7!`BWaj_X8+}3{Kv~KeJfsk`@<K_ z_41<^@FJhUelh^$^g$i!3p}@G)ZVfe#7Z9C;%t6ycCeIxW%tG{Oy8cVDnDzglg1ap ziRW!B)IK%`Vj3G8&BUHBJD07VX`q)`8GLujySVs8{4dU$$f1@Op|L3OOxx08=MKm& z&j3I%K^tp(=faYjMH%ICo8vLgMU{)vAO?78mswa`t+b?IS8nUt;#|@kTnn-R$GnCM zOYe7tD94>U=DS>Y?eTWV(UkpTFvoGY2@XPc!C#V8T*^igLe+2WACIssx<1trsu{9s z%beD4%rD9+%6Qp2<o+sJ)Ckj^@S<3>Olh)P(|DKjFB#0FRQ>+H40IvK6pmslLUYB0 zMentGg$df@VJiPvJ~I9PHqhntO<rCXIv&90g<t*u8|W_OW5sovovU_n*Qai%1+d#X z_F<S0kO?>S)#&{n2D;tpHJ4j!llk_)HQF?2Zf)16??M)L2R^JBcg?xA<?`J<Au8+n z;<|ftbxD)izM{{xkjJA;&1Q1#U5_7n9zAcTTf8hz`v0~CIKxfY9ORq$J%N`!Z~5*; zBGv;XguPzam$sL5u7{}J@ETP+)8zWQ$z6y}VaY1(xUCr-;dH@!x~{bI?&;{00SDf* z!=+vKJENoHF8It(mZm=b9UT*YkOv&zzU4rXCMVxGv8dwlXf)(|e5J7OioHkobnW-k z7Z1EPsw~y#f5(JYZ_R(VwRp0`ca(Wd=(|;Stp_7-dtqLmZ!a=avAm5Ybesrkj8K8H zh$~57g&Fj{m}|7E-!Um%O?<mmmt>s4*REwjJje&|o|Tl%^qVdLKb~tFW;Nck6(Ru2 z6{O35ueQ4CRdBOf?G3V?`H8Fj6)1SggSK6(df}Z<(C>di>Z@+7w!jHLu>paejppp! z6b#>}2J^2BH-IBEpA_NHd1kHkBd6`Kx9fQMORt?%b~s8o-$|Uln}pC6;gNt54ZsN< zqn<JG;l?c`0OH=egfRFbNNs(l&TW0_;_Qdg#ckZ!D?xQf*DU~jm}Yo3G!LO76~=q- z(fD-R%RCndghWixa!wp>{F?wWOK4zpwe6bI-=oKGJbcwKb_(i-mXU{PuYU5ym-(=l zAQ;lX^M{s~lk=h|h>G8D?`w56fBEL8DzId7_TRI6c+r$(YbK943?M^&`8;`sdeOko z)V$FzUPm6ksswG*XI#FXJcfVo_DCcvq9=s>Wlm9^t4p7YNC8n7Ub){2mWr5vPCzHo ziJ%Ux!EiH*F+0tEw#0`&9~8j@GaNVLY?%pF@fksIZL#wKi^d3KPzyX+-bC7O7U%xb z0oRHXT(Jb0#2)Fbe@`SN)aqt+#sDD~{^-t=!7wx(fC+B)Vet8o$O!N{u_YGrB&R}& zbhx4E^=qV203QBVylwHPTNnjA&AkK)(&CwdGsK!tM9C5Cku`>VviFG$RJ0YP^=Md8 z+XIoN>dD{6<Z*Kh9E4#uLDqEkj+z=c%y)%(;ST$<)NHaKFPOHNVhTW%P5@%odu1<E zSZZj%qprPG<&r`cUOFNuOM5M3L{Q=I3tWx>p#89MXD;BOPR28|GqFQ3pPFp*;v8EN z3DCMjM|?jHqD^U`4T}{BE9Pb9y;p}3H|Yo_^|C7k{1(8`nJ9Ad=H*F212cN6Fq2Nt zC8y%)w2j1J0PYua2$6+AX%qyO9bIk&U<Pz?YZ7Qm7iT_8tRsamC88wp@Wf#GoHRpe zA~VSfCE*bjB$#6Be04vtz^S4{0}Uw%Ng9j+y#`!J+n&Tf_@<wpc#uqGbF^pkBSK05 zXkrIB1MJ-tcpx3+j7Kod$xp9Yt2R)@M3pKcs|yiD#v@HBh$JE#KOVI}LI&JJtJf}h z;xTN%;*;^ARQ$h~A1k4Fq%#1eQs9j=D4m2%qQR2z$YRRg@gF@;kM2`rIO6c|VmiE) zlGu+1)A8^(tY8y)RVV*D6Wews!Gzil?SX?V^0%G!b$j|>Q#wkCIiix6udBc?PA|g8 zS)jPR8Z3(|jTQMC)(XH}fBxm)WL2WE_yH_)&ERzvD3FBA;(*p#APKwgY(!Kl38}G( zl4QE2G#FFkX5<2}7CfAJaoQPxZ8<PjUbEn60GR>@@)6FI)pXk8^CLhvGdV?K@5giB zC9xZj*c$<MooGxI9^Qe+bTeso(*FqZKmhfO%JjO~Jt+$>TP3cfzp$n-AM3}!DRBD< ziO!QCfsXRSqwsh^SR0r`=SI_5#aN*l8k-A6;?}}mC{UP7mr5f^!{{hkf}+SO>iNWb zJQ+wQf!fN@3Ko`5`u$%aEF(_hezW>_2UISd%@5Dj_5+Tmpu`vdb^nwXxx5)lWc37C za_L9f;($^P7BZf#TnRPe1XM7&Q{ujS>uL=%9=#6NqOn>NS=z2DVu;ENGy%K&W5*K! zl4#6sBtPuvks?#JBr2OJlZdCQTEv05V>?8$Jb%tJjbGv@JSLY4i~}$Xk*%1-?u=*W zCbBa5c9A^zI1vI!AT{bT6J>wM#eN*m4hMQP;yG2fv>)^Xp}<Q*I3}A@=bZwmL`SLN z70|zwl22hTlBS+c!u~5nJS=$f^fjv~4HifxT%<w8cw{48vSeY)p3aK=v7f-jVy+72 zQr42_x^0|$Wa^;-Q3j}6HKp^|P+%pbm0Tj~ddueGD<GX2At$0a9E5G~@YZpZFcGZ; z9E8#lFJl??s^2LPG?EK6#KGvVSquoUb&McmKn*TNlIFt8ssl&A{8G1}!28>`ISPaX zsZuQXe@K!53kezO;8l^vw3ILvB;YO8_!AxVk%;hfVe6(KiUIZtI$J-*#E=JI0_~IZ zpWQU*BMDi2R4@Pj@g7sAJ;hG{`8{dsIOAERDSd?!C=k|sXi9@j0dOV{Q8j89Fy1GP zSK!MRkO20I0Y<$fXip_XFC1Z}C<N$mF~IC+tN=p-X7I&`s|32YaV)_RGN3^}I-pS( z1-dJQ0btl4N0^O;ZceDN1#vGHsiFyc8Vg#JV2dLH;u|h9B-dGHjN&SML=A30aGt*m zPXgX^I6`AvYId3+<Gbs=v&vB}X6(Lz<KUb8(<?7BkAnR?U=oqFzi2s|3~MB!OgC7o zs9-1_J{Sj^q_!&20N1#093ytW`TCQvuo@!X0T1r-)qIaxcOO$2CV<=Vi<H!WW~emS ztP)Q$^5FJ<eSgXNdsFB@Ko5tFUa35ezM({0H%bV$+mUIhR&Y*T2y9T;`MxEz(?qt{ z+K!hOBmTAS;?0{-^d1A+>yEf~Ej11H*tRH^9amRis-cPkx(Q<~0|klf5sE*g?Nc-H z3Njjbpsk7sJDvkU2@kwHUJ*okQR>4(k`#47i~V5rY>&za?JFI5x7hWzuIcUE75Yl_ zw@pnNW6k~J+v6WUR{MNOHO&qs%cZ}8H^m-k#U!)8Ti<!7B6W&YAZDLGRzQIK^;q0e z^Yh_jPY%DuBfiJ7e1B*DpuqM=e6!MNx3j0c9-Q{wJsqHZ<}t@zHqzpU{^-B8cFIFD zWbIRP8bdUx@rSq1UVaxUsy&je9j+FC?!x_Z<-6x9wa?!=d%pI;`G(#9!$9A?(4(Ey zcQ)y<hs*Qbq#^B#6K5|@Ke#x%dvRX-zs~{}iyr*9vHRao?d0EQllRYR8muROMlfIZ zDXfVU!=_}_!t-2-DS|i?dNm{lq{`@|DkP>VKTK8KOV!j#lkz+(jC=KRJ<TF9y|=o6 z!AnH!;5m0l8D0-FeD^W}bTUH{nIt;rODbHcG(BYGc|w^@`)Fb!GAlzT>vCe&)rbEx z&`X#GdgA5EhnGXDp-58pNh-W?FS}XiN?YQU&WBeX?J+U*Y<(KYyK{LIm;GAj>O|tz z>4#Tm_pY)oZY`F*TS?3f*wMK#V~ibozxOcj?_M6Ln~#{yi(be>pUdacE#Ny>Ao!?2 zbiY7Cw@~I>p;^p*`C|ccx<#7jigX_p8SWREcolNa7W~4we8dFbNPD*JGE`_*a#~=l zv8GS@YRT7idH4O&XX~R#rKkU{UGoT3zr0X-QE<Ywsrc$S|A8-M$`;p-Y)lQimony~ zhCICtPCOc!94NVaPOqlC?3UT}$Fmf)PDS6jilIjpFZL@&bt@;%RZc&uoZYXS*RA?| zu4?H~)#`rLhVIRu<rVj5uZvogbETIbQy%S_jp+5#|8tId<6I(7cL}QyRiay>NVmFt z@yw;D(?_p=4%|Jh{-<~N?(K}6YKuSH=W|T)^qQL+HC$(Ft}Iehw1)%tYriNBIOp8B z`AFYW?~bU-8@(?kBcsrpYIU6bogV|kIsz|p^=7>VY7}<Q1YB!~%c-xO8|u%2B&DJ3 zy70#4xy1O!-+S*;XK&17Zn0l~xy&E`*lsBQL0n1NN7Lw!i5OiWkAAFO%e<b<3`UnB ze^rKHc5fgj{NMG-C+AzaMvncHfFxUuuew<^Dx0DXj0i#Ra;j%&(W5z6>2MB3JWJ>e z=v0NND<O>dJ=Zxi5Obksk)L{IHmWQ#aJJ*EZ2$A#_GRgc{>4J2&QANxQ}4g<{%X6Z zUsFS5t01ygkz}|I9>hz1m87Cf&TQq!KI|C#M!Nhf`%JgVnbGkp$j5Y4O^M0pU*c#A zyo2@!$+3q02G&s78i{jalnH9b8XNVY7cqL;1yw^;sK9fCo$c$uL!QjoE(xg@L-M1v zGG%jSAUyPH_@EoQm<j{}Y20*HAW8R=k7$AZz_YA*Eh3u%9g~M2)Fvq~G(|LLl%Nj! z3sc~0#R9yBzTc(qaM!^%gUDK|p)}Mf|F!9iF~5f}9%D~u^90zPX)rtqqlTxQ#g_iL zi}quV1In0)2Ecg}K1>4a0dX|I(oc8FBVpKRER7v#h_o8~oCV$<-T|;AO&%KDMmtkm zv6}Dwpy!VPr~}X37{L4Kp*EDuS#^Vm`D95r^u1lRw-C_+h}>z8V7YkY%>k>L3)D{o zr9QB<;DKSPP#Q_4lB(QEXU(OeMY4gp_r3lU_DlT*l2kNv=uF3Bk^o@P2O4JD@Oa)= zd5Bi}E1MBkGX2j>2Po2+H4l$U{hw-%*2)7J-Bh5MYTHQyW;B8PAFMSkU^nq(fNy05 z?ROG@{=nUoS<Tju2Pp;^GBfQgQrL)pId?FzWEh@M0~*j+mmT)kHASTs&A<LteDeE6 z4fROw4>o{0l0k$TDS$jL&`3o*(;v*BqAQ4q@jP|Y6RfGC6aV^D5qS0rZWewbS|tbr zFm2eQgAOG2)CxEjj}Z$d=25|gig|Gd%r)Q2jvm=(6mc|Bg^kMme%LE0^H;yov6Q)s zctGSIqn<n99y6YUNA*(>NG4`Z0z8?&ZThF4DqkJ5ISyac+aRzw4on!F=rwx6O@XIA z22@?p75Mrx9(0S}I%D}U8$I@6CB@)%q0C8v;_;Iv&j3i*4lQqpF=%f+aS@1o2Xs)` zTB$%NolT3g7>S3C6WPeLV~s?%*27t0BI+$^ubW~5Bckg>T?XhfX{}$jRe@Ce+Y)=$ ze$pV{DMsKtY{njq#UnaMWy>Y{s!1DH#ogBas)V(JGj@VJ)K7WhZ`Pt%()K}U;+UA` zLg>Z;|JDS72<oZovvbgwmEf*;WPcvQfO6nJ?)%PPWlQMqz0(jF^Jp|~rcoI*=#Z_- z+XhnMSKw%aD9=_JB?HMYP-6PS@JzTwQa*v$Z-s=j+Y>$WC(Kf^xv-wC`BbSZ0ywdM z7Z|MSbtB~(C+D7AR=+b=X>j4sA*)9H_$~7*LWbEI5t9gRN%MSs-=#c=9kqvQr$@kR zPdq;Vm(4vKD#!fe!yTOJGwx*I@Kn80d>R}v^HGCDCHlZb(2EznD7Q!Mvtv6%4<AIm z?4<nCqWSQH-pD9+#*rr^l@$1O^&8PQNK9ZXTkt9S2%(8-p!+=jk6phj>YamxwKe57 z8;7_~>)zfw*Z%d-gI5IXlzGnCWxhQ6EtrExZ);h#LI1%&=kp2Iryhjuem{J?w>kXk zhH;)z&!69h<$9+TL96_`Mg-cYmqxw+{vIA2FgQsRh-1$Uh9hFZR5ck-;S>%d6eA#= z+uk}LgTIs|<>D@4*VW~WFDfugGS@orvTRkoH;kV-#$Qp1%nHm=8+L!2qxCT>DA(*_ zeNdjhQ)W?E%QUXY+n{b}Cf7*iMR1Y5(X15Ad`vo|<Wi^G?c(4FFZXL6?h&=uJOgKC z%2eaZWv+)j4PGjDF=Y+=pMn1Md~wgCx0U4^FY3b1@32bWv|QW&T9q!8y;2!1^D?|D zM=U$6ve4c(qPFxOs;(?J^ku}I(9G3{`s!TU$cAfG*^!NnFB_O2b^WQob;VTZNOPCu zpUCEJ)9%Q7Pyew+WmUC%MYau#`N+0ch?PdPjv1k&JJ#l}e`|jG{m)AEv=A#pzUxh> zY;FEz?y;Ch%crJ^uowNVGG;Fu_rG7qraV@7e6#Rn%fqkVU&Z$R8*?Rsnp<TwpG-rn zO8-fPD0vv0{_$WhG+s$&2zzhH%ZE*F^UVncuCyFvCjw4GZbpYRGlAP7^j@ZcuHJ#( zb3{CzkRYY<d(`B6_!0#9H!mfuT3iDexE|*IJe>wXk<%fYg9_M<cR|kin|ZuS1`-6g zi8S4uPg0mjo3dgQ(PGVbTHkXiVDLk%md}o#oj>!AH3b_)tx<W5SPbpMaf@)JldVJ~ z9&nlx^CwTpq2dOOWpz{sjFmJJOkoZcjuaOAJ$wqAeGQ-`R1!;I{IT}srI_H1n*1nO zdo0OBz`hqhghcMq&8O5w0w^p-27NRxhj7(2K-JoW_>zb`9c<TPd6UNn=I`)#elGU4 zp}nss1?zo{4{L_A3ZDQteC1W2@H*5dXYik95@>w3)+uIiqnrX$J_(%^7{nCJVJi@N zPXOu(pdfrVX|Q2xx<)Vs;f5!|46rF_1R|Q7NJK84WnR|+&<f-I|4`&qRbKjO6Q+_x zAc^OM_W`5Xympi6cSN+V*lB&a#aUj`gg+CTWv(O%!%&PkGbz4E9XuMx^d3d}E=m(p zxU29Pyc$>GI6RHV8VhUKBcgTiCVVy66oB!B#sWu~0ae(ctqdCE1`tuh)KoztHGLFj z2ZnCKAp!vN1t^@wSU?Hb6jxWG@I$S_80%XqC=-Bn@vFg!d9vedzgSShbThF}(cyli zE0@D%+cGeM9o_^9DdCFb;8eg$Cy37)Yb?inucVVGEVSmS{?Ym~szn$Osv-cK2@)87 zaw^Z}3_>JF0*?9F2Q^~hA_jEOcQ30OKbe7{+(nx_CknJ?fyxHA(2tM7&@J4lijEne zn^P)wc~(KO+}3W8d%A9+bHJ4?fx7HX;kUV#B2$+EVs)%x+?%O9Bnnu<lL|O9`Df2l zlKjMc_@qE8M<$*Dv6kV{2BegCw|H3?6aX^Fht4lh5S)9$tUAAN+^Cey3@<vQMS;Dn zr(HyiFR&`*<Ix{3tC<ilH$Pu!cJ@2j_)$&9<X-kPNmP{---anIbg!kArIS$?j@edN z3Z@6k5+Y5$L5I#19-Yq!xb7>nVp*BqaUQT@;kXyx)U1149c5K!?T4YdligUGsgXrJ z0NZS0$m#ZCx009mY85A=V24kx*J-Yn<s+F#I=mGH4R@~#D1^9&oLm)_yVfW-Q95!| zL{~XVxX#OTw5IV>bz^L^_bi?5np-1ZbkLOBhsBStJU^MMoLY@Iq3m1NW&(HVuD;=* z-llM0n}Ojwb19=D(ZZu^QLyFQ>sQj>Ua-ls?$1n^BfZD%uXUWf&KCl=6wH0HB!MEX zA43I}J}4czm!dcuYWCQ-bDZbIMg8bL=`SB|(D@~9M)O@WNTXnmjdauut!E0104cRH znit%J&O78R2pgIk<&-<SFBYXDbL@Mqi!jOTU-$>eBN0JrL?oL&_n5^*t&(H^F$^V* z2Tw<cg$uc)OUd8t={)w=f?2IawqriIsmWoVo9Av8T*tk5iPG)kk)-5*mEhOIlE5kR z9bivrR2kv(>QGvpUtX3Sk}xtsjZH4`QjQL#t8}#bCBo%MTgQ>|{%mzxL$pNV3vPT0 zgM~og=EgH~RRj}A3!BMH#LHq)Fd>H1FuZsU##|QS)ba~eH1JT+rU{O16H*SBh-b%g z!2L)deEp{kXW2GP2|I<XA;$2d`b5&ML4a!?YXB()FnVXzPK85)fgmz{9x>)c7q|Uu z#U@PxY6Xc<C&xhN-OcD=|KZ8xE&$CR7;&|Vgyi{_%86x~Nr@C-N(=9Xxw@HdRS$yr zzO_j{(XDAc1l&4>SEcbA-XH)IgsW^xzLP<|12BWv6mPNfsT%UPAZ%8s-{GAOMa&6= z2OfYYVIdJ6HB104g%>w_YS55~cBb_ME%aFa^nf{bollrz1|gFWWgljwW5O0nAoHL2 zOjom^@Nc<W%4v`RxBMIY|0Lp-B2(ZVNv2~qj=IX}dXRU0KUXOBv@+!nN_fT}*GdB< zp8v@8%(4~ez{2jnCRS)aDeM>L-2cUkguM55e9E5_!+7Y3_NG++;Ij`0R&&VRIZQzW zZ#-6W00vvV2hQ-|l&OQ?xbXnGb=;sQfn(KqlgNjq7%5nT(BxnWKbDN(1MtkQD~(SH zpRR8D9hKT^T0Qiqjhmkis+|MC+<al?8VVKE+QndN?N$^S-@}z;BOspZnn)6J{Yd-T z@B^-{_j&nEa;o#ad;o?ggTQ}3c>#&H44Heil-$B2?DF!jgUkx#Qh2O+IHln~td5`9 z)n;HpF%lq$MY0ksgz=y={kYr;v(0J2j1(fa%^4J=T^is^jbNr12ftVwVFQEHf%Jq^ z#U_w}96Y_)lszB(#tVJk4)Z3)ja&lV$QG$#24e{pIJ)EZHfK8Gm|7oiIL+X2Djp=A zRWE~ru%>b(tQ8e*OLxSm!n|97uzG~hS9qKh=s^{BAR7zjoBq%~{^=|1uNfbE*9lGd z(b<fwSEeaf<Wq_ZK+nxf%<yAU3BNGqk_pYj6c0x^9?KhsyrqNUrm)h)IR0I3Z+ZlZ z0_!^id8unk;1S2n8Botx3tN5_Ea|jWvF4nH#i_J2MkL_47Ple*s**t2dPp%JQY7n! zTj{wK0zGm#^}frz9=b_iP231318=xwX8<ss|NIuPe&3W?<vf1dqF#y&-Lf!tM=+Mb zHfu;OA3RFr`!Dqfb<n5X^hnN1UcmzZjwR&X5*XypKfxEMVeW%)A+SaSp-H%d-<&X- z?7!dc>23ZQs>b*0Jbh(kn6p$8qVS|U0n6M9WERRr_{z%p=4A*asv3i<{3oXUp?Kf& zE%%Fk?uDN<5>2oM=L#gv1Z;j4efsTCkdgI!EALnX8C9fq@xCKA$QzqN_|!pin^pNa zM5uFPl>F@Uj+d~-BUNQ@dy^n<xp?n(8Q=0g!9RiiVxg)ItAuMM@;eIw?w7Ac=&GV+ zeOP4O4)%O5ZP^^RDNEN<w7OiJKjeGaOUbj}cYdg>z$+_1qilfNG2?Q%oaMFG1Ad>j zuerLZ&7BfN?@^-4Wq-<))z0SaJui<oxvVuIf7-@28xr-kacf2do-U`f4Urz5Q=WFV zoh>jdx2Y(}C=7Cz-qcpxm^@LwbmIAMRrXTR{<kO4L^bDAmBk=PzwN$V9QN+CAeN<y z-r)Ut-(x{R6%{9_9LIA4ihKX2VD_hMTmV0Ngzxu2pYdA$)1^1rmsQ5Sd^Gp53pUgd zCx$mdsOm&Lv%^g-L4eLwgd&aWjH-Zy<JsPy=b&E#hU)yuaYCVe&_6f+CT-YUmZ{6_ z1paaJ`C$I)G7EdEz$+vO!Zeb8UadE|9mEwTP|i(%PFC22bSN-;5`>@|Ps#ImSqdPE zpnz6TON&32PoVH8wffh^f1w`m0)dJ)|J!XBu`ktQ+XSkA@>~8AK#Xf7-?snp6(@dP z2=NPGbtJ%M{o!N{1Rd@Z2ghI`TLR1kAIPp)4~0}N2p}cZMU#IS3RCJv(ju+K0VT2y zQvu25xs)HID;;)fmHU!kxNx_*0JDIKxQ&o(1J`*$!v}iKv^Z4)jQWz1Dlu+;gD2;P zR3zUe@QInT5+2^m1(z)j_sxeun!e9-vjQP5X(H6~i}SaX_O$^Bn-AXR;gTR>Thb6` z2YH|KH~jemPj(OPE`nxVFR`TvTVX*vUTrkKL5HC3*$0Kw;cT>YDQjIrYaKM9IfNI2 zQNaI7Eu>Uyo?AxW=0~#A$(<U&jA}jm1?>zIC<v(M>Jm`OM|P_M56zm6oke_0us0<q zYG+yKI7U`yY8@?TRNn-cX;Xbfk_1rTiRbnXi<d3~kz|87m;Zb>0VO<Qz8EQe1&nai zUHhv0eaaL@Kw6C-cUgpENT3)1BB>Y0?#pZP*?WIsfQx6LU~SESRudD{X$5MgeLg6R zWuBGU`I4Gf%+i(~oDtPV!tkdh95Xf3V8`SdKc8`lpu_5KpJcvB+r?Wx4FDHeu0;6& zo|~u5=FU2h5vt>M2Rx7jFD!`EiroYR$=n>@9$9R=zw7`;hxtFrUj~Q*4`F~uzJ&r6 zo{nhm;elcVVEme9BC5`zP6*+A03yJ22!P+6YBUwWMF12i2yy{dK?7NxjoA5mf3g_x z*5*?sGsR1yuj3`V`+5df&f^GIU_fcOqQey%hpXP|4g{Dl0ah=^efRt$4=X6L9<F^w zi@6-ZhsPl)2suY9Pb&Pg77R&dAYfKno$1Uk#l;E$5X5t6EZ|Fq-(0aq;eo{Gx<8~$ zu~;om<_Y3MP{PX68vte%#es2SU>p%%s(bnOqoYlR#h=09DMVlvGG)&E*nzMZ7Wpy} zp-zTu@fO9mg~c}ExYOs?wz*?BAxo)7qaDtuZx$Zo7S4`{@UH%)N1*$Ng{TKYfoNYQ z3}fo&Xh&U#RxoH2{=oID73DwNCZ|TceHt#%fxuU8F2AJ+1Z;A@Jp*qKH4e%LXF9U0 zbRt83_Vo&ZbHYe5z{HINK39jqThAbfUFQ>R)bZiIc(?*~$mNDGaoyU1Y^T8dH%pHV zz`_Jok+^&Ybl?){=mCnpM?}QK;Y=No4v(M^?$jv|Fe8MZN|Qg1%yDIHI+VE1f94=X zD2|(dGg^)glM4`jKMZlv069u1CLhe13YIGoRBCNlIJ7eOQX!WD*wjNm-sL(nQTZ+C zDA8d)CxY2;E-y%p{~502C1XWWE#GpKC;^ypT!~FC#}3J(t>&xoy5tan0yaHd+^9rC zOkWV!pFdn&1X#(`h*%k@GtMnc!?IGGcqT#xA*Ol{lO~(!JkT(rItc?{6F-QL=I(cL zX1ge;kgwLaKBanJuE9bu{)_y%&l(wh9%e5DPyOU4*^sVC3Pue1`&{?%PW3-!%aA{j z4XQe7ecDrHedM0C#2@qXYT&2`CzzaWYS!kA3y=|D?Gp@}z)ekyTs9F9+lF}0`A44< zH2Y$8K{6ytvM%J7fM0Elc$yH>1ve4FFVd&>H$>3y_f*lw(YMnoo7JTu4YLuf<I`@X z<&`(V692Imvmvwm=N`>|`t4h)>^nLssy!i!-Jg2_ioKl>eIQyjB2o1jjGK1yD`x-j zx7`(4=jCgoS~(~`SScTG<Iny@{#L|^eOy^qyZ8HQ?>C0m-P9`d`&#=p<}-8!&h5xb zEDKz{I9oS=Q#`Zcj%LV(CAqazZwh`EoF4Z0Ht8*;<-e~hd(zAMtKnS4WzYChhUzCf zI$}(PmpPD0@eB%NVF-HBHX1t-fi^)JsQi|T3s$V8&>0brCM^NW_*l#Prk-CytA`<@ zsZ!jTIb>`5@8*!b29>yOaA6y}YB}?{2sDT{w;6zhH=(04a99l8?EAcQSko7E*tC}B zgojpAJ$9_Fy5uCF-W*{d5~P{}2$Prk*JudkJHK?&l+{kQ5676a_DAVQ`osx)riaRU zax<=TGa~u9C=skF%+XDMG{}Zk>=KTiX^RBM>N*bYw^u6~ndh$1PPiE15hkQ~uA%{E z%^gO+zkgTVWb=3c^_cisqkg?p8PhrzGJVom0DP}kWMoN_MGUwwTrEAO<bbFkeA3Su zz@znf0Cm)N93hMCmmMU^@<PLDPM+KL_7s6wT#SY~GNBe>a{}=>9VSbMxqXJ`j$OQ* zyHRy;Rf%e^{>E=M<)p@5SjB_x(WjZWJkC!0oj1+5)@l?ePJ#gHV_R9^?1N|Q1YqR> zQjCzim7tLjaBJs*fw~UxM1naH!PNoajW!Uhk?xEKBU+KK&hSkp!CCyzg(e`7WVlgl zk}WBD{1WWWaX$EFw^h}K!fPt81U!I%e0QeacgxD)2sh~oV9Gq`KY+`v9FKgQs*H;~ z$(8nQ8P4?M$@k?)pFT`}4+Kk}T-MOeh_mAON)8EU@Of-rHNiW`*qZ2&;i0_iR)>vb z=|p7D+8a4UERJaJ82{N^*MKi@?b&HXhuv~P751=~h4N|)rrAy5Ly!Mt8^4@aXTj-s ztmYx;9`?c+F#5~9mY#UuA^bs@hV#dj7NQc-woc{kIb)^Gi)Wf5*B-|>j1P7eJAT!A zp~Q^?%>Zc%;zxa|0|`Gk2nmvgc9cLiCEQV01e@b-uYU!GZyH6qGhreCr?^LT)*3X_ zhV^+k*$JFXIizIxtDO@PS0T*iVL#OQ<boa;C(X0b{7GOzXxzq~3<68Tg>!99;TjrP zcf#`mJk5boRz4Sgs_6R0iLMeMcUCL|$Iu`V@~M5PFm~>!amUYn2sAf;)brNQy~zUV zS~Jflq%89#j>L?teEyW0i`Pvx7o1!=R;C&<R^v6bY*(Rs`upPS)K>?pNd||E_nQ@` z8k-W8kU7^n^Lk8mb%o+|q+63mr@i5$=_BtD?9v>?GrTFpI}y_@A@ARA_&khT8mskr z_kBDoNbq5Wd@J?S({NSUZT*L_eNWPxA*~9oltFmF5Bs_kvs)n}<(jd}A09=(F<gYM zU<GdFXFY+2-~V0%q`$qD;0bI6B!W{hUAtY!3FE+JOs_WHb9MHA271ZSu#X?kO(FQZ zt)1d_LS8)^l#2AHUr$VVj!rknS2BJ+PfN}d;LWdIvdMzbV?rb@DCIPBYmB4S%fLYX z8hPr&uWTBdL^zKt*#vny5TC+6Y%QTVv(rvvRj>~yX77s83F*kH{8Tu+qFxfk|298R z2PL*0a8*uH#{{i_8SiJ|#Ow5@iW-jhr$OX;hy~fmgvH^`<Eg-QcPo2cvweF*Qza?r z#mfnuAofP&<L#|ugaHFGh$26%wuG~xB2rk$<JD}Olh%C{UTJCiWtB!IHm+(-{9#qR zaKHj769`l^XHC|vY?Z2fO1efWkw#GrWgaA0p{-4_f0Of5DM*gaANT>;KUWB|!7l5X z?kpEJj=JqOwz@H%Qfv5*dBiunz4PMJ=kria`(GO1id`cf#NloO{7EZzR46qcx}<`_ z-$F|?u}fvjRncf^$c}szDCes$nf|exL?1`wZkn)h0t8x`6c?6unU`%`6$7`gH>EIZ z`>8Jw-C6V_>5pn6Tbt_VoZU0-ttl={)D*TGTzQu>`T1MN<in<Pv${#o!ed(di-p3^ zIj^XsqKMfV$dRmB?VArB(fkCm=@nkJhYPIy{P_zhr}N}BQZ&iHYgQ#8vda}@BgzcT z-ADuM`Rc}Km*g6mptN#se!U}b7dP(OF=hGqP3QEP8yg+qeQvjh$<Y@!y64~O6N(RZ z4q_R!8)+|LXe`A|21W>vOTj9wG{@~rZc<ZQskT(DOHz%^6!yVDN>`dx8UUdq(<td5 zxx;CxjxL)t3Xf&9XYl2)2bDXs#(q(OA1?HY9{KnRos_t6Mf+cKy4aT+)mb~)P1I*< zYxeijug9{swVppB|77i#(5~xc*UXX5o>#lmhg(aQ;<3Nq^}fIOEALwJe}BHQyxgIi zS&p3jWO#E8-@bV-VE<s=1DB}}`880`ywsuUKx34pV=B)!8gN4N{wmLt5K73Jo72wE zk%nuY(XT*+EEx@yZARZ~#3F6>`hK@<l6h+a*rUVS*{-fjV<nz*c$q0?qZZHO-`g=b zo29UA@I3steXAr0Rl;Sv<b`Bjc{{<QC>=UxOD`z-N_=iWFp`&2bgBwe^e`+K!4l3- zT){R&rdb3`mW7g}8~6B)Jxsm6_F|Cu-@V#bqMzaNeI?-7B!#(fRVwnXIlcG`hcd4t zuu_QIy!)KohXXL2^;C?3jRj_pj?nR@fHls#)3slvt+FTxXJRTgkqG^5tT}@nC`1=n zhYZ@h=AAIL$PJH#wUp1Y8eq#;3SIz#kAkgbLu5kTbB!k|W^5WCGJ_F!WVYf)WjfCl zVwso0lx6@l8#(pwp;P6z;5(=Kmtb$W!U^|^9dxA#_jt{zfEZB}hG$??hchG)4*gjy z{p3{JI;NP58UWJCaAYfBxOk3eDog<-sGm{Kj`tah;X#-ubB&d63jb4^0gRCJY?+2b zH`Ds9paERrL<|2Siky53kb?%3ty{qc;H!x=FbPwmsJjH#92X-J;ntKCXpd%`X4?nL zy3EC0L6k<d0%#>i0FB`Wv5w&|Z)u?y1yn$Skn))brBpPGH4ybo$lZ!5vVkcGBrc6} zm_%XGX{bz-i3-@51ne?CqZIHQDb-SNWjY=ffP#>wL@&$;3T;Xt;xda<HFN@QvD?rv zOdC8|BqfB)xgW=TIj9uv1l;goW`!$-p>mk!yzyubQ?r?;f=U2vv8jM5A&s|{1i0Z~ z#K+VO!4aV9<`xPhlhcbMP0%Y(`f;9E_;MZ5+85u)RfE43QWe}D&z8p9jjdK4q>Fph zoAPz-Q_dQu7|Rt<0);*9Cy!e{*-V0%mzgu(MS^G}T>eXYa=MB}493|yg%f81%}7Q9 z-iaozzwcKmmbp}A%EVo^J5hXk2#>*`V3Hx3{AkoILmD3hR~v7KudJdRh(uh1{(Hri zSNb0E#Jt;)9mz^M2vghuvV#6z$EF01i3VyuNK0vHkbp^cB3OZiL#T7kN+=jmLrbmS z2UsMq*ps;!ib^n}%MhWHdILp=^N9yo`zFp-I7?Ba%I>2P4^t7Qo9X|%J4Uwjh!k53 zDhW4X<wTkK-;qH87(7bHx;RAw3n-uXjI!79p{0%^#I31l7?FnCHb~<^1^7UlU^nyU z2BqsX$St3~cd@zXa8C|{WNPPr1^{Ls|3EnW%@g@oofs0nRoRv(;E69$O?U|Umhn8; zJx+1D1Udu0X`H<H@7Q2zOwAQS)?9o#xJPHh%2Q%Zrp@erdZ8RPqbaG>43Hpgec{g~ z&Rmk8_9&H2wRI=|)SC>Rbd$l!DN`&(Sml-8>hLwuXb{(us+zwH^4H%htZokHGzVB1 z4*A+KGUPBB5&)AoX&Q8j29-Uzx^;yHSceH|U@N^$+=P~wxPP)n&UaN%l~P{(O7j8R zAk!By#W2wpCU_*}<qz1n<OAZwSeN5H{j4W=@Dov`U_e+OYtjX{y=|Z4KRpP}PfugP zGv9eif*csfAmpacX;04&J6iNz7WrFj{E0N43L3O=b&2&Tg~H3cQp(Bu{_c={-*hbr z<R*tN!zL~;Pivt6hq1d1iYos91-=POFDc#KAT8Zp(uj12fPe_7OLuoE9ZRQlcS$!$ zhbSSSAn4xx{r~?5_rbk$@60|r4|Zl}_M9`{PrP4@=$iryHb96jLvwf0cT;$U5C_4D zU}C#iE~N6L<lM|;kKi+ISp<P(2m>kiwOp<Q2y5ad3)h4e43u~RO!EYN#y6B@dKvJ$ z+j14e{kk{86s2>gQ8{+4!TcEUl;t#E6|o(L1nBE6bPPEmKwTeR969zqu8{sy{MH-7 zE?5}_=**4MCyITHje2}a{ai1V6}uPi2};cABhOB|Qze!IV&QSKYz;(RruMFZ<sM&S zf%%z-B>G7tV=;ypi6lF2#(F&{@vawSmw<`F=;>Mb$BQ#Lx&x+4tEl?6(gu3UC3+kN zp@FBA@|E;C^qMd>5{7W6frg#J23bZ(oO~UO9wSPgEf1T|E)`do0(L^Z6kN>fgB2p1 zm?&EWPhl&POBC9JF$F0khA<^n46alRrk@P(f*6XtqO1PM$#W}W&r^|mGbs7wiU)jB z45RBs!9GQiGbvOnYIG@fAjq>kxwyOwVk^sjUQ&yiWj&A=#Jq(Mdc|+=5M_^Lg|(9l z1;pF$$!S(AnRh7_o6s!JrGM7X!xRH14@4!hCs+?fG41^a4982x#(~EVtPW#FmqL;d znDmLXl<_tsad<XSa3bX-`m(vgO3XWn^FgK8k}5uVSe0V{sZ$U+N!0s(66XF8HeF)F zE&`<hTstIVoETa`DT7=hq}2cpax`4(iCpZ+qRDt(&(wRI^z#bl5cFD>)zi-tvRmpU zagsO*iU|5kL}qd$TG7^1Q%RLnOCuQpnzRQ#j}A~EA)rTSQ2=o0IS7)FRL+v^sOMtb zNeBwv<T)aol&TQ;$x{#vh~xke-DP96g}`Nbh)jsk)VNY%)6+l_x-mqL0<ThPHrr}# zg<SoISz=sOAgLHHkqMeO2fP_i0{FA*s;RZ-X_z+?5)~9ZF@Hj)8p?*YzR|=v48Z2Z z$HPyEe9gDeB*g#+ZO%)$+Ym6^Mb;rfO}RY1%_19pAR*OYo+=P4u<(ObFj_gsX+taL zAR-e@lLb&nP$s+r#G?C@0|p|o7N^Tn<L2+g69k0Y5_LRk?cB&g+Q>MO{4eFJ)4>RV zPPFI~!nO*)^$%gv1r@Kc6P!NtKMUz{MZBg!^XNdJY&GW?y7ep;LJmXl-f`}H1NlEs z`D6Y>sft+StV%0cTZsvv^(+M9nMjV{x$dH*_OIatAn1bo;^-0dvz6Ys+8FM-12)8- z*UvzR?EBDB39MX@ZcFuJ_5~3rlnEH{h>33al3xY~wu5kGb3W8(C^Mj~_h8s{JMS2P z?BqX$I{I^EkctbVgIp%p#R0JVgO`#4&cv#}FS8@^I+XhXJUgv$|5~Pk7Fb{gW?>GY zk1o%azF!fn<83-@41j(X-1r0FgoO<f3(=|o-1>rspMd!VIR?_oq;GR9A%Inibg_K# z@GDwaQagm76U<Khl?s5xo;Ue6#ksljb4V8yb*QfzZvaEaa93tsROU5^#a19b*631f z?=F6S3)f4>9$Z^=4PiVl98TR~Nn=laqMMI?tD9j(KS?z(?>2l`%T>A2Z`LbRk}QnA zG|Xr3&G$EWA!THzl+6}Lq;X3Fk|&q>zWBEv8%3y;2bi{-HgeBLpEjAfcb7N}VB9`~ zwJ==PN1Tuwh8T7xljOJ?)hL5?qqq6SzWUjVFQhoUqSXkC{@5~BuJQ>y<%m!t2>wy} zVU~cJpQOsAh<Ftd#m`&{s;&?Of}(<>i;d%^O|bN{C-qxx4Wfx<X+-RU)h7_aAspFA z4um&{kZm;kQWB)13Rpk)q#z!|-zS2yMt)EQK6s{Pr{X6}w;LT`S((NbZQ+^{;>KI7 zo9C%tb0TDMv1m>CaSEz&PgbV_Qt8<NUpl5|)%A)@5frl(7<Zp}v(>V<>jLnm6E z688vY0smZTO2#++EJz90Gt1Fk>Xuq}(^sKcC!L&S?6Ef+{2{Hlj^LV=x+j-u=ws)| z5_NM1I1qy%Z6Wn<LC~?9%c_tYS#D%S2r(`g^6rV;K$I|l`A@sxz(P%s7?ABmPzOlr zJ-5&WG<um_XsV~uUWg^Uha>DlWxhLX>W<5PZ)BqOl3e1&(cgZO=a~YkHT+@#(+26U zR3ZdUY3~ABzfcYS)~9eCgk7KnS)#Z)NMH>gbfwV0q|g*W6^&1=8VYI4SW-|I4hHyE z<{KMi1xeA*k6|-}C>g!LjY`g1DKJ3Q<hx++gaflNw08i~JHhc;4Dwk=-8<(BxW(4M zGbACXzk@tWVtfct-2}i83(2<tP}4^--`7C;LK4&wI}0V8o>G-XQ#HfM*A|4-caan) z@sVbkgr;gM*M<ZExt7A|+fbv9s{#utT;>D@+;v0TTAPwk?8nz!pj9MyEo0#K5`7TC zJw0<s7#`V28Qkx^Xpl;1rq>r}`xpoZzW}%leS!uUVH8<`Fk+3VhcW)pNdDV@Y_O64 zB^<W1g#E3+QwpZUiod)Fp!aBwa(@vO31j^JwwN?!k2ylo;@w`mn$1=`!xqoM1<wCQ zN0S4f02sLcf9UAPQLBRfP}u($9gTc3{{Nz*Q#mdEn~qL?8Li%eT&gl@a@or9;asV+ z8jPXQXmy+9cUVALOt#i+eD>U*$k+H>yVdD`{cUUV^MBLPw3==8yMs~0Tra2E8umw% z{zFHv?T1ceJ$2pwel2+Xr9dH;R;#1=bm70~=#G}Nm3rIBk6N9rKQ`K4pKVWfe!lqH z7m7poUv#v+7K{(k)qZ_ETl`;i^zGSdlk3<2BONWJEOEX+`AOyz!QY3w>$Cq09erm; zjjznkAn&2+v>Q(DP_Y|9?RT;pNgu(!7sZ_6v=_}@R<Reu-FmVY%Rj=tA1Aczv>z{a zRI#5R`RimqQ5J*aAW4zT`5;-9welcEQ{?m@RacqgFwMZo`7qtYq4F@}h2QC6rd0&T zQI=hX^HH`_S>;iVTkGjjuIC8Hah}hz^KriaQRVT+pkJrQpAa912JEH|g=7n&Xcc9P z;zYikpmVMPz>+j0m($X$|E8m{4In5*dSFE%FLQq-5xe3yneqS^mnv8=3j13{al%@k z%;&xJzFJ(_SwtNH+A*%L<z(h=Ao!b8rSQ?~?ODx7;aNBNkA|0tEpSbVO2y?27oLhO z^=8hr<p`YQ*3=xX*;Y)o2c4!#n|3aR-hYE0^@B&|uM|lY3q11vVQ3OI5*_}Lm9r6f zR?`jQ3Hl+sw*J8PnLx$xO!l9=PlGbWGdtk(Vhl+E8@K`7s~w#E0H_CxbC=cq7Oc8x zg*b}*M2v37!Kcm#$oVv|dvUHNunMOxTLsD=>u16R;%O&VTe*|QarxfCA&OK!Ys=3V zU!*h=FX5(4MjcTTPO)u&6PA}L9};d6pxWYJCTimPUAmQ{>ATEkjFNn_jM+`Y0>*su zUU(HA{daDQ*{>jD4gabOz8m)ZuwVVD<Z)vwLZ_xhPB+klXC>}gKI=pXRgK5unqY$P zRxl3FVHZTJ%58q+C^iW~Zj}^#0e=?<$3Ve#B(p}I)Je(@h#quakO_TlJRdK5r+fGu zo3};wL0Yp(w#ybS*GgzUB)n$v(US0f?dL~1qzcmw;1Aw!Rq?+t>kl$RQKAs>-(>Kw zAaedb8x}hR*sbs3{8lDHmG{Hl<RmCZq4(ZY%ba{r7K~w%)I#A&j|*b}Q_}bN3b^_F za@ja$G%0zo<_mAbp}xfp0mA5KL+QF+0!8V2DR@ghfY#^&P+78MKlILmz6Zzx#K{M! zwY9^@l4NV0M7SNs6IjI-;lDiCp0+L}As{|`2XJ;E4s%T~R>McQ^9loL$B&qw``h)b zrS*vd0<kvCsxSsm$wCWO3qrfX0L{qMC#+${5#~?emBNGW$w~CEsbYCJIS{7;$F;2K zB^+mTB(^P?of!@z=(bf1x4KNcVBDs$_z7@+N2FT2S)iskHd<BcW=|Scta0hYz%X!` zDt@imfgvx+ubsq#M=uA<pa8K5yiQ{-EV-$uXd7&(<`vMz<NKO5+3sE!QDra=lDATZ z#l3o=AmP|54-dBGR1A}0`o#Tdm1{42^66+y;UXj&Re~v)VntpJ0LM_M#n8Lu%Gi~Q zGbACCczjfG-O-zIZ<45#4d@B)mcWdCdJ(D%uQB@VgfSb(h!}jBgEeh-`Z(mNJub6o z4z@v7lndtlLQz;)!Q#)*w2>c45P20$Vh+n7&H?hCkikVI329K$5m5|Z1z>Ex?T%=9 z8V9>m0V>=Akd$E=?;i8$DD>46y5?osYG6;EcykkncoZbz+IGU}xiRUjLTQ8$L^Oyh zRfi>GtP@W1jndgG(*l@{ryRIILYgCI;U(U?YJDxI83P6$2B_(YPSps!OhguxV>nhP zTdEWP{j7of+7QWVp7UBgt%zQ-3?knKfT7T?qzjkoF{gT;`pXF4U-Gt{LfKLl82Enp zwv{lvMmfG_27=e@!C*@G07Nzz=S>zE8^8Vq$w41X2@bR{4}j-;-vBhCK$ty!!SR00 zz)3qNWiL|BS&4K*J-kEMk^T0k6m<|^-$li@CB07>6Z8qBFbrjS%h`}u<^?|iSbpjT z;3hvq^dShQOy4uT&INst;&(0JG_1pDh^Dabb2r@yC7A*Mp{CW*IxlowgsWrRglnDI zyp8@0RgEs4ZOd%^F$|eVr^oX|;Qj17kZcad!iwrcS2`j&zwXkp^CQxftipIv1u#=G zZkX4www~S&4!;Q>E*Zcqfp-T5Q&9zgRWBhB>Rsq!3ji#u)CGg{qpt>&B)~xo>~i`) z%-t&ZcS6@}tP1qU0N^QAGY&r=eL~efLX({;5+`e83aRaqen$YEK`?+)l1;fKU2kdK zHK;lu!+!1Xn9x8Dhe;LS^lo?#(nSx&**S643#44pzR4fGxrU*EOo)k<ZpTu&(1(q| zWbec_d;z=A`H2?^6?~&7&pn8J4MPQm#0mU#6+kInP%fM>>;S1gypGMo51Lk6lfqHj zEcFP+tlh5;cahj+T%1~wayVkJ0ZM)JL{v!uj#-5~I1d4pr|SophynBFE+KT(k}zEV z0U1wOSqn_cJ#Ca~Kb5B^h{p;DM(=Oplpw-+B|CBS>t!hilI95G3b75*bD<rc5G<cU zY}D+4j6NciX{ryC=NE!V-V@4`*N16w5<(ykxZ=uc0;<3iNa=UN_{D$*yebk92XwtE zsc+weTzn`TU5(Q1!g;_mby1ZxoSJV0Vy*TO^6UO4b2J>e*t9kI{D!9y%EP?LtDD&J zSHW#kH%pzkB6&-E!28n!ojX6Gxo7A6gKi;!G)c5O-s+-re%bZ%kR2Rng~2;ZI|+Gp zOz6E0CGsf*=w|_OMv?$wZ~C#&2dDB*dLVZg{kdF42($wcDsX3o%j_9~t}F&&gax0$ z`8!c$A9bO0{8qSxvH|2F{20_?!3TJ%a^&O%;b+FZf6%-27#(nQ7B~Zt=@=+-3^t*M zYSViyieg|OJTdq|)&L-P85FIXKJ9yLy8|@r1F68lhH$V&A0TujXzmTfL<OX>1JNtf zF0*#4CsiC5k;j08xRX3NbOE!B?%nplML#w3*H1GXbs-E4rVu+qJ);LZZfpmIgHkS* z9q6$LrfIzgrYzLR&tBIGP<afJk$v@x)p7Dr_@NchYz(1>d$P-V5*0Yh1Au0io?u<5 z?+O&4`<`Le&shv)Y~_P93#9-!;T1rwe}m-VAn8kjFOldDJ)rvu2Hqu91qFwo<zf!> zt$gVq566(^k3vtEwj4S`b)hQ!7$J9_&;n?i(mSWiV8JIK1UuBw3ZWtkFe`@wFA3yy z0o(;ps1<PT33^`vY>Xy(Wq}vQP%2NTi70?=70OT_$ZP^7M}U3F1ZhPmgG6m754o%l zfWTi6ZcpQ=<2S-&DrYufx37r=O6lk3;c25HD`8<*OcI{<np33!a(+y$45)BD0IvYu zVz)3<hSKoM<6HuWtsrQi7EM#bgmgBaJ2YW>0-u1}*?i<L0cKV}+ddzQOOUhfYx12K z{Ui`Gxl=iYkCw^@D!7-nt_6cQ*tZNyA?qUm_hP$*aG(&$uYUQMc|yBZp`vOaLn}av zsu!aQ96c{*_5>`4i2C`P;BW<MvI8lsfNIO4zZWX$7-yK|OJ3k(T%U5I0#u=gpp9Gf zWR7-{uV5q;4K~XoqUQV|{beCFx4xqhrhKaA(1LgJJ3!)Qa|{7@BL!2bHn<FoNkG|> z!aCv5KVhmk?0!TFOBbY>1l8=51CyBW0-(J7⪑8FxUAC*h`cFL9E<Hhs|QdjjgD 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 rpL@?@ zy2>7`6#KKi;?A3C(oP^!xuCSgQDzb%1|)XXr;bn}3&R5&R*EkVJ<f;me>NMRVw(O3 zePnv-j$cqnd@TVd<`xgWXuaxxdiC?k`XoAPnpo>R!28^$eglge1B3n~8hPqwxccfV zHD||#?a>Y1%WpXQfa2%B7Tpi4dM?F!Z|U7%bp{&GY)i(~X*luKC@>hi^-{jgxk1M> zT=%TbDEv-v|E(f0jJNv-!<w$1j)CsSK&NYymGF%U31Q&{A>HOfUBf}~$Ge55J9Zy_ zTG!hZs(Vuzl4xGIjK%nN?rmz^;j$$?)z^W}z*qUG+)(JNUwH�>#oHD8hT?KYhT* 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%0A4|9-uHTBqykbmwGp3{PS32{1;%eg$2)~!8t2!XX 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 literal 0 HcmV?d00001 diff --git a/packages/nightwatch-devtools/README.md b/packages/nightwatch-devtools/README.md index cb7a544c..8c8e31c9 100644 --- a/packages/nightwatch-devtools/README.md +++ b/packages/nightwatch-devtools/README.md @@ -8,6 +8,46 @@ npm install @wdio/nightwatch-devtools --- +## Quick Start + +**1. Install the package** in your Nightwatch project: + +```bash +npm install @wdio/nightwatch-devtools +``` + +**2. Wire the plugin into your Nightwatch config** via the `globals` field: + +```javascript +// nightwatch.conf.cjs +const nightwatchDevtools = require('@wdio/nightwatch-devtools').default + +module.exports = { + src_folders: ['tests'], + + test_settings: { + default: { + desiredCapabilities: { + browserName: 'chrome', + // Required for network request capture + 'goog:loggingPrefs': { performance: 'ALL' } + }, + globals: nightwatchDevtools({ port: 3000 }) + } + } +} +``` + +**3. Run your tests as normal** — the DevTools UI opens automatically in a new browser window: + +```bash +nightwatch +``` + +No changes to your test files are needed. + +--- + ## Setup ### Standard Nightwatch (mocha-style) @@ -76,25 +116,9 @@ module.exports = { --- -## Configuration Options +## Configuration -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `port` | `number` | `3000` | Port for the DevTools backend server. Auto-incremented if already in use. | -| `hostname` | `string` | `'localhost'` | Hostname the backend server binds to. | -| `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | -| `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | -| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` (or directory) under a `test-results/` directory at run end (base dir resolved from the test file dir → config dir → cwd). See [Trace mode](#trace-mode). | -| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace artifact layout — `zip` writes a single archive, `ndjson-directory` unpacks the same files into `trace-<sessionId>/`. Only applies when `mode: 'trace'`. | -| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | One trace per session / spec file / test. `'test'` is what the per-test `screenshot` / `video` artifacts attach to. Only applies when `mode: 'trace'`. **Caveat:** the BDD `describe/it` interface collapses to a single session-scoped slice (see [Per-test slicing](#per-test-slicing--the-bdd-describeit-caveat)). | -| `tracePolicy` | `'on' \| 'retain-on-failure' \| 'retain-on-first-failure' \| 'on-first-retry' \| 'on-all-retries' \| 'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. Pairs with `traceGranularity: 'test'`. Only applies when `mode: 'trace'`. | -| `filmstrip` | `boolean` | `true` | Record a dense, continuous screencast filmstrip into the trace for scrubbable playback in the trace player — not just one frame per action. Runs the screencast recorder (polling mode on Nightwatch) for the session. Only applies when `mode: 'trace'`. | -| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir (and listed in the artifacts manifest when `emitArtifactsManifest: true`); it is NOT attached inline to Allure (see note below). | -| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir (and listed in the manifest when `emitArtifactsManifest: true`); NOT attached inline to Allure. | -| `emitArtifactsManifest` | `boolean` | `false` | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. **Opt-in for Nightwatch**: it has no live Allure signal to auto-detect against (`nightwatch-allure` is post-hoc), so unlike WDIO/Selenium it never auto-enables. Trace mode only. | -| `captureAssertions` | `boolean` | `true` | Capture assertions as trace action rows — `node:assert` plus native `browser.assert.*` / `browser.verify.*`, including negated `.not.*` matchers. Passing assertions render green, failing ones red with the error. Set `false` to opt out. | - -> **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files, plus the artifacts manifest when `emitArtifactsManifest: true`) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. +Options are passed to the plugin through the `globals` field — `globals: nightwatchDevtools({ ... })`. **All options are optional**; the plugin runs fine with `nightwatchDevtools({})`. See [Reference](#reference) for the full option table. ```javascript globals: nightwatchDevtools({ @@ -106,6 +130,69 @@ globals: nightwatchDevtools({ --- +## Live Mode + +In the default `mode: 'live'`, the plugin launches the DevTools dashboard in a new browser window when your tests run, streaming each test's commands, screenshots, console logs, and network activity in real time. See the [dashboard docs](https://webdriver.io/docs/devtools/dashboard) for a walkthrough of the UI. + +### Preserve & Rerun (Compare) + +Available for Nightwatch — same dashboard UI as WebdriverIO. The "compare with rerun" flow snapshots the failing run, re-launches the test with `DEVTOOLS_RERUN_LABEL` set (the plugin filters down to just that test name on the rerun), and the dashboard shows the two runs side-by-side aligned by command. + +--- + +## Trace Mode + +Set `mode: 'trace'` to skip the DevTools UI window and instead write a portable, self-contained trace artifact at run end — for offline replay, CI artifact collection, or AI-agent diffing. The backend port-bind, the UI window, and the live-only `screencast` option are all skipped in trace mode. + +```javascript +globals: nightwatchDevtools({ + mode: 'trace', + traceFormat: 'ndjson-directory' // optional; default 'zip' +}) +``` + +Nightwatch emits the **same normalized trace** as the WebdriverIO and Selenium adapters (all three share `@wdio/devtools-core`), so the archive format and the `show-trace` player are identical no matter which adapter produced it. A Nightwatch trace carries the full per-action capture — a screenshot, the depth-indented accessibility-tree snapshot, the interactable-element list, and the Markdown transcript — so it opens in the player with DOM/snapshot time-travel, the **A11y** and **Transcript** tabs, an **Errors** tab surfacing expect/step failures with jump-to-source, the pick-locator element overlay, and (for Cucumber) **Feature → Scenario → Step** nesting. + +Open a trace with the `show-trace` bin, shipped with this package (no extra dependency): + +```bash +npx show-trace test-results/trace-<sessionId>.zip # in a project that installs this adapter +pnpm show-trace test-results/trace-<sessionId>.zip # from the devtools monorepo +``` + +For the full artifact contents, the `traceGranularity` / `tracePolicy` reference, and the player walkthrough, see [Trace mode](../../README.md#-trace-mode-tracezip) and [Viewing traces](../../README.md#viewing-traces) in the root README, and the [Trace Mode docs](https://webdriver.io/docs/devtools/wdio/trace-mode). + +### Per-test slicing & the BDD `describe/it` caveat + +The per-test options — `traceGranularity: 'test'`, and the `tracePolicy`, `screenshot`, and `video` options that pair with it — need a per-test hook to cut each test's slice. The **exports-object (mocha-style)** interface and **Cucumber** (per-scenario hooks) expose one, so they get real per-test slicing. The **BDD `describe/it`** interface — the style used by this package's bundled example — is the exception: Nightwatch runs each `it()` internally and fires the plugin's per-test hook only once per module, so `traceGranularity: 'test'` collapses to a single **session-scoped** slice keyed to the first test. The artifacts manifest still lists every testcase with its correct state; only the per-test slice/artifact keying collapses. Session- and spec-granularity traces are unaffected. + +--- + +## BiDi capture + +Enable WebDriver BiDi capture for browser console messages, JS exceptions, and network requests. Equivalent to the path selenium-devtools uses — both adapters call the same `attachBidiHandlers` in `@wdio/devtools-core`. + +```javascript +globals: nightwatchDevtools({ + port: 3000, + bidi: true +}) +``` + +You also need `webSocketUrl: true` in your capabilities so chromedriver actually exposes the BiDi channel: + +```javascript +desiredCapabilities: { + browserName: 'chrome', + 'webSocketUrl': true, // ← enables BiDi + 'goog:chromeOptions': { /* ... */ } +} +``` + +When attached, the per-command Chrome performance-log network capture path is gated off so requests don't appear twice in the dashboard. If `webSocketUrl` is missing or the chromedriver version doesn't expose BiDi, the attach silently fails and the perf-log fallback continues to work. + +--- + ## Screencast Record a continuous `.webm` video of the browser session. The recording starts on the first session the plugin sees and is finalized in Nightwatch's `after()` hook, writing `nightwatch-video-<sessionId>.webm` to the directory of the test file that just ran. Falls back to the directory containing `nightwatch.conf.*` if the test file path isn't known, and to `process.cwd()` as a last resort. Directories under `node_modules/` are skipped. @@ -140,31 +227,25 @@ The encoded video is sent to the DevTools dashboard via the `screencast` WS scop --- -## Trace mode - -Set `mode: 'trace'` to skip the DevTools UI window and instead write a portable, self-contained trace artifact at run end — for offline replay, CI artifact collection, or AI-agent diffing. The backend port-bind, the UI window, and the live-only `screencast` option are all skipped in trace mode. +## Reference -```javascript -globals: nightwatchDevtools({ - mode: 'trace', - traceFormat: 'ndjson-directory' // optional; default 'zip' -}) -``` - -Nightwatch emits the **same normalized trace** as the WebdriverIO and Selenium adapters (all three share `@wdio/devtools-core`), so the archive format and the `show-trace` player are identical no matter which adapter produced it. A Nightwatch trace carries the full per-action capture — a screenshot, the depth-indented accessibility-tree snapshot, the interactable-element list, and the Markdown transcript — so it opens in the player with DOM/snapshot time-travel, the **A11y** and **Transcript** tabs, an **Errors** tab surfacing expect/step failures with jump-to-source, the pick-locator element overlay, and (for Cucumber) **Feature → Scenario → Step** nesting. - -Open a trace with the `show-trace` bin, shipped with this package (no extra dependency): - -```bash -npx show-trace test-results/trace-<sessionId>.zip # in a project that installs this adapter -pnpm show-trace test-results/trace-<sessionId>.zip # from the devtools monorepo -``` - -For the full artifact contents, the `traceGranularity` / `tracePolicy` reference, and the player walkthrough, see [Trace mode](../../README.md#-trace-mode-tracezip) and [Viewing traces](../../README.md#viewing-traces) in the root README. - -### Per-test slicing & the BDD `describe/it` caveat +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `port` | `number` | `3000` | Port for the DevTools backend server. Auto-incremented if already in use. | +| `hostname` | `string` | `'localhost'` | Hostname the backend server binds to. | +| `screencast` | `ScreencastOptions` | `{ enabled: false }` | Session video recording — live mode only (see [Screencast](#screencast)). | +| `bidi` | `boolean` | `false` | Opt into WebDriver BiDi capture for browser console + JS exceptions + network. Requires `webSocketUrl: true` in your capabilities and a BiDi-capable chromedriver. When attached, the per-command Chrome perf-log network path is gated off so requests don't duplicate. | +| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` (or directory) under a `test-results/` directory at run end (base dir resolved from the test file dir → config dir → cwd). See [Trace mode](#trace-mode). | +| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace artifact layout — `zip` writes a single archive, `ndjson-directory` unpacks the same files into `trace-<sessionId>/`. Only applies when `mode: 'trace'`. | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | One trace per session / spec file / test. `'test'` is what the per-test `screenshot` / `video` artifacts attach to. Only applies when `mode: 'trace'`. **Caveat:** the BDD `describe/it` interface collapses to a single session-scoped slice (see [Per-test slicing](#per-test-slicing--the-bdd-describeit-caveat)). | +| `tracePolicy` | `'on' \| 'retain-on-failure' \| 'retain-on-first-failure' \| 'on-first-retry' \| 'on-all-retries' \| 'retain-on-failure-and-retries'` | `'on'` | Which traces to keep. Pairs with `traceGranularity: 'test'`. Only applies when `mode: 'trace'`. | +| `filmstrip` | `boolean` | `true` | Record a dense, continuous screencast filmstrip into the trace for scrubbable playback in the trace player — not just one frame per action. Runs the screencast recorder (polling mode on Nightwatch) for the session. Only applies when `mode: 'trace'`. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Per-test screenshot. Trace mode + `traceGranularity: 'test'` only. **Produce-only** — the PNG is written to the trace output dir (and listed in the artifacts manifest when `emitArtifactsManifest: true`); it is NOT attached inline to Allure (see note below). | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Per-test video slice, retained per the given policy (e.g. `'retain-on-failure'`). Trace mode + `traceGranularity: 'test'` only. Setting a non-`off` policy starts the screencast recorder itself — you do **not** also need `filmstrip` or `screencast.enabled`; the recorder runs continuously for the session and each test's slice is cut from it by wall-clock window. **Produce-only** — the `.webm` is written to the trace output dir (and listed in the manifest when `emitArtifactsManifest: true`); NOT attached inline to Allure. | +| `emitArtifactsManifest` | `boolean` | `false` | Write the `devtools-artifacts-<sessionId>.json` manifest — the generic index reporters/CI consume to discover produced artifacts — next to the trace. **Opt-in for Nightwatch**: it has no live Allure signal to auto-detect against (`nightwatch-allure` is post-hoc), so unlike WDIO/Selenium it never auto-enables. Trace mode only. | +| `captureAssertions` | `boolean` | `true` | Capture assertions as trace action rows — `node:assert` plus native `browser.assert.*` / `browser.verify.*`, including negated `.not.*` matchers. Passing assertions render green, failing ones red with the error. Set `false` to opt out. | -The per-test options — `traceGranularity: 'test'`, and the `tracePolicy`, `screenshot`, and `video` options that pair with it — need a per-test hook to cut each test's slice. The **exports-object (mocha-style)** interface and **Cucumber** (per-scenario hooks) expose one, so they get real per-test slicing. The **BDD `describe/it`** interface — the style used by this package's bundled example — is the exception: Nightwatch runs each `it()` internally and fires the plugin's per-test hook only once per module, so `traceGranularity: 'test'` collapses to a single **session-scoped** slice keyed to the first test. The artifacts manifest still lists every testcase with its correct state; only the per-test slice/artifact keying collapses. Session- and spec-granularity traces are unaffected. +> **Inline Allure attachment is not supported for Nightwatch.** Its official `nightwatch-allure` reporter is post-hoc (no live attach API), and `allure-js-commons`' `attachment()` no-ops in a Nightwatch run. So `screenshot`/`video` artifacts are *produced* (files, plus the artifacts manifest when `emitArtifactsManifest: true`) in the trace output dir but not attached to an Allure test. Per-test slicing (and therefore these artifacts) is meaningful for the cucumber and exports-object interfaces; the BDD `describe/it` interface collapses to session granularity, so the gate no-ops there. --- @@ -202,33 +283,6 @@ Nightwatch does not provide the same depth of framework hooks as WebdriverIO, so Overall feature parity with the WebdriverIO DevTools service is approximately **80–90%**. -### Preserve & Rerun (Compare) - -Available for Nightwatch — same dashboard UI as WebdriverIO. The "compare with rerun" flow snapshots the failing run, re-launches the test with `DEVTOOLS_RERUN_LABEL` set (the plugin filters down to just that test name on the rerun), and the dashboard shows the two runs side-by-side aligned by command. - -### BiDi capture (opt-in) - -Enable WebDriver BiDi capture for browser console messages, JS exceptions, and network requests. Equivalent to the path selenium-devtools uses — both adapters call the same `attachBidiHandlers` in `@wdio/devtools-core`. - -```javascript -globals: nightwatchDevtools({ - port: 3000, - bidi: true -}) -``` - -You also need `webSocketUrl: true` in your capabilities so chromedriver actually exposes the BiDi channel: - -```javascript -desiredCapabilities: { - browserName: 'chrome', - 'webSocketUrl': true, // ← enables BiDi - 'goog:chromeOptions': { /* ... */ } -} -``` - -When attached, the per-command Chrome performance-log network capture path is gated off so requests don't appear twice in the dashboard. If `webSocketUrl` is missing or the chromedriver version doesn't expose BiDi, the attach silently fails and the perf-log fallback continues to work. - ## :page_facing_up: License [MIT](/LICENSE) diff --git a/packages/selenium-devtools/README.md b/packages/selenium-devtools/README.md index bf4b4c8a..61dc3791 100644 --- a/packages/selenium-devtools/README.md +++ b/packages/selenium-devtools/README.md @@ -10,7 +10,7 @@ Works with **Mocha**, **Jest**, **Cucumber**, or plain `node script.js` — the --- -## Quick start (3 steps) +## Quick Start **1. Install the package** in your Selenium project: @@ -247,7 +247,7 @@ node tests/google.test.js --- -## Configuration options explained +## Configuration The runner snippets above use a typical config: @@ -388,7 +388,7 @@ The trace uses a portable NDJSON schema, so the same `.zip` (or `ndjson-director --- -## Reference — all options +## Reference | Option | Type | Default | Description | |--------|------|---------|-------------| @@ -455,7 +455,7 @@ pnpm example:mocha --- -## How it works +## How It Works The plugin patches `selenium-webdriver`'s `Builder`, `WebDriver`, and `WebElement` prototypes at import time: diff --git a/packages/service/README.md b/packages/service/README.md index 06a74728..e10a445f 100644 --- a/packages/service/README.md +++ b/packages/service/README.md @@ -3,7 +3,9 @@ A WebdriverIO service that provides a developer tools UI for running, debugging, and inspecting browser automation tests. Features include DOM mutation replay, per-command screenshots, network request inspection, console log capture, and session screencast recording. -## Installation +## Quick Start + +**1. Install the package** as a dev dependency: ```sh npm install @wdio/devtools-service --save-dev @@ -11,7 +13,28 @@ npm install @wdio/devtools-service --save-dev pnpm add -D @wdio/devtools-service ``` -## Usage +**2. Add the service** to your WebdriverIO config: + +```ts +// wdio.conf.ts +export const config = { + services: ['devtools'], +} +``` + +**3. Run your tests as you normally do** — the DevTools UI opens automatically, showing each test's commands, screenshots, console logs, and network activity in real time. + +## Configuration + +Options are passed as the second element of the service tuple: + +```ts +services: [['devtools', options]] +``` + +All options are optional — the service runs with sensible defaults out of the box. See [Reference](#reference) for the full options table. + +## Live Mode ### Test Runner @@ -35,33 +58,14 @@ await browser.url('https://example.com') await browser.deleteSession() ``` -## Service Options - -```ts -services: [['devtools', options]] -``` - -| Option | Type | Default | Description | -|---|---|---|---| -| `port` | `number` | random | Port the DevTools UI server listens on | -| `hostname` | `string` | `'localhost'` | Hostname the DevTools UI server binds to | -| `devtoolsCapabilities` | `Capabilities` | Chrome 1600×1200 | Capabilities used to open the DevTools UI window | -| `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below; for trace mode use `video`) | -| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` under a `test-results/` directory (base dir resolved from the test file's dir → config dir → cwd) at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | -| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace mode only. Output layout — `'zip'` writes a single archive; `'ndjson-directory'` unpacks the same files into `trace-<id>/` (one less unzip step for scripted/agentic consumers). Both open in `show-trace` and other compatible viewers. | -| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned — one per worker session / spec file / test. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | -| `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep: `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'`. The retry-aware policies pair best with `traceGranularity: 'test'`. | -| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). WDIO-service-specific. | -| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). WDIO-service-specific. | -| `filmstrip` | `boolean` | `true` | Trace mode only. Records a dense, continuous screencast filmstrip *into* the trace so the player scrubs smooth playback — dense frames are added alongside the per-action frames (not one frame per action). Frames are thinned (≥100 ms apart, ~600 max) and content-addressed (identical frames — a static wait — collapse to one resource); windowed per slice at any `traceGranularity`. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | -| `emitArtifactsManifest` | `boolean` | `false` | Trace mode only. Writes `devtools-artifacts-<sessionId>.json` next to the trace — a generic index of every produced artifact (trace/screenshot/video) plus each test's state, for reporters/CI to consume. Off by default; **auto-enabled when `@wdio/allure-reporter` is in the config**. | -| `captureAssertions` | `boolean` | `true` | Capture assertions as command/action rows — `node:assert` plus passing *and* failing expect-webdriverio matchers, folded into single `expect.<matcher>` rows (e.g. `toHaveText`, `toExist`). Set `false` to opt out. | +## Trace Mode -## Viewing traces — `show-trace` +Set `mode: 'trace'` to skip the live UI window and write a portable `trace.zip` +(or, with `traceFormat: 'ndjson-directory'`, an unpacked directory) under a +`test-results/` directory at session end — meant for CI, offline replay, and +agentic diffing. See the [full trace mode docs](https://webdriver.io/docs/devtools/wdio/trace-mode). -In trace mode the adapter writes a portable `trace.zip` (or, with -`traceFormat: 'ndjson-directory'`, an unpacked directory). Open it in the -first-party player: +Open a trace in the first-party player: ```sh pnpm show-trace path/to/trace.zip # from this repo @@ -223,6 +227,32 @@ No configuration change is needed to switch modes — the service detects browse After every navigation command (`url`, `navigateTo`, etc.), the service runs the shared `CAPTURE_PERFORMANCE_SCRIPT` from `@wdio/devtools-core` to read `window.performance.getEntriesByType('navigation' | 'resource')`, cookies, and document info. The result is attached to the command entry in the Actions tab so you see `loadTime` / `domReady` / `responseTime` / resource counts per navigation. Same script and `applyPerformanceData` post-processing used by selenium-devtools and nightwatch-devtools — uniform dashboard fields across all three adapters. -## Shared library notes +## Reference + +```ts +services: [['devtools', options]] +``` + +| Option | Type | Default | Description | +|---|---|---|---| +| `port` | `number` | random | Port the DevTools UI server listens on | +| `hostname` | `string` | `'localhost'` | Hostname the DevTools UI server binds to | +| `devtoolsCapabilities` | `Capabilities` | Chrome 1600×1200 | Capabilities used to open the DevTools UI window | +| `screencast` | `ScreencastOptions` | — | Session video recording (live mode only — see below; for trace mode use `video`) | +| `mode` | `'live' \| 'trace'` | `'live'` | `'live'` opens the DevTools UI window; `'trace'` skips the UI and writes a `trace-<sessionId>.zip` under a `test-results/` directory (base dir resolved from the test file's dir → config dir → cwd) at session end. See [Trace mode](../../README.md#-trace-mode-tracezip) | +| `traceFormat` | `'zip' \| 'ndjson-directory'` | `'zip'` | Trace mode only. Output layout — `'zip'` writes a single archive; `'ndjson-directory'` unpacks the same files into `trace-<id>/` (one less unzip step for scripted/agentic consumers). Both open in `show-trace` and other compatible viewers. | +| `traceGranularity` | `'session' \| 'spec' \| 'test'` | `'session'` | Trace mode only. How traces are partitioned — one per worker session / spec file / test. `'test'` is required for per-test Allure attachments (trace, screenshot, video). | +| `tracePolicy` | `TraceRetentionPolicy` | `'on'` | Trace mode only. Which traces to keep: `'on'` \| `'retain-on-failure'` \| `'retain-on-first-failure'` \| `'on-first-retry'` \| `'on-all-retries'` \| `'retain-on-failure-and-retries'`. The retry-aware policies pair best with `traceGranularity: 'test'`. | +| `screenshot` | `'off' \| 'on' \| 'only-on-failure'` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screenshot, attached inline to Allure (`image/png`). WDIO-service-specific. | +| `video` | `'off' \| TraceRetentionPolicy` | `'off'` | Trace mode + `traceGranularity: 'test'`. Per-test screencast video, retained per the given policy, attached inline to Allure (`video/webm`). WDIO-service-specific. | +| `filmstrip` | `boolean` | `true` | Trace mode only. Records a dense, continuous screencast filmstrip *into* the trace so the player scrubs smooth playback — dense frames are added alongside the per-action frames (not one frame per action). Frames are thinned (≥100 ms apart, ~600 max) and content-addressed (identical frames — a static wait — collapse to one resource); windowed per slice at any `traceGranularity`. Runs the screencast recorder (CDP push on Chrome, polling elsewhere). | +| `emitArtifactsManifest` | `boolean` | `false` | Trace mode only. Writes `devtools-artifacts-<sessionId>.json` next to the trace — a generic index of every produced artifact (trace/screenshot/video) plus each test's state, for reporters/CI to consume. Off by default; **auto-enabled when `@wdio/allure-reporter` is in the config**. | +| `captureAssertions` | `boolean` | `true` | Capture assertions as command/action rows — `node:assert` plus passing *and* failing expect-webdriverio matchers, folded into single `expect.<matcher>` rows (e.g. `toHaveText`, `toExist`). Set `false` to opt out. | + +## How It Works Most of this service's capture + reporting logic now lives in `@wdio/devtools-core` and is consumed by all three adapters: `SessionCapturerBase`, `ScreencastRecorderBase`, `TestReporterBase`, `loadInjectableScript`/`pollUntilReady`, `processTracePayload`, `captureSource`, `sendCommand`/`sendReplaceCommand`, `errorMessage`/`toError`/`serializeError`, `RetryTracker`, `mapChromeBrowserLogs`, `attachBidiHandlers`, `finalizeScreencast`, `encodeToVideo`, `suite-helpers`, `test-discovery`. This service contains only WDIO-specific glue (BiDi event listeners via WDIO's native `browser.on`, the WDIO reporter integration, `beforeCommand`/`afterCommand` hook wiring, Cucumber UID branching). + +## :page_facing_up: License + +[MIT](/LICENSE) From b82b043092a0deb4c25d13bd25376acc76131408 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 20:09:29 +0530 Subject: [PATCH 107/109] docs: sync CLAUDE.md and ARCHITECTURE.md with current state --- ARCHITECTURE.md | 8 +++++++- CLAUDE.md | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 1324f454..a7ec337b 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -140,6 +140,12 @@ Contains: DOM mutation observers, page-side trace collection, a small logger. It The execution environment is the browser, not Node, so this package cannot import from `core` (Node-only) or from non-browser-safe parts of `shared`. +### `packages/elements` + +Element-detection scripts (`@wdio/elements`). Produces the per-action data that feeds the snapshot pipeline: `getSnapshot`, the depth-indented accessibility-tree serializer, and the interactable-element list, plus locator generation. + +Consumed by `core` (the element-snapshot builder) and by the adapters' per-action capture (`captureActionSnapshot`). The DOM-walking scripts run in the page via `browser.execute`, so — like `script` — they avoid Node-only APIs. + ### `examples/` Per-framework demo projects used for manual verification. @@ -227,7 +233,7 @@ The architecture above is the actual state of the repo. Where it diverges from t Notable in-place pieces worth knowing about: - `replaceCommand` has two semantics across adapters — Selenium mutates the existing entry in place (preserves `_id`/`id` continuity for chained calls); Nightwatch splices and reissues with a new `_id`. Both call the same `core/suite-helpers` factories; the storage strategy stays adapter-specific because the runner integrations differ. -- `patchNodeAssert` is wired only in `selenium-devtools` (Selenium's primary assertion style is `node:assert`). The shared helper lives in `core/assert-patcher`; Service and Nightwatch can opt in via a one-line call when they need to, but it's not auto-enabled because both communities lean on chai/expect. +- `patchNodeAssert` (via `core/assert-patcher`) is wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`), so `node:assert` — and, where the framework exposes assertion hooks, `expect` matchers — surface as trace action rows. Framework matcher libraries differ (Service taps expect-webdriverio's hooks; Nightwatch native `assert`/`verify` and Selenium's `node:assert` surface via their reconcile/patch paths), so the remaining gap is Selenium's jest-style `expect()`. - BiDi is auto-attached in Service and Selenium. Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities — historically Nightwatch users haven't all enabled BiDi by default. - Performance API capture (`CAPTURE_PERFORMANCE_SCRIPT`) is identical across all three adapters; each wires it into its own afterCommand-equivalent path. - Output directory for screencast videos and trace files is resolved through `core/resolveAdapterOutputDir` — adapters feed `userConfiguredDir` (WDIO honors `wdio.conf.ts`'s `outputDir`/`rootDir`), `testFilePath` (Selenium/Nightwatch), and `configPath` (Nightwatch), and the helper picks the first writable, non-`node_modules/` candidate. diff --git a/CLAUDE.md b/CLAUDE.md index 8750159a..71bd7d1f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,6 +48,7 @@ Defined in root `tsconfig.json`: | `@wdio/selenium-devtools` / `*` | `packages/selenium-devtools/src/...` | | `@wdio/devtools-shared` / `*` | `packages/shared/src/...` | | `@wdio/devtools-core` / `*` | `packages/core/src/...` | +| `@wdio/elements` / `*` | `packages/elements/src/...` | These exist so imports stay short and grep-able. Long relative paths (`../../../components/…`) aren't used. @@ -158,7 +159,7 @@ Unused exports, unused imports, commented-out blocks, and `_unused` parameters g ## Testing -The repo uses **vitest** at the root. The current state: 566 tests across 47 files; thresholds at `vitest.config.ts` enforce a floor of 85/77/86/85 (statements/branches/functions/lines). Coverage is ratcheted upward as gaps close, never downward. +The repo uses **vitest** at the root. The current state: 1315 tests across 112 files; thresholds at `vitest.config.ts` enforce a floor of 85/77/86/85 (statements/branches/functions/lines). Coverage is ratcheted upward as gaps close, never downward. ### What gets tested From b28de266c6925d100e367ccb8c6b52690c04afc4 Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 20:25:04 +0530 Subject: [PATCH 108/109] chore: add changeset for trace mode (minor across 6 published packages) --- .changeset/trace-mode-parity.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .changeset/trace-mode-parity.md diff --git a/.changeset/trace-mode-parity.md b/.changeset/trace-mode-parity.md new file mode 100644 index 00000000..b089bce9 --- /dev/null +++ b/.changeset/trace-mode-parity.md @@ -0,0 +1,17 @@ +--- +"@wdio/devtools-service": minor +"@wdio/selenium-devtools": minor +"@wdio/nightwatch-devtools": minor +"@wdio/devtools-backend": minor +"@wdio/devtools-app": minor +"@wdio/devtools-script": minor +--- + +Trace mode: a portable `trace.zip` artifact and first-party `show-trace` player, at parity across WebdriverIO, Selenium, and Nightwatch. + +- **Trace mode** (`mode: 'trace'`) writes a portable artifact under `test-results/` with no dashboard window — `traceFormat` (`zip` | `ndjson-directory`), `traceGranularity` (`session` | `spec` | `test`), and retry-aware `tracePolicy` retention. +- **Trace player** (`show-trace`): DOM time-travel replayed from the mutation stream, an A11y tab and pick-locator element overlay, a Transcript tab with Copy-for-LLM, Errors/Console/Network/Source panels, and a scrubbable filmstrip timeline. +- **Per-test artifacts**: `screenshot` and `video` at `traceGranularity: 'test'`, a dense `filmstrip` into the trace, an `emitArtifactsManifest` index for CI, and inline Allure attachment (WebdriverIO + Selenium). +- **Assertion capture** (`captureAssertions`, on by default): `node:assert` and framework matchers render as trace action rows. + +The trace format and player are identical across all three adapters; capture completeness varies per adapter (see the cross-framework support docs). From acce14d64c947e7c9143a9e3612dac4a913c287b Mon Sep 17 00:00:00 2001 From: Vishnu Vardhan <vishnu.p@browserstack.com> Date: Fri, 24 Jul 2026 20:32:25 +0530 Subject: [PATCH 109/109] docs: update CONTRIBUTING.md --- CONTRIBUTING.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b8070bff..01d3d7ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,6 @@ Thanks for contributing to WebdriverIO DevTools! This guide gets you from a clon ```bash git clone https://github.com/<your-username>/devtools cd devtools -git remote add upstream https://github.com/webdriverio/devtools pnpm install pnpm build @@ -70,18 +69,24 @@ Resolving question: *who else would want this?* If "any future adapter would," i ## Changesets -This repo publishes with [changesets](https://github.com/changesets/changesets). If your change affects a published package, add one: +This repo publishes with [changesets](https://github.com/changesets/changesets). **If your change touches a published package, add a changeset** — without one the release won't bump or publish it. ```bash -pnpm changeset +pnpm changeset # or: npx changeset ``` -Pick the bumped packages and a semver level, and commit the generated file with your change. +Then pick: + +- **Packages** — only the **published** ones you changed: `@wdio/devtools-service`, `@wdio/selenium-devtools`, `@wdio/nightwatch-devtools`, `@wdio/devtools-backend`, `@wdio/devtools-app`, `@wdio/devtools-script`, `@wdio/elements`. Do **not** select `@wdio/devtools-shared` or `@wdio/devtools-core` — they're private and inlined into their consumers, so a change there just means bumping the consumers (a released package that depends on them). +- **Level** — by impact: **major** = a breaking change (removed/renamed option, changed default), **minor** = a backward-compatible feature, **patch** = a backward-compatible fix. + +Commit the generated `.changeset/*.md` with your change. You don't edit `CHANGELOG.md` or version numbers — the release generates those from your changeset. Publishing itself is a **manual step a maintainer runs** (the "Manual NPM Publish" GitHub Action), so your job ends at landing the changeset. ## Before you push - `pnpm build`, `pnpm test`, and `pnpm lint` all green — don't push red. - UI / runtime changes verified in `examples/<framework>/`. +- A changeset added if a published package changed (`pnpm changeset`). - User-facing changes (a new option, CLI, flag, output, or workflow) update the relevant README **and** are mirrored to the [WebdriverIO devtools webpage](https://webdriver.io/docs/devtools) in the same change. ## Pull requests