UI Generalization 2
Summary
Continuation of UI Generalization 1. This session finished the toolkit's element vocabulary, built three composite screens (HUD / shop / inventory + skillset + pause as Tier-3 reference pages), then ran a long element-refinement pass that established the toolkit's visual identity (drop shadow, no-thin-borders rule, font rule, selection-marker patterns, area-scaled juice). Ended with a documentation / compartmentalization pass that hoisted the per-frame UI plumbing into a visible block in main.lua, refactored the gallery to be a truly optional dev tool, and rewrote the UI section of .claude/CLAUDE.md to reflect the current architecture.
HP bar v1 rebuild (Chunk 7a finish):
- Removed the scale-spring + white-flash juice. Replaced with the v1 two-bar tween: fast
frontfraction snapping toward the new HP, delayed slow whitebackfraction exposing the lost-health chunk, and ashown_valuecounter ticking down toward the new number. - All three driven by
timer_tweenon a sharedui_timerwith named entries per bar id (bar_front_<id>,bar_back_<id>for the re-armable delay,bar_backtween_<id>,bar_value_<id>) so rapid successive hits debounce cleanly — the back-delay timer measures from the LAST hit, and re-tweens capture the current in-flight value as start. Heal cancels the pending back delay and tweens back up together with front (no white sliver on heal). - Tunables in
juice.lua:BAR_FRONT_DUR = 0.18,BAR_BACK_DELAY = 0.15,BAR_BACK_DUR = 0.5,BAR_VALUE_DUR = 0.35. - Flat decreasing edge via stencil:
draw_bar_segmentdraws the fill as a full-width rounded rect, stencil-masked to[r.x, r.x + frac*r.w]— the rounded LEFT corners read, the cut RIGHT edge is flat. No-shader equivalent of v1'su_hp_clip_r. - API change: health mode takes
value + max(numbers), draws the centeredcur / maxtext fromshown_value; progress mode keepsfill. Gallery's page_bars updated. - Cash-register kick (Emoji Aimer's gold-chip pattern,
gold_chip_y_offset = 4instant +timer_tweenlinear to 0): on damage only,y_offset = BAR_KICK (4)instant,timer_tween(... math.linear)returns to 0 overBAR_KICK_DUR (0.25), namedbar_kick_<id>so rapid hits replace not stack. Whole bar (track + fills + text) draws pixel-floored atr.y + y_offset.
Chunk 7b — ui_tabs:
- Unified widget for both tabs (text labels, active = panel_fill cell) and segments (glyph cells, active = bg cell + green outline + green glyph). Equal-width cells with integer-snapped edges and remainder distribution.
- Per-cell SNKRX juice (scale-pop + hover sound) via
<id>_<i>cell ids; instant active-highlight snap (no slide); inactive cells brightentext_muted → texton hover. - After trying text-tabs in Awesome 16 + FatPixel 8 + PixulBrush 8, user picked PixulBrush as the tab font for the gallery demo. Widget default left as ui_font_body for that turn (later changed to Ark per the font rule).
Chunk 7c-d — form controls:
ui_checkbox(boolean) +ui_radio(one-of-group) — each is an indicator (rounded square / circle viaui_rrect radius = side/2) + optional label, full row clickable via sharedform_control_interacthelper. Scale-pop + hover sound per id.- Checkbox on: green fill + a geometric checkmark drawn as two rotated rects via
draw_checkmark— no font dependency. - Untick bug fix:
clicked and (not on) or onLua idiom collapses whenonis true (not on = false, falls through toon). Replaced with explicitif clicked then checked = not on end. ui_slider— thin charcoal track + green fill + 12px green circular knob; press-anywhere-to-grab + drag tracks cursor (usingui_state.active_idpersistence as the "being dragged" state, no new machinery). Knob travel inset byknob_rso it never clips. Knob scale-pops on grab.
Chunk 7e — ui_tooltip + ui_list_row:
ui_tooltip(primitives, pure draw): self-sizing info panel with optional icon tile + title (ui_font_header_l) + description lines (body font) + optional meta rich-text runs (ui_font_pixul).descis array of pre-broken lines (no wrapping). Returns the rect for caller chaining.ui_list_row(widgets, interactive): one row of a list.cellsarray of{w=N}fixed or{flex=true}cells with optionaltext/color/align/icon/font. Header variant = charcoal bg, muted, inert. Hover = charcoal bg, selected = charcoal bg + 2px green left accent. 1px bottom separator. Hover sound only, no scale-pop (full-row bounce reads off — user picked "background highlight only" from the AskUserQuestion options).- Gallery
contentpage composes a tooltip + a small inventory list (panel + header_row + 3 data rows) to demonstrate.
Chunk 7f — cards + text input + modal:
- User confirmed dropping
ui_dropdown—ui_tabs(compact horizontal selector) +ui_radio(vertical option group) already cover "pick one of N"; a dropdown only adds value for collapsed-popup style which a SNKRX-style game UI rarely needs. ui_card(widgets): selectable ability/item card. Panel chrome + centered vertical layout (icon tile near top, colored title, multi-line muted desc, footer pill anchored to bottom so cards in a row align regardless of desc length). Hover → grey border + scale-pop + sound;selected→ green border. Footer pill is flat (user picked "flat colored pill" over the mockup's bottom-edge depth strip).ui_text_input(widgets): charcoal field, click-to-focus viaui_state.focus_id. Editing: appendui_typed_text(caller-managed global captured once per frame fromengine_get_typed_text()), backspace (UTF-8-aware viautf8.offset), enter →submitted. Caret pinned to end (no mid-string cursor — deferred). Blinking caret driven bytime. Text + caret stencil-clipped to field; scrolls to keep end visible on overflow.ui_typed_textplumbing: changed main.lua'sengine_get_typed_text()discard line toui_typed_text = engine_get_typed_text()so the focused field reads it. ui/init.lua initializesui_typed_text = ''.ui_capturing_textflag: text input sets it true while focused so the gallery suppresses its letter hotkeys (B/O/P/K/L/U/[/]) — typing 'b' in a field shouldn't toggle the body font. Reset each frame inui_state_begin_frame. Snapshot pattern (see final docs pass below).ui_modal(widgets): full-screen scrim + centered auto-height panel with title/body/buttons. Returns{ result }(clicked button's value, or'dismiss'on outside press). Input capture via new globalui_input_lockedchecked by one new line inui_claim_hot— caller raisesui_input_locked = trueBEFORE drawing the screen behind the modal so those widgets go inert;ui_modallowers it as its first act so its own buttons (drawn last, on top) work.- Three composite reference pages (assembled purely from existing elements, no new widgets):
page_hud(HP/MP bars + chips + ability slot row + boss bar),page_shop(title + gold chip + 3 cards + reroll/leave buttons; leave opens confirm modal exercising the input-lock),page_inventory(tabs + 5×4 slot grid + detail panel with stat chips and divider).
RICOCHET-inspired additions:
- User uploaded 4 reference pages (kit sheets) from RICOCHET project. After mapping to existing toolkit, added 5 new named elements (
ui_badge,ui_tag,ui_stat_chip,ui_pips,ui_icon_button) plus extensions (ui_dividerstyles,ui_slot target='partial'), and 4 new gallery pages (badges,chrome,skillset,pause). ui_badge: small solid-color pill, defaultui_font_pixul, no border.ui_tag: outlined icon+label chip.ui_stat_chip: built onui_labelwith stat-shaped runs (icon + muted label + colored value).ui_pips: row of filled/empty dots for tiered progress.ui_icon_button: thin wrapper overui_buttonwith glyph label.ui_dividerextended:style=thin / thick / dotted / dashed / double.ui_slot targetgained'partial'(orange drag ring).- Engine
MAX_FONTSbumped from 16 → 64 inAnchor2/engine/src/anchor.c; rebuild viabuild.bat; newanchor.execopied toattack-template/after user closed the running game (file was locked). Also aliasedui_font_bracket = ui_font_header_lsince they were duplicate registrations.
Audit dot removal:
- Per user request, removed all red audit dots: dropped
ui_red_dot,ui_audit_dot,ui_new_editions,ui_is_new_editionfrompaint.lua; dropped the calls fromui_panel/ui_label/ui_button; cleaned docblocks.
Long element-refinement pass establishing visual identity:
Throughline rule from user: "all elements need to look cohesively thick. One line borders = out. Either thick borders or no borders at all, negative space used well, like with the [ ] on the tags."
- Badges → buttons → bracket tags evolution. First made
ui_badgechunkier (PixulBrush + pad 7/3, no border = solid fill is the chrome). User then observed badges are functionally non-interactive buttons → consolidatedui_buttonto support auto-size (norect→ sizes fromx, y + label) + arbitrarycoloropt, removedui_badge. Then user said "too big" — switched to the[ tag ]bracket motif via newui_bracket_tag(delegates toui_rich_textwith[, label,]runs). Tried Pirkkala 16 (too big), switched to Ark 10. Single-font implementation (no separate bracket-glyph kludge, assuming the chosen font has[ ]). - Font test trial. User added BoldPixels.ttf, More 15.ttf, pirkkala.ttf to assets. Built temporary 2-page font test (
fonts+fonts-pirk) at sizes 16/24/32 and 14..32 step 2. User picked Pirkkala for tags then switched to Ark; Bold@16 and More@32 noted as "work" for future. Test pages removed at end.ui_font_pirkkalaleft registered as future-available (the 64-font cap means it's harmless). ui_tagremoved entirely after user observation it duplicated the now-bracket idiom.ui_stat_chipforce-uppercased on label + value (:upper()); default font Ark.- Panel variants added as
ui_panel({stripe = color})(3px left accent), then user asked what they were for; concluded they're a web/productivity idiom that doesn't map well to game UIs (only legit cases: modal danger stripe + toast bg) → removed entirely. - Drag targets dashed ring → semi-transparent colored wash (
with_alpha(col, 130)over the slot interior), preserving icon visibility.
Drop shadow system:
- First-attempt mistake: I designed a per-element double-draw approach (each
ui_rrectwrites to bothui_layerandui_shadow_layer). User corrected: shadow should be derived from the layer's canvas via a shader, like Emoji Aimer and Invoker do. - Copied
Invoker/assets/shadow.fragtoattack-template/assets/—vec4(0.1, 0.1, 0.1, a * 0.5), reads source texture alpha, outputs dark grey at 50%. - Added
ui_shadow_layer,ui_shadow_shader,ui_shadow_offset_x/y = 2globals in init.lua. Documented the render pipeline. - Pipeline:
layer_render(ui_layer)→layer_clear(ui_shadow_layer)→layer_draw_from(ui_shadow_layer, ui_layer, ui_shadow_shader)→layer_draw(ui_shadow_layer, offset_x, offset_y)→layer_draw(ui_layer). Shadow renders BENEATH ui_layer with offset. - "No shadow inside a panel" emerges automatically: shadow at offset coords inside the panel area is covered by the panel's body fill on ui_layer; only protrusions show.
- Bug: full-screen tint not discrete drop shadows because the gallery's bg fill on ui_layer made it fully opaque, so the shader-derived shadow was a screen-wide opaque mask. Fix: moved bg fill to a separate
gallery_bg_layersoui_layerstays transparent except where chrome/text is drawn. ui_paneldropped its default 1px border (single rrect fill); border opt kept for explicit state indicators (card selected, slot selected).
Background / chrome / shimmer tuning iteration:
- Bumped palette
bgfrom (22,28,34) to (34,40,46) to make shadows readable. Also liftedslot_fill(40,44,47) andpanel_fill(46,48,52) to preserve ladder order. - User noted: "the delta between colors got different" — explained that palette Lua change doesn't propagate to shader's hardcoded
ui_palette_color()(editions 50-67 keep old RGBs). - User asked slot/panel reverted but bg kept brighter → slot/panel back to original, bg stays (34,40,46). Triggered inverted ladder (panel darker than bg).
- User: "Some portion getting way too dark" — diagnosed as the shimmer's symmetric ±0.09 lightness modulation creating visible dark patches against the brighter bg (panel_fill L=0.135 → range 0.045..0.225 is almost half-way to black on dark end).
- First fix: reduced amplitude on all UI mimic editions (50-67) from 0.18 to 0.08.
- User: "amplitude change should only apply to gray with the panels" → split: chrome (50-58) at 0.08 amp, accents (59-67) keep 0.18.
- User asked for brighten-only clamp to preserve dither delta:
if (edition <= 58) shift = max(0.0, shift);→ chrome lightness ranges L_base..(L_base + 0.09), never below base. Accents stay symmetric ±0.09. - bg final value: (34, 40, 46) (after brief experiments at (26,30,36) and reverts).
Page-by-page refinement:
- Page 4 (pause): HP bar thicker (h=8 → h=10) and dropped value text (
value/max→fill = 0.64); MP nudged down 1px; HP/MP labels + STATUS / MINIMAP section headers + status-effect rows (burning/poison/shield + timers) → Ark font. Addeddraw_dashed_linehelper usinglayer_linefor diagonal dashes; minimap nodes connected by dashedpanel_borderlines. - Page 5 (HUD): HP/MP labels + STONE GOLEM boss-name label + ability keybind captions (Q/W/E/R/F) → Ark. HUD HP bar reverted to value/max mode (kept value text — only the pause bar lost values per user spec).
- Page 12 (bars): progress-bar percentage labels (72%, 45%) → Ark.
Font rule established by user: "font for text = Lana, font for single UI lines and other individual UI elements = Ark."
- Widget defaults flipped to Ark:
ui_label,ui_tabs(non-segment),ui_checkbox,ui_radio,ui_bracket_tag,ui_stat_chip. ui_textdefault left at Lana (it's the generic text drawer; per-call Ark passed for single-line UI).ui_buttonkept PixulBrush (distinctive button font).
Slot + icon construct change:
- User: "the icon is always the same size as the slot, so when the slot is filled it's just as though it were a button with the icon with nothing around it."
ui_sloticon_pad default 2 → 0; icon now fills the slot, slot's radius applied to the icon tile so corners match.- Triggered selection-marker iterations because the panel-level border was hidden behind the icon.
Selection-marker design iterations (slot + card):
- v1: 2px top stripe (slot) / 3px top stripe (card) — user "selection green border looks off."
- v2: full-area corner bracket at bottom-right (L-shape with quarter-arc following the rounded corner, via
layer_linepolyline). User: "the corner thing you added is a small rect, I meant it should be a line following the edge of the element, like the corner of the area attack objects" (referencingsnkrx/area.lua'scorner_bracketsstyle). Built the bracket-with-arc. - v3: user: "let's try a little square on the top-left, with a small margin so it's not touching the edges." Small
ui_rrectat(lr.x+3, lr.y+3, 5, 5)for slot,(lr.x+5, lr.y+5, 6, 6)for card. Color flip: blue on slot when icon is green (icon fills slot, would hide green marker); cards stay green (panel_fill doesn't dominate enough to hide). - v4 (final): "Let's just try 2 pixel border for the cards, 1 pixel border for the inventory slots. Like it was before." Cards get 2px green border via
ui_panel's two-rect trick. Slot border can't go on the panel (would be hidden behind icon-fills-slot) so drawn ON TOP via stencil: mask the interior rect minus 1px, draw the slot's shape in border color underlayer_stencil_test_inverse→ clean 1px rounded outline following the slot's curve. Color flips to blue when icon is green. - Page 3 (skillset) keeps its vertical list-style: external 2px green left stripe at
x=8next to slot atx=14(ui_list_row-style accent for the vertical-stack case).
Area-scaled juice:
juice.luaaddsarea_scale(rect)helper:sqrt(900 / area)clamped [0.3, 1.0]. 900px² is the baseline (~30×30 slot = 1.0).ui_juice_pull(id, force, rect?)andui_juice_hover(id, hovered, clickable?, rect?)accept optional rect, multiply force by area_scale.- All widget call sites updated to pass their rect: ui_slot, ui_button, ui_tabs (per-cell), form_control_interact (checkbox/radio), ui_slider, ui_list_row, ui_card.
- Card (~144×180) now pulls at ~30% of slot's intensity. Spring tuning also softened (
freq=3, bounce=0.4vs framework default 5, 0.5).
Ghost button:
ui_buttonghost variant 1px outline dropped per the no-thin-borders rule. Ghost is now label-only when at rest; hovered ghost still inverts to white-fill via the solid branch.
Final documentation / compartmentalization pass (the closing chunk):
- User asked "What does the general code for doing the elements look like? What does a new instance have to do in general?" and requested main.lua should contain UI plumbing necessary to make the toolkit work but no actual UI code (no widget calls), with comments explaining usage like the attack system has, and proper compartmentalization without hiding details.
- Refactored gallery.lua so per-frame plumbing is caller-owned (not coupled to the gallery being active):
- Removed
ui_state_begin_frame()andui_juice_update(dt)fromui_gallery_updatebody. They're now main.lua's responsibility, called once per frame regardless of gallery state. - Split
ui_gallery_draw→ renamed toui_gallery_bg_draw, scoped to ONLY compositing the gallery's full-screen bg fill (when active). The shadow + ui_layer composite stays in main.lua so real-game UI and gallery widgets share one pipeline.
- Removed
- Added
ui_capturing_text_wassnapshot instate.luaso hotkey gating still works after begin_frame was hoisted to main.lua.ui_state_begin_framedoesui_capturing_text_was = ui_capturing_text; ui_capturing_text = false. Gallery hotkey gate reads_was(last frame's end value) → typing in a focused field still suppresses the gallery's letter hotkeys with one-frame lag in the safe direction. - main.lua rewrite:
- Top docblock expanded to cover both toolkits (attacks + UI), the calling convention (rect vs x/y, static vs interactive, caller-owned state pattern), and the dev gallery as opt-in.
- INPUT section: removed all gallery binds (F4/[/]/B/O/P/K/L/U).
update(): addedui_state_begin_frame()+ui_juice_update(dt)calls aftersync_engine_globals()+ui_typed_textcapture, with a documented block explaining the plumbing. Removedui_gallery_update(dt)call. Added a commented widget-call example.draw(): added the explicit UI render pipeline (5-line block:layer_render(ui_layer)+layer_clearshadow +layer_draw_from+layer_drawshadow at offset +layer_drawui) with documenting comment + tunable references. Removedui_gallery_draw()call.- Added new "UI GALLERY (optional dev tool — uncomment to enable)" section at end with all the binds, update-hook, and draw-hook (
ui_gallery_bg_draw()placement) commented out for opt-in. Explains the per-frame plumbing is shared.
- CLAUDE.md UI section overhaul:
- Rewrote calling convention section (rect vs position-only widgets, static vs interactive, caller-owned state).
- Added explicit per-frame contract code block (update + draw).
- Rewrote element-set descriptions for current state (icon-fills-slot, ghost label-only, selection via stencil/border, drag-target tinted wash, ui_button auto-size + color for static-status use).
- New Design rules subsection (no thin borders, font rule, selection markers, area-scaled juice, spring tuning).
- New Drop shadow subsection (pipeline, shader, "no shadow inside panel" emergence, don't fill ui_layer bg explanation).
- Updated Editions on the UI subsection with the split amplitude (chrome 50-58 brighten-only at 0.18, accents 59-67 symmetric ±0.09).
- Replaced fonts paragraph with a table; added Pirkkala "registered, currently unused (kept for future)" note.
- Updated file map (init.lua's shadow ownership, state.lua's new globals, juice.lua's area_scale, gallery.lua noted as optional).
- Module docblocks refreshed:
primitives.lua— full element list + font rule explained.juice.lua— area_scale documented; pull/hover signature updated to includerect?.gallery.lua— per-frame contract clarified as caller-owned; gallery's responsibilities scoped.
ui_font_bracketaliased toui_font_header_linstead of being a duplicate registration (saves a font slot).
Notable user feedback / corrections (quoted):
- "Your approach for the shadow seems incorrect, there's no need to draw the same shape twice, just draw the shape to a layer, and then the shadow layer itself is derived from the canvas of the layers that it applies to" — triggered the layer_draw_from refactor.
- "Why do panel variants have different color 1 pixel borders? Same for drag targets, but dashed ones. Can we find another way of conveying whatever information those borders are conveying?" — drove the no-thin-borders rule + drag-target tinted wash + (later removed) panel-variant stripe.
- "These are not functionally any different from buttons, so basically let's just have a button object, a non-interactable button object that looks the same." —
ui_badgeconsolidated intoui_button. - "Hmmm, still too big, let's try the [ tag ] but with Ark Pixel instead." — moved tags to bracket motif with Ark.
- "the icon is always the same size as the slot, so when the slot is filled it's just as though it were a button with the icon with nothing around it." —
icon_paddefault 0; triggered selection-marker iteration. - "Like it was before." (re: 1px slot / 2px card borders) — settled the selection-marker iteration after several alternatives.
- "Juice amount (intensity) should be lower based on the area of the element, bigger area = lower intensity." — area_scale.
- "font for text = Lana, font for single UI lines and other individual UI elements = Ark." — font rule.
Final state: 17 gallery pages covering every widget + composite reference screens. main.lua is a clean template with structural UI plumbing visible (no widget calls). CLAUDE.md UI section comprehensively documents the toolkit's current architecture.
Let's continue with UI generalization. Read the summary for the last log to get aligned.
I'll find the most recent session log to get aligned.
Bash (ls -t E:/a327ex/a327ex-site/logs/ 2>/dev/null | head -20)
ui-generalization-1.md
attack-system-generalization-4.md
attack-system-generalization-3.md
attack-system-generalization-2.md
attack-system-generalization-1.md
edition-system-generalization.md
emoji-aimer-8.md
invoker-spellcasting-tree-structure.md
emoji-aimer-7.md
anchor-app-phase-2-part-2.md
anchor-app-phase-2-part-1.md
invoker-hp-and-mana-orbs.md
emoji-aimer-6.md
emoji-aimer-5.md
orblike-to-invoker.md
emoji-aimer-4.md
anchor-app-phase-1-part-3.md
emoji-aimer-3.md
anchor-app-phase-1-part-2.md
emoji-aimer-2.md
Bash (head -60 E:/a327ex/a327ex-site/logs/ui-generalization-1.md)
Title: UI Generalization 1
Date: 2026-05-21 21:54:45
# UI Generalization 1
## Summary
First session generalizing a SNKRX / Orblike / Invoker-style UI element toolkit into `attack-template`, built incrementally one element at a time with the user testing between each. The toolkit lives in `attack-template/snkrx/ui/` and is loaded by `require('snkrx')`. Covered alignment/architecture, six build chunks of elements, and a large edition-system integration. The full mockup vocabulary is NOT finished — tabs/segments, form controls, tooltip-as-widget, list rows, cards, and the Tier-3 composite screens remain.
**Alignment & reference gathering:**
- Read the four Invoker UI mockups (`Invoker/reference/mockup_ui_kit_1..4.html`), `ui_primitives_spec.md`, Invoker's existing `ui.lua` + `primitives.lua`, the attack-template / edition-template `CLAUDE.md` files, and the Anchor App UI discussion (`anchor-app-ui-discussion.md` plus `Anchor2/app/widgets.lua`, `rect.lua`, `docs/ui_architecture.md`).
- Later viewed the original PNG sources (`orblike_ui_kit_1..4.png`, `orblike_hud.png`, `orblike_inventory_orb_1/2.png`) — confirmed the HTML mockups are faithful re-creations, and that the HUD / inventory PNGs are Invoker-specific Tier-3 composites built FROM the primitives.
- User framing answers: fold the UI into `attack-template` (specifically inside `snkrx/ui/`, not a sibling directory); Tier-3 composite screens decided per-element.
**Architecture decisions:**
- Calling convention: every widget takes ONE opts table; the rect is `opts.rect` ({x,y,w,h}, RectCut-native); draws go to the global `ui_layer`. Adopted from the Anchor App over Invoker's positional `(lyr,x,y,w,h)` signatures.
- Adopted the Anchor App's `ui_state` (hot/active/focus, explicit string ids) as the interaction substrate and RectCut (`rect.lua`) as the layout primitive — dropped the Anchor App's pane/template/workspace/model shell as overkill for a game UI.
- Kept Invoker's chrome technique: panels are two filled rounded-rects (the engine's rough-mode SDF stroke drops top/left edges at 1px), and `ui_text` pixel-snaps draw positions.
**Chunk 0 — `ui/` scaffold:** created `snkrx/ui/` with `rect.lua` (RectCut verbatim from the Anchor App), `state.lua` (`ui_state`, `ui_claim_hot`, `ui_point_in_rect`), `gallery.lua` (paged F4 test scene), `init.lua` (registers fonts, creates `ui_layer`, requires modules). `snkrx/init.lua` gained `require('snkrx.ui')`; `main.lua` got F4 / `[` / `]` binds plus `ui_gallery_update` / `ui_gallery_draw` hooks.
**Chunk 1 — Tier-1 primitives:** `ui_panel`, `ui_text`, `ui_divider` in `primitives.lua`. Fonts: Awesome 9 (`ui_font_header_l` @16), FatPixelFont (`ui_font_header_s` @8), and a live-toggleable body font — LanaPixel @11 vs Ark Pixel. Downloaded Ark Pixel proportional-latin TTFs from the `TakWolf/ark-pixel-font` GitHub releases. User feedback: use Ark Pixel 10 not 12; FatPixelFont @8 renders far taller than its point size, so the gallery text section was relaid-out with a running cursor driven by each font's real `.height`.
**Compose page:** added a second gallery page composing panels/text/dividers into a mock "run summary" screen. User found it "doesn't look that good — elements too simple"; also asked that new gallery pages be inserted at the FRONT so the project always opens on the latest work.
**Chunk 2 — slot + item icon:** `ui_item_icon` (colored rounded tile + centered glyph) added to `primitives.lua`; `ui_slot` (first interactive widget — derives hover from `ui_state`, data states selected/locked/disabled/occupied, drag-target dashed overlay) in a new `widgets.lua`. Established the split: `primitives.lua` = pure draw, `widgets.lua` = interactive.
**Chunk 3 — buttons, reworked SNKRX-style:** first built `ui_button` with mockup-style bottom-edge depth + press-sink; user rejected it ("take inspiration from the original SNKRX more closely ... disregard the mockups a bit"). Studied SNKRX's own source (`SNKRX/buy_screen.lua` `Button` class — the user's own MIT-licensed game). SNKRX buttons: flat rounded rects, scale-spring bounce on hover/click, invert to near-white on hover, two layered hover sounds (`bamboo_hit_by_lord.ogg` + `467951__benzix2__ui-button-click.ogg`), font `PixulBrush` @8. Reworked `ui_button` to match and introduced `ui/juice.lua` — a per-widget-id registry holding a scale spring + `was_hovered` edge for the once-per-enter hover sound. Copied PixulBrush.ttf + the two sounds from SNKRX into `assets/`. Decisions: keep primary/secondary/danger/ghost variants as color presets sharing the SNKRX juice; defer animated wavy text to a later text-effects chunk. User later noted SNKRX uses a hover-only (bamboo alone) sound for non-clickable elements vs the layered pair for clickable — added an optional `clickable` param to `ui_juice_hover`. Buttons were later defaulted to PixulBrush in all cases (the body fonts read wrong inside buttons).
**Chunk 4 — rich text + labels (GLIMPO redirect):** first built bordered chip / tag / badge / rarity pills from the mockups; user rejected them, pointing at a screenshot from **GLIMPO** (a SNKRX-inspired game — screenshot only, not a local project). In GLIMPO, tags are bracketed multi-colored inline text (`[tier 2][mage - psion]`) and the pill-like elements are flat dark rounded labels. Dropped `ui_pill` / `ui_badge`; built `ui_rich_text` (one line, multiple `{text,color,font,dy}` runs) and `ui_label` (flat dark rounded container holding plain OR rich text); kept `rarity_color`. The metadata motif: PixulBrush has no `[ ]` glyphs, so the bracket runs use a small Awesome font (`ui_font_bracket`, ended at @16) with a per-run `dy` vertical nudge and a dimmer color than the content.
... [30 more lines]
I'm aligned on the prior session. Let me check the current state of the toolkit before proposing what's next.
Bash (ls -la E:/a327ex/attack-template/snkrx/ui/; echo "---ASSETS---"; ls E:/a327ex/at...)
total 72
drwxr-xr-x 1 adn 197121 0 May 21 21:44 .
drwxr-xr-x 1 adn 197121 0 May 21 21:19 ..
-rw-r--r-- 1 adn 197121 18511 May 21 21:32 gallery.lua
-rw-r--r-- 1 adn 197121 3960 May 21 21:20 init.lua
-rw-r--r-- 1 adn 197121 3587 May 21 21:00 juice.lua
-rw-r--r-- 1 adn 197121 5358 May 21 21:41 paint.lua
-rw-r--r-- 1 adn 197121 6782 May 21 21:42 primitives.lua
-rw-r--r-- 1 adn 197121 3664 May 21 17:34 rect.lua
-rw-r--r-- 1 adn 197121 1852 May 21 17:35 state.lua
-rw-r--r-- 1 adn 197121 11781 May 21 21:44 widgets.lua
---ASSETS---
467951__benzix2__ui-button-click.ogg
ark-pixel-10px-proportional-latin.ttf
ark-pixel-12px-proportional-latin.ttf
ARROW_Hit_Wood_Shield_stereo.ogg
Awesome 9.ttf
bamboo_hit_by_lord.ogg
Bloody punches 10.ogg
Bloody punches 3.ogg
Bloody punches 7.ogg
Body Fall 2.ogg
Body Head (Headshot) 1.ogg
Click sound 37 + Body Fall 18.ogg
draw_shader.frag
Explosion Flesh 1.ogg
Explosion Flesh 3.ogg
Explosion Flesh 4.ogg
FatPixelFont.ttf
fx_energy_122.png
... [14 more lines]
I'm aligned. Here's where the UI toolkit stands and what remains.
Done (Chunks 0–6): scaffold, Tier-1 primitives (ui_panel/ui_text/ui_divider), ui_item_icon, ui_slot, SNKRX-style ui_button + juice, ui_rich_text/ui_label, ui_bar, and the full edition system applied across the UI.
Remaining from the mockup vocabulary:
- Tabs / segmented controls — kit 2 tab strip, kit 1 shop/inventory section switching
- Form controls — checkbox, radio, slider, dropdown, text input (kit 2 + kit 4 settings)
- Tooltip-as-widget — kit 1 has a tooltip; currently no widget for it
- List rows — kit 3 list view, kit 4 quests/save slots
- Cards — kit 1 ability cards, kit 3 item tooltip card
- Tier-3 composites — HUD, inventory/paper-doll, shop, world map, dialogue, modals (decided per-element)
Per our incremental rhythm, I'll do one chunk at a time with you testing between each. One question on ordering before I write the first design brief.
AskUserQuestion
Your questions have been answered: "Which element should Chunk 7 tackle first?"="We need to fix the HP UI element first along with a few others.". You can now continue with these answers in mind.
Got it — fixes first, not new elements. Let me look at the current bar code so I can understand what we're working with.
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
1 --[[
2 ui/widgets.lua — interactive UI widgets.
3
4 Same opts-table / ui_layer convention as ui/primitives.lua. These
5 widgets consult `ui_state` (ui/state.lua) — they derive hover via
6 ui_claim_hot, run the mouse-down→up click machine, and return an
7 interaction result. Each takes opts.id, an explicit caller-provided
8 string identity.
9
10 Coloring goes through the edition pipeline (ui/paint.lua): draws use
11 the ui_rrect / ui_text wrappers, or bracket edition_set manually for
12 loops (draw_drag_target). Every widget accepts opts.edition to force
13 a specific edition for all its draws — the per-element override.
14
15 They also carry SNKRX-style juice via ui/juice.lua: a per-id scale
16 spring that bounces on hover-enter and click, and the hover sounds.
17
18 The action-vs-rules split: a widget's *data* states (a slot's
19 selected / occupied / locked / disabled) are caller-owned and passed
20 in via opts. Its *interaction* state (hover, active, focus) is
21 frame-local, derived here from ui_state. The juice + bar registries
22 are the one retained sliver — keyed by the explicit id.
23 ]]
24
25 -- Clone a palette token with a fixed alpha. Returns a callable color.
26 local function with_alpha(token, a)
27 local c = color_clone(token)
28 c.a = a
29 return c
30 end
... [288 more lines]
I've read the bar widget. Before I propose fixes, I need to know what's actually wrong — I shouldn't guess at the problems.
AskUserQuestion
Your questions have been answered: "What's wrong with the HP bar (`ui_bar`) as it stands?"="Juice behavior", "Which other elements need fixing in this pass?"="The problem is that they're inconsistent visually with each other in some small ways. I need a way to look at all of them in the same screen.". You can now continue with these answers in mind.
The two issues: HP bar juice is wrong, and elements are subtly inconsistent — you need one screen showing them all. Let me read the gallery to see how pages are built.
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
1 --[[
2 ui/gallery.lua — the UI kit gallery / test scene.
3
4 A paged, full-screen overlay that renders every UI element the toolkit
5 ships — the in-engine equivalent of reference/mockup_ui_kit_*.html.
6 F4 toggle the gallery
7 [ / ] previous / next page
8 B toggle the body font (LanaPixel <-> Ark Pixel)
9 O / P preview the whole UI under prev / next edition
10 (per-color / dynamic / palette-cycle / polychrome)
11 K / L field_scale down / up (UI shimmer density)
12 U cycle the dither mode (32 modes)
13 Each element chunk appends its showcase to a gallery page.
14
15 WHY PAGE DRAWS RUN FROM update(), NOT draw():
16 Interactive widgets hit-test with mouse_is_pressed / key_is_pressed,
17 whose edge events are only true during update() (see MEMORY.md →
18 "Anchor 2 input edge events are update-only"). Widgets also queue
19 their layer commands in the same call. So the gallery queues ALL
20 ui_layer commands from ui_gallery_update(); ui_gallery_draw() is
21 only the layer_render + layer_draw flush.
22 ]]
23
24 ui_gallery_active = false
25 ui_gallery_page = 1
26
27 --[[
28 gallery_section_label(lyr, x, y, num, title)
29
30 Numbered section header in the mockup style: a muted two-digit number
... [406 more lines]
Read (E:/a327ex/attack-template/snkrx/ui/juice.lua)
1 --[[
2 ui/juice.lua — per-widget retained juice.
3
4 Immediate-mode widgets are pure functions — they have nowhere to keep
5 a spring, a hover edge, or an eased value. These registries are that
6 place, keyed by the widget's explicit string id. The small, retained,
7 action-based sliver the UI doctrine puts behind an id; everything
8 else stays rules-based.
9
10 Two registries:
11 ui_juice[id] = { spring, was_hovered } -- hover/click bounce
12 ui_bar_juice[id] = { trail, fill, flash_t } -- bar trail + flash
13
14 Lifecycle:
15 • ui_juice_update(dt) — tick springs + bar easing (once/frame)
16 • ui_juice_hover(id, hov) — hover-edge bounce + sound
17 • ui_juice_pull(id, force) — kick a spring (e.g. on click)
18 • ui_juice_scale(id) -> num — current widget scale
19 • ui_bar_feed(id, fill) — feed a bar's fill; returns trail +
20 whether the post-hit flash is on
21 ]]
22
23 ui_juice = {} -- widget id -> { spring, was_hovered }
24 ui_bar_juice = {} -- bar id -> { trail, fill, flash_t }
25
26 local function entry(id)
27 local e = ui_juice[id]
28 if not e then
29 e = { spring = spring_new(), was_hovered = false }
30 ui_juice[id] = e
... [75 more lines]
Bash (grep -nE 'width|height|window|w =|h =' E:/a327ex/attack-template/main.lua | he...)
33: width = 480,
34: height = 270,
89:main_camera = camera_new(width, height)
90:main_camera.x = width/2
91:main_camera.y = height/2
99:p = player(width/2, height/2)
104:-- spawn_seeker(width/2 + random_float(-100, 100),
105:-- height/2 + random_float(-100, 100))
107:-- local wx, wy = width/2 + 80, height/2
148: spawn_beam(p, { damage = 2, length = 600 })
212: local e, w = ev.a, ev.b
231: layer_rectangle(floor_layer, 0, 0, width, height, bg())
I have the full picture. Here's the design brief for the first fix-pass step.
Design brief — Chunk 7a: an "overview" gallery page
Approach. A new gallery page, page_overview, that renders one representative of every element family on a single 480×270 screen — a contact sheet. Its job is comparison: putting elements that should agree visually next to each other so subtle cross-family mismatches (corner radius, border treatment, row height, text baseline, internal padding) become obvious. This is the screen you asked for to spot the inconsistencies.
The headline feature is an alignment strip at the top: panel, label, slot, button, bar, and item_icon all drawn adjacent at one shared height (22px), each with a muted caption. Because they sit side by side at identical dimensions, a radius or border mismatch jumps out immediately. (For example: ui_button defaults to radius 4 while ui_panel/ui_slot/ui_bar default to 3 — that kind of thing.)
Below the strip, a compact showcase: the text font-ladder + a divider + the rich-text metadata motif; then the button variant row and slot state row; then the bars (progress thick/thin + health). One representative per family — the exhaustive state matrices stay on the existing dedicated pages; the overview is about cross-family consistency, not within-family states.
Deliberate decision — the overview page is fully static. Widgets are drawn with no id, so no hover-scale, no juice. On a comparison sheet you want everything sitting still at rest size; a button scaling up on hover would disturb the very alignment you're checking. Interaction stays on the dedicated pages.
Interfaces. Pure addition to ui/gallery.lua. New page_overview(lyr) function; prepended as the first entry of ui_gallery_pages (front = newest, per our convention, so the project opens on it). Reuses gallery_section_label, the local caption pattern, meta_runs, and every existing ui_* widget. No changes to primitives.lua / widgets.lua / paint.lua yet — those edits come after you've looked at the overview and pointed at what's wrong.
Functions.
page_overview(lyr)— draws the four sections viarect_cut_*rows. Callsui_panel,ui_label,ui_slot,ui_button,ui_bar,ui_item_icon,ui_text,ui_divider,ui_rich_text, all static. A small local caption helper places the muted sub-labels under the alignment strip.
Once you've eyeballed the overview and told me which inconsistencies bother you (and what's wrong with the HP bar juice specifically), I'll do the actual fix pass. Sound right, or do you want a different cut of what goes on the page?
Go ahead.
Read (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
1 --[[
2 ui/primitives.lua — Tier-1 UI primitives: panel, text, divider,
3 item_icon, rich_text, label.
4
5 Calling convention (whole toolkit): each widget takes ONE opts table.
6 The rect is opts.rect — a {x, y, w, h} table, exactly what RectCut
7 (ui/rect.lua) produces.
8
9 Coloring goes through the edition pipeline (ui/paint.lua): these
10 functions don't call layer_* directly, they call the ui_rrect /
11 ui_rect / ui_glyph_text wrappers, which bracket each draw with the
12 edition that mimics its palette color. Every primitive accepts an
13 optional `opts.edition` to force a specific edition for its draws.
14
15 These six are pure draw — no interaction, no ui_state. Interactive
16 widgets live in ui/widgets.lua.
17 ]]
18
19 --[[
20 ui_panel(opts)
21
22 Rounded-rect dark fill + 1px lighter border — the single chrome
23 primitive. opts: rect, bg (panel_fill), border (panel_border),
24 border_width (1), radius (3), edition.
25
26 Drawn as TWO filled rounded rects — the engine's rough-mode SDF
27 stroke drops its top/left edges at 1px, filled rects don't.
28 ]]
29 function ui_panel(opts)
30 local r = opts.rect
... [189 more lines]
Design's approved. Adding the page_overview function to the gallery.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
SYNTAX OK
Done — gallery.lua syntax-checks clean.
To test: run the project, press F4 to open the UI gallery. It now opens on the new overview page (page 1/7) — a single-screen contact sheet:
- 01 Alignment Strip — panel, label, slot, button, bar, item-icon all drawn adjacent at one 22px height. This is the comparison tool: look along the strip for radius / border / baseline / vertical-centering mismatches between families (the button's radius-4 vs everyone else's radius-3 should be visible, for one).
- 02 Text & Divider — header line, body line, rich-text metadata motif, divider.
- 03 Bars — progress thick + thin + a health bar with value text.
Everything's static (no hover-scale) so the alignment stays still. [ / ] still page to the dedicated per-element pages.
Take a look and tell me which inconsistencies bother you — and what specifically is wrong with the HP bar juice — and I'll do the fix pass.
You can remove this page, we'll try again later with more elements. To fix the HP bar juice: remove the spring juice, copy the effect from Orblike v1 HP bars in terms of tween for the two bars (primary and secondary that's white). Importantly, inside the HP, the rectangle should not be rounded on the end that's decreasing, otherwise it looks off, right? It has to be a flat rectangle that's getting decreased inside the bar, while only on the edges it's rounded. The HP text/HP value itself should tween down overtime as well, instead of directly being changed to the target damage value. Make sure to use the timer module functions with tags and with after functions correctly, in case multiple damage instances happen close to each other.
I'll remove the overview page, then study the v1 HP bar.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Overview page removed. Now let me find the v1 HP bar code.
Bash (ls E:/a327ex/Invoker/v1/ 2>/dev/null; echo "---"; ls E:/a327ex/Orblike/ 2>/dev/n...)
anchor
assets
main.lua
profiler.lua
profiler_log.txt
recordings
run.bat
---
Grep (hp_bar|health_bar|hp_yellow|draw_health|hp_2|secondary.hp|hp.tween)
7646: draw_health_ui(self)
9375:function draw_health_ui(entity)
9422: -- Yellow specials have their own sub-bar HP tween; re-arm its back delay so
9513: draw_health_ui(self)
9688: -- Yellow specials get their own per-enemy UI state for the sub-bar HP tween.
9803:-- Updates per-pack UI animation state (HP bar tweens, springs) and per-yellow
9804:-- HP tween state for sub-bars.
9842: -- Per-yellow sub-bar HP tween state (mirrors the pack bar's front/back)
10016: -- Yellow slot: HP from the yellow's own ui_hp_front / ui_hp_back tween,
Read (E:/a327ex/Invoker/v1/main.lua)
9375 function draw_health_ui(entity)
9376 if not should_show_health_ui(entity) then return end
9377 local bar_y = entity.y - entity.h - 2
9378 local bar_w = entity.w
9379 local bar_h = 2
9380 local bg_c = color(30, 30, 30)()
9381 local hp_fill = math.remap(math.max(0, entity.hp), 0, entity.max_hp, 0, bar_w)
9382 ui:rounded_rectangle(entity.x - bar_w*0.5, bar_y, bar_w, bar_h, 1, bg_c)
9383 if hp_fill > 0 then
9384 ui:rounded_rectangle(entity.x - bar_w*0.5, bar_y, hp_fill, bar_h, 1, red())
9385 end
9386 end
9387
9388 -- Apply a flat damage amount to an entity. No defense subtraction.
9389 -- damage: {damage = N, element = 'fire'}
9390 function apply_damage(entity, damage)
9391 if entity.dead then return nil end
9392 local dmg = math.max(0, damage.damage or 0)
9393
9394 local prev_hp = entity.hp
9395 entity.hp = entity.hp - dmg
9396 entity.last_damage_time = an.time
9397
9398 local overkill = 0
9399 if entity.hp <= 0 then
9400 overkill = -entity.hp
9401 end
9402
9403 return {
9404 damage_hit = dmg,
... [100 more lines]
The seeker bar is the simple one. The two-bar tween is in the pack UI. Let me read that.
Read (E:/a327ex/Invoker/v1/main.lua)
9803 -- Updates per-pack UI animation state (HP bar tweens, springs) and per-yellow
9804 -- HP tween state for sub-bars.
9805 function packs_update_ui(dt)
9806 for i = 1, #packs do
9807 local p = packs[i]
9808 if p.engaged and #p.members > 0 then
9809 -- Sum live non-yellow member HP for the pack's main bar target. Yellows
9810 -- are tracked on their own sub-bar and are excluded from this sum.
9811 local target_hp = 0
9812 for _, m in ipairs(p.members) do
9813 if not m.dead and m.tier ~= 'yellow' then
9814 target_hp = target_hp + math.max(0, m.hp)
9815 end
9816 end
9817
9818 -- Front bar snaps fast toward current HP
9819 p.hp_shown_front = p.hp_shown_front + (target_hp - p.hp_shown_front)*math.min(1, dt*12)
9820
9821 -- Back bar waits out the delay, then lerps slowly toward the front
9822 if p.ui_back_delay > 0 then
9823 p.ui_back_delay = math.max(0, p.ui_back_delay - dt)
9824 else
9825 p.hp_shown_back = p.hp_shown_back + (p.hp_shown_front - p.hp_shown_back)*math.min(1, dt*4)
9826 end
9827
9828 -- Scale spring toward 1 — critically damped so it never undershoots below 1.
9829 local k_s = (2*math.pi*5)^2
9830 local d_s = 4*math.pi*5
9831 local a_s = -k_s*(p.ui_scale - 1) - d_s*p.ui_scale_v
9832 p.ui_scale_v = p.ui_scale_v + a_s*dt
... [80 more lines]
Read (E:/a327ex/Invoker/v1/main.lua)
9960 local scale = p.ui_scale
9961
9962 hud:push(cx, cy, rot, scale, scale)
9963
9964 -- Common bar geometry (local coords within the push)
9965 hud:rounded_rectangle(-bar_w/2, -bar_h/2, bar_w, bar_h, corner_r, edge_c)
9966 hud:rounded_rectangle(-bar_w/2 + inner_pad, -bar_h/2 + inner_pad, bar_w - 2*inner_pad, bar_h - 2*inner_pad, math.max(0, corner_r - 1), inner_c)
9967
9968 if slot.kind == 'main' then
9969 local hp_max = p.hp_max > 0 and p.hp_max or 1
9970 local front_r = math.max(0, math.min(1, p.hp_shown_front/hp_max))
9971 local back_r = math.max(0, math.min(1, p.hp_shown_back/hp_max))
9972
9973 -- Back flash (edition 31 + clip)
9974 if back_r > 0 then
9975 local clip_back_a = (inner_pad + (bar_w - 2*inner_pad)*back_r)/bar_w
9976 hud:shader_set_float(draw_shader, 'u_edition', 31)
9977 hud:shader_set_float(draw_shader, 'u_hp_clip_r', clip_back_a)
9978 hud:rounded_rectangle(-bar_w/2, -bar_h/2, bar_w, bar_h, corner_r, back_darker_c)
9979 hud:shader_set_float(draw_shader, 'u_hp_clip_r', back_r)
9980 hud:rounded_rectangle(-bar_w/2 + inner_pad, -bar_h/2 + inner_pad, bar_w - 2*inner_pad, bar_h - 2*inner_pad, math.max(0, corner_r - 1), back_c)
9981 hud:shader_set_float(draw_shader, 'u_edition', 0)
9982 hud:shader_set_float(draw_shader, 'u_hp_clip_r', 1.0)
9983 end
9984
9985 -- Front HP fill with wall palette (edition 30)
9986 if front_r > 0 then
9987 local pal = wall_palettes[wall_palette_index] or wall_palettes[1]
9988 local ca = pal.wall
9989 local cb = pal.wall2
... [100 more lines]
The v1 bar uses a two-bar front/back tween plus a shader clip (u_hp_clip_r) for the flat decreasing edge. Let me check the attack-template shader and paint pipeline.
Read (E:/a327ex/attack-template/snkrx/ui/paint.lua)
1 --[[
2 ui/paint.lua — edition-backed UI coloring.
3
4 Every UI color is drawn through the edition pipeline. Each of the 18
5 locked palette tokens has a "mimic edition" (50..67) that reproduces
6 its exact color plus a subtle lightness shimmer (see ui_palette_color
7 in assets/draw_shader.frag). So UI elements still read as the locked
8 palette, but they breathe like SNKRX entities.
9
10 How a colored draw works: instead of `layer_rounded_rectangle(ui_layer,
11 ..., c())`, widgets call ui_rrect / ui_rect / ui_text, which bracket
12 the draw with edition_set(ui_layer, edition_for(c), field_scale,
13 dither) / edition_clear. The base color passed is still the token —
14 so at edition 0 the UI renders as the flat locked palette.
15
16 Resolution order for an element's edition (ui_edition_for):
17 1. ui_global_edition, if non-zero — forces the WHOLE UI to one
18 edition (the gallery's preview override).
19 2. an explicit per-element override (opts.edition on a widget).
20 3. the token's mimic edition from ui_color_edition.
21
22 Editions 50..58 (the chrome greys) are flagged in ui_new_editions —
23 the "newly created" set the red-dot audit marks.
24 ]]
25
26 -- Tuning globals — the gallery exposes keys for these.
27 ui_field_scale = 0.4 -- shimmer noise density (UI elements are small)
28 ui_dither = 0 -- dither mode (0 = smooth)
29 ui_global_edition = 0 -- 0 = per-color table; non-zero = force all UI
30
... [103 more lines]
Bash (grep -niE 'scissor|clip|stencil|mask' E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md...)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:28:layer_stencil_mask(layer)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:29:layer_stencil_test(layer)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:30:layer_stencil_test_inverse(layer)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:31:layer_stencil_off(layer)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:330:## System: Clipboard
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:333:clipboard_get() -> string | nil
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:334:clipboard_set(text) -> bool
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:335:clipboard_has_text() -> bool
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:264:### Blend and stencil
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:267:layer_stencil_mask(lyr)
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:268:layer_stencil_test(lyr)
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:269:layer_stencil_test_inverse(lyr)
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:270:layer_stencil_off(lyr)
Bash (grep -n -A4 'stencil' E:/a327ex/Anchor2/docs/ENGINE_API.md | head -50)
220:### layer_stencil_mask
221-
222:`layer_stencil_mask(layer)`
223-
224:Starts writing to the stencil buffer. Subsequent draws write to stencil only (not visible on screen). Use to define a mask shape.
225-
226-```lua
227:layer_stencil_mask(layer)
228:layer_rectangle(layer, 100, 100, 50, 50, rgba(255, 255, 255)) -- draws to stencil only
229:layer_stencil_test(layer)
230:-- subsequent draws only appear where stencil was set
231-```
232-
233:### layer_stencil_test
234-
235:`layer_stencil_test(layer)`
236-
237:Starts testing against the stencil buffer. Subsequent draws only appear where stencil has been written.
238-
239-```lua
240:layer_stencil_mask(layer)
241-layer_circle(layer, 150, 150, 50, rgba(255, 255, 255)) -- mask shape
242:layer_stencil_test(layer)
243-layer_draw_texture(layer, tex, 150, 150) -- only visible inside circle
244:layer_stencil_off(layer)
245-```
246-
247:### layer_stencil_off
248-
249:`layer_stencil_off(layer)`
... [20 more lines]
The engine has a stencil system — that gives the flat decreasing edge cleanly. Let me check the timer module's tag/after signatures.
Bash (grep -nE 'timer_(after|every|tween|cancel|new|update|reset)' E:/a327ex/Anchor2/d...)
7:take state as the first argument (e.g. `timer_update(self.timer, dt)`). The only
95: -- game update: entity updates, timer_update, camera_update, etc.
502:Procedural scheduler. Create with `timer_new()`, update with `timer_update(t, dt)`.
505:timer_new() -> t
506:timer_update(t, dt)
507:timer_cancel(t, name) -- skip the `after` callback
519:timer_after(t, delay, [name,] callback)
520:timer_every(t, delay, [name,] callback, [times,] [after])
522:timer_tween(t, duration, [name,] target, values, [easing,] [after])
526:timer_every_step(t, start_delay, end_delay, times, [name,] callback, [step_method,] [after])
530:- `timer_after` — fire once after delay.
531:- `timer_every` — fire repeatedly every delay; optional `times` count then `after`.
533:- `timer_tween` — interpolate target fields to values with easing; callback receives nothing (target is mutated).
537:- `timer_every_step` — fire `times` times with delays interpolating from start to end.
649:### Easing functions (used with timer_tween)
Bash (sed -n '500,560p' E:/a327ex/Anchor2/docs/FRAMEWORK_API.md)
```
```lua
-- In your rebind UI:
input_capture_start()
-- wait for input in subsequent frames...
local captured = input_capture_get()
if captured then
unbind_all(rebinding_action)
bind(rebinding_action, captured)
input_capture_stop()
end
```
### Raw engine queries
These are engine C functions, not framework wrappers. Always available.
```
key_is_down(key), key_is_pressed(key), key_is_released(key)
mouse_is_down(button), mouse_is_pressed(button), mouse_is_released(button)
mouse_position() -> x, y
mouse_delta() -> dx, dy
mouse_wheel() -> wx, wy
gamepad_is_connected() -> bool
gamepad_get_axis(axis) -> number
```
---
... [31 more lines]
Bash (grep -n -A6 '^### timer_tween|^### timer_after|^### timer_cancel' E:/a327ex/An...)
(Bash completed with no output)
Bash (grep -n 'timer_tween|timer_after|timer_cancel|timer_every' E:/a327ex/Anchor2/...)
1340:- Can be cancelled with `timer_cancel(t, name)`
1348:timer_after(self.timer, 1, function() print('fired') end)
1351:timer_after(self.timer, 0.15, 'shoot_flash', function() self.flashing = false end)
1356:#### `timer_after(t, delay, [name,] callback)`
1361:timer_after(self.timer, 0.5, function() self:explode() end)
1364:#### `timer_every(t, delay, [name,] callback, [times,] [after])`
1371:timer_every(spawn_timer, 1.5, 'spawn', spawn_enemy)
1374:timer_every(self.timer, 0.05, 'blink', function()
1393:#### `timer_tween(t, duration, [name,] target, values, [easing,] [after])`
1401:timer_tween(self.timer, 0.5, 'pos', self, { y = self.y - 18 }, math.cubic_out)
1402:timer_tween(self.timer, 0.5, 'alpha', self, { alpha = 0 }, math.cubic_in, function()
1465:#### `timer_every_step(t, start_delay, end_delay, times, [name,] callback, [step_method,] [after])`
1473:timer_every_step(game_timer, 0.05, 0.5, 5, 'wave', spawn_enemy, math.cubic_out)
1485:timer_cancel(t, name) -- skip the `after` callback
1491:`timer_cancel` marks the entry for removal and does not call its `after`.
1778:Used with `timer_tween` for non-linear interpolation. All take `t` in 0..1 and
Read (E:/a327ex/Anchor2/docs/FRAMEWORK_API.md)
1330 timer_update(self.timer, dt)
1331 -- ...
1332 end
1333 ```
1334
1335 ### Naming convention
1336
1337 Every schedule function accepts an optional `name` string immediately before
1338 the callback. Named entries:
1339
1340 - Can be cancelled with `timer_cancel(t, name)`
1341 - Can be triggered manually with `timer_trigger(t, name)`
1342 - Replace any prior entry with the same name
1343
1344 Anonymous calls get auto-generated internal IDs.
1345
1346 ```lua
1347 -- Anonymous: fire once in 1 second
1348 timer_after(self.timer, 1, function() print('fired') end)
1349
1350 -- Named: replaces any previous 'shoot_flash'
1351 timer_after(self.timer, 0.15, 'shoot_flash', function() self.flashing = false end)
1352 ```
1353
1354 ### Schedule modes
1355
1356 #### `timer_after(t, delay, [name,] callback)`
1357
1358 Fires `callback` once after `delay` seconds.
1359
... [100 more lines]
I have everything I need. Here's the design brief.
Design brief — Fix the HP bar juice
What's wrong now: ui_bar juice is a scale-spring pop + a one-shot white flash + a single trailing value. That's not the SNKRX/Orblike HP feel. v1's HP bar is a two-bar tween (no spring, no flash): a fast-moving colored front bar and a delayed, slow white back bar that exposes the "lost health" chunk.
Approach
Rewrite ui_bar's juice to copy v1's packs_update_ui / draw_pack_ui HP bar:
Two tweened bars. Per-id retained state holds three tweened numbers: front (fraction), back (fraction), shown_value (the displayed HP number).
- On a drop:
fronttweens fast to the new fraction;backwaits a short delay then tweens slowly down to it;shown_valuetweens down to the new number. - On a heal:
frontandbackboth tween up together (white trail is damage-only feedback); any pending back-delay is cancelled. - The white
backbar drawn behind the coloredfrontbar = the lost-health chunk visible between them.
Timer module, tagged. A shared module-level ui_timer = timer_new(), ticked once per frame. Every tween/delay is a named timer entry namespaced by the bar's id — 'bar_front_'..id, 'bar_back_'..id (the delay), 'bar_backtween_'..id, 'bar_value_'..id. Named entries replace any prior entry of the same name (the framework guarantees this), so rapid successive hits debounce correctly: the back bar only starts easing the delay-interval after the last hit, and each new hit re-targets the front/value tweens from their current in-flight position. This is exactly the tag behavior you asked for; it replaces v1's manual ui_back_delay countdown.
Flat decreasing edge. The engine has a stencil system (layer_stencil_mask / _test / _off). Each bar segment is drawn as a full-width rounded rect (so its left corners are properly rounded) but stencil-masked to a plain rectangle [x, x+segment_width] — the mask cuts the right edge flat. This is the no-shader equivalent of v1's u_hp_clip_r clip: rounded on the static (left) end, flat where it's decreasing. Applied to both the front and back bars.
Spring removed. No more layer_push scale-pop, no white-flash window. Track → back bar → front bar → value text, all flat draws.
Interfaces
ui/juice.lua—ui_bar_juiceregistry reshaped to{front, back, shown_value, target, target_value}. New module-levelui_timer.ui_juice_updateticksui_timerinstead of hand-easing the trail; the button/slotui_juicespring registry is untouched.ui_bar_feedrewritten to compare against the stored target and fire the tagged tweens on change.ui/widgets.lua—ui_barrewritten: drops the spring/flash/push, gains a localdraw_bar_segment(r, rad, frac, color, ed)helper doing the stencil-clipped rounded-rect draw.- API change. Health/value mode: pass
opts.value+opts.max(numbers) —ui_barcomputes the fraction itself and draws/tweens thecur / maxtext. Progress mode unchanged:opts.fill(0..1), no text. New optionalopts.back(white trail color, defaultwhite). This breaks the currentopts.value-as-string contract, but the gallery is the only caller. ui/gallery.lua—page_barshealth bar updated tovalue/max; progress bars unchanged.
Functions
ui_bar_feed(id, target_frac, target_value)— first call seeds the registry; later calls detect a change, branch drop/heal, and schedule the taggedtimer_tween/timer_afterentries onui_timer. Returnsfront, back, shown_value.draw_bar_segment(r, rad, frac, color, ed)— stencil-mask a[x, x+frac*w]rect, draw a full-widthui_rrectunder the test, stencil-off. Skips whenfrac <= 0.ui_bar(opts)— resolve fraction (fromvalue/maxorfill); ifid, feed the juice and read backfront/back/shown_value; draw track, back segment (only whenback > front), front segment, value text.
Tunable constants in juice.lua: BAR_FRONT_DUR ≈ 0.18, BAR_BACK_DELAY ≈ 0.15, BAR_BACK_DUR ≈ 0.5, BAR_VALUE_DUR ≈ 0.35 — easings cubic_out (front/value), cubic_in_out (back).
One open question before I write it:
AskUserQuestion
Your questions have been answered: "On a heal, how should the white back bar behave?"="Follow front up together". You can now continue with these answers in mind.
Bash (sed -n '1778,1800p' E:/a327ex/Anchor2/docs/FRAMEWORK_API.md)
Used with `timer_tween` for non-linear interpolation. All take `t` in 0..1 and
return `t'` in 0..1.
```
math.linear(t)
math.sine_in, math.sine_out, math.sine_in_out, math.sine_out_in
math.quad_in, math.quad_out, math.quad_in_out, math.quad_out_in
math.cubic_in, math.cubic_out, math.cubic_in_out, math.cubic_out_in
math.quart_in, math.quart_out, math.quart_in_out, math.quart_out_in
math.quint_in, math.quint_out, math.quint_in_out, math.quint_out_in
math.expo_in, math.expo_out, math.expo_in_out, math.expo_out_in
math.circ_in, math.circ_out, math.circ_in_out, math.circ_out_in
math.bounce_in, math.bounce_out, math.bounce_in_out, math.bounce_out_in
math.back_in, math.back_out, math.back_in_out, math.back_out_in
math.elastic_in, math.elastic_out, math.elastic_in_out, math.elastic_out_in
```
Naming convention:
- `in` — slow start, fast end (accelerating)
- `out` — fast start, slow end (decelerating)
- `in_out` — slow at both ends
- `out_in` — fast at both ends
Heal follows front up together — that's what I'll build. Implementing now.
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/juice.lua snkrx/ui/widgets.lua...)
snkrx/ui/juice.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
All three files syntax-check. Let me sync the stale CLAUDE.md line.
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
<tool_use_error>String to replace not found in file.
String: primary/secondary/danger/ghost; bar (progress / health — health mode
adds the trailing-chunk + white-flash + scale-pop juice).
(note: Edit also tried swapping \uXXXX escapes and their characters; neither form matched, so the mismatch is likely elsewhere in old_string. Re-read the file and copy the exact surrounding text.)</tool_use_error>
Grep (white-flash|trailing-chunk|scale-pop)
581-container). Widgets: slot (inventory cell — selected/locked/disabled/
582-occupied states + drag-target overlay), button (SNKRX-style: flat,
583:scale-pop, inverts white on hover, layered hover sounds; variants
584-primary/secondary/danger/ghost), bar (progress / health — health mode
585:adds the trailing-chunk + white-flash + scale-pop juice).
586-
587-### Editions on the UI
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Grep (ui_bar|ui_bar_feed|ui_bar_juice|ui_juice_scale(.*hp)
Found 3 files
snkrx\ui\gallery.lua
snkrx\ui\widgets.lua
snkrx\ui\juice.lua
Only the three files I touched reference the bar — no stragglers. Done.
What changed:
juice.lua— removed the scale-spring/flash bar juice.ui_bar_juicenow holdsfront/back/shown_value, driven by a sharedui_timer.ui_bar_feedschedules tagged tweens: front + value re-tween on every change; back waits out a re-armedBAR_BACK_DELAYthen eases down (drop) or follows front up (heal). Named timer entries mean overlapping hits debounce — the back delay measures from the last hit, and a mid-tween hit re-targets from the current in-flight position.widgets.lua—ui_barrewritten: nolayer_push/spring/flash. Newdraw_bar_segmentdraws each bar as a full-width rounded rect stencil-masked to its fill width — left corners stay round, the decreasing right edge is a flat cut (no-shader equivalent of v1'su_hp_clip_r). Draw order: track → white back chunk → colored front. API: health mode takesvalue+max(numbers), draws a counting-downcur / maxtext; progress mode still takesfill.gallery.lua/CLAUDE.md— health-bar call updated to the new API; doc line synced.
To test: run the project, F4 → page to bars ([/]). On the Health Bar section:
- damage — front (green) snaps down fast, the white back bar holds ~0.15s then eases slowly down behind it, the
N / 100text counts down. - Click damage rapidly — the white back bar should only start catching up ~0.15s after your last click, not flicker per-hit.
- heal — front and white rise together, no white sliver.
- Check the decreasing (right) edge of the green/white fill is a flat vertical cut, while the bar's outer corners stay rounded.
Tell me how the timing feels — BAR_FRONT_DUR / BAR_BACK_DELAY / BAR_BACK_DUR / BAR_VALUE_DUR at the top of juice.lua are the knobs.
Have the HP bar go down by a flat amount on damage, then linearly go back up to normal after a short while, following the gold UI effect from Emoji Aimer.
I need to see the gold UI effect in Emoji Aimer to copy it correctly. Let me find it.
Bash (ls E:/a327ex/emoji-aimer/ 2>/dev/null; echo "---"; ls E:/a327ex/ | grep -i emoji)
anchor
anchor.exe
assets
design.md
ideas.md
main.lua
reference
run.bat
sap_reference.md
---
emoji-aimer
emoji-ball-battles
emoji-ball-battles-generated
emoji-ball-bounce
Grep (gold)
47:gold = color(248, 168, 48)
48:-- Alias kept under a distinct name because the `gold` global gets
50:-- `gold = 0` near the run-persistent meta block). Anything that needs the
52:-- reference `medal_gold` instead, otherwise tier.color() ends up calling
54:medal_gold = gold
140:-- gold price per shop visit.
420:-- vacuum before the round-end transition fires. 'payout' = mid-screen gold
451:-- Run-persistent meta. gold accumulates from collected resources and is
454:gold = 0
457:-- Shop gold-chip feedback state. gold_display is the *displayed* gold —
458:-- on a buy, real gold drops instantly (so affordability checks are
459:-- correct) and gold_display tweens down to meet it, scrubbing the number
460:-- visibly. gold_chip_y_offset is the "cash register" kick — set positive
462:-- Both tweens are tagged ('gold_tween' / 'gold_offset') on shop_kit_timer
464:-- stacking. Synced to gold on shop entry and on run_reset.
465:gold_display = 0
466:gold_chip_y_offset = 0
469:-- Score-panel display state. Mirrors the gold-chip pattern: score_display
472:-- linearly returns to 0 — same "cash register" thunk the gold chip uses
529:-- after the final round). gold is incremented by total at start_payout
530:-- so the shop's gold chip already reflects the new balance.
531:-- seconds_left and gold_held are stored so the detail strings on the
542: gold_held = 0,
1930:-- red → purple) then caps with the medal tiers (bronze → silver → gold).
1942:-- top of their existing +1 gold.
1955: { combo = 90, color = medal_gold, shake_amp = 4.0, shake_dur = 0.45, score_bonus = 1, coin_chance = 0.25 },
2710: -- gold hit reads as a much bigger event than a fresh yellow hit.
2890: gold = gold + self.value
2893: -- Other resource kinds (gem / crown) still grant gold only.
2901: -- the fingertip so it reads as a gold gain on the cursor itself.
... [32 more lines]
Found it — Emoji Aimer's gold chip does a "cash-register kick": on a buy it sets gold_chip_y_offset = 4 instantly, then timer_tween(... math.linear) returns it to 0 over 0.25s, tagged so rapid buys don't stack.
I'll add that same kick to the HP bar: on damage the whole bar drops a flat 4px instantly, then linearly returns to 0. It's additive — the front/back fill tween stays (the fill still shows HP); the kick is a positional nudge on top, tagged bar_kick_<id> so repeated hits replace rather than stack.
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now ui_bar in widgets.lua — read y_offset and shift all draws.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/juice.lua snkrx/ui/widgets.lua...)
snkrx/ui/juice.lua OK
snkrx/ui/widgets.lua OK
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Both files syntax-check.
What changed:
juice.lua— addedBAR_KICK = 4/BAR_KICK_DUR = 0.25constants and ay_offsetfield to the bar registry. On a drop (not heal),ui_bar_feedsetsy_offset = 4instantly, thentimer_tween(... math.linear)returns it to 0 over 0.25s, taggedbar_kick_<id>— so rapid hits re-fire the full kick instead of stacking. Returnsy_offsetalongside the other eased values.widgets.lua—ui_barreadsy_offsetand draws the whole bar (track, both fill segments, value text) shifted down by it, pixel-floored.
This is the same cash-register thunk as Emoji Aimer's gold chip, additive on top of the existing front/back fill tween.
To test: run the project, F4 → bars page → Health Bar section. Click damage — the whole bar should jolt down 4px and linearly slide back up over ~0.25s, on top of the green fill shrinking and the white trail. Click damage rapidly — each hit re-snaps the bar down (the kick replaces, never stacks). heal does no kick.
Knobs at the top of juice.lua: BAR_KICK (drop distance), BAR_KICK_DUR (return time).
Perfect, you may move on to next elements, your choice.
Glad the HP bar landed well. Moving on — I'll take tabs / segmented controls next: small, interactive, and it unlocks section-switching for the composite screens later. Let me check the mockup first so I propose something grounded.
Bash (grep -niE 'tab|segment' E:/a327ex/Invoker/reference/mockup_ui_kit_2.html | head ...)
96: /* Tabs */
97: .tabs { display: flex; background: var(--charcoal); border-radius: 6px; padding: 3px; gap: 2px; border: 1px solid var(--panel-border); width: fit-content; }
98: .tab { padding: 6px 14px; border-radius: 4px; font-size: 13px; font-weight: 700; color: var(--text-muted); }
99: .tab.active { background: var(--panel-fill); color: var(--text); }
101: /* Segments */
102: .segments { display: flex; background: var(--charcoal); border-radius: 6px; padding: 3px; gap: 2px; border: 1px solid var(--panel-border); width: fit-content; }
103: .segment { padding: 6px 12px; border-radius: 4px; font-size: 14px; color: var(--text-muted); }
104: .segment.active { background: var(--bg); color: var(--green); border: 1px solid var(--green); padding: 5px 11px; }
202: General UI elements: panel chrome variants, buttons, tabs, badges, rarity labels, form controls, keybinds, progress bars, tooltips. Same locked palette as kit_1.
207: Rarity colors: <strong>common</strong>=text-muted, <strong>uncommon</strong>=green, <strong>rare</strong>=light-blue, <strong>epic</strong>=violet, <strong>legendary</strong>=orange, <strong>mythic</strong>=pink. Form-control on/checked = <strong>green</strong>. Tab track = <strong>charcoal</strong>; active tab on <strong>panel-fill</strong>. Segment-active = <strong>bg</strong> + <strong>green</strong> outline. Tags/keycaps = <strong>charcoal</strong> bg + <strong>panel-border</strong> outline. Notification dots reuse the accent palette plus <strong>grey</strong> for neutral.
270:<!-- 03 TABS / SEGMENTS -->
273: <div class="section-label"><span class="num">03</span> TABS</div>
274: <div class="tabs">
275: <div class="tab active">shop</div>
276: <div class="tab">skills</div>
277: <div class="tab">inventory</div>
278: <div class="tab">options</div>
282: <div class="section-label"><span class="num">03</span> SEGMENTS</div>
283: <div class="segments">
284: <div class="segment">⚔</div>
285: <div class="segment active">⛨</div>
286: <div class="segment">◎</div>
287: <div class="segment">…</div>
The kit-2 mockup has a charcoal rounded track holding cells: tabs (text labels, active fills with panel-fill) and segments (icon glyphs, active gets a bg cell with a green outline). They're structurally the same widget — a track with one-of-N selected. A few design calls before I write the brief.
AskUserQuestion
Your questions have been answered: "Tabs and segments share a track + one-active-cell structure. One widget or two?"="One unified ui_tabs", "Should tab cells carry the SNKRX hover juice the buttons/slots use?"="Match buttons", "When the active cell changes, how should the highlight move?"="Instant snap". You can now continue with these answers in mind.
Decisions noted: one unified ui_tabs, button-style hover juice, instant snap. Here's the design brief.
Design brief — Chunk 7b: ui_tabs
Approach. A unified immediate-mode ui_tabs widget (interactive → widgets.lua): a charcoal rounded track holding N equal-width cells, one of them active. Active selection is caller-owned (like ui_slot's selected / the gallery's gallery_sel) — the widget reports which cell was clicked; the caller updates its own active var.
Two visual variants from the kit-2 mockup, chosen by opts.variant:
'tab'(default) — text labels. Active cell =panel_fillrounded fill +textcolor. Inactive = no fill,text_muted.'segment'— glyph cells. Active cell =bgfill + 1pxgreenborder (the two-rect trick) +greenglyph. Inactive = no fill,text_muted.
Both: inactive cell brightens text_muted → text on hover. Each cell carries the SNKRX juice — its own ui_juice id (<id>_<i>), scale-pop on hover-enter + click, layered hover sound — exactly like ui_button/ui_slot. Active highlight snaps instantly to the clicked cell (no slide), so the widget stays fully stateless apart from the shared juice registry.
Layout. Track drawn via ui_panel (bg = charcoal, radius default 6 — so it picks up the audit dot like other chrome). Cell area = track contracted by pad + 1 (3px mockup padding + 1px border). Cells are equal-width with a 2px gap, integer-snapped by flooring each cell's left/right edge (remainder distributed, crisp pixels). Default cell font: ui_font_body for tabs, ui_font_header_l (Awesome) for segment glyphs.
Interfaces. Pure addition. widgets.lua gains ui_tabs; it reuses ui_panel, ui_rrect, ui_text, the ui_state hot/active/click machine, and ui_juice_hover/ui_juice_pull/ui_juice_scale — same patterns as ui_button. No new juice machinery. gallery.lua gets a new page_tabs (prepended to ui_gallery_pages per the front-is-newest rule) with file-local gallery_tab / gallery_seg selection state. CLAUDE.md element-set line updated.
Functions.
ui_tabs(opts) -> { active, clicked }—opts:rect,id,items(array of label/glyph strings),active(1-based index),variant,font?,radius?(6),pad?(3),edition?. Draws the track, loops the cells (hit-test untransformed, draw inside a per-celllayer_pushscale), returnsclicked(index or nil) andactive(=clicked or opts.active, the convenient "new active" value).page_tabs(lyr)— a tab-variant row (4 text tabs) and a segment-variant row (4 glyph cells), each click-selectable via the file-local state.
One note: for the segment demo I'll use plain letter glyphs (the mockup's ⚔/☸/◎ aren't guaranteed in the pixel Awesome font — the ui_item_icon tiles already use letters for the same reason). Real games pass whatever glyphs their font has.
Sound good?
Yes.
Implementing ui_tabs and the gallery page.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/widgets.lua snkrx/ui/gallery.l...)
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Bash (grep -n 'ui_slot, ui_button, ui_bar|the stencil).' E:/a327ex/attack-template/....)
588:the decreasing edge via the stencil).
Bash (grep -nE 'widgets.lua|interactive (' E:/a327ex/attack-template/.claude/CLAUDE....)
573:- `widgets.lua` — interactive (consult ui_state + juice): `ui_slot`,
704: ├── widgets.lua # interactive: slot / button / bar
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
573 - `widgets.lua` — interactive (consult ui_state + juice): `ui_slot`,
574 `ui_button`, `ui_bar`.
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Both files syntax-check, docs synced.
What's new — ui_tabs:
- A unified segmented selector in
widgets.lua— a charcoal rounded track of N equal-width cells, one active. Active index is caller-owned; the widget returnsclicked(index or nil) andactive. variant = 'tab'(default) — text labels, active cell fillspanel_fill.variant = 'segment'— glyph cells, active gets abgcell with a green outline + green glyph.- Inactive cells brighten
text_muted → texton hover; each cell carries the same SNKRX scale-pop + hover-sound juice asui_button. Active highlight snaps instantly. - New gallery tabs page (now page 1/8) with a click-selectable text-tab strip and a glyph-segment strip.
To test: run the project, F4 opens on the tabs page:
- 01 Tabs — click
shop/skills/inventory/options; the active cell fills withpanel_fill, the readout text updates, cells scale-pop and play the hover sound on hover. - 02 Segments — click the
A–Dglyph cells; the active one gets a green-outlinedbgcell. - Check the cells sit cleanly inside the track with even gaps, and inactive cells brighten on hover.
[ / ] pages to the rest. Let me know how it feels and what's next.
Try tabs with the other bigger fonts too.
Good idea — I'll show the tab strip in the larger fonts. This is a gallery-page tweak, so no brief.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
Syntax-checks clean.
What changed: the gallery tabs page now shows the text-tab strip in three rows — Awesome 16, FatPixel 8, PixulBrush 8 — each captioned with its font name. Each strip's track height adapts to the font (font.height + 14) so the bigger fonts get a tall enough cell. All three rows share one gallery_tab active index, so clicking any row moves the highlight on all of them. The Segments section follows below.
To test: F4 → tabs page. Compare the strips:
- Check each font sits cleanly inside its cell — no clipping, especially FatPixel which renders tall.
- Click cells in any row; the active highlight should move in lockstep across all three font rows.
- The
active: <name>readout is top-right.
Tell me which font reads best for tabs, or if any overflow/baseline issues show up.
Remove the fat pixel and awesome ones. You can also move on to the next elements.
Removing the FatPixel and Awesome rows — keeping the PixulBrush strip.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
---FORM CONTROLS---
141: .checkbox-row { display: flex; align-items: center; gap: 8px; font-size: 13px; }
142: .check-box { width: 18px; height: 18px; background: var(--charcoal); border: 1px solid var(--panel-border); border-radius: 3px; display: inline-flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 700; }
143: .check-box.checked { background: var(--green); color: var(--text); border-color: var(--green); }
147: .radio-group { display: flex; gap: 16px; }
148: .radio-row { display: flex; align-items: center; gap: 6px; font-size: 13px; }
149: .radio { width: 14px; height: 14px; border: 1px solid var(--panel-border); border-radius: 50%; background: var(--charcoal); display: inline-flex; align-items: center; justify-content: center; }
150: .radio.checked::after { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--green); }
151: .toggle { display: inline-flex; align-items: center; background: var(--charcoal); border: 1px solid var(--panel-border); border-radius: 12px; padding: 0; overflow: hidden; }
152: .toggle .opt { padding: 3px 12px; font-size: 11px; font-weight: 700; color: var(--text-muted); }
153: .toggle .opt.active { background: var(--green); color: var(--text); }
362: <div class="form-label">checkbox</div>
363: <div class="checkbox-row"><span class="check-box checked">✓</span> enable option</div>
374: <div class="form-label">radio buttons</div>
375: <div class="radio-group">
376: <div class="radio-row"><span class="radio checked"></span> option one</div>
377: <div class="radio-row"><span class="radio"></span> option two</div>
385: <div class="form-label">toggle</div>
386: <div class="toggle"><span class="opt">off</span><span class="opt active">on</span></div>
Tabs page cleaned up (PixulBrush strip only) — syntax-checks clean.
Next element: form controls — checkbox + radio. Design brief:
Design brief — Chunk 7c: ui_checkbox + ui_radio
Approach. Two small interactive form-control widgets (→ widgets.lua). Each is an indicator + an optional label, the whole row clickable, carrying the SNKRX juice (indicator scale-pops on hover/click, hover sound) — same ui_state + ui_juice substrate as ui_button/ui_tabs.
ui_checkbox(opts) -> {checked, clicked}— a boolean toggle. Indicator = a rounded square (radius 3): off ischarcoalfill +panel_border1px border; on isgreenfill. Returnsclickedandchecked(the already-toggled value, for the caller to store).ui_radio(opts) -> {selected, clicked}— one radio button; the caller places each and owns the group var (like the gallery'sgallery_selpattern). Indicator = a circle (aui_rrectwith radius = side/2 — no new primitive): off ischarcoal+panel_border; on adds a centeredgreendot.
Both: opts.rect is the indicator box (~16px square). opts.label optional — drawn to its right (gap 6, body font, text color, vertically centered). The hover/click hit region spans indicator plus label. Off-state border brightens to grey on hover.
Interfaces. Pure addition to widgets.lua. A shared file-local helper runs the hot/active/click machine + juice (the same block ui_button uses); ui_checkbox/ui_radio call it, scale-layer_push the indicator by its juice, draw indicator + label. Reuses ui_rrect/ui_text. New page_form gallery page (prepended) with file-local checkbox/radio state. CLAUDE.md element set updated.
The mockup's pill toggle is just a 2-item ui_tabs — I'll fold that in when needed, not as a separate widget. Dropdown + text input (they need popup layering / the typed-text buffer) are a later chunk.
One visual decision:
AskUserQuestion
Your questions have been answered: "How should a checked checkbox show its 'on' state?"="Green fill + geometric tick". You can now continue with these answers in mind.
Green fill + geometric tick. Implementing now.
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
425 if is_active and variant == 'segment' then
426 ui_rrect(lc.x, lc.y, lc.w, lc.h, cell_rad, green, ed)
427 ui_rrect(lc.x + 1, lc.y + 1, lc.w - 2, lc.h - 2,
428 math.max(0, cell_rad - 1), bg, ed)
429 elseif is_active then
430 ui_rrect(lc.x, lc.y, lc.w, lc.h, cell_rad, panel_fill, ed)
431 end
432
433 -- Cell label — active is text / green; inactive brightens on hover.
434 local tc
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
435 if is_active then
436 tc = (variant == 'segment') and green or text
437 else
438 tc = hovered and text or text_muted
439 end
440 ui_text({ rect = lc, text = items[i], font = font, color = tc,
441 align_h = 'center', align_v = 'center', edition = ed })
442
443 layer_pop(ui_layer)
444 end
445
446 return { active = clicked or active, clicked = clicked }
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
446 return { active = clicked or active, clicked = clicked }
447 end
448
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the gallery page.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/widgets.lua snkrx/ui/gallery.l...)
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Both files syntax-check, docs synced.
What's new — ui_checkbox + ui_radio (in widgets.lua):
- Each is an indicator + optional label, the whole row clickable, with the SNKRX scale-pop + hover-sound juice (shared
form_control_interacthelper, same machine asui_button). - Checkbox — rounded square: off =
charcoal+panel_borderborder; on =greenfill + a geometric checkmark (two rotated rects viadraw_checkmark, no font dependency). Returns the already-toggledchecked. - Radio — a circle (
ui_rrectwith radius = side/2): off =charcoal+ border ring; on adds a centeredgreendot. Caller owns the group var. - Off-state borders brighten to
greyon hover. - New gallery form page (now page 1/9) — two checkboxes + a 3-option radio group, all click-interactive.
To test: F4 opens on the form page:
- 01 Checkbox — click the boxes or their labels; toggles between charcoal box and green box + checkmark; indicator scale-pops, hover sound plays.
- 02 Radio — click any option (or its label); the green dot moves; only one stays selected.
- Check the geometric tick reads as a clean checkmark at 16px — that's the part most likely to need tuning (
draw_checkmark's point fractions / thickness).
[/] pages through the rest. Let me know how the tick looks and what's next.
Looks good, checkbox doesn't seem to untick, though.
Bug found — the clicked and (not on) or on idiom collapses: when on is true, not on is false, so the ... and false or on chain falls through to on and never returns false.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
widgets.lua OK
Fixed. The a and b or c idiom broke because not on evaluates to false exactly in the untick case, so the expression fell through to on. Replaced with an explicit if.
To test: F4 → form page, click a checked checkbox — it should now untick (green box → charcoal box), and toggle freely both ways.
Great, go ahead.
Next: slider — it rounds out the simple form controls (dropdown + text input need heavier machinery, later). Let me check the mockup.
Bash (grep -niE 'slider|range|.handle|.thumb|.track' E:/a327ex/Invoker/reference/mo...)
21: --orange: rgb(233, 108, 27);
56: .orange-text { color: var(--orange); }
111: .chip.new { color: var(--orange); }
114: .chip.legendary { color: var(--orange); }
128: .rarity.legendary { color: var(--orange); }
154: .slider { display: flex; align-items: center; gap: 8px; }
155: .slider .track { flex: 1; height: 5px; background: var(--charcoal); border-radius: 3px; position: relative; }
156: .slider .fill { position: absolute; left: 0; top: 0; bottom: 0; background: var(--green); border-radius: 3px; }
157: .slider .knob { position: absolute; top: 50%; width: 12px; height: 12px; background: var(--green); border-radius: 50%; transform: translate(-50%, -50%); }
177: .tile.sword { background: var(--orange); }
207: Rarity colors: <strong>common</strong>=text-muted, <strong>uncommon</strong>=green, <strong>rare</strong>=light-blue, <strong>epic</strong>=violet, <strong>legendary</strong>=orange, <strong>mythic</strong>=pink. Form-control on/checked = <strong>green</strong>. Tab track = <strong>charcoal</strong>; active tab on <strong>panel-fill</strong>. Segment-active = <strong>bg</strong> + <strong>green</strong> outline. Tags/keycaps = <strong>charcoal</strong> bg + <strong>panel-border</strong> outline. Notification dots reuse the accent palette plus <strong>grey</strong> for neutral.
346: <span class="notif-dot" style="background: var(--orange);"></span>
393: <div class="form-label">slider</div>
394: <div class="slider">
Bash (sed -n '392,402p' E:/a327ex/Invoker/reference/mockup_ui_kit_2.html)
<div class="form-row">
<div class="form-label">slider</div>
<div class="slider">
<div class="track">
<div class="fill" style="width: 75%;"></div>
<div class="knob" style="left: 75%;"></div>
</div>
<span class="muted" style="font-size: 11px;">75%</span>
</div>
</div>
<div class="form-row">
Read (E:/a327ex/attack-template/snkrx/ui/state.lua)
1 --[[
2 ui/state.lua — frame-local UI interaction state.
3
4 `ui_state` holds the three interaction IDs, rebuilt every frame:
5 hot_id widget under the cursor this frame
6 active_id widget the mouse-down landed on (persists until release)
7 focus_id widget last clicked (persists until the next click)
8
9 `ui_state_begin_frame()` clears hot_id; call it once per frame before
10 any widget calls (the gallery does this in ui_gallery_update; a real
11 game calls it once per frame too). Widget IDs are explicit, caller-
12 provided strings — no auto-IDs.
13
14 This is the rules-based, frame-local interaction layer the project's
15 action-vs-rules UI doctrine sanctions — it is NOT hidden persistent
16 state. Persistent UI state (what occupies a slot, a drag in progress)
17 is action-based and lives in caller-owned data, never here.
18 ]]
19
20 ui_state = { hot_id = nil, active_id = nil, focus_id = nil }
21
22 function ui_state_begin_frame()
23 ui_state.hot_id = nil
24 end
25
26 function ui_is_hot(id) return ui_state.hot_id == id end
27 function ui_is_active(id) return ui_state.active_id == id end
28 function ui_is_focused(id) return ui_state.focus_id == id end
29
30 -- Point-in-rect test. r is a {x, y, w, h} table (a RectCut rect).
... [19 more lines]
The slider is a thin charcoal track + green fill + a green circular knob. Design brief:
Design brief — Chunk 7d: ui_slider
Approach. A draggable slider (→ widgets.lua). opts.rect is the slider's footprint (e.g. 200×14); inside it a thin track strip is drawn, with a circular knob riding on the value. This is the toolkit's first drag widget — but it needs no new machinery: ui_state.active_id already persists from mouse-down to mouse-up, so "is being dragged" is just active_id == id.
- Value model:
opts.valueis a plain 0..1 fraction (caller maps to any range and draws its own value text, like the progress bars on the bars page). Returns{ value, changed }. - Track: full-width strip,
track_htall (default 5),charcoal, stadium-rounded (radius = track_h/2), vertically centered in the rect. - Fill: same strip from the left edge to the knob center,
green. - Knob: a 12px
greencircle (aui_rrectwith radius = 6) centered on the value, riding the rect's vertical center. It carries the SNKRX juice — scale-pop on hover-enter / grab + hover sound, like the other widgets. - Knob travel is inset by the knob radius so it never clips the rect:
knob_cx = rect.x + r + value*(rect.w - 2r). Pressing anywhere on the rect grabs and jumps the value to the cursor; dragging (even off the track) keeps tracking until release.
Interfaces. Pure addition to widgets.lua. ui_slider has its own small interaction block (press→hold→release — different from form_control_interact's press→click, so not shared): ui_claim_hot for hover, mouse_is_pressed/mouse_is_released for grab/let-go, mouse_position() for the drag x (same coord space as the rects, per ui_claim_hot). Reuses ui_rrect, ui_juice_*. New section 03 Slider added to the existing page_form gallery page, with a file-local gallery_volume and a % readout text. CLAUDE.md element set updated.
Functions.
ui_slider(opts) -> { value, changed }—opts:rect,id,value(0..1),track_h?(5),knob?(12),edition?. Computes hover/grab, maps cursor x → value while active, draws track + fill un-pushed and the knob inside a scalelayer_push.page_formgains the slider section.
Steps/snapping is deferred — continuous only for now, matching the mockup. Sound good?
Yes.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/widgets.lua snkrx/ui/gallery.l...)
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Both files syntax-check, docs synced.
What's new — ui_slider (in widgets.lua):
- A draggable slider — thin
charcoaltrack +greenfill + a 12pxgreencircular knob. Value is a plain 0..1 fraction; returns{ value, changed }. - Press anywhere on the rect grabs the knob and jumps the value to the cursor; the drag keeps tracking even off the track until release (
ui_state.active_idpersisting is the drag state — no new machinery). - Knob carries the SNKRX scale-pop + hover-sound juice; knob travel is inset by its radius so it never clips the rect.
- New section 03 Slider on the form gallery page with a
gallery_volumedemo +%readout.
To test: F4 → form page, section 03:
- Drag the knob — the green fill and
%readout follow it. - Click anywhere on the track — the knob jumps there and you're immediately dragging.
- Drag past the ends / off the track — value clamps to 0–100% and the drag stays grabbed until you release.
- Knob scale-pops and plays the hover sound on hover.
Let me know how the drag feels and what's next.
Works great, what's next? Tackle multiple elements at a time if you can.
The user's happy and wants me to batch elements. Remaining: tooltip, list rows, cards, dropdown, text input. I'll group tooltip + list row — both are content/composite elements that compose from existing primitives, cohesive and low-risk. Let me check the mockups.
Bash (echo "=== KIT1 tooltip ==="; grep -niE 'tooltip|tip-' E:/a327ex/Invoker/referenc...)
=== KIT1 tooltip ===
239: /* --- TOOLTIP ---------------------------------------------------- */
240: .tooltip {
248: .tooltip .body { flex: 1; }
249: .tooltip .title { font-weight: 700; font-size: 16px; margin-bottom: 2px; }
250: .tooltip .desc { color: var(--text-muted); font-size: 12px; line-height: 1.4; margin-bottom: 4px; }
251: .tooltip .meta { font-size: 11px; color: var(--text-muted); }
252: .tooltip .meta .tier { color: var(--text); }
362: <strong>charcoal</strong> = nested panels inside other panels (the inline reroll panel and icon buttons in the top bar). <strong>slot-fill</strong> = empty slot interior. <strong>grey</strong> = secondary button + slot hover border. <strong>panel-border</strong> = all panel/slot outlines, also empty wave pips. <strong>text-muted</strong> = secondary text + tooltip body + section descriptions. <strong>Tile pictogram color</strong> = <strong>text</strong> (240,240,235), not pure white.
551: 06 WAVE / 07 COMBAT / 08 TOOLTIP
587: <div class="section-label"><span class="num">08</span> TOOLTIPS
590: <div class="tooltip">
=== KIT3 list ===
43: .row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
44: .row.tight { gap: 6px; }
45: .row.gap-md { gap: 16px; }
137: /* Inventory list */
138: .inv-list { background: var(--panel-fill); border: 1px solid var(--panel-border); border-radius: 6px; overflow: hidden; }
139: .inv-list .head, .inv-list .row-i { display: grid; grid-template-columns: 36px 1fr 80px 50px 70px 50px; gap: 12px; align-items: center; padding: 8px 12px; font-size: 12px; }
140: .inv-list .head { background: var(--charcoal); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; font-size: 10px; font-weight: 700; }
141: .inv-list .row-i { border-top: 1px solid var(--panel-border); }
142: .inv-list .row-i .iname { font-weight: 700; }
171: Inventory, character, and orb-system elements: grids, item cell states, item tooltips, list views, orb cards, paper-doll, drop targets. Same locked palette as kit_1.
430: <!-- 07 INVENTORY LIST -->
432: <div class="section-label"><span class="num">07</span> INVENTORY EXAMPLE (LIST)</div>
433: <div class="inv-list">
Bash (echo "=== tooltip css 239-260 ==="; sed -n '239,260p' E:/a327ex/Invoker/referenc...)
=== tooltip css 239-260 ===
/* --- TOOLTIP ---------------------------------------------------- */
.tooltip {
display: flex; gap: 12px;
background: var(--panel-fill);
border: 1px solid var(--panel-border);
border-radius: 6px;
padding: 10px 12px;
max-width: 360px;
}
.tooltip .body { flex: 1; }
.tooltip .title { font-weight: 700; font-size: 16px; margin-bottom: 2px; }
.tooltip .desc { color: var(--text-muted); font-size: 12px; line-height: 1.4; margin-bottom: 4px; }
.tooltip .meta { font-size: 11px; color: var(--text-muted); }
.tooltip .meta .tier { color: var(--text); }
/* --- BUTTONS ---------------------------------------------------- */
.btn {
display: inline-flex; align-items: center; gap: 6px;
padding: 6px 18px;
border-radius: 6px;
font-size: 14px; font-weight: 700;
border: none;
=== tooltip html 587-605 ===
<div class="section-label"><span class="num">08</span> TOOLTIPS
<span class="desc">clear, informative, and tier aware</span>
</div>
<div class="tooltip">
<div class="tile sm target">◎</div>
... [49 more lines]
Both compose cleanly from existing primitives. Here's the brief for the pair.
Design brief — Chunk 7e: ui_tooltip + ui_list_row
ui_tooltip (→ primitives.lua, pure draw)
A self-sizing info panel — the kit-1 tooltip: panel_fill panel + panel_border border, an optional icon tile on the left, and a content column of title / description line(s) / a meta line.
opts:x, y(caller positions it — near the cursor, etc.),icon?({fill, glyph}),title,title_color?(defaulttext),desc(a string or array of strings — each is its own line, so no text-wrapping needed),meta?(rich-text runs — the[tier 2][mage — psion]bracket motif, drawn viaui_rich_text),edition?.- Auto-sizes: width =
pad + (icon + gap)? + max(title, desc lines, meta widths) + pad; height = the stacked content + padding. Returns its{x,y,w,h}rect (likeui_label). - Fonts: title
ui_font_header_l, desc body font, metaui_font_pixul— the established hierarchy. Reusesui_panel,ui_item_icon,ui_text,ui_rich_text— no new machinery.
ui_list_row (→ widgets.lua, interactive)
One row of a list/table — a full-width row the caller stacks to build an inventory list, quest list, etc. The toolkit ships the row; the surrounding container panel + scrolling are per-game composition (the gallery will compose a small list to show it).
opts:rect(the row band),id(omit → static),cells(column spec),selected?bool,header?bool,edition?.cellsis an array; each cell is{ w=N }(fixed width) or{ flex=true }(splits the leftover), plustext/color?/align?/icon?({fill,glyph}) /font?. The row lays them left-to-right with a fixed gap + horizontal padding, flooring edges.- States: normal = transparent (container shows through); hover =
charcoalbg; selected =charcoalbg + a 2pxgreenleft-edge accent. A 1pxpanel_borderseparator along the bottom edge.header = true→charcoalbg,text_mutedcells, no separator, no interaction. - Returns
{ hovered, clicked }.
Gallery
New page_content (prepended): a tooltip up top, and below it a small inventory list — a ui_panel container with a header row + 3 data ui_list_rows (icon + colored name + type/tier/value columns), one selectable via file-local state.
One interaction question:
AskUserQuestion
Your questions have been answered: "How much juice should a list row get on hover/click?"="Background highlight only". You can now continue with these answers in mind.
List rows: background highlight + hover sound, no scale-pop. Implementing both widgets.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Bash (grep -nE 'primitives.lua|rarity_color|item-icon tile|# panel / text|# interacti...)
571:- `primitives.lua` — pure draw: `ui_panel`, `ui_text`, `ui_divider`,
572: `ui_item_icon`, `ui_rich_text`, `ui_label`, + `rarity_color`.
580:Primitives: panel, single-line aligned text, divider, item-icon tile,
711: ├── primitives.lua # panel / text / divider / item_icon / rich_text / label
712: ├── widgets.lua # interactive: slot / button / bar / tabs / checkbox / radio / slider
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
580 Primitives: panel, single-line aligned text, divider, item-icon tile,
581 rich_text (one line, multi-colored runs), label (dark rounded
582 container). Widgets: slot (inventory cell — selected/locked/disabled/
583 occupied states + drag-target overlay), button (SNKRX-style: flat,
584 scale-pop, inverts white on hover, layered hover sounds; variants
585 primary/secondary/danger/ghost), bar (progress / health — health mode
586 is the v1 two-bar tween: a fast `front` bar + a delayed slow white
587 `back` bar exposing the lost-health chunk, a counting-down value text,
588 and the Emoji-Aimer cash-register kick on damage; fill is flat-cut on
589 the decreasing edge via the stencil), tabs (a charcoal track of
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
All three files syntax-check, docs synced.
What's new — two elements:
ui_tooltip (primitives.lua) — a self-sizing info panel: panel chrome + optional icon tile + a content column (title / description line(s) / meta rich-text). Auto-sizes to content (desc is a pre-broken array of lines, no wrapping); returns its rect so the caller can place follow-up UI.
ui_list_row (widgets.lua) — one row of a list/table. Takes a cells column spec (fixed w or flex cells, each with text/color/align/icon). Hover = charcoal bg, selected = charcoal bg + 2px green left accent, 1px bottom separator; header = true gives a charcoal muted-text column-header row. Background highlight + hover sound, no scale-pop.
New gallery content page (now 1/10): a tooltip up top, and a composed inventory list — a ui_panel container + a header row + 3 selectable data rows (icon + colored name + type/tier/value columns).
To test: F4 opens on the content page:
- 01 Tooltip — check the panel hugs its content, icon vertically centered, title/desc/meta stacked cleanly.
- 02 List — hover rows (charcoal highlight + sound), click to select (green left accent), header row stays inert; check the columns line up between header and data rows.
[/] for the rest. Let me know how they look and what's next.
Looks good
The remaining mockup vocabulary after this chunk:
- Cards — kit-1 ability cards, kit-3 item card. Visually distinctive; worth its own focused pass (and a reference check, given the buttons/tags history).
- Dropdown + text input — the heavier form controls. Dropdown needs popup layering (drawing above everything, click-outside-to-close); text input needs the engine's typed-text buffer + a caret. A natural pair, but more machinery than anything so far.
- Tier-3 composites — full screens (HUD, inventory, shop, world map, dialogue, modals). Built from the elements; decided per-element whether they belong in the toolkit at all.
Want me to keep going? If so, which next — cards, or the dropdown + text input pair? Or pause the element work here and do the consistency pass (the "all elements on one screen" page) now that there's a fuller set to compare.
Do cards and text input, dropdown is not necessary, or is it? Can we do equivalent of multiple options with the UI elements we do have? I think we can, right?
You're right — a dropdown's only unique value is collapsing many options into a popup to save space. For "pick one of N" we already have ui_tabs (compact horizontal segmented selector) and ui_radio (vertical option group). A SNKRX-style game UI rarely has a select so long it needs collapsing — settings use tabs/segments/radios fine. So: skip the dropdown, do cards + text input. Let me check the mockups.
Bash (echo "=== KIT1 card ==="; grep -niE 'card|ability' E:/a327ex/Invoker/reference/m...)
=== KIT1 card ===
281: /* --- ABILITY CARD ----------------------------------------------- */
282: .ability-card {
291: .ability-card .icon {
297: .ability-card .name { font-size: 18px; font-weight: 700; }
298: .ability-card .desc {
304: .ability-card .price {
314: .ability-card .price::after {
321: .ability-card.fire .name { color: var(--red); }
322: .ability-card.fire .icon { background: var(--red); }
323: .ability-card.fire .price { background: var(--red); }
324: .ability-card.frost .name { color: var(--light-blue); }
325: .ability-card.frost .icon { background: var(--light-blue); }
326: .ability-card.frost .price { background: var(--blue); }
327: .ability-card.shoot .name { color: var(--green); }
328: .ability-card.shoot .icon { background: var(--green); }
329: .ability-card.shoot .price { background: var(--green); }
483: <div class="ability-card fire" style="padding: 10px;">
488: <div class="ability-card frost" style="padding: 10px;">
632: ABILITY CARDS
635: <div class="section-label">ABILITY CARDS
=== KIT3 card ===
144: /* Orb card */
145: .orb-card { background: var(--panel-fill); border: 1px solid var(--panel-border); border-radius: 6px; padding: 14px; max-width: 260px; }
146: .orb-card .top { display: flex; gap: 12px; align-items: center; margin-bottom: 10px; }
147: .orb-card .orb-name { font-weight: 700; font-size: 16px; }
148: .orb-card .orb-tier { font-size: 11px; color: var(--text-muted); }
149: .orb-card .sockets { display: grid; grid-template-columns: repeat(4, 28px); gap: 6px; margin-bottom: 10px; }
150: .orb-card .socket { width: 28px; height: 28px; border-radius: 5px; background: var(--slot-fill); border: 1px solid var(--panel-border); display: flex; align-items: center; justify-content: center; }
... [16 more lines]
Bash (echo "=== KIT1 ability-card css 281-330 ==="; sed -n '281,330p' E:/a327ex/Invoke...)
=== KIT1 ability-card css 281-330 ===
/* --- ABILITY CARD ----------------------------------------------- */
.ability-card {
background: var(--panel-fill);
border: 1px solid var(--panel-border);
border-radius: 6px;
padding: 14px 14px 10px;
display: flex; flex-direction: column; gap: 8px;
align-items: center;
text-align: center;
}
.ability-card .icon {
width: 56px; height: 56px;
border-radius: 8px;
display: flex; align-items: center; justify-content: center;
color: var(--text); font-size: 30px; font-weight: 700;
}
.ability-card .name { font-size: 18px; font-weight: 700; }
.ability-card .desc {
font-size: 12px;
color: var(--text-muted);
line-height: 1.4;
min-height: 50px;
}
.ability-card .price {
color: var(--text);
padding: 4px 12px;
border-radius: 4px;
font-size: 13px; font-weight: 700;
display: inline-flex; align-items: center; gap: 4px;
... [53 more lines]
Bash (echo "=== engine typed-text API ==="; grep -niE 'typed_text|text_input|key_is_pr...)
=== engine typed-text API ===
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:235:key_is_pressed(key) -> bool
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:343:hotkey_is_pressed(id) -> bool
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:170:key_is_down(key), key_is_pressed(key), key_is_released(key)
=== attack-template main.lua typed text ===
113: engine_get_typed_text() -- drain SDL text input every frame
=== arena typed text usage ===
Bash (grep -niE 'typed|text_input|engine_get_typed' E:/a327ex/Anchor2/docs/ENGINE_API....)
---
Bash (grep -rniE 'typed_text|typed text|text input|begin_text|start_text' E:/a327ex/An...)
2649:// Input state - Typed text queue (bounded, drained per-frame by Lua).
2652:// for the final glyph). Lua drains this via engine_get_typed_text() and
2657:static char typed_text[MAX_TYPED_EVENTS][MAX_TYPED_LEN];
2660:static void enqueue_typed_text(const char* text) {
2662: snprintf(typed_text[typed_count], MAX_TYPED_LEN, "%s", text);
9042:// engine_get_typed_text: returns all SDL_TEXTINPUT events received since
9045:// local t = engine_get_typed_text()
9051:static int l_engine_get_typed_text(lua_State* L) {
9055: luaL_addstring(&b, typed_text[i]);
9649: lua_register(L, "engine_get_typed_text", l_engine_get_typed_text);
10437: enqueue_typed_text(event.text.text);
Bash (sed -n '9042,9075p' E:/a327ex/Anchor2/engine/src/anchor.c)
// engine_get_typed_text: returns all SDL_TEXTINPUT events received since
// the last call concatenated into one UTF-8 string. Drains the queue on
// read. Returns an empty string if nothing was typed. Lua-side use:
// local t = engine_get_typed_text()
// if t ~= '' then insert_at_caret(t) end
// Returns text only — control keys (arrows, backspace, enter, ctrl combos,
// etc.) come through key_is_pressed/down/released, not this function. SDL
// also suppresses text-input events while modifier keys are held, so
// chords like Ctrl+S don't pollute the typing stream.
static int l_engine_get_typed_text(lua_State* L) {
luaL_Buffer b;
luaL_buffinit(L, &b);
for (int i = 0; i < typed_count; i++) {
luaL_addstring(&b, typed_text[i]);
}
luaL_pushresult(&b);
typed_count = 0;
return 1;
}
// engine_init: Creates window and initializes graphics
// Must be called from Lua (via framework) after configuration is set
static int l_engine_init(lua_State* L) {
if (engine_initialized) {
return luaL_error(L, "engine_init can only be called once");
}
if (headless_mode) {
// Headless: skip all graphics initialization
printf("Headless mode: skipping window and graphics initialization\n");
... [4 more lines]
Confirmed — dropping the dropdown. ui_tabs/ui_radio already cover "pick one of N"; a dropdown only adds value when there are so many options they must collapse into a popup, which a SNKRX-style game UI rarely needs.
Two briefs:
Design brief — ui_card
A selectable item/ability card (→ widgets.lua) — the kit-1 ability card. Vertical centered layout inside opts.rect: a colored icon tile near the top, a colored title, a multi-line muted description, and an optional footer pill (price/cost) anchored to the bottom (so cards in a row align regardless of desc length).
- Chrome:
panel_fillpanel + border. Hover →greyborder + SNKRX scale-pop + hover sound;selected→greenborder (likeui_slot). Clickable →{ hovered, clicked }. - Icon: a
ui_item_icontile,icon_sizedefault ~40, centered. - Title: centered,
title_color(the element color — caller picks). - Desc: array of lines, centered,
text_muted, body font. - Footer: optional
{ text, color }→ a small flat rounded colored pill, centered near the bottom. opts:rect, id, icon, title, title_color?, desc, footer?, icon_size?, selected?, edition?. Reusesui_panel/ui_item_icon/ui_text+ the juice. Newpage_cardsgallery page — a row of 3 selectable cards.
Design brief — ui_text_input
A charcoal text field (→ widgets.lua).
- Typed-text plumbing: a new global
ui_typed_text, captured once per frame fromengine_get_typed_text().main.lua's existing drain line (currently discards) becomesui_typed_text = engine_get_typed_text()— a one-line change. The focused field appendsui_typed_textto its buffer. - Editing: append + backspace (UTF-8-aware via
utf8.offset); caret pinned to the end — no mid-string cursor (deferred; fine for player-name / search fields). Enter →submitted = true. Optionalmax_len. - Focus via
ui_state.focus_id: click the field to focus, click elsewhere to drop it. - Draw: charcoal field + border (focused →
green, elsepanel_border/greyon hover);text-colored content ortext_mutedplaceholder when empty; a blinking caret (driven bytime) after the text. Text + caret stencil-clipped to the field interior, scrolling to keep the end visible on overflow. opts:rect, id, text, placeholder?, max_len?, font?, edition?→{ text, focused, submitted }. Added topage_formas section 04.
One card question:
AskUserQuestion
Your questions have been answered: "The card's footer pill (price/cost) — what treatment?"="Flat colored pill". You can now continue with these answers in mind.
Both approved. Let me check a couple of engine details before writing — key names and the main.lua typed-text line.
Bash (echo "=== key name strings in engine ==="; grep -niE '"backspace"|"return"|"ente...)
=== key name strings in engine ===
2785:static SDL_Scancode key_name_to_scancode(const char* name) {
2800: if (strcmp(name, "enter") == 0 || strcmp(name, "return") == 0) return SDL_SCANCODE_RETURN;
2801: if (strcmp(name, "escape") == 0 || strcmp(name, "esc") == 0) return SDL_SCANCODE_ESCAPE;
2802: if (strcmp(name, "backspace") == 0) return SDL_SCANCODE_BACKSPACE;
2879:// Convert scancode to key name string (reverse of key_name_to_scancode)
2881:static const char* scancode_to_key_name(SDL_Scancode sc) {
2899: case SDL_SCANCODE_RETURN: return "enter";
2900: case SDL_SCANCODE_ESCAPE: return "escape";
2901: case SDL_SCANCODE_BACKSPACE: return "backspace";
3181: ctrl->code = key_name_to_scancode(value);
3788: "space", "enter", "escape", "backspace", "tab",
8162: const char* key_name = luaL_checkstring(L, 1);
8163: SDL_Scancode scancode = key_name_to_scancode(key_name);
8173: const char* key_name = luaL_checkstring(L, 1);
8174: SDL_Scancode scancode = key_name_to_scancode(key_name);
=== main.lua 105-130 ===
-- height/2 + random_float(-100, 100))
-- end
-- local wx, wy = width/2 + 80, height/2
-- spawn_wall({ wx-8,wy-40, wx+8,wy-40, wx+8,wy+40, wx-8,wy+40 },
-- { edition = 0 })
function update(dt)
sync_engine_globals()
engine_get_typed_text() -- drain SDL text input every frame
-- Hit-stop: hit_stop_update runs the freeze countdown on UNSCALED
-- dt; sdt is the scaled dt every game entity updates with, so a
... [13 more lines]
Read (E:/a327ex/attack-template/snkrx/ui/init.lua)
1 --[[
2 snkrx/ui/init.lua — the UI toolkit aggregator.
3
4 Loaded by snkrx/init.lua (so plain `require('snkrx')` pulls the UI
5 toolkit in alongside the attack carriers). Runs AFTER snkrx/palette.lua,
6 so the 18 locked palette tokens (bg, panel_fill, text, red, ...) are
7 global and available to every UI module.
8
9 What it sets up:
10 • the UI fonts — two headers + two interchangeable body fonts
11 • ui_layer — the screen-space UI layer (no camera, no edition shader)
12 • the toolkit modules: rect (layout), state (interaction), primitives,
13 gallery (the F4 test scene). Element modules are required here as
14 they land.
15 ]]
16
17 -- ── Fonts ─────────────────────────────────────────────────────────
18 -- Headers (fixed):
19 -- header_l — Awesome 9 @ 16 : big header / pictographs
20 -- header_s — FatPixelFont @ 8 : the biggest/boldest header (FatPixel
21 -- renders huge even at 8)
22 -- Body (two candidates, toggled live):
23 -- LanaPixel @ 11 and Ark Pixel @ 10 — both cover all languages. Every
24 -- UI element draws body text in `ui_font_body`, which the gallery
25 -- flips between the two (key B) so they can be compared in context.
26 ui_font_header_l = font_register('ui_head_l', 'assets/Awesome 9.ttf', 16)
27 ui_font_header_s = font_register('ui_head_s', 'assets/FatPixelFont.ttf', 8)
28 ui_font_body_lana = font_register('ui_body_lana', 'assets/LanaPixel.ttf', 11)
29 ui_font_body_ark = font_register('ui_body_ark', 'assets/ark-pixel-10px-proportional-latin.ttf', 10)
30
... [41 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/main.lua)
<tool_use_error>File has not been read yet. Read it first before writing to it.</tool_use_error>
Read (E:/a327ex/attack-template/main.lua)
110
111 function update(dt)
112 sync_engine_globals()
113 engine_get_typed_text() -- drain SDL text input every frame
114
Edit (E:/a327ex/attack-template/main.lua)
The file E:/a327ex/attack-template/main.lua has been updated successfully. (file state is current in your context — no need to Read it back)
The gallery's letter hotkeys (B/O/P…) would collide with typing into a field — I'll add a ui_capturing_text flag so the gallery suppresses them while a field is focused. Writing everything now.
Edit (E:/a327ex/attack-template/snkrx/ui/state.lua)
The file E:/a327ex/attack-template/snkrx/ui/state.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the two widgets:
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
578 function ui_radio(opts)
579 local r = opts.rect
580 local id = opts.id
581 local font = opts.font or ui_font_body
582 local ed = opts.edition
583 local on = opts.selected
584
585 local hit = { x = r.x, y = r.y, w = r.w, h = r.h }
Bash (tail -5 E:/a327ex/attack-template/snkrx/ui/widgets.lua | cat -A | sed 's/\$$//')
x = x + cw + gap
end
return { hovered = hovered, clicked = clicked }
end
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in main.lua snkrx/ui/state.lua snkrx/ui/in...)
main.lua OK
snkrx/ui/state.lua OK
snkrx/ui/init.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (grep -n 'engine_get_typed_text' E:/a327ex/attack-template/.claude/CLAUDE.md)
435:engine_get_typed_text() -- drain SDL text input
658:- **`engine_get_typed_text()` must be drained** each frame even if nothing consumes typed input — otherwise SDL's text-input queue fills up after ~32 keypresses and warns per-press forever. main.lua calls it at the top of `update()`.
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
432 ### Update order in main.lua
433 ```
434 sync_engine_globals() -- refresh `time`, etc.
435 engine_get_typed_text() -- drain SDL text input
436 hit_stop_update(dt) -- freeze countdown; sdt = dt*time_scale
437 sound_tuner_update(dt) -- F3 — returns true (early-out) while tuning
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/widgets.lua snkrx/ui/gallery.l...)
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
main.lua OK
All files syntax-check, docs synced.
What's new — two elements:
ui_card (widgets.lua) — a selectable ability/item card: panel chrome + centered icon tile, colored title, multi-line muted desc, and a flat colored footer pill anchored to the bottom (so cards in a row align). Hover → grey border + scale-pop + sound; selected → green border. Returns { hovered, clicked }.
ui_text_input (widgets.lua) — a charcoal text field. Click to focus; the focused field appends ui_typed_text and handles backspace (UTF-8-aware) + enter. Charcoal fill, border green-when-focused, blinking caret, text+caret stencil-clipped to the interior and scrolling on overflow.
Plumbing: new ui_typed_text global, captured once per frame — main.lua's drain line is now ui_typed_text = engine_get_typed_text(). New ui_capturing_text flag: a focused field sets it, and the gallery suppresses its letter hotkeys (B/O/P/K/L/U/[/]) while you're typing.
New gallery cards page (now 1/11) — a row of 3 selectable ability cards. form page gained section 04 Text Input.
To test:
- F4 → cards page: hover cards (scale-pop), click to select (green border); check the icon/title/desc/footer-pill stack and bottom-aligned pills.
- form page → 04 Text Input: click the field (border turns green, caret blinks), type a name — confirm typing does not also toggle the body font etc., backspace works, type past the field width to see it scroll/clip, click away to unfocus.
Let me know how they look and what's next.
This is all fine for now. Let's move on to the composite screens. Tells me what you intend to do.
Before I touch code, here's the tension and my intent.
The discipline. The toolkit's stance — the same one the attack carriers follow ("ship elements, compose per-game") — is that full game screens are game-specific layouts, not reusable API. A HUD, an inventory screen, a shop, a world map: their composition encodes game design (what stats, what economy, what's where). Baking ui_hud() / ui_shop() as widgets would smuggle Invoker-specific decisions into a generic template.
So what I intend to build, in two parts:
Genuinely-reusable composites → real toolkit widgets. The composites that are pure machinery, not game design:
ui_modal— a full-screen scrim + a centered panel + input capture (so widgets behind it don't receive clicks). This one has real design — input-blocking in an immediate-mode UI needs care — but it's general and worth it.- possibly a titled-window / dialog frame helper (panel + title bar + close button). These are the only composites I'd add as code.
Game-specific screens → reference composition pages. HUD, inventory, shop, dialogue, etc. get built as full-screen mock assemblies in the gallery — laid out purely from the existing ~17 elements, no new widgets. They prove the element vocabulary scales to real screens and serve as copy-paste reference for a forking dev. (The early
page_compose"run summary" mock was a tiny version of this idea.)
This keeps the toolkit honest: the API stays a flat element set; the screens are demonstrations, not surface area.
Two scope questions:
AskUserQuestion
Your questions have been answered: "How should the composite screens be delivered?"="Widgets + reference pages", "Which composite screens should I build? (pick any)"="Take a look at the UI elements/widgets/composite screens generated by ChatGPT in the RICOCHET folder. Those images contain a very large set of ideas in terms of game-related elements, so take some inspiration from there. Be mindful that you don't have to worry *too much* about visual details, I intend to do another pass on all elements to make them more cohesive with each other, so you should focus on building things logically and such that they're spaced correctly, less than on getting the visuals perfectly right. Try to bundle everything into as few new pages as you can.,Modal / dialog,HUD,Shop,Inventory". You can now continue with these answers in mind.
Let me look at the RICOCHET folder for the ChatGPT-generated reference.
Bash (ls -R E:/a327ex/RICOCHET 2>/dev/null | head -60; echo "---alt---"; ls E:/a327ex/...)
E:/a327ex/RICOCHET:
anchor
anchor.exe
assets
design.md
dot_shader.lua
entities.lua
main.lua
reference
run.bat
todo.md
E:/a327ex/RICOCHET/anchor:
animation.lua
array.lua
camera.lua
class.lua
collider.lua
color.lua
font.lua
helpers.lua
image.lua
init.lua
input.lua
layer.lua
math.lua
memory.lua
object.lua
physics.lua
shake.lua
... [22 more lines]
Bash (ls -la "E:/a327ex/RICOCHET/reference/" | grep -iE 'png|TEMPLATE')
-rw-r--r-- 1 adn 197121 1388616 Apr 25 08:51 01 - ART DIRECTION (DOTTED).png
-rw-r--r-- 1 adn 197121 1878437 Apr 24 00:30 01 - ART DIRECTION.png
-rw-r--r-- 1 adn 197121 1301925 Apr 25 08:51 02 - GENERAL UI ELEMENTS (dotted).png
-rw-r--r-- 1 adn 197121 1709600 Apr 24 08:54 02 - GENERAL UI ELEMENTS .png
-rw-r--r-- 1 adn 197121 1575255 Apr 25 08:52 03 - TYPOGRAPHY (dotted).png
-rw-r--r-- 1 adn 197121 1816321 Apr 24 08:55 03 - TYPOGRAPHY.png
-rw-r--r-- 1 adn 197121 1520042 Apr 25 08:52 04 - COLOR AND TEXTURE (dotted).png
-rw-r--r-- 1 adn 197121 1772063 Apr 24 08:55 04 - COLOR.png
-rw-r--r-- 1 adn 197121 1452967 Apr 25 08:52 05 - GAME OBJECTS (dotted).png
-rw-r--r-- 1 adn 197121 1635288 Apr 24 08:56 05 - GAME OBJECTS.png
-rw-r--r-- 1 adn 197121 1455673 Apr 25 08:52 06 - TEMPLATES AND USAGE (dotted).png
Read (E:/a327ex/RICOCHET/reference/06 - TEMPLATES AND USAGE (dotted).png)
[
{
"type": "image",
"source": {
"type": "base64",
"data": "iVBORw0KGgoAAAANSUhEUgAAAaEAAADrCAIAAABPfr4rAAHGGElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a9+6qd+6od88AcKDALAIITAIATmfgbxLLYxCEAIgQGBAQSAASMJDLYFgAGDEALAIEnGmCuMsUFIgMAAgAEMkgCBeRZjgSQABNg2FkIANsIGbBACEBgEIMAgQGAMYAAMAklgGyRxmW1ACAE4zbOIZzMKYRACI2wwEgZsg8A2AoRBkgAAgTEWmGcSQgAYBAZAXCEEIDBgECAJbAAEgMG2EEJcITAAGDC2eb7EM5nLbC4zCCEE5gpjACSBQQJjbNtGiPtJAgMYIwkwCAFgEICEbSeSEAAYYy4zCJAENgBCPJONwBgEBiSBsI1BYJ5NCAwCkDEASMIGQBIGZxqEuEJIAjAIIe5nEgMyxiBsCymEucIgnosNAsA8k8BcIQECEAJsG2MkAQhACDDGPBeDMMgAFkKA7ARAYACDuEJIwpBpgUI8gJAxxhjAgBACxBUCwDyTbUAIMAAhAIMNIDDGSEJgrpCwrYhs7Ru+4Rt1x23PuP76a9frIUIYAAEC82wCg3gm2wgQVxgEILBBPJNBANgAQmCEARBXCBsJAHM/gxAG2SAAYSOBMYjLBAYwzyTxTAaMMJJ5LsZCPJDAIAAMYCxAAgDM/QwySAACA9iWuEzYCBCAQVxmEBiBxbMZBAbxTMYgAWAABIABEAAGQMbiWWQbkAAwFhgAIQBsnpfAPJsEgMACAzaSAAwYCYxBgDAIbMT9ZCMZY0CIK8QzmWcTmGcSGAABYIMABBgLQGDARgIwEuYKgwBsJEAAGAQGQGADRgKDMAACwFgIBOZZjIUQGABxP2OBAYOQQYDAGACBQQAGQGAAZAwS5n5GkrEAMAACDIAwEoAxiOchnskACGwQYAAkYxnE/QSAMQgQ2CAus4wlJNnmfkZgAQbJGCNxP/FMtkEIgXkmAdiAQYAAMAiQsQAEGAtAABgAGQtsBAjARjxTOufz+e133FklrddDZssUgEEACGxJgAHzPAwCwCAwzyTAIMxzEM9mAMS/zCD+BQaBQWBJgG1JXGYbAAwCIWMQGJBkG4TAPIuEzbNI2NzPAEjCBpAAbJ6LhM2zSNggnslI2NzPRuI5iSsENg9gAMTzEgLbIDAA4n4StnkmAWAQz2QABAbxrydh82wCcz+DJGwACdsACMwzCQCDeCaDJGyeRWAuExgE5nkYAIQMgITNczLPQQAYBOZ+kmwDIJ6DBUYAWMhcYa4wSDwHgwAwiOdmnoN4JmOQEBhAYJ7FAAgAJGyukLABAyAwiOdgSRgDAvMsErYBEJdJ2NzPPJPAPJMAgQEM4rkZBIB5JgFgEAAGJNlcIUAANoCEjQRgWwJkm2cT2Ga1XkuqEiElSACIZ5NAgAAZsJG4TDYIAQgEwgYMksSz2UhcYQsMkgSAQWAJkA0A2AZAEiCeyQCIZ7LABgmwJQlzhSSeTRKAEAAIgUG2wJJsBEhgEABIAGAukwSAQZLAtiRsg8ASIGPxbBJX2NiSAIMkELYlQGCQAGRbAsSzGSRZwgbEMwkAg8AACAxIAkACAwZxmSRsJEBgkEEWMogrJCyeyTybALCNkEEYAeKZLGEbJAmMJDD3s8ASIEm2AUkYwEIAspEAIACwxAMJQAACQAYBYAAEAsAgYQAkAdiWAGEsBBiEDViSDUgCwABIAhDPZhBGAgQCC2wkYYwVAoG5woAAJJ5J2Ij7BTbiechCCECAASEwCAQ2CHGZBNgWWAIEgAAMgLhMAEgBBowAgUESAAjMZZIAbASIZwswzyRAPJAAMAaEALAQtgSSTQBgEAgscT8hsCWBAUkAWAoALIQADDJGkkPCDoQFYIORBOLZDAYwIIn7WUI8i8EIAwAGA7ZsJC4TSLKExHOxBYDBgESEJANgQELiuRghgUASGEsgEA8gLjNgYZ5JGAnAtsRlBsAAgM2zCQwGkAADGCwB5pksBAIkgQAQSJIEGABjY4NAAAgjBJYE4tksAQZsgQAQ4jmJZxOIy4y4wtxPkmzAIECADIBAAAYsDNg8gMGAJIQAAeKZzGVSSMK2AQzifrIEABYIJDAGAwYDSAAIsDHPTSAAbMwzGQwCwAAYxLMZAEs8iwAwBiSEMIAEgAGBxBUGwGAkEBLPZAAjrpAQYBsAgRAIBAACgRE2NpcZAdg8JwkJA2AABIAwV4hnMQBIgCTxQAJhAIEBsG0wCMT9bAAwCMDYFiBA3E8gAAEgAAwG8VwEEggkSUgywggMBoHAIAAEAjsBgUEgwLYNBhtA4jKBAXEZERG2uUwCyWkwBvNMNhghns02z4+ExDNZgCSezQCAAYNBgACMDYC4zDYPYGNzmbnMxgAGg0EIAWAMgEA8iwDMFcZGXCYpACwQyAAGkARCABjAABgAcz+BQACIyyTZXCYwz0EgkJEALAyWxHMz2MYGBALAXGEewGCJ+xkMAhkwCMSz2NzPIFs8k8EACEiDLa4QSAgLAGMjgwABmOdghCQMYMAAIO5nG2GDkJAkgUBcJlmAEAgA8TwEgCRJAJhnsYTBmAcQzyKel7EEYDAYg0EgAMwVNjYYhI3BRhgMYIQBcZkFskDczzaXSUjY5goD5jkYMOJ+4n4CzDMZDIABAWAbAwKMQIAQl0mSBIAAMACyDSBxhUECmSsMAkAGMAACwFwmnsVgnslgwNg2CAwGQBL3MwAGQJJt80wGS0hC5pnMM0kCGwCAEBLPZBshhEACcZlt7mcbkMT9bGFsbC4TBgyWDAYB2CDANuJ+BgySzBUGgwAhnsm2uczmMksI80wCiyssrjCAQWAADIANIADb2GAAbBssrjAYMOZZxBW2eSYBYDAGAISxwWAABOYyG2PbBgmwwAhkjAyAwQAIkAQCwGAADIBs80wC2QAgEIANDpDEZTa2wcgS93MIAAPYAsCABAKBAIONkcEA4plsLrO5TGBzhZFt82zGPJMAJAAQmCvMFWlAgG1A4tnMAzjTNjaY+xnZXCaBJAFgG5srDAYhAIMAARhsgQQGDMYCASAQEoCNQCBhJAQIA7YAsDG2jA2AwZK4nw0SYEBIAoR4FhsbDCAZYwMYEIgHMoAxVwgwIAAD2ADItm0ADAbAYMA2BgRGgLFtg0DYGDDIAAbb5n7GIJ5NPJsBi2czYBtsA4hnskAQEggMgABjAPEAAmxAACApELa5TBJgDIDBNkaSAGNAiCvMFZItJElcZoSNBQgQz2QbkMSzGAAESALxTAaZZ5O4QgLMMwnE/Ywl7icQGIFBAEg8gJAkcz9JEpcZACHbtgHMZbKFwQBCgLifEAgbzBUCg4UAsAQgAdg2IC4zyEY8kAEwGAwIQAAYHBLPZLCNbWwMYIwxNmAASQJACMDiMgOAACTznGwwGIzBgIUBJAEI2xgJG2wbGQwGEAIjnkk8i22DAYwBgbifZDBYEmBzP4Mxz2SukEBgnsU2CAzGACCEANsgkAEwCJC4TEgCMIhnkgEQWAAGEADG5jkYSSAbCRAA4tkMYAAJIUCABRhs21wmEM9iAwgbACMDEgKwEPcz5n4Gi8skAIzBAgQgWwAWIAHmgYQEGIwAMGAAwEiAQEIgMIhnMs8mQIANAgwgsIUAzP2MjQxgkA0YEM/JYLARlwlABMY8i20ADAaQQAC2bTAIEADCtNZaS7ecpjEzMQBIUrY2TVNrOU2T0wgEIMSzCDAYwFwmIQDMs1jcT4j7GdsGBCCQbUkgYzAgxDMJbGzMZbYBiSuEwSBAANhGSLLNM1lYAgEYwMYAIIFAAgnEs6UN5jJxhW0AG7AQWMhgAPF8yAjM/Yy5zMYGkIRAAJIQl9lcYUAIbNskl9lpA2AwQgAGGyMBSELICBAgwLYxgEBgACQJAxKXKQAwQhjMs0iSAQwIbGMAxDPJBswV5jIZjAEQkiRsDMgCc4UkMIAxBrAFkhDiMoEwVxjxbAIhBOKZzGW2Mc8mBAgbGwwCAEtcIQkZxANYBiQBGAAZIwAkLrMxAgAJcZkEMsICMAYQQlg2z2RsrjAAxnZiEAiDASwZQJaQBIAxmOdiQCABIFsIEDbYgM0D2AaEADAGQIBBABgkAPEsNs9kwLa4n8AAGAzCGCEscRlABYQAEFjCRgjZRkJgWxIgZAxGINy8vbODoCWlH9erYViHBGR6e+cYKuRE1DaulstlRMG2zGVCtgEDmCssZACDDAAIDELINgJkGyEB2CAjME6QxWUSBnGZAVlIwrbA2AgAy5gAg0EASGBAEmAQIIwBgTEIAIMwxiCELQCBBUhcZhAYAEmWwBhsEMZCYGxjJCGwjSQAG/FcJBljJGEbhA2SwFwmgY2EMAaQwBiEkDEIARjzTEJcJtsIYyEAjDEWAhAYICQDSNhYEthp7ifJNgbxTEJcIWRsEDLPZAnARgIJAxYY25IAMAACECAADAIDIJ5JgGwjnoN4AIExAALARgAgLjNIYAAEgHgWY1nGkgAMsg0IDALAgBDItm0BCECAkAEMQhIYBJjnZa6QSCcWkgRGgIRBGGSQMBIAYCQAg3g22yAwMgiEjRAyFlcYBJYEAiNAACFsMEgYCWwAgcEgAATmmQyAASFjJAAbAQhAYAALGUBgMALAloQEIFQBMAA2CCTAgMRlkrjCmCuszLaYz37yJ3/yx37sJ1ar1aMf85iP+PCPuOH6aw/29+22vXPsd3/3977ne7/v4oXzN9100wd90Ac99jGPPjw4iBKAjcAyAiTIbDaSQwVkp21MKCSlMzMjCri1FiUkJDLTAJQoRtmaFCFsIbBbmyJCkm1nAihCMrRsEkAobJwNwJQoCJAxWKhlwxhKBIAAMJaAzBYRmRZWCSd2AhESAlomdpQAJLXWuCwihDLtTIsSIcm2MZdJ4n4SYAAJDALAIMC2zGVGXCbZtiUwAAIJADCABAiBASTxXAQGwCAjACEMgAAwCBsMWJIBDCAEtiUQQsbGGMQzGQAhybaMAYQEBkDYRsgS2MaShIyxJC4z4n7GGCQQAALzTDYSGIFBPIsAg7jMAOIKYwQgMOYyAQYJkLDNZRKXCRACMAgQGACBeTZhIxBYGASALQGyDICxwAgQCAwGATYSkmwjhAAwz8EIIWMM4jJJAAYBBkDYIIQBEAYZARjz3AQGcYVBxlwhMFcIAANIYBsBQuIyAWCMsSTANiBkA0bmmWwDloTASAKQeSYMuuuO206cONHaJIn72QDiMvGcBJ7GcefY9nd+1/e+3/t/IPd78Rd7sd/49V/d3FgsNha/87t/8IZv9MbTNAHAmTNnfue3f/PhD3vIMIySAAO2JElIi41tLhtWR8OwXswXpZ8Bw+poGIbZbNbNFsvDA5yLrZ1pWK/X6yix2NiAgtvhwb4UGxsb69VqbGMoMFFivrE9DatxHGezedQOoA37+/sRsbm1SXSQy8MjRcwXmwA5HR0dSrLTBkF6c3OTUsk8PDyQZMAGgJAWW9vr5dFsseHWlstl19VuNgPWy+U0Tbbn83mt3eHhgRTAxtY2CDg62MvWZrO+my8gxvXRMAyhQGCMMQgEFthYFmBZFpdJShuQEAKMAQxgIYPAAArZBoQAYwxgWRbCWBYCwCCeySAADOKBhIwxAOIKgwwCwCAADMK2JEAIMMYgAIxBEhjEsxhjiWcRMmAjMAgAg3gOBkAA2EhcYQDLsrhCvAASGIMAgTEGARiEAAnbgJAxgEHcT1xhI0lgwOYKgQGQjWQDBpCwEZeJKwQGmwgBtkHCBiGwEViSbQBkLBAylrAlbIRB5vkTz80YxPMQGJCEMQgMADaAJDDmRSZkAGMQGCTAtgSAQWCeSQACI4ExxrjWev78hRAAEiAQAEhIAoG4zMbmMhtKKcvl8PXf+E3AB3/wB/3UT/3kwx720L//h3/43u/7/s2dnaj913/DN0zT9OZv/uY/+ZM/8Wqv9qpnz5797u/+nm62mZmAbWxxhUrpPvmTP+kd3uHt3/qt3urP//zPt3Z2vud7v++N3uiN3uSN3/j3/uAPt3ZO/OEf/8m7vMu7rNbDcj2+27u92x/90Z9sbh+7775z7/5u7/Fmb/amP/mTPznragl/1md/zuOf+KTNjS2bfjY/d2H33d7tXf/u7x+32Nz+9d/4jbd4izd/q7d6y4/8mI+tNS5cOPce7/k+b/AGb/Apn/JptZ/1s/kXfuEXvumbvulf/OVfbWxsZiZIklsuFvOf+umfeZ3Xed0f/4mf2NjYzGaBJEm11uV6/Umf9Ekt+cZv/KZf+MVf2tjaufe+s+/yLu/27u/+HufPnwdvbW/+wA/84Id+2IfP5xsoNrZ2fv7nfv61Xvu1v+7rvq7vZxvz7id+8qfe5I3f5M3e7E3/+E//bGNjs2XaNgbMZQYbI4RAkgUgEMbimWwbc4VAyAAYAGEbAIzTCSAQshCAEAIESIAAIQSAQTwXY0AC8UxGCGHzTAZAYIRkAcbGGMQzCQkwCACDwciBeCbxTEYASDyTucw2z0viWYRCQgACAbaNeV7mOQghCUACMGAbELKNwRhjBEhgMM9kpw0gEEgAAgkk2whJSAASz8UGI8m2bSHAIARGgEE2AhAgABlAWAgjAQIwL4RtY4NBXGaDAQDxbDbGYAAskIQAYzA2GAyAwWAeQNzP2BhAwiCwsUMCCRAgEAIBAowAYwwgSWAIJAkbMBgAAWAwGANISGAAMvvZ7Nz5C3ffdXeJ+JAP/uC3fuu3eYu3eAvgyU95KpTz5+57whOeAHzgB3zA27zN277Xe7w78Pd//zjcJNkWkiQFCGjT+JZv/mZ/9md/9uhHPeohD74F9Du/97u11I/7+I9/0C0PAu68/fYf/uEfedKTnvSMZzzjB3/wh5729KcB589f+OM/+dM3fMM3+uRP+bR77r1n1tWf+4VfuPvuu1U6Ran97AlPfOIP/uAP/ckf/zHkox/5kAfdctPjHvf4d32Xdy617h8c/dZv/c57vud7vumbvGnX9b/+67/2Z3/2p6/zOq/zqZ/6qQTZGkiodv3RcvW1X/cNb/1Wb/VVX/U1y6N9ySAkFLWbtfRP/uRPr9frX/21X/+Lv/hz4Cu/6quvvebajY3Nb/jGb97cPoH6X/qVX/3O7/ru8xfO16LzZ+/5+I//+Pd57/f++q//+j/5sz+P2dYf/fGfgD7sQz/khuuuHYZBEgaDEWCweA5GSBLiCiGBATCY5yAQAAaDuUISVxhJQgAGAEsygIV4FgFgMM9kAJDB5pkENkbC5lmEEAhjAIMBMPeTkJBtAAQCAcaYyyxkzBUGzDOJyyQBGAQC8yxCXGab5yBJPJMMxgAYAAGAwRhsBJYkns0YCQFIQhiwhQAwQggBBsBgMBhsDEji2QQgkABAEuKBjMGAwTybsREgDALAwgZZEhYSICEQVxgABAYQEUJcZiRAAmFzmQAQAOYyY56TZUBcJgEIBAIAAWCexQgBYCQshITBtrnCyCAQGMBgg5CQbAyCCtgAGIME2EaAEDLGIACEjQFoma212nXDMAClFGAaR/B6uVyv1oAkt/H1Xu91v//7v+eWm25eHh5IAiEkGQR2tml61Vd/zYc/4hFv8EZveP2NN4Fqra//Bm/w+q//Bpcu3udpWUp0tT7jGc/oZ/MSUUoB2jTccMMNH/VRH/UDP/AD9529cNODHrK9vS0JT9M4AE98wuMf9ehH3X7H7dN6ectDHvaGb/D6d9x5zyu/yqu3aSzd7OZbbn6P93hPIMdlG4d7773vIz78Q17z1V754NIlSc5myDZJPnX65OHh0UMf+tD5fOPw6DAcAtvZJre2ubnZ2rSxWMznc6AW7S+Hb/2Wb/6Lv/iLaVgul8vMfMmXfMknPOEJr/lar3nx9tu7vnv3d3u3UydPHj92DOhn8zd7szd70zd7i9XR/jSOCmEQz81gkMC2AWNJAICFDNiWBGAQCIENQsiAzbMJjDAGACQwgAEwxggAY4ENCPEcDJJAxthIYIQkjEFgY8BYEgbxbAZABgwSYJ7FIJ7F2AYsCYFtQAjxLAYBCBljEIBtAHGFhcwzCcRlrlFKqeM0ZCaYyyTZDoUxYHDaTkmAJEmZCUiyDYAkpTMkG4RtY6EkJdlGYCFsC4wBELZCkmyDbQO2hYwDDDaAJAkAwk5JTkeEMxUCORMpJKcVykyBDcJGQsjGWAiTTgXYQgAGMEgWatkkARAGMAgQMuZ+xgIh2wiEjQQ24jkZgxCyjUCAARAYATIGJGEjQMLmCoElzLNYACAqDyABwkgGYVsGEM8igWWDE4iIfjYDMhOYpolcQyIBx0+cUOm2tnfe7d3eE3ywdykiwIBtwABEKW4TeBgGDPLGYuNbvuVb7rvnzg/6wA84duJUa/mSL/mSt91+e0R5zGMfO40jkNnuufvuj/6Yjx7H8SEPezhEhEoJYJoGGB//+Me/6iu/yq3PuM0qUA+X4zAMgO2u6+677953f7d3fad3ePvXf/3Xfd3Xfs2v+Kqv+rAP/8jv+I7v3L90sZSwbXuaxhOnrn3VV37lT/3Uz3jq054a3RyOwE63bNOQ07hurXVdX0qZzxfAR374h73Kq73mq77KK73He7733sX7zp47D7zES7zYE5/05Nd8rdfpun5jsfEXf/EX11x75syZk8Dm5sZ3ffd3r1ar93mf997a3JimSTyTkDEYQFxmIQAhBGCQwAAgCQMghIwNSIAxgAAwCGwLQDyTbQnAGGSQzBVCAJJkzHMzgAHEZcKYZzL3ExIyNpaFeDZjgUEAGAsZEJhnMYAQgAGBhRAABoG4wphnMQjAIABkEFfYSAARsbe/d7B/cOr06fl8HhGAbTtLKev1uus6KSQBpZRxGoUycz2sNzY27czMEsWZhnEc+342TdNs1tlISJqmFiGbUkprDchsEQWDAGyXUoZh3aapn82EECBgmqau1ja1Wosk2+v1OtuEwnbfdZnuujoMY9d1bZqQ+r5HmsZxNput1uv5YuFMIO2QWuY0jhGqpWIUiojWstYyDGNrrdYiKSKmqU3TNJ8vnGl7nMZQmMsk2yAJ21xmACOBAYnnZgAEIDC2EGCeSYDAAAgMIABsC/FMBmMhg20JBACqYIEAgYVAXGaEDSABYCQZA4LMtJ2ZzgaUUoDMBEklWwK//Eu/9NEf9ZG3PuMZr/8Gb/ANX/d121ub4zhKALZ5JoFUKihbtmkqXUxtuvGGG17mZV+u62dQxml60IMefOvTn5HOhz/i4VObgFDsH+zL/o5v+5Zj29u2a6mKgqJEGVbr2267/e3e9u2+/wd+8PDw6Hg/tzOz0YZxdTiuj7LlIx/1iDNnTrfWat/98i/+wku+1Mt+27d+6wd84AfuX7pYSkHe3Ny5ePH8H//Jn7/0S770H//JHx3+xuE7v8PbroYhogihiFJqKZIUigjwTQ960M/9zE++4Zu++cMf9rBXebXX+PO/+vvFfPGSL/mST3jCE4H1amn7zrvu+uAP+eBv/aZvfOu3ffvV8uj48WMPf8TDSym2BQAGYRtxP3GZMRLPZAAbAWCMhRCAbSSwwNhGAsAgAARGgBAYJB7AEhgAAWAAcz9jDAhxPxtJ2AhAyBgQMuYyY4QsxDOJZxOAjYTAkjDPYgBkLAAZJIQFRiAADALAIJ5JXCHuJ0DYgCTAzlLKhQvnn/KUp3Wz+YMf9KBSSmtTa23W9xcvXnzsYx/7J3/6F6dPnZKM4t77zt50043TOA3jMKzXJ06cuPfee2azed/3YEmPfMQj777nnr//+3948IMfXGvsXtpbLZcPefCD9w/2+747d+788eMnsuXu7u6x48e7rlssFnffc/fOzs7y6PDRj3rEn/75X/Rdf/PNN63W677vM33jDTf8w+Mef++99+3sbF9zzZn1en3zTTc95WlP77r+7rvvfp3Xfd2/+Iu/OHH8+DgOZ8+efdVXeeXW2m233T5O01Of+tSHP/zh8/l8f/9gY2NTEWfP3rezs7O9tXX99ddeunTpL/78Lx/xiIdPre3t7V9zzTUXL158yIMfNJvN7r77nmFYD+O4Xg/jMJ48dbK1SeghD3nQer2WAsBcZptnETIGgwBsgyQADCCEAMsGQGCQuJ95JgNYyIBBAjDm2WQMEgA2ALgCBiOBsRAyBiRAgLlCmAey7cycxgForQG1VmJW+o0oIfHFX/LF11133YULF3/kh3/k5htv+rIv/9LVallrhw1CxkjYdhuytdaaFKi3/ZZv9Zbv+E7vcuniOTweHuxff8P1d999d2Z70IMe3FoCFjfccONXffVXT+vl3t7F7e3t1trGYg4R4cPD/dtvv/3rvv7rz58/f+HCxeMnToqMCIPEOA7Hjh37zM/8LNDyYPdxT3jibL7xPd/zXR/0QR/6nu/2TiLtsN3PFz/+kz955pozX/wlX/QSL/ESn/zJn9RvLJbrIaIQpZ/PdXDYsm1tbdRajw4PQb/6K7/2Gq/+6p/1GZ/55V/xVT/xaq9xzz13/cZv/uZf/OVfvORLvhTQWrt0ae9t3/Ztf+EXfmEcJ2C1Wr/B67/BW7/12ywP99o0KcSziAcwAOKZzBXigSTxLEIAGIMk80AGEM9knpfACBsZSZYBMAgMSAIwCIxBAhsBYIwRQDoBSQAGgQAwiGcyzyQkrpBBPJuwkcUzCcCADTKIK2wEgG1JPC+DwAYQYAwo0ydPnr7lQe3waHn77bc/5clPftCDbtk/OFyv1wf7+y/xEi+xWi3/6I//KKQHPfjBly5dWq9Xd9555872zslTJ/7gD/7g2M7xG2+68XGP+4fHPPaxZ++79+EPe8QTnvDEixcv3n333ddce01EGYb1arW6ePHiYrGw88KF3cPDw+uuv+6OO++8/vrrfvu3f/uWBz3o7H1nn/CExz384Q/b3t45e/bc45/wpNp1z7j1Vmd7j/d418PD/XFc7+7m3z/ucdecOfPYx77Y4dFyHPdqV6W4ePHiPXfffer06XFqF3cvHdvZfvKTn3JweDCO05Oe9KT5YuMpT37KTTfdeOr0mVrLXXfdNQ7j1tZmRI1S/+HxT2itnTt79vTp07fffvusf90HPehBt99xZ+3KvfeeLRG1K7ffcZsiHvmIRx0eLvu+2gbxLAZAAgxCxmAQQgDmMtuSjDHGCFkI8UACYxBCBLbA4oUwAhAAQjXTEldI2BYCY1s8F4GNAeFMsKQSFZAEIACJUorN53z253zap3/6x33cx37lV37VH//xH4/rVSlhWzKAxf1UynK5KrVG13PZb/zGbzzy4Q+75Zabjp04vVqvF/P5yZMnMF1X9/cuAbYPDw/2Lu3VWmrtMHv7+7/wC79weHjwqq/8ik994hPXw/AzP/Nj7/SO7/h3f/d3D33Yw6bm1Wqt0pduilLvvuee7/jWb73p5pve6E3e5ClPfdqXfflXvtu7vftsPi+1jq1xv53trd///d9/3/d9n9YyW0IXpSJhT+O4ubE4Ojr6ju/87r/6y7989Vd7NeAXf/GXfuRHf/z0mTN2Ar/5G7/+Vm/1Vu/w9m/7cR/3CdM0nr7m2mFcf/d3f/cf/tEfvdmbvRkwtum3fvu3XvzFHv3whz/8IQ95yDRNkmwkAAyShG0QV9gIgUHIGCPJAgyAwICxkMCYK4yFAPECCAyAuUwCxPMSzyQEFjIYJEBgsAwIJAEYBOLZBAYBIJ4PmQcyAsCAERgkAPFsxgiDkBAG8dwEgAAwCIQgs21sbNxyy82lVGe+5Eu8eNd14zT1/Wwa19nGl37JF3uJF39srXVzY5OIYRj+/u8Xj3rUo5z5oJtv3traioiXfdmX6fvZ0dEh5Eu/1EsMw7C9vYNUa21tysyD/f3FxqKrXUtP01RKtGns++74zutvbm5m5iu90iv0/ezFXvyxoVguVxIv+9Iv2aaxTe3Rj3zk1Nrm5tbUmmEc1o98xMPa1La3t1ZH+6/xaq86tVZrXa+H/f39Yzs7L/uyLw22OVqudi9desVXeEWcy+XRxsbG1HKaxsPDw1MnT73sy7zUrc94xrFjx++7994Xe7FHHx0erlarg4P9F3vso8apPfxhDy+lROjw4GBzYzGO03J5OJ+faFNDBoHAkgxgBAkSCAzGIAAMkgQgsBDCPD/GXCZjLF4AG2EA8QAAVdzPICSezQIjLhNgG5DABkClROl7oNYKOA1jG5etNeBVX/VVgdd6rdf8yq/8qtVqlSaiZBpLAoG5oo3TG73RG1x37TXTsAzp1V71VX70x37im77lWz/u4z4OeLEXf8mbbr60vbWVLc9fOLezvQXt+M6xt3qrt+r7TiAqUd72bd7mT//0z86dv/hqr/bqzfE2b/3Wj3j4I97hHd6hlgBuvumm13md1842jsN6e3PjDd7g9X7sJ3/6xV78xV7rdV7vrd/6bf76b/7mx3/ix77yK768zhYMkyTw/u75133t13z913vtj/mYj/7yL/vS8xcu7O9d6vu+TVM6x9WwtbH4ki/6/C/4oi95zdd8rXd9l3dxTp/yqZ/6UR/1Uffcc/dXfvmXAw9/xCNf8RVe8bVe67Xe+E3eePfChdOnTnzmZ3zad33nd7zlW7z5Qx/yYODVXuWVb3vGbd/ybd/x8R/3sY961KPHcUQCsJEQYFs8F2OQMAYQxjyLDSAA24hnMWAAxLPYSNzPGCQwzyQwAMIGkLmfQWDAIABsJNuAAMAgnskgns0AGITAgEEC2yAEgJCxjQABYIMACQwCwCAAIcA2AkA8k0E8i7EQgMAASGlL9LUzppTt7W2kzSh2etZN07S1ta0ISZmW3dXy8i/7MlMmZmdnp7UmSQrjY8d2pnHa2TkmkQaws5RSSpw+cyYzBb0Es8xG39m+5sw1mRmlKKK1FhL2Yj6zjRAbLXNza1tSZqu1glfr5c72NpAtDRLzWW+0vbW5vbU5TdPOzo7tiLJ9LK+55pqIcOZ8fjzTs3lIm9jjNPV9/4iHP7yUcvNNN0zTdOz4iePQMoHZLABj4OTJk61NXddvaKNNDQFgAwgExkYAGAuBjBGY+xkQAsAAwlgWgHgmg8BgI4FBXCZkDIDAEg9gEAIAdNcdzzh58uQ0TUhCAIBBCIx5IAPY7vvuzrvvecVXepXDg4M/+qM/fMmXeulP/qRP/JIv/bL3e9/3/fbv+I577r7j1V/jtZ/61Kf+3M/+zJu/xVv+yA//4Du/y7u9zMu8zB/83u9gJxaAeCYDzlwsFuv1amoJLOaLOlsAOY3r9arve9t2y7TAMA5DP5v3843l4b6dXLaxtQUFWK8OQ9H1/aXdi5ubG22a1ut1P5t3XXd0dCQksbm9jSqwOtoH5htbIMijgwNJdtrGgDc3NzJbdDPSR0dHkmzbBmdrm5ubUSuqw2o5tanv+9r14DYMq2G9ubWd0zSM43yxuTzcG8dxc3Mjoqh0q6PDYb2ezWezxQZEG1ar1QoBkgCEzLMYAGEQYAwgyZjnIDDPJGQMIMk2AGAAwLIQABIY20hgEM9kEBJYxlxhnkk8m0EAWMgYg7hMYCFzhQEQz4cxSGAMEg8gMGCDkEGAbEtgAMSzGQSAARAABoEBEIAQYIxBADbORFymUkraISmitUlIwuBsTitCkMY2oAhsSZIiwvY0NeOQUEhIKqW0lhK2szUwNpdJUWq1nbawjQQonUCJYozJzAg5M51SGCJCKDNtS0SEFKWUaZrAtkFI2IBtk0KSbEopSG2aJAF2SlwmEALbNhCSbUU4jbhMgCQwVxjAIGEjhMwVBvG8hIxtA5J4AYSMeTYBYBAYCwHGBhnXWi9cuFhBNgAGjACQbCOEuMwYQAC2iUABZCbZAANgG1DpAWBjYxOotQCtTa21CMkgAWABko0iDg8PIyIUwHK1YrWUIiKA5fLItiRJNhHR9f00TcPeboQESLYP9vayNUWUWhtttV7PZvP1agBq7adpmsap1g6QdLB/6EyFSinOtr97AYWkUoqxFJJtjC/tHUjgw4iiCBQRgW2QYrlaw8omShGslss8PMCUUqLE0f6ejUIHly7Wruv72Wo1GNq0X0qpXT+O07C+hBRBKZFGwrYkGzAIEAKMERgE4tnMMwkwgJBlwJKw7TTCIEAAgBAAAhuEkEGWBZJskAGbywQGECBj8QACwBhjJAnzTELmgcQDCBuQZCEMABIgMM9kDELC2JIAW+KZxDMZBAJjLAmwDUgBgBEAxjJXiMtUirr5zEZoauPBweHGxgLnejXsHDs2DsM4jpB914EOj46k2NraiiitTW1qiHEYm/PoaL/r6vbOsRJhGxERbWrr9Wo2n0/jiN33nW1soSgl08vVarGxWHT91MZsLdPTNHVdV0odxnVXajpns/7w8AhYzBeGiDJOk0Tf95mZraWNdGlv/9SpU3ZiMts0TVNr0zQt5rMonSKmaayl7u8fSNra2jJIYCksaC0jwsY2uLVcrZZ9103TOJ8vpIiIzDSexhEExiCBAxkLEFcIWeZ+tiVxhSARQmAQz2YQAMaAeAADIDCAAANIAAZsqDyTJDCAkLlCYPNcJCmTxWKxWMzPnj371Kc//SVf5uWe+pSnApubGzD1NTY2N4Bbb30G8OSnPBU4fer0fDZbrpYRIYMAjAQKZXPtZi0zQs4sIWAap8yspdRaSynj1JyezftMT9PUd/04juM4tNYys++6RBuLDVBrU0v3fX90eAQWKrXazsyWabulNxYbs41+HMf1eiUAhENh23bLZlNrBc3ni2zTOI2ZWRSkhzba2dJ932V61vetTW2cWrbM7GpXujJNE9IwjLO+I62I9TCASgTSxsbGOI7TNHV9j22nxMHRUSm1REgCai0gDMI2zyJAyBhjAIEBbEkGMMaAkDGABAhjAARgIwEGgMQCsACwzXMwz8HiORkkZLAQNgKDAAMYJAAZAyAAbIOEMSBkG3GZQQLbiMsMkoXAIISMEQDmOQghLhMygAGDzLPYlgTYrrWcO3f+nnvuLbWbzWYHB/tHR4ev9mqv9pu/+ZvTNN1yyy3nz59fr9aLjUVX67Fjx5/8lKe81Eu91NT853/+5ydOnDh58sSFCxfuvvvuhz70oX/1V3/1Wq/5msM4PeO2247t7KzX667rDg8P77j99td4jVdfrYenPOUp111/nTP39/f7rl+vV0aHh0f9rD996tT58+e6Wh796MccHByeO38+FI957GOe9MQnAuM4HhweHh0e3XzzzXv7e1vb2/P5/GB/v++6u++++8yZUy/xEi/5tKc//W/+5m9f7dVe/eBg/9y5c8eOHZ+m4Y477rzxphvalP2sv7S7e/z4ieXR0X333feIRz5itR4uXLgQpYS0u7t7cffigx/0oP39g52dnWEYMlMS+M4773jYQx92eLScz+cHBwebm5vjev2Yxzx6nCYJABvJGEBgAwhjDOIKSRgEYFuSMYB4DgLzTDIGQDyLAGSMQQAYy5JAQAUknkkABrCEhM0zGQRgG2lYr645ffLFX+zFbrvt9o/8qI/52q/7+t/+7d8B3uiN3nAaxhMnTrzOa7/23/3t333qp33Kj/7Yj/zRH/0R8Lqv+7p1Nsujw4hA2JYEzvSs73/5N37roQ992K233vqgBz2o77vHPe5xD33Ig/f2D06ePNH3s1uf8Ywzp08jbSzmD3/Eox7/D/8wjuMwrPtZf+HCxdOnT50/f14Rx4+fOHv27GKxmPWzzc2NRz/msX/91389Ta3ruvl8fnh4eOLE8Wc84xkPftCD77777htuuuns2ftOnDh5sL8XEXffdfebvdmb7O5eunjxwo033Pj3f/8Pp0+f3tvfn83mh4eHu5cuHj927L5773vowx563bXX/sVf/NWDHvygu++5Z2trS/AyL/uyf/WXf9Fay9bOnDnzV3/9t494xMOPlsvNzc3l0dGFixfms9mrvsqrPOXxj18tV+txPHP69DOe8YzTp0+fPXvu+InjD33IgzPzqU996mKxkZnr9fraa6+9cOHCy7z0S07jhIQNgMA2AmTMswhZBmTzbAIbC1kIMAbEMxkBIAAMGABJYMwVBkBcJjCIZzKAAZCQwSBxP/NM5jKBuUI8kwEkbARItnk2gQ2I+8kGIUAAxtxPkrFtWYgHkgCBAYkHEuIyQ63dPffe+5d//Tcv8RIvfnh4cPbc+euuvWYcxt3dvWPHjj391lv7rt/Y2EDc+ozbr79+OlouZ/PZ7u6FYRwOj44Ojw73Dw7m8/n58+dPnT51/MTxe+6998///M9e4iVearlcOvPBD7pl/2D/3Lnz1157bdrPeMZttda77767qyVKfchDHrKxsQH8zd/+bQndfNNNi/n8GbfdtntxN4rWq+V9Z8/OF/N777332LFjJ06eeOKTn9R33Wq9xtRaLpw/f2l3dxrXN9xww6zvr7322t//g9/f3tre2dl5xm3POHXy1IkTxw8Pjy7tXopSZn1//vyFJz7xCceOHVssFufPnz9//nyUMo5TraWWevfd9955510PfvAt+wcH8/l8tVqfPn1qc3P70v7+hQsXu9otFvPzFy5cvHDhuuuv297eAiFsC2MABOKZDIBBGASIZzHmfgbxAOIKWZYBDOIKY8AGLAAQQjaAoIJtwLYkLjOX2eZ5SADC47D+8i/74nPnz//pn/7ZHXfcsb29/cmf9Elv8iZvcnhwMEt/1md+5u233/4zP/Mzv/Irvyrp3d71XT78wz7k6GC/lCoERrLN/Y6OlvsH+11XcU7TOLXprrvvqV295557brjhRsHd99xz8uTJSxcvPPwRD5+m4b577zl1+vTWxsadd9whTt14ww3PuO32+ay/tLs7juPNN928u7sLvvaaa9brYffSbtrL1XK8b1gPQ9eV66+7zs7dCxe72k3TNJ8vSq1RZ/v7+4Dk9bBqOQ3DutQ6TdP5c+dPnz790Ic/fBiGc+fPD8Mw6+u115y5eHEX7Gnsuu6ee+49eeJ4hCSDs7Vszc5a6x133mHn9vZm13Xnnv7066+75r57797YWBw/fvzaa6+97bbbNjc27rv33pd4iZdQxNOf9vRa697e3jQ1QthYCDAgAbITEEJgjBEYScY8k0Fg20LGIO5nIwECDAKEuMIGkIRtBIhnMvcTmMvEZcYgwFwhAAyAuMwACIxBPJuRALARAAYBxiCeSWAkABsBAjAIAGNAEs8kMCAEgLmfbUlcIa4IaRiGRz3ykY98xCNqLZjVehVRQrzBG7xeV2trrZQYx6nU8jIv9dK11tV6Nev7Y9vb119/vcB2a01imqZaK3DzjTe+73u/d6llvR66WjPbgx50yzSNpZSXe5mXatM0my/+5E//7MVe7MVOnjgxTlMbx1rLS7zEYzG1lpbtYQ99CA/BWOJlX/albR776Ed3XRcRL/kSLz5NU9pAKWGn0NFyOU7TiRPHd3Z2HvGIh81n877vM3O1Xne1SrJt3NVuau2xj3lU3/cSx4/t3HD9dbXrwKWUUurR0dGZM6cf+YiHHx4edl3XWutns3EcSyltahFRSrTWWmsS2AhAAkAC80wCkAUGjCQwgEGAADAAyAAIAIMAMJYB24AQgEFgBAgsZCHbwiBJuvOOZ5w6cXJqTRIYCQNgI2xLgHg2AeDW2mIxX6+Hv/6bv10uVw972MMe8tCHHe5fsg2ezxdR6l/99V/dd9/Z66+/7iVf/MWGYWitSdhIsg0SGCLi4PCw77q+79rUEDbAer2WtFgskKQYhvUwrLe3tg4OD9s0bW1upvPw8GhrazuirIY16X7WYY/jZNjc3ByHoZRytDyazxbTNE1tsjOkruuBKDFN03K52t7ZycyulqPDwwh1ta5WqzR9PwPN5rNxHCPU97PDw8NpmjAR1FLHcRyn8dix48vVyrZQOjc3NtJeLldd1w3DemMxH8ax77o2TYbl0bKf9bXrpOi7Pko5d+7cxsai1DIO61rq0eFR13eZ3tzYMAbxTLaREJjnIGSMQWAsMAIkMM/LIEDCBhDPzYCQAYwBEM9kkMDcz7YkDAiZ5yDbEpcJAPMcBMYggTEIAIMADAIbiWcyCNuAEAKDuEzYiCsE5lkE5jkIgQHbSJJsI0koncahADKzlJK2wCYkk7aAkNIJAMZCEjaSbAPYSLYjItNgkIRtSZIMfddnurXJTknOBJBsgyQAwFiSJIwNGAAEBtuApIgAtdYkIiIzsZEiwrZtJEHagoiwbRujIgxg2xCKUss4DCVKOqXITIUwkmwbC0nY5oEMArBBCIEBIQMYwAAIEGAjmediEFcYBBiEbUk8k8AACIwBEDa1losXd3XXHbedOHmiTQ0hnpNB3E/YAAIEBjIdoY3FgijjsF6tVhFFIezMBDY2NqLUNo1HR0eKCAnAIAwCDMJQojhb2pIAIYtQ2OBEsi1JorUWUSRaa5JKqZkJRMh2psGSQJkpCYgS2VIhSRhw2rYxCkIls4FsR8i2TURIADa2FbLtzFIKCLBtW4GI1lqUENhIZCZSRDitULaUSFsARCmZiZGUTkytJTPTFtiUEthImckzSbLNZcKWMM8iMAZhIwkMAAIk2zyLQQAYACFkDAIDIAAMgADAtsRlkrBtc4UACcxzk8DYlmQAQGBsJIQMYJDAMuY5WMg8kAEsCwEYBIBBAAIjbCRsAAEIjAAwYBAAGMT9xDMZwEYCbABJxgIbCWMQNgAIGcBCFgKwLQnbIEBgrjBI4goDto0AcT8Bkm0JzDNJsi1hgxDY5tnEswgBCAzYgAGQwOLZDAIQ2AZxmcAASNhI2EgANs9FArCRADCIywziWYxBQsgYg3g2g3gmgxACjG3Es0ky5oWyXUu9sHtRd995+/Hjx1prIAkAgxAyFjLmWQwAtiQQpMlMICRFgLnMBpxpbERESOKZBAYMGAmMQTIIAxiDuEwCsJGwLYVtYyEukwQGAWDAgJFkG0AIgQEbCcCAucwgQBJgWQjbgAHzbJKwASQBxhhJtsFS2EYA2EgYCYMkzGW2uZ9BYABkIxlAwkjYSIDAAAgMgAwCMAgMgAAwgIQBg2wjxGUWGGEDSIDAIJ7NIDDPJNsSzyLJNgDCRkjCGIPAIABsEIDAAAjAloSwDQIDGADxLEJAYgFIYADzLBYYQIAAMM8kAAwAQgYwzybAGCNxmcAgACzJGItnMwgAgwAwzyRjjAQAAhsEtiXZSAAGIbAkG2MZwABIGDAIIZ7JPICNJAnbgI0ExkJgEM8iAMzzJ57JINsSGMACI3GFjcQDSNg8kMCAjQQStgBkDNgIkMAgMAAC89zEMxmQwDJgCyyegwEQDyCeybZr7S5cuFCRkEASzyQAA2AM2AASgAWWjLEBkIQA7LR5JoGRQAG2bRsAgQEBwrYtkGQbbMAggW0A24AEaQA7EQKwQZBpACwBGAChzEQAGDACA2TyPAzYlrABA4ANGMRlwuaZ0hZgLDBgIJ0ACYAgDdhIsm0MCAAbQMI2mPvZRiKNwAA2YJ7JAGBbwgDYlgDAgI0ENgCCtMEgAGwECcLmMtsgYxDiCvNMAhtjnsU2z2QAY5tnso1kwAZAGIsrDAC2MSBI7meQeRZjLjPYFlhgLrMksAEjAPMcbAAEgLENIAFgjCWusLnMAJjLbANgLrORAPNs5tlsg7ABZFsIDAanJTK5wrLAtg1gnsW2EICMsUEAGADxTJlGCGyexZZtAAFgkG0knsUGkLjMPJttbIMAGYONBADYADaXWeJ+AhuLZ7JxWiINsgzCBgDbSIABMAYBYBAGYZ5JgG0wIMkAAhsEkowxz2SQADAIAAFAxcY8gMAYZO4nAWAAARLQ1y5K2MaWZK6QMAgZhEEAtnkmgQFJGGNAyJhnk7BBAstYErYBJDCWwABIAMYgcYVtEBgQmGeSBAA2EgA2wgYASTwHAxjAgCQMAowFRuIKGwljLISwAQRggyQwAMIACGwQYCzuJ2wAQBIGDEIAtgEhZBD3M2AECMBGgAxgAQZhEBhAwhgACQDzbBIYAIEFBttCCGwjAQIAYQMIAPNswkYCwCCel0EYBAgBthE2wghb4tkMAmQsxPMnMP8SgzCXGYnnZRAABgHGGEDCCCwEthFYyBgQMpYEthECjAEQAAYkYQBjAQgB2BaXCRshsHkOkgCMsQQIAIMAbAQGQLItBBgLQAjAtrhCBrCQMQAIAHOFAAHimQxgDBI2ksBGAmxLAmxLwoARIMBYCIO4n7AlDCABwsZOSVNrbWpgjARgW8gyYCMBBiTZBgRgSRVAgEEYMAgMYBAABoG4wriW8td/+3dnz56rtRqw0wYEBokrbDDINoAEIIQEYCNJstNGABjEZRLY5n7GICGEJAG2Aey0uUxShADbGGMbsBACBLYBCyGBQQA2gATGIAEIDCAAzP1s2wCSACEJBGAbEJgHMIgrJIExgAEEFhhsYyEeSGCMQQAYZAO2DQiQJECSeCAbQABCxljIABbYAEgCBOZZDAKwbQOI+wmQxP0EgAHbAAgA20gABiEB4pkMsm1bQgpAgGQb24AQwjZgkEGYy8yzCQwASAAgQAKEwEhgDOJ+wja2AQNYCAESYBvAICQJAAN22gKDJEkSkmwyEwwCgyQJQMYYsAEIyRhk27YASZKkkBAAJm1sEDJIgIRtnk1gk07bYAAkQBLPZBBCAAgBIISEAZsHss0DicsEFmDMZUIIAYAA2YDBtgEhJDAIjDHPQZIQsg0YwBgkQABgZ9/3z3jGM371V3/1O77tW0My5gpjGQAknsU2z6Z0VgDMFeKZDAbxTAIDIGyAbPngBz3ohhtukAQGhLjMPItBGDDiOQkACyEADOIKA0ZgrjAIDIAASYAxIMAgbK4QIIEx5jkIjG2DJEBgIQSAQWDMMwkMYJDAYCwADALAIAQAEgC2AcQzGSQwz5/APIu5TFwhAxhjkAQGQAJjwEZCCDAAAgsZhM0zCWwAxGUCwCCBQWAAYwDEM9kgAAFgEEJcZp5J2AZAPJN5JgECgwBhA4CFAHOFeSYBCAEGMAYBYBDPwQAIDOJ+EhgDAiMMGAECBAZhc5kNAkkYBMYA5jIhAMkYkDHPJEAANmAQlwmQwIDNs0gAGIMxRgIkQBjE/QziMgFgEAC2eU7mCgNYCAESGGMQz2SQwBgJc4UkwBgjQDyLQYgrbMAgLhMACABjG3GZxHOxucyAEFcIm8sMgCRAYNtARDzsoQ95scc+RiEbBBYygEE8izEGJAEgwDbVNhYPYFuAeA4CA0gA6dze3gyFMQACwAAIDIDAIJ7JAAjMcxJCGDBgAATmCgkbBEjYXGaeSYCEbZ5JYAAEgCUZsAEQAgPmCoElsMDcz1xmDBIAIDAviATGABjE8xDPSWAAg3gmC4zAPJN4JnOZJLDN/QSAARD3k7ARGMAAiGcRAhsALGSuMM9NYJ6DAAnbPJN4JgshbO5nHkBgxDMZCQPmASQBNoB4JmMQQgYwABIGDJjnIAAMQlwhjDECJGyDADAAAgMgMAhAxoDAAAhAYACBAcwzCcxlkmzuZyQMIDAGcYXABgFgAAQGITAIAcYg2RZgLCTZBkDCgHkOAgQGMAgMgMA8BwFgAMQDCIx5JoFBAoPAAAZA4pkMyCAMMhaY5yaeyQAIAPNMAhAYMBBx4sG33HK0XIIBMIB4JgMgQIDEAxBSBQOSuMJIPJtBXKGQbQwClJlJ2gZJ2IBBPJOFAPNMEgbMZQZAEgZxmbEQ2ICRMGABEmAjAdjmfkKIK2wuMyAEIGwACYwxCAwS9xMYwAAIEDbPwwBIYACDxDOZBzLPSQhhwICRBICNBGDABgESgG0QIGEjMAaEuMwgAdiAhQBjAAQAAoMEYHOFuExgDOKZDGAhA5hnEgAGgQEQz2ZACAECsBEYAyCBMQAC8yyWhDEPZBAgAdgAEjaAhA0ggUFcYQMIm+dDyCABgMCYZzHPJACMQQJjEBgAgQEQIEA8i839DAJLwhgQGIF5JokrbMAggQEMCBkExpJ4JoFtBAgbgQEMAgNCCIMAMAgAGwkbMCDE/YxBCBmEDVjIGCQB2AjABpDEFQbxAMYgAdgIgxAGGfNMEhhjSTZgkMSz2FxmEPeTAKZpWq+HkBA2gACDABAY25IQIDBg2wapAhK2kQSIBxAYgwBsAARGAmMsCQQW2EikLVDIxnaEbAvZBtmWZCMBBglAACBsA0YIEDZIINuAbRsJDAJAPIvEZQKBAZBkIWOEEPezkbhMyIAMgAAEFhhA2EIIhAELIWwjASCBnTYhIQEYY0AI4bRCxoBspExHBNhcIcC2JBsQGGQjYZvL0imkkLhCkkEAIMRzkMxllgDxbEaIZxPYssBI4lmMkQQWl1lgS7IlcZlsJBBXiPtJwrYtCUBgEIAQADaAJAAECExKgRBg2xYCAMQzGQnbaQsZA5K4TBKADWGMkTDmMvEsQhiEAIwQAgSAbCQADAKDAMxlQhaAAAEIjCwALJ5FAFgCBJKxUxICwIABDIC4TGCD05IQ2EIIG0k22CADIAlsg20AQGBjIBTGQjyABAgQwlwhcZkEIDCXCQmMuUIIAYAwEggQRhKAQWCEECAB4plkW0LCRhLPJNs2EpIkbGQkbJ6bEBIyBoPAQhLYFcRlQgIDmCsMAgCBsSUZkG2XUmqp62GQAPq+j4hhHGZdZ3saRyJqKav1uqtVERI2ETFNU9d1thXRpsn2NE0lwrJN33UGAzZYktOtTV2tBqFSS2sNwLaZ2iQEIAADRjIgMAaMMYj7CZB4bgIQQjYAEoBBCABbFsIGJBkwkm33fY8ZxkEIKKUgbLephaKf99M4KYSQZHs+61brVUREhG1JESFptVqVKGmHhBQK5FLqOE4hFCG0HtYSWGDEZQLAWAgwgI2EjQDAIDAIg3guQhhjAIMADIBtQAgBRrKReCZbPIB4AANCNhayEYCNxP0siWczisVssR7WtoFSa611GkeEIO1SijMjYj0MpZQSJZ211tYaYDsU4zgiZrN5myZJUYqdkqZpsg2UKNhAyyaDsJEAbCQus8QDCJnLBAgAGQBhIwAJbABxmcBg7idkbNHVbpomjHHf9wAIcCaXZWbt+2kau65fr1aZWWtxotBsNhuGERxRbEeotTaN02w2y0yFMhOw3XUdBrFerzEIA7YkrjCAkAWYZxLPZEDIGDBXCAwCAyDE/cyziWcTmOdgcT9hAIMEEs9kDBIYbBCAuExgLjPmCptnwqC77rjt5MkTU2tC2AACBIBBABgkMAaAiHJ0dHTx4u7NN980jmNX6x133rVcLW+4/oZ77rm31Dh18sR6PV66dOnhD3/4+QsXhmHAbpnDMJw5ffrCxYubW9ur1XJjMc827ezsHBwc1FJms/nupUtdP6u11lJa5jgOgbe2ts5fuABCWq+HnZ0dgW3w1tZmZkriCgNCtg1IwgAIABuEEDIGQLYBicsEBrBBCACwLQmDsC2EADAI213X3X33Pdna9ddfN02T8eHRkZNa64kTJ9fr9Z133XXttddO09TatFqtaq0Xzp9/6EMfPAzjar3uajdN49FyOQ7jgx/8oMPDw1r71towDsN6HSX29/bPnDkztbZcroZhfcvNN03TBEjimQSAbSQwBgkQGMAgAAyAAGyDJAwCjAGQeL4MAmNZCGwkENi2JJ6LARBXGAAZJDAPZAAESCLTt99+x8233BIhnIdHy93dS6dOnRqGYRyHWsqlS5dms9lytXzIgx50tFwdHh1tbGxeurS3sbFobSqh9Xp96uQpKW6/884Tx49PbTrYP+hnszZNx47tdH1fa10uV5Jwbm5uZjYhy0IYCxnAQgZAAAJzP4MAgQ1CYAxgkBCkLQnAAAZAQghJ0u6lvePHjzkzQnfddXfXdWmkmM16nNM0dV139ty506dP3Xff2Qc/6Jau6y5d2lvM50i33XHXTTfeaPvg8KCW2Nvb29xYnDl96tZn3L7Y2Jim6dix4zalxrn7zipiHIeHPPhB0zRJAmwknskCI57JWAgwBgkQmGcSGACBQWCeg8AACAwC87zMswkQGIN4NoMwADIAAoN4JgMgMADiCptay4ULF8vHfezHLBaLzJRAAEhgQAjMMwkbQLLdd919Z+/73d/7/Zd7+ZdbLY/m8/4v/uovH//4J66H4dZbb733vvuWq/W58xduvfXWl3ipl/q93/vds/edfeKTn1hr/amf/pk0t91++/nz58+fP/8rv/Yrd9xx+yu/yqs+7nGPm8/nwBd80RdfurR72223nT17dv/w8Id+8Idbthd/yZf5oR/6od/7/T84ODyaxum3fvu3n/TkJ91z73333XvfYx/7mGEYJAEYAAFIkgQgI/FMQmAQzyIhQDybASFsA5IkYQCEEOLZhO3ZbPYPj3vcX/7lX770S7/0NA7DOP3lX/3tr/zqr547f+4lX+ql/uFxj/ubv/27Kdvf/d3f3/r0W3/mZ35uau1JT37iq7zKK/7D45/w4z/+ExHlz/78L26/884//MM/eN3XeZ2//ft/QPG3f/v399xzzx/80R8eHh79/h/8wTi1v/u7vx/G6e6773qxF3+xYbUOBeK5SAAGkAQA2AYkAYhnEpIkbAQIg0DCBlmI52YhECBA4n6SAAwCMAgsCwEIQIABJAEYA0KAuEzIgMRP/8zPXnPttWdOnwnpKU996rd9+3ccHR3ddeddT33a0++8++6nPf3pq/Xw1Kc+7WVf/hUf/4QnfNM3fvMwTrc+4xnDMH7Lt33r8WMnfuO3futlXuZlzp49+33f/wPDMP7d3//9E5/8lGPHjv/cz//c4dGylLq7e+mP/uiPn/GM2/b2Lj3qEQ8fhkEhIS6TMAgkEAjbkkAgrhDPIoN4FgkhA0IWAgFISFzR9919Z8/92I//5Ku8yquO47DY3P7pn/npxz3uCfedO7tYLH7wB3/gzjvvesbtt6+G4Vd++ZejxK/86q/ecsuDrrvhpr//+7+78YbrH//EJ/7FX/5ltvb3f/e3t95669/93d/+wz887sKFCy/1sq/w8z//c/fdd9+f/fmfr9brJz7pibsXL/7d3/1t3/VPeepTXuolX2oY1pIwEs8mEM8mBBiExP0EAoEBEBgExiCuEOIFkCSBARCSEAgEYCNAYAADQgIQyCAAQOI5CACBBOKZHBHL5SqweTYhgQGQeSAjIQBJ0zSePHVye3v76GAvs6V9+syZ66+/fhiGG2+88fSp08Mwgvu+A66//trzF8/3XX/jDTccHR0uFotaq4Kuq+vl6s677oYyjNPGxkLirjvuWB0tb7/99ttvv92Zq/Xq3PkLgNA9d91dSqldtDY94xnPWC6PjpZHCvFAQhKIZxKIBzIWmGcyAALzbAIBCIn7CQQGAdgACAyQrW0sFrfccgu41FnXz0RM03TfvffdfffdFy+cu3D+vic+/vFPe+pTgbP33Vtr2djYRLNhGO+6666j5dHupUvz2byfzcdhHFer/f2DW5/x9IsXdx/x8IefOHFiNp8vV6vdS5c2NhY72ztuiUA8i22uMICEZACEAUniWQSAuUICgZFAYEuAjAHA2NggBAgkEBiMDYDBIAwYgQELgXgmI0kANoAlZDCAJGSM7Vri2LGdg729aRoiNLX22Mc+9ujw8ElPfMJqtZz1swfd8qDz589tbCyAxXzxjGfcenhwME3Dzs7mhXMXVuv1ej1EaLVaKqTQ4f7BsWM7s76bxnFjY2O9XN55xx1PefKTTpw4fuL4ztQmwOYKy4DAwsbmAWzbgMEA2BgEYAMgANsYWQgACwCBQJlZu+7xj3/c057y5GG5P65XwPJoWWqppZ45ffq+e++95567z5297567716t14v5xtbW9tTacnk0DMNsY3sYxoc95KH33Xfvk570hPPnz43juLm1qQig72et5dHRkc0zbn36nXfesZgvTp85fc0114ABjGXbmOcixLOI52SweCZxhUFIQkI8k7mfjQ0A2LZBIDDGtrmfBAJAIAEYzHOxbB5AgEAAWBhzP4DycR/3MYvFIjOFEPcTmOcmkG2wxDRN4zBN07SxWMznG9Pk2Wx+/PiJre2tYzvHbr/99q3NjeVy+ciHP+TWW2/N1haLxXK1esyjH33q1Kn1anX8+LHl0fJhD3vYjTfceNON1184f+G6a65pmds72w9/2MNvvPnm66+/4fjx49dfd+3NN9544003rlbr62+4/rrrrj3YP3j4wx/20Ic+tEQ5efLEg265eRxHBJaEEBiDAIEBLBACgSRAPJPEFQLAPJMAASAkAGMsAWFAgDGSbM8X87/+m7812jl2bHNrC7Rar2644YYbbrj+xV/iJZzTbbfdcfPNN588ceKmG2+8+eabHvzgB69X60c+8hHjOFxzzTWnTp+2fcMNN9h+6Zd+iYu7u095ylOvv+GGM9dcc/NNNx8/ceJgf/+Rj3zk4cHewx760FLizJnTrTVJIBBIXCYBFgIMgECIZzEIASAMMggAgQGQAAFIXCFZEkIYxDMJSQjbQgaBBIAQSDwXIQQgQLItQEICQKASWq7WT3rSk8+cOSW8sViMw/jiL/4SG5sb11xzzWKxcf311126tLu1tTmN48Mf8uDl8mg2nz36MY8Zx/H6665/+MMfdsONN7Y2vuRLvGRmu/vue17mpV9qe3tne3s7Ih7+sIcdP3H8jjvuOHHi+Jkzp2+68caTJ09ubGw4LWEkAWAkCQAJjCQAIwAkAAQSAgSSQBLCMkg8m0DYIASSMvPkyZNb29t2biwWNRin6dTJk8Kbm5s33njjwx72sNOnT58+deoRD3v46dOnL168+LIv+zLjeliv19ddd63w4x7/+FtuufnkyVO33HLzNddcc3B4+OAH3XLzLQ96wuP/YWNj8djHPnaxWJw4cfKaa6557GMfu7W1ZXzq5MlpmhCAJMSzCAlsI/GCiOdLlmVAyDbiWSTEZQKDeCaBkYRBPJMBEICEhLmfLARI4lkMgJAEAnGFkBQRy+VKd93xjJMnT7ZpQgJAYJ4/AQJjG4layjiNQihqrRFh2zYSkG1yZmutdl2JQAJFKNPpxLQ2lRJSrIehRNiWtLGx2bJFlMycxjFEZq6H9Ww2K1FaZtq1dhFh25nDsBYCkACBMfcTgIwBIbAtZBCYZxIYgxAyBoQssAEhY2MhDAKDsA2SAAH9bNZay9bAQJQiIbNcrbqu6/oZtnG21vez1lra4ziGFKG0u66zFaHl0WFEgLuujygtE1RKadMIbq1Jaq0JIQAMAsAgnskAiGcyzyRsCyEAjEHi2QyAEMJYBmMBCAwyFuJ52QgQGMtCGGMhgYVBRpKxjcQzGSQwBgFERNd1w3rdWgNKqYiun5VSnM5sgPE4DNM4lRrz2byljZzZ933LVkpZLZdA19VpmmqtaZyutbRsTkuqtU7TZGdrjQeQhDGAAYSQjQCBQYDAAAgA80zCRpJsA9gAkg0YIQQIKCW6rlutVk7bWbsKZHpqbWNj03ZEZKakzKy1DsPQpgmws5TS9z0oIsZxsB0RmV6v133fITCK6PtZpqdxcKZC4zhKEkJgEM9kAMQzGYSQMVcYxDNJAtvYIMQz2UgABvFsBkA8k0FcJjAPZIzFFeJZxLMZxLMIGQMYJDD3K6VcuHhRd93xjJMnT05TkwTGgBAAmCsMEhgAgTEWGIkrbAM2CIyEJJCkdNoWYEwCQiAkYyAUxgIgMyVxP6cRoUgnIAkJA8YgSRIYgwCwJGwkABvJNiAJwADGgBDPZBuEENgILGQsyTbPYizLAhAg7mc7JAPYtm1AEKXY2EZghNOWBJIEpA1gSwIiIjN5JoPAmZYkIQmQhEGAASMZxDOZZxLYRgIwEoCNhLEsC0A8m7nMBnGZhEEAxkI8kAEMEhjAAEbIGARIGMAYAGEjABsJAIO4nxDZmiTANgZh81wkSbLtTCQwyLYk44jA2JZkm8vsBCkkwCAJjIUAxLMZxLMIGQsBBkCAsHkACyFsCyGBMYC5QhJgALCNUYQEkJmZCZJIW0gSVwjbQoAEgG0DGEshYSNJUjoxYBswSBJYSJKFeBaDAAnbIIF5wQwgAQDm+RAYMBLm2QQGABsJwCCDuMJGAmwLWRYCbCQADAgZwAAIEBiDBAiMAdu11gsXL1aezRgEmCsMAkBIYBkjnIBDkXZmArYFSNgYkME2BgHYNpcZhDEgbCNImjH3sw0SBgyYdAIIp8GIZ7JtnpcQ2JgXziCezTwvgQ2gkBRgWchGAjCAQQiP46SQjZ0YQFLLBGwDGMBCSBLIGASW5DSYqSGwsY0xCIQQCgkQNoBtDIAAiSvMZQaMJAAMssAIENgILJ5FxkIA2AgsnkVgg8AGIQQGMAgjcYV5NnGZwJjLJNVS05aQeCZxP4GF+r4HYdu2U5JByCDJNlcIDLYxGAQIgQGDJGwAZAwFEEIGYRsAAQhAPJsBJMz9DOIycT+BeSALAS0bBkAIQGCQkO10lhIYAwiQFBFcFhIIEM8kCcxlkoxCNhIGARKA7UAIgwQIEDIAxiAbQAAyIGxkASkEGMAgbBACEAjAxkI8k0EGDELYAAgDxiBhMAgMQjaAAAtAGEAyBpAFlgFTSqQNRoC5QmBhkDEIMMg8kyTA6QrigQwSV8ggAGFbEhZpICKWy9VyuSy1OpPLjIUAhAAE5pkEBgHGgBAAxgBGYO4nyRhjEEhgIS4zyIDN/WwLGSSQxHMwxjybeCAhAAECY4yFjDEAkqC1ttjYWMznmSkkwCAwCOxz5y+UWoVsGyQJjLDBmc22hBSKAAkbMMaAJJDtdDpda8lM24AkSUJIYNtcYYy5TBIInJmSMlOSJNsSGEmSDIAkSYBtwAYshLCRwBgLIYA2NUQojIGIYttOEEjiCgkQGAAJG2ywFbItFCWmqW0s5psbGy2bJBsJAIRtOaRpavfdd9ZGoTY125mpEBARmSnJEIqIUEgGECAkAWCek81lBkniMtvGAhAPYIwBg8A8m4QtARgkQAIDILAxafez/vix4yYxGAQYBDYCaimX9vYv7u6VUswD2AiMbbDNs9hGgCQwlxkJYxCAEM9FYJsrJDAIAAsBBonLBIBtBMYAIIS4TGCnDWAMgABxPwkQ2AYbgTFIksAYCyEM4n4GCRCXCQHIuJZy7TVnSoQxAAIDyAAGBOa5GMB2xQbAIMRlBkAA2EYA2AaQhCVN07i9vd33nW0QAJZkAwaBDUIIGQMYEBiEjAEQGDCI5yAEGHM/IWMEFhghC2EjMICRMGCeP3GZhI2EzXMyiAewHdI4Tqv1SuIKIcvcb2qtdt3p06dbm6QQUoQhFOBpGkuEJDszU5LTCEzLlCTJkK1JEaVM49h1Fdsg8WwGMEhgDIAECAwCzxcb0zTVrh/W63FYd1213fez1to4jhI2gADxLDZXiMuEjQRIYhwnSaUUcEsP63Xf97XWzEQKCbCdmRISIFBIadsupbTMUgp2Zo7TdHhwgAAwksA2wgAmSuwfXDparjJzPp8P6yGiNGdYziy1ttZmfV9r6btOilprSOASgRDiCnGZeDbzTBIAxlxmEAC2QWAQIDBICBmDuJ+5ny3JIADAEXH3PfduLDb6vks7hI2xBAaBaJkHh4c333QDAAZxPwmb+xkAAWAAxDMZEAKMARBXCMxzECBxhcA8DwnACAMgYy6zAYTN/QQGSWAbBAYkjATY5n6SsA0SIDAIMAiDwNzPBgFgl1J2dy9duHjx2muumaZJAiNkDCAQ2DYSlxmwAQNATRsA2UgAGAAZBEgGQAAYMNiWApyZtkESINu1BIpsCYpQZmZLkAABGADbFhgwGAAMgJCxEDJgwCAwiQEJMIAxxmAsAAwYgTEGQOKZDGCglLBtYxsJgw0YS4AwSJLsBNKAEbYFGGPEAwho09TatB4GCClqjfV6sL29vXnf2bPjMG5sbhzb2ZnGCQwC0mkTEUC2JqXtli1SmCsEBjBgI0CAwIAQkm27SfqJn/qpl36pl37Sk578Mi/9UmdOn3rc4x5fa7ntjjsf+fCH33TTjev1CgAJkMDcz0biAQQGSdiZicQwjAeHR/sHB7WUkydPLOazbKbEOE6r9XpzY5EtkUCllIPlkQiko6Oj7e3t3d1LpcTxY8fsRAJACDAgAUjCBkDz+XyaJklRYj6fgSSmaYpSJNVSaq1d32FKRJQAhwRI4jIhsIUMEoANgBBCxhhjQBJgm+cmCcwVxjYg28a2bSMhBUiSBNRa+q43gIQNCCHbksCSpmnqu67WMk1NkoTNs0jcTxhkAMRzEwYhZAwWEjJGSNjYlgSSAABj8SwG2QA2gDACBCBsQIGNEQAGAQgjYQQSBjAABkmAwBgwIgDJNiAMAgCBeSZJwjaXCXsxn62HERAGIRswCAADIIPAGISEDQBUSTwXcYWwAQQWGEDYAMIGQMJIgCSVUvb29/f39lfrlWBza3Nna3uxsRjHEQQC20hCDrCwkQQANgBCCAMyFiBsEAIMFjIILGELWcIGQAIDQgAIGQAwQETs7e8v5vNQGLeWtmutmRmhaUrbpRSJ1rLWIgUCgXk2gQEQksC2pVhsbH7Xd39v7brjx453XT042H/Jl3jxhz/84b/0S7980803X3/dddecOXM4jYCEpHBgDAJJRhICIWMJDAIDAiTzbJK4zDhDOjo6+oe//7tQPPEJTzx5fOfYzs6v/8avvfRLvWSIO++846Ybr3dmRACSzBUSlwmBARAgQDZINpJay+VytVqthvV6inLu/IUbr79Oku3VelVrB0KSlOm+q0968u3jOD3ikY/6u7//u4ODw8PD/e2t7bd9m7dZLpcYAGxLgMACjG0A7JYJ2Ngex8l2lJjGsYJb0vdSxNQA2xUjFMGzCQxgDHYKAQhsjLFBYAzYCAxgnk1gjDGASRtI2+nMTNtOSUKSIiIiJDJlLAAkDBiEFNgIAGiZGAmQbS6zDYAk20gCsBAYhJCxbSGEBSAABMYABgECGzuRbAuQZBuQZJBk23ZEpI0NgJxJBHaEMm2MiYi0BSDbkjAghA0YAGzAEmAABAYM2FxmBMZCMsZCFrLNZRYyoLQBMJKQMYB4JgHIQgCIywQGkKokQIDAIJ7FAMKWZB7IIsAgALAdorX29Kc//b6z52rtaledvu/chY2NxTVnzpw5fTIzBYCEbQmDEAJsgywJBAYQxoC5TOIKGQyAQbYBIdsAEhhAXCYw95MAwPPZPKIgubVSQkgRkoASihJg25JsS8bYXCZjgbEQArBtEEgqtd/c3FqtVvv7e5ubm7O+y2wh4ZzPZtdde+00TZIAUNpCxrYT2ymFeDYbCRuBuUICY+5nA047UN/PsUopR8uj2nUIm8ODgwu7e6/yyq+0HtZISCBj7meeyTyThSywBMYgmFrLTIVq1yk0jtPRcrm9tbVerTCL+ay1lAKQPI7D8WM7d9973z133z2bzZdHq1q7ruuwW2t2YgAJEGAMCAADIluCI6LWzs5xnDqqkFBisDFgG7AJhRDiMgGWZQEIIR7AMiAEFsIgAAGI52QbBDYGbJzOzHRm2phMSREhk1aAbZ7JBhAyFjLPJBtsJAwyYCMhCQNgSdiWhAEZC4wBSdiADBIgZIMAEIBtYNbPbZdSMq2QM0FgO6WYpqnWWkpdrZe1liDSdnq+NZ/ahGmtdV2xDR6GQZKNsISNZADEMwksnpNsI/F8yABIwsJpAIEQzyJswDYBFpgrDAJAgLCRwLZBgEQFAIMQMgACAwYBwjYSGITAQgbAGEAS0tOefutdd93ddV3XzzIT25m7F3fvu+++hz3kIQ960M1takgCcZkxRgASthBgng9J2ABYiMsMBmwjABAYwJIwxkYYMBJX2I4QIAxGATIYhCXstAEDkngmgwWAhSwLLGEEJu3M8WBv9+3f9q2NMSoxTS1b6/r+Ld7iLWZ91/WzcRwkAbYFdoIQMoAkEPeTuMIgMM8kCWOcCRhTIiKilvqWb/nmN91088Mf/vAbb7hhvVp9yAd/8MUL5++5996dY8dms8U0TsaADYANNkgCY0k2yEJcISEA2tTGcXQmNlZmrterjcV8tV4tFhs2kgAwMLV28sTJxWJjGMYXf+yLnTp9+vDwoLVptVqBbSOuEJcJEBgQOA1gbGc2SdjDODozaim12mSmbQAM2IkK9xPYGIPEc5IExgYhnpPAABIY24DANja2W8vWWnPadtq2JOHW0iVKxVJY3M9GAoSMQYAASUgCBBZCGIMwBiRhI+5nZCwExgJJgAAwCElgLGRQui1m8z/9s79QKbWUjY3NO++887rrrrvrrrs2NzcWi/ndd931uq/7uruXLj3xiU96jVd71T/64z/e29vf3No6ceLk7bc945prr3E6Iu69996dY8ckvfIrveLR0SEIAAMgwE5JgLCRsYSNAAEIDEIAGIPMFQZsgUEYxGXm+TBgnkXCIIOEEQYMIACACgDCPJsxCAHYRggAgUFgG0kgBHap3d1333P33fdGqYCzIY3TFKFpGm3fetttJ04e39neaa0ZIwkQ9xNYwrYknk2AsLEt2wIkMIj7SVxmrjBgA2AMgBCXCQxIkgAiQsggmKYJJCFJIqSpTaUESEIIMAhAYBljhJCEM22P4/qpT31aa8329TfceNONN07T1LKdOHGitWanbS4TpA0IgLRBABiwDXaCAIGNuMxA2lxh7FLrPffed+8990TEsePHImJna/tv//ZvThw/fnR4cMstt4Duuuuee++9T+hhD3soAAaMARAYABsAYwyAEOKyru9b5uHh0TQ1oO/7xXw+TSMoIuwEMAZJEKXTZu3ueepT7QtPecqTVqvVTTfddMstt0QpEQGSBDKABcbcz7i1VkLpnMaJUJQAVGopRRK2M20DNmCQDTgUBoMQ2LJBFuIKYwwSGAuBwCAAgwRgA5KwbWMbyMyWOU0tna2lnVFqiGyZTlEVFnYptgGBJDBXiAcSGAPIXCGMEUI2ksSzCfEsRsJGYIyQhQwgA2BsO+++566HPfwRP/2TP/3SL/uy58+fPTo6uufeex72sIftXtq98667Nxbzxz/hCb/xG7/xGq/5Ws94xm33nT13w003XnvddT/4gz/4+m/wepd2L50+c81tt9/+Ei/+4hcvXnyVV3klGwkQIAFgSwKEbIMlAAkAAyAEtiUwCAwCMEgAGECAABDmmWwDIJ7FAMiIy2yeTeIyQBUAjITAAAhZCGwjAcZCGIQlLjMgQJqm6d577osI27YAKbpaMzNKjcDO8+cvnjhxorUJwFjIRgLAPJMAEAAGC5lnkgABCEDIBgwCg0AAMiBkLAkAYVsIYxBIIDCGENi41iLFNI1S2AmKCJ5FgIQThI0lyZjLbEWU0s1muvGmmzIzpI2NjfV6bTtCrTVwRIDAACZkAFuKkJqNCUVERMiJZQGSJBsJbMCSALBBktja3JjdckvtOmeOw9D35Ybrr+tnszNnTm9tbV9rMrOWYhuQgABLwjxbGIMEgAQGCUmllBpRSun73rne2Nw4dvzY5tbWOAy1dqUUbIBAXCEgpNOnTtvJyZPOVrsOqLVTDBKXGQQyBmwEgO1SSkSACNkoVGtnW1KbGti27ZAkIUmSAAEChJABLMSzWFIijGTxLALLWMIWgMBgGwOA07axgZY5tQlQcaYzm+2WqdZCkbYNYBAYbACJywwYAxgMAjAAQhiEBAaBsSwEIACDwEaAEMIANhJXGEAR5Zoz11zavfj6b/h6J46f3NxYXHPNNds726dOnbq0e2n+sNkwjhuLxWMf+5j10cGLv/iLHy2X6/W6lnirt3rLm2666cLF8ydOnHroQx4yZts5tpOtgUE8kGQjYQwgns2AkQBAAoPAWBYCJDCSLGMQGAQgMAaQDICNxDOJZ5FkGwAj2QYD2FWSucxGILABYyEENiBhCMk2RsIIsJG0v7+/v3+QmaHAtDTOcZrsnKap1lpq3dvfH4dBkm1hEAhjCMlgzDMZCYOxDIDAABgQAmwDIDCI+wkZAyAwxlhCXCYAgcBgDMZuaUlygmyD0kbiOZlnkgAQMgpQtGkahiHtnZ1j2C3bNLVcrRXCRkKI+xnEFbYBIYOk1bSapqnrqm0hhA0iFLZtAwiMwBgAzWbzjUWkjZ029sa1GzaYaRqP7exg2waGYQAwxgLE/WQbXKIgIbCzpXFmTi0PDw42Nje3NjenlhFytmE9TFOTomW2abItCQAbhGxvbm4YcEohaRiG9bCepkkSYCRbwoABDICk1towDLPZLBQErWVEs5nGKZ1CEpKQQKCIkMJOY5CMZUAIgwQGkLEQAgTm2YR4FpMgRYmiGMfBmWls0m6ZmRZq2cZhALCjlJYtMghsg7nM2AaQALCQhYQABMJYSAIjybJtCSTAshCAQQASNhI2GAkAIYOxEITkiPU4vtIrvWJmIpw88hEPt4lQaxmltNaGYX3LzTc//GEPWa2GRz7qkSVKa209rN7iLd58HKdaC85SO0uY9XqopRrbBoFtJCRsJCEDBgEGQAJsAIFBNpKQjcQVthEIwLIQBkAChACwJACDwCBAAAYEBmHzTADVGBAgAJJnkhILECBjkA3IGBBXOKKu1wO41tpa2tmm1pimaeKy1rLUYmxbEgiBMQgkjEFCyFxhgxASNveTwGCbZxIAEiBswBYYY64Q4n42EgAyBjBOgwWZWSJCQpIkKafmNGEA82zGEoABCyS1zOVyNU4TIEASKGI+6xWyEQIkrjDmMklcJjAOqe86QCFJIDuPjpYbi3mJyMQCkMAIAQg7p5YgQIDUWjNgJKZp5JkkCYwkBEgYBLZLKbV2B4eHs9mslJKZtZQS5dKlS0eHh9vbW7UWoO97wO5KrcMwdn0nEEbgRJKihNJM4zhOU5uasVCUqKWOwyjEZQKEuUwIgZEkSZIASglDSC3TmVIXUq211o7LJOx8+tNvm81m1157TddV2wDIAEgyFvcTzyYwSGAwAEKAwIK77r7n6PDoxhtuqF0XmZYkRUQV02RPmViolCIIiWcygAAACQAEIGMsA0gARgiBQRhjJAFgEGAsi+dkg5B5JmNZlgAYh3GxuTFNk804jrZr7cZxVMR6PZXQNI3jONnZ9/045WJzs03tcHVou5YyjGOtHSCV5XI1tWk+n0vKTDslYQMS9zMGAAQIhG0QBoExAEgGQOKZxDMZhCzLgJAAjCzEMwnZBhCAARvEZeaZBAAVIy4zCCQAjC0hZAwGYSNAEggALGTnxsZic2vz6GjZWsts6YzQMI4RZTab9X23WCyOH9uJiExLYBAC20I8N4EBsBMEBglsAAQgYzBIwjYGJIRtgQVI2AYMAiRAyBiDiAgk25LdEpDCMAwDUt932NgojMGAACFjAIRASEiKkAQWUkQpIZT2rO+FwJJ4TjYSgI1kEAawEAC2RanbZX//YHt7u+tLprlMGAABxggZkEECwCAAjAGQMMaSAAxgDHY/m91+xx0//3O/8P4f8AE4M5uc05R7y8Na63XXXy9Ip8AYyel53x3s782jLyWkThKAkUAxjGOtVVKraWdmAmBFYNvYSObZJDBg2yBqrQqtVwNCKEIGQIoopZSQBAiODo+W69VDH/rQdMOAuEwIbCcAMpbCTkm2JWEAO20iBJIEtgHSvvaaa55+6zP2Dw5OnTo1tmbMZc50trRtS5At05JKwXY221wmMAgMBjAIABDYAAjAIINAABgQIGQewEbiMgECMJYQAmxqVx/3+CccHh7VWiSFOH369H1nz7axzeaz66+77mlPe5oihmG87vrrdi/u3vKgW/b29u6+6+7lev3Ihz/8zrvufOhDH7peLQ8ODoCd7Z29/b3VajWbzXcv7W5sbL7Cy7/cOI5C3E8SBkBcYSwJc4VlIUAI24DAAEhgwCBACHGZAQTiMhvJxiAJDIBAPJN5AAwVMA9krhCAMc8iLjNgA4CQMnNjsai1ZssosrENEiGp1rq5ubm1uXn82DEAbCMEAJK4LFuLUjITFKHWspQAIezMdClhpxStZYQkMrOUkpmtuZRoLUuJNBJO246I1lJCkgBkWyJtCQA0tTEijEKSIkK2V8vVcrUa1sM0Tddee81sNjNGsgEMAmMhBGBbOFvLTDBgjDMTgZ0Dms06YycAGAQIzDPZxgAGQMZggW2IUja3toZxnJfANs9kAAtZkADIQCZXCAAbQCLTPIsxlmQjNI7jYj5/jdd8jRDjOCn05Kc89ehoOV8sXvqlX2q9WhmkAGOcLqXcceedv/M7v/egB93yKq/8ykkCIMugNk3T1CQEwzDamWlEiGmcFAEWgMBcZmOQAOwEJIUUJYTAkmpErbWUCGQjCWyYzWc33nBDrXWaMAYbiWfqug6UmX3fD+PYd/NxGKIU2yimaepqqaUOwzqzYWwbg4Ba67XXnhG0bABGQiIUoJCQEKGICCFsSQhjAIxB2EjGQlwmCYPAIGOQeG7iCplnMkYyEhghYwCEMSAwTt9yy81HR8u+69brddd189ms6/oSkdkWi8WNN944m82RNze3jh07trmxEdLm5iZw4vjxzc3NxcaitXb99TesVssTx48fO3784OCg77vrr78OmKZJCBAyBoO4nzEGgXkmIwkQMkZgQMgAGIMQYEkYkI2FAWxjQBJYCAEgnpuwLcm2jaACAjAIgxAy5n7GIAHGIGEjyRiQsImIEyeO71642HddKyUUEYRCUWZ9N+tntda+721LAkBgAARWxNbm5uHB4dbWFmi5PNo+dny9PJrG0eRsNuv6+fLoaLHYGKdpY2uR03oYho3NjcP9w9lsVmfz1fJoY2tzWB0KpmmaLxYRZbVabmxsTtO0HgYhsAAkbAMWlCjGzqSWCEka1kNrDbtlu/e+s8vV6jGPflRrEwaQBIklYQOWJWHIdGYCkkAKAQhQa22aVGtnLEACbFsIcZkECBACg2wLUIBt11pKKeM4llK4QhICwAIkAGxbEigiMhsgCQCLAFtgDJIAScAwTts7O9dcc+1yuVSJWsqZM2fuuuvuF3vso1fLI0DIkpAkO2ez2d1335P2XXfdPUxjLTWdwiGBMhOMSXu9Wjqzm83G9dD1vURm45kMEhiDARsQ0FprptSuRkncplZqBSEyHRUJgxDQd918NhvHQQKEQbaxvbW9/b3f+33b29uv/Cqv8od/+Iev+Zqv8bM/87Ov/Eqv/Kd/9qePfOQj1+NYSz11+tTP/ezPfdiHfnCJyEwkAAiptWlzY2OaWra0bTtbttbGcbKNFBG2DbbTmSkkG8wzCbCELQEWAmyDbQAbITAIDOLZDIDAIABxmQGMAZBkG2SBUWY7fuzYyRMn04mxM9M7x3ZsYzLz2PFjNkBmbm1ttpZbW1sRArU2bW1utjZtb22CIjS1aVNx6tQpO20gx3ECEBgACYQMAEIIAPFcbFsWksA2FkIgAAS2AbCNxBWSAATGGEviBZAEgCQQIQAMCATGmAcQEoAtJAAJyVxmbJOZ11177ZlrzgB97aIESBF2jlNr2Y4d2+lqtW2uMGBjOyJWy+WP/MiPb27v/NAP/8hP/ORPLJfLz/nsz3zyk5/cdd1isfHbv/27X/kVX1lq/b0/+IODw6Ov/7qv+9u/+4dLu5e+8Au+aLk8+sM/+uOv+9qvHYbxsz/rM//2b//2b/727/YPl7/xW7/9kz/10+PUfvInf+rP//wvaqlOY5CxEZcJUAgkwNhkujklgaTounr3Pfcsjw4FYMA2gMBCCAEGQAKc6bSd6TQIy9h4mhpYAsBgJLCMAYwRyGAbJJDAACAg0+CIEJQoIJvnYRshADg6OpICkBBgAQgBQpJtA2BnV6vQ0dGhBDBN08mTx1/8xR+TmRgQAmxsO0LL5fJlX/ZlHvHwh73Kq7xSX2trkwAE2LYtCZE20l//zV///M/93H1nz85m8yg1otgYA9i2AQkJMDgkAByhKKWU0vezWmotBbAzM20LJARpZ6bAtm3EFXaCn/q0pz35KU+9776zf/7nf3FwcPD4f3jc2XNnM/PkyZP33nNPBEeHh7u7F+67995ai7EAJMlg01oCEYoQkk22ltnSDkmKEgU7MwFFRERIEphnsUEgkLlCIPFMxjbYADa2jW0bG9s2tm0bsDFGAJIAkABjC2F7HKf1ej0O4ziN09QycxjGaWrjNLXM9XoYxmEYh6m1YRgy2zgO6/V6vV63luthPbU2jeM0Duv1kC3b1Nbr1TgM4ziMwyQQYMCADDbmmcxzEoCNQQhhMJfJ4pls2wDGRhIGAPNMtkFI4gGEhIR4DgZAgQCEABsLDGDMMwmEkXkmg8EAWIDtUsujHvXI62+4ToEzp2lq0zSNY9fVa8+c2dxYGEvC2AC2JcBd35+/ePFHfvRHs7WnPe3WX//137DT6Y2NDUPp5hd395729Ftvv/2OP//zP7/j9tsf97jH/dEf/uGdd911cHh0+tob/uRP/3SxMS8V45OnTv/dPzz+7LnzT3nKUx/3uCecPXvuW7712//qr/56NpvZiQAhMBIIG0yESq1gSRLYmdlaM0QpiohSDDaAkBCAAIONAYEABJA2BgMKhRQhwDaWwQIBkhAyRgjsrKV0XQWMASQwGBDYjghFtMyImM/nYGzM/STJUGu9eHH3R37kx8FAZqYNNgYkAeD5fF4ULZsiJMBSALJBRiAbhRA2AoG4Qq21V3u1V7vhhhvHaZJkg21jJ1iSFKWUvu+PlqsLFy90XQeOCEkIEICEuJ8AbCAUUUqb2jgOTiOVWpEwSDa2bWMZpOAKIwAkSQLaOAi/3du+zb333Xvu3LlhGA1d1z3kwQ/+y7/4C9vYy9Vyb29fUSKKFJIiBMYWSEgCGWzbVpSu77uuiygSxpJqrV2ttXaSAAxg8ywyVxiDMAIBSFIppUQUhSJCESolSolSFKEIlRKlRClRQlEiaumEANuSAYVqKaWohEqoBCVUi2qolihFtUQpqiVqiVqihmqohrpaQpIEAuxEUi3qqroaXVEplFAJSqgEVZSghEq4BEUuogQlCBFBFQ8gKBFRSpSIiBJRaokSUaKUKBERERFRSiklSkSJWkMIAEkCDIC4QgDmCtu2ASGMbduSAKCCAIOQZO4nhAGQAcRzE5dZgCJbk/TgBz3ommuuubR76Wh5lJnHdnaOHz/e911rKQFI2FwmwKbU7mD/UHh/f3/v0qXtnWOnzlx/ww03LBaL1ibntLW1edPNNy6XR7OuW2wsnvGMW9/kjd/o2LFjmQlZa3nrt3mrzc3N62+44djxE/P5PDM3NzbHnbHUMpv1B4eHRDW2LclGAhAYEAC2JIxA6Gi5XK1Ww3rYu7R3y803LxYbwzhIABbGsgDAABLYGAAJIQkADAKEQJmOSEkgYy6TEULYns1md919797+/qMe/rBxGg3CgI0AgWXADunSpUv7+/s33XijZZ6DJVprO8e23/wt3sTmMgmMkWzAkqR48lOetr21deLEcacBYwCEJK6QBBgjgQGMsSRJHB0dIkUpGAAbDCA5LSmkaWov9VIv9Yqv+ArT1KZxkgDEZRYCwCDAICSg1BIRJUJ0CkkCR4QkiYiIiIgABDiRDJIAIRBQSplavv7rv/7NN92wXC7f8R3e/vSpUy/50i/1iEc88i/+8i8e/OAHp9vBwcFNN930ki/5Etdde+00jZIMGIxBALLTNiakUgrCdmZmy2xNUq01IhQRIZBCSIBEJkKSAQwCgwwYAEnA7uGlJO1MGyyEJASAAWwDEBJIYnu+XVRtGyRa8/nlJEnYibFBFhhJAgPYRgAgbANwbCO6EgiMJabUvQeRJoKQQWkEBgEgYZ7FGEAgKclOPrEBgDEKXdo/GIYxQjyTeA4GDAIhBLCztaUQGCMQCCEusxDCACADthGAJINtMFABmwcyFgIQAMZYEggMIBBCXGYQFrI9TeNiPtu4/jpAAmgtW2tCGIQNGAsA2Qm67Rm3rlbrW2+99dTpU6vVChjG0SZbyzbcffddf/7nf/GO7/CO62HMlo945KPWw7A8Wk7TNK6WwzB+3ud94Zd96ZdNUwOOlkc4b7vttv39/Vk/e/gjHq4oADaXCWyEkAU2gARgGWs2n3VH3aXVpdV6fcMN1z/4lpvHcQipIUkAiPsJgRCADViSJCEJjG1JNhKS5ovFsB7sFGAsm8tMrfXs2fO7Fy/VLp7ytKc/7CEPGqfJCJDAYCQBmW1ra+tv/+7vfuzHf+LLvvRLjpZHAhAYAAmDaikbiw2F3AzmmQyyAUotX/lVX/lBH/iBN954/f7+QYQAIe4XES1TAEiAjCWEbMC2pLDNMxmBCUUokglkCGl7ext7PiuSIO3kMmNxmXgWSUiZKRRdATJzHMdSKtD1PRBRSimS7AQM2LYRESEF97P9qq/yKuv16tGPesSLPfbR6/XwXu/13tOwepM3fqM2Tc4GGL34S7zU6uggM8EYJElgG0BgnkmSpMxsrdkpSRERJUqAbEuSJDAGScY2AOI52YlDunh0MVR35lst05kSAAiQZBsw2BYGCU9tunBw/szO9ZLtBN93adhe1HlfDLaxjYUMAgQ2AAEgQLaBllw4bNceKxgwIZ078KzLzd6JhCVsAxgLkEA4AYNBIRkEWUJ7K1048plNJpdaLl3aXw/r48ePORMAAba5nwCJ+yk0rIfdS5dOnjwJRlxhEOIyYwCDEDI2CBCALANIoLvvvP3EieOtNZBtgQVG4pkMgACBAZtStL9/OJv1tXa2wQAgZAwCc5kkwAYhsEEWwpJIu5a46+67bc/mi3EY1+v1zTfddOddd5w6darW0tX6lKfdet/Zc6/1mq91661PP3369H333Sv7+PGd3/6d33mNV3+No9X6zjvveo3XfM2nP+2p115zzT333H3i+Ilbn3HrOI4v8RIvcdttt89m8+uvv3aaJkmAMZaEAZBBPItNSEjjOIBmfT+1CZA0TW29Xm1tbWVaEpj7CVrmXXffu7O9bQAkSZIkEZIkSV3f/9Zv/tarv/qrLRbz1prAIAmwXaLs7e+dP3+h2RuLjZtuvH4cR0kABmGQAcCITEuyXWvNlsZI2KAQKIwPD4+2Njcy07YkIQSSANMyJUmSsLENFkJIAh0eHW5tbrbWELIMEs9i23YpddZ3q/XaBpCQZGN7GEfA9uHhoe2u66dp6vse5zCOZ06fztYABICNxGW1dmfPnVsu15JKLW1qiGxNISdd30VELSWilFoEJUKSRClF0jRNgCRsAOFMRWSm7VCkUyrGQgoBkto0lVLAtm1Lcrp2nSTb2Ia0p2lqLVtrLdOZtgFJUiBC6roqNJv1586fP3niRN93mRYgDAIMQtI4Thd3d6+75hrb54/O7cyO1yigvu8NABL2OAylFkyUgknnNA62Q3H+4OzxrVMlinGmz+5N1x+vzRZC6mpXIqbWhAxplxIYO4HM1lqTJKmWcvfF1YnNWgIbSXHPXt5wzLZtMFBKqbVLp41EZmbLWitSSK211hoAJhRD6vxhXrfj1mqt585f2NhYLObzzBRCRCm11MwUMrQ22QmAjAWC8+cvHD9xPCLWq/Wl/YPrrj0zTZMUAgOY509cZlxLuXDhYuUKgywusyXxLOJ+BgHCNlcIjJGwBQYAIQtAgMASV0iAAISxpLG1m2660emWLiVqKUeHRw+65ZZpaqDadS/xki8JMaxXD3/4w8ZheOiDH9zaOE3TO7zTOw/r9emoD33Yw5eHBw+6+abl8uj6a69J89Iv9dKqdVgtH/nwh62HYZomSTZgSQhAYDDIIAwYgTF23/XGU5skYUBg20Jg2xJYxhJIgCQkZxNCkgAEisCezWa/97u/d3Bw8Ad/+Iev+zqvAxhAkmwQLdvx48ds7+0d3HzTDeM4SgKwELYRVxjJLqUAhtYaSMK2EMKAbVuQmUAoECBAAEqnJAlwGoGEkW1MKfXWZ9x+4cKFM2dO3nzTTeM4KiSeSVKmo5QaceHixdtvu/0xj3mMQhgbMKBQV+s4TYKu7578pCc//enPePVXf7XFYpFJKABjkLhC3M9ODBAlhDIbyBAKZCRJgIQkARKAuCJbEgThTIMkkNOAUNpSSBYCsI2dIFprYBCXpc1ltgFASAgAC5AiAjBgBBEhRYQAEM8iYQMIg8yzCaxA6cxUZrv73nsWi43adavlchjHE8eOnT1732I+P1qtZrOZ4JprzkhCsmzbTkCihNJg0q41zp+/sFqtFxuL1fIo04uNjf39/fli3tVuvVrN5/Od7W1jm5aZxhgDAmMzpQQYCGl1tLxw8e75fCF8eHQ4n81ns/n+/p4iMnNne2dneyudAAlpsDHGBshMsMHOEmV/f39/b19R2jR1Xbe5udF1tdYKBhmnbQCBEAJAEsLmAQQGMJIA2wACAxgqABgCWQaEAIyxJBAYAARg4xLFmRgECJCEAUnYIACDsI0ECAADIDBgu+/622+/HbTYWJw7e9/yaHn9DTc+9alPfdCDHnzLgx70J3/8RzvHjh8eHhzb2bl48WJESLrhhuu2trb/6A//6NixY5LGYRiHYRjWwPETJ6655tqn3fqMUrujw8NLu7vXXnvm4Q9/eJuaJCRjWQhABkDYloQEBjDpBJAAC2EAZBAgbJAx95MgIsAgSTYRSBIQkemXfOmX+vVf+/VHP/rRpZZpTEAijSAko3Gcju3snDh+fL1eS5JUSmmt2SAJAwgBCtu2hdrUpjZtLDaSRBLCtjMzp2kCgxCSQJIkjpbLrusC2YkFGBDPYufBwX6p3XI5RAQAAttIOLPr+t3dS5ntwoXzP/nTP/0JD3vYYmPRWkoACJsIdV1tUyul3HPP3f/wD3//Mi/z0ltbm5IkASAEBoGwkQAkgVu2SFkoIqRM2wZCkmTbgA04UxEYY8xsPpPEsxmUmdiIKyRAkmzzAJJ4ANuZCYBtQAqFBVXKzAQADLIkAeY5GMAYIWNbEmAJwIAgQaGICIu//Mu/2L24awQ2vOZrvOav/uqvnDp5cu/S3jXXXnPDDddfd+21LVMCIwBxmW2BJTtn8/mf/8Vv3XnHndded+0//P3fX3PNmVd4hVf4i7/8i42NjePHT54/f+4lX/KlTp06uV6vAaczwSAABDaCQA7bXdfdeeedf/aXf7m3t29Ta9x4w40Pe9jD//7v/3730qXdixdf97Vf+9RLvvhyuZKEEMZcZrANgIXTdtd1z3jG7X/6x39y5tprzp49u729debMmcc85tHXXXvtOE7IMkJIXGbzbDYILGQAc4VkjAEQlxkAdPedt584cXyamsQVAgMGcYWNBOaKKLFarf7oj/70QQ+65eEPf+gwjkISNhLPhzFIPA9hR8Te/h7Qdf3+wb5b9rPZOI4bi42trc2777mr72dtmqIUIFum3XV1Z+fYufPnuq6fz2fr1TrTmS3Ts1m/vbN9/tyFWuvUpja1xWJ+4sTxzBSyAAthEBgDQjxfwoAthKZpXK3W29tbmRZYFuIKkS3vve/ssWPHMg2AJYUkKSIUUUvpu241rPuua61xPxsJEAC2sVOSANjfP9ja3gYDQkiAbQnANgBgLl7aXSw2Njc2WpucCbbZPzg8dmxHCkVw2fnz53GePHkS2zZgwEhSCAAhAq3Wq/vOnrv5phttY55JgEKaWnvik57U1fqoRz3y6OhwNpvZAiQAIwE2Atjb27t06ZIUtZadY8dKKcuj1cmTJ1prEiBjAQiwXWs9d+783sGBYDabSTKapjEiSkREsV1KKaV0XQWXKBEhERGABAiQkFRKGcexr52xASMpQmmP44SNQGBeANkG27KzZTpJZ6btzJYWTisoUSMkKaSuq+fOXTh58njfd04DCBuEAJBinMaLF3evveYa7PMH57bnO13pVMq5c+dqKev1Smg9jidPnrh0aa/rur7rVsvl1tbmfD5HKqWe3bvnxObpEmE7zfmD6cx2ddpQu3rh/IXlctX1XZumWd9vbm7sHxys1usSYbO5uXns2LHWGhDi7t3p9HatgUEh3bHr63cIARgFq9X6/IWL8/l8HIbMLLUeP37i0qVLfd+t1+tZ3504cSJbIpA0TLpw1K7bcWu11nPnLywW883FRssER8R6Pezt7QmQptamaTy2c2xnZ7u1JgmwfXH30onjxyNivV5d2ju47toz0zRJEjLmmQQGBDYA4grbXa3nzl+oYBswiMsMgCQEYFsCAWAQtksp8/lsNpvZFKmUOk5TBDYYAIF5JgnbRgKwkQDAhpZtZ+cYgL2xsSEpnRElW2ttuvHGGzPNZRFFEpCZrU033HCD03ZubW5KEZIhM9N5/Q3XYiREtMzWmiSMDBKAuEICYyHuZwAEgAzISAASQsIIERgAWch22jaAhBQCKRQCIiQxjEOJmKZJEgACS9hGYEsRgSlArfXsffc97enPuPaaax728IeO6yFtALvWmq21bJIkSaGIrps9/enPOFouJTKb7Ygwms/nQraBo+XR5mJ+y003ZqYkRQDYs1k/TVPakgyCdM5m84c++MHDMCAsMMiB0o6u3nPX3VJsbe9ExHy2SCeyEAAIY5Bsg0upJ0+eBNnuSkVC3E9gIQAMSAYjIkJgM02TImrtSgnbxrbB6bQtgaQQz8FARFkuV7uXdq+/9tqn3fp0rMXGout7Z+7t7bc23XjD9X3fA7bEFTYIQAjbPJPANhgwAAYZYyQwz5JO25Z5FglbAALbSFwhSAADBme79tprbWPsBMZpvOnGGyUZhKdpykyeSQAIDGAAhFCbxlOnTpYoxpIys7V2Zr5QCIOU2VqbJNkghBESNgACwDYCO5nP5w+65Rbbkuzsun6apo2NOUaQzmmaJNlIAAgJQAgDICRAmTmb9ddff51tSSCJaZpaawLbQgIBEpdJgEA8N3OZAXE/gwADovICGDBgrrDACCAzZ33/Ei/+YrPZzNmWq/U999ym0LFjx44d2xEYBAgMEliAADASz2QBEq01gYFsGKRGAySN48T9WmvcT9I0TmCeqQkZA8CUybNJXCawIcDGAJIMIB5AABhkrhAIIZDFFcYCwIABWmuZKUCShEFIlKglZBtkG8QDmYiYpqnWmi0JAVHKhfMX7rr7nmzTX//N35y/cPElXvyxtjNbiTh/34WNjY3Nzc3MBGw724kTx5/+9Ke/7Mu8tHNq0wQoIkoJFYVsSujS7u4Tn/SkkydPDsOoCC4L6SlPfdqZa67Z2tho2QAjkDPXwyCBkUAYpRFM43jzTTfs7m5FidZaOoW4whhLMmAjsMBCUligkBCABQIDGMRltgDbJUpElBKZGZIzLQwRJQoRISkkrkgjFGGbB5Di6U+79bprzzztqU9br4frrr9uGMaptbvvuqvvyrXXnO76HpC4wgbJRlwh27YFQEhEpK1MSdhShEDCliyFJCGwzf2EQVxmQAIsEM8iSRK2h/UabBsQ9F23Xq8iikFCSAoAG4xtGyMAAyCEiGmcRkYukwQkScMGkCSFnQAIicskACFLlmUMUtiM4wCk3ff9M57xjFrrqZPHp5aSJEnCSDyTbZ5JkpDBRkLg9DiOgG3bCCFJgAwCZAMG8ZyMuZ+QMQgMgMAgsACQVA0SQoBtCRAWMsZYEkbCCAwALTOdaZeu/9s/+8v1en3LzTcNw7BarhaLucAGEGAjAATGWIhnsgAkGRBgETyQEAKEbS4TQoBkEAZAGGQBBoS4zFjGwgBI2AiQuJ+MARlLAmQsAIEBg2QBCBKwQRYCjIRNV2otJVsTYCIiQrVWCUAIAQKEjME2tZZ77rn3Gbfd/qBbbr7u2munaUK0cdxYzLc2N/f3Ll137TUbi9nBwb5wlHLs+PEv+8qveru3edvXeq3XODw4sJEgs9lgyVFKlCKDsA2JJcChiNr1ESWi2Z7GwTCfL37oh3/kbd7mbV/6pV/q8GAPBCnJshBgLAQIkMA209SOH9/JdGsphACwkQDbSDIAAnTh4sXMnKb2sIc9dBhHrhDGGMBYgHgg2xGl62R7HEdjoRJFkqSIQMIGG4Rs80wS2NRaXvGVXsHmNV/zNTKtiIgCLsFqtSpRAIwxl0kCEBjMFRLGWAAYEAKMQyCFguCKkMAosLlCgDFIPJMBGxuEkCSQwQCWVEpxevfS7m/99u++3du+zTRNs74fx1ESYBuwbS4TGJAQAoFBCAAhywAIEwJhYyf3E+IKIwEGCwwgMCgiQDL9bONpT3/69ubmddeeGcclEaEAEIAEgLlMXGYQgG1JkmTbdq21tZaZCglZgLmfuJ8B8xwENgZxhUHmmYQQwqoCG4NAEgaBABBCAMKYK4yQkKHWevHi7p133nnLLTd3fVdrTbu1rKVYiTES9zMgiWcyCMwDCCEwBkCCxAKwucJOG0UIwAKQMQIEgBEANhJCCAzCgCwknslCCGEjBICMAZAxxiBbBsAGJGEuk2TAzr7vNjYX0zgJSSABAsAgBAYwlgEbO0P14u6lk6fO3Hv23A033KA2GQx939944w3z+fzMNWfms35YD8aSMJ/1GZ8xn8/XqxU4s9XarYdRimEY2jjWrguFhTNbaxFhG1CRQrbXwzCOU9d3hlqr7U/55E8upSyXhxFh28a2JAxCCkBgEBgkMNM0AZIwgA2SjBDCXGaMZ7PZ7qVLd9xxx6u88iuP0wDiMtuSkABhAAQGQooS2AjAdqklIkgb2y4EiPtJkgQIQGAjnKUEKLN1fSdkW5JtYGfn2DS1dEpyWgJpmiYAhGwDFhhhAAMgSCxJkgHJWAiwbZvLbJAkOROBwEYCAyAAjMEGEEJgRRweHV24cPFhD33YYmPrUY96VN/34zg97WlPu+VBD3ImGATCAGBsG4GEQWCwE5CUNgYMFrJwGogIABACAAPCIAMCJEC27ZzPF3//D4+/dOnSa7z6qz32sY+ppYzj9Du/+/sv//Ivf+LETmuWeCCBAWEQYAMSINuSSokL5y8sNjc2NzaGYVAI80xGPC+DQGAwBkAAmOckO43BFQQW9xMANuIFMRgL2c5s6/VqGIZsaTvTgEEA4gpjgQFLPJPAgMAACAAbQLYlG7quZqZNrQVbkkKGaZwyU0KyDRIYAAMQYAkAYyGBkQABYAMghEEIEM9iI5nLBIj7CWwDCHAaIRCSMBEhAdgACBsAmSuEjYQkKVrmQx78oGfcdvvDH/qQaRoNIEktXWu94YbrWsvVai0JZDRO09bmRjpbmyTN+lnLrLW21hBIPJNn81ntjq2O9qdpklSiltIpNJsvFOuQ6mKjtQa2cxwn29hIgCRDhEKRmYABsA0gIcuybIwQEpcJjA1gDJKUzhMnTtxww/Xz+TybFQJAIACMARBgrpCmqQkYp3EcSim2MXYqw3ZTCpwCsJFsS0ISgBBAZmJq391xx53jOHVdXR4ddV0tpTs8OjpzzZmI2N+71HczQ2Zed+01xrYBCVvIGAADBmxj27ZtW4CUmUBIgDG2BLYNgEEgcT9hwDyAjW0Dns/m29s7B4eH8/n8phtvNDpaHm1tbZPpbJIAywgBCIwwNghs7Nza3m7T1KbWz3rbAoNtOyOKIg4PDiUBCMlcZlvCAoMAwNjgzHb61InNjcX5c2fbNNXaDWN7+Vd4xePHdrqua20FgGwEIACMkTAGSQLAtter5V/+5V/38/lyuXrEIx7xkIc+5HB/XwKDQFg8i20DCIMMgCSMhUEWGBA2gAwCDBUAjGUBCMAgg3g+BDYW0DJPnjjx4Ac/eJrGUpStSZQSYCwAgQGEUIJ4IAHmChtAAGAJIcStz7j9+uuuGYfxjrvuypYbGxur9bpl3njD9cd2dlqbbIHBGARIArABhJBlnskgLpMMArAMkrifjSUBNgjxQAYkgQEkDBhLCkmAjcSzSIAAwLbtCAGApEz3fffYxzxqHKfMFEIGATbT1IQiArAtAE3TyGWhWK1WXd/VWvuun3WzUqokO2fzxd133/Orv/Zrb/WWb7m1uTFNY7plGzHORrYpvR7Wi40N2zhb5nw+c+YwTrUURelnfZvyqU97Wt91N914wzCOAoSNMIAQwlhgEJJsI/qum6bJ5oppHE+dPAGM4zibzcQV5gqDADAICcA2tsGZIQGSMhNsOyIkJCFJSMIWCMBIGIwxYCil3HnX3UeHR7NZX0q5tHdp9+Luzs72Nddde8899z35SU86duyYRVfiuuvOOLmfhEHGAmMAJKGIgqS0DcaWBESEJIFtSQAYcZnAgI3AAhAgYWOMjcFOl4gzZ06vVuujo8P1MBzsH2xtbfddt1oeSdggyw4FksCSDAiwbXs+n//mb/zmNddce+11197++NtLFDAIiNByudw/OHz1V3u11iZsLBDPJCwZAwLLNhART37SUza3tjY3N6PUi7v3Ljam66699vhsvrt7sUScPHF8PQySQSAEYJ5JiPtlejbrn/DEJ938oFse+ajH2HzjN37ja7z6q73Ei7/Y4eFBSCAA2yCwMVcYBGDAFs8iZAEgrhAA2JX7GSSeTTxftkEIJCCzvdzLvsy9994rxWKx2FgsABuJZxIYgQmwEGBsWwILCYx4LrYjYnf34umTJzKnvd1Lx44fu+POO+bzxcbGRq0VjEEGMMhYiMssgUEGEBjEsxnEFbIABIAB80ySAPMAloTBNgLEFRJgMFiSjQBhI/Eskvq+G4ZBEmAbZHu1WockYSMEMkaAuMwGCQBLsh3Sar389V/7jdd8rdeazfpMr9brKEUip1Zq/+u/8Rvv937v/9g/+qNXfuVXXO8uhVubDg729y7tTtOY6T/7i798jVd/tflsNk7TzrGdL/iiL3nUIx7x1m/1Fhd3L9VS77jjzr29vdV6LdT33alTJ1trQgLbIElghMBCyAZRo95zz30nT57suq61ybbtcRhLLRGyU1EkgbhCBgEIEJjLJGGXUhQKKdOItEspEoBBEjYIYXOFDSAASUgMw/CKr/jybWrZWoSyNYSiSHHi0ccf8+hHmSQ9TqPTkgAQ2BgAG5srzGXGEkAmGGOJdMoCJHE/GwmwjYQEBgAM2DbGAlCtZbVaPfmJT3zoQx5Wu7q/f/AXf/EXr/3ar9VyOn/2vtvvvONlX+ZlWksEYAAMgLnMNoBKN/+TP/2zl3jxF58vFk94wpPm81lmCiJKrd3FixfOnjv7Gq/+atg8D2ODsC1jBFBrffLTnvaYRz1qc2urn8329w5ac565BvKee+4RnD59CgwBGAsAAeKZBAaIEqV2T33q017/Dd5gGsfa9S/z0i81n/VtGiUhYQCDQEICEIAQtiUBGIQBDALzAMYAUBEgQOJZJJ7JIJ7FRpJtLIzszOxqufmmm7I1hQDbQgZAXCYSYySMuUwSBoENIDAIDAJAaq29xIu/GJCtvezLvUxIj3n0o4hoU2vTNE0TSDYSCEBcYcBIABgEgEEAtgUgDIAA2ZZAGMlcZgADIAxgwBiQZIMRgHgmgWwkMOZZDJLUWrvjjjtvvvnmaRozEwADEQKBJQBsQAKwDZIAgQFAkk3X9a/zuq/ddX2Euhq1qzYhosQ4rN/yLd78937vd17ixR+7OjqqtS8RUtRaNzc3xnG0/aqv8sqz2cxQap3G9jqv/donThxv6b7vMTvbW8OwXq3XpatTayCuEEIgMFcYAbLtWT978pOfOkzTpf39Rzzsobadzkzjc2fPdX1/5sxpGxswYCMJCRsAYwTYEmlntpaZME1TqTWiGGe6lGIAIZCEEAaQMMhCAAI707ivlb4DQspM2zY2UxttgyMCc5nAGAwgZADbti0kgUljG4yQsZFkWxKSbYMkyTwHIQNgbAQyAJKU9ny+ePEXf4lau9XqqO+6l3npl1yvV4vZ7PjxnWPHH5uZEcKWJC4TGGxsQEBoebj/KZ/yydM4Yj/8EY8Ag7ERGBTA4f6eJC6zzWUCJIR5FgvGcXzzN33jcWrjMA3D+GIv9mKGzFZKvNhjHw0cHR1GFAAhwAZAGAAhiftJUWp9/OMe96qv8ip333n7fffd+2KPeeQwDJJAYO5nYyPJ5gpJAAgZADDIQgYwAAIARBUSBvE8hCzzAAJACIFAgOy0myTbEgKEwAZhEAgQAAYJDCAwAOLZxLNIYduZUUrX9RElM7M12bUUIgDsls2YBzIAxgKQQQAYQBIgZIwAbHOFASywJWEAhA1gwACyEIAAcZl5NgMgcYVBOBVluVw+9Wm3Llfrhz7kwZJscz/bEiBshIxBIAmwkQABmSlJIhQbG1uZLbOlbFsRxnaOw3pjsXj1V33lw8OjTIMUUWrf9zMUilJL6WcL2wB4tV698iu9Ymau10Pfz7Dn8/nW9vZd99yztbF54sTxaRy5whgjxP0ECAxk5sbGYnn+wqyrbRptjLuuu+uuu/7u7//hlV7xFSOipblMAgTGBmxLAgwgG1CaaRijRESRwplOIwQYnAgwCCwEgHgmgZ1p+577zp09e3Y2n3ddP4zjYj4/PDyKEiXixhtvmM1mNgYJgwzCmMuMwYAkwAZzhW3bCCQBGGRbIIFtGwQGhLCReSYhAJDAgLFzckZof+9wtVrPZv001cVsdnh4uLW12fdzJK6QDGDuZ2ywkW35YG9PEtJqveJ+BmEboJQCAhsDAknGAkkGY8wVtsdhesbttx8eHr3kS77k4eFhiSgRf/wnf/yYRz1ye3tbEjYCAoR4DsYGQALWy6O3e5u3/qu//uvf+q3fWq/XL/syLz2fz8cpQwAIY8yzCCTAUtgGgUFgAAkAg0BgsAQAqmAkAQiMQVxhDGAQAsACY5ARBgEggQUWYJAxCAABCBtAIIExCMBYSMgY8ZwM2C61O1oun/Tkp1y6tLexsbF36VIpUUodxmE+m5cSj3j4wzc2NzKT+wkQtmUhnk08i22DDEI8k4UAsAQgAEAACIRBCIwExrYkEAIMAAYBCGwj2aiUslwuu77b298bxqGr1TYQEQIL22AEgBACMIiuq9M0As7c2tgcp3FqmZmZrZTSWtZSndnGISLANm0a9/aGUsI2dmazUxG19sMwQkKWErZtSzo6OgJFyDYwtSbpumuukRjHQZKQ7RJRatday0yeSVwmaRyn6667dntrczafAQqFIqJcc801r/aqx7a3t6bWSikIAIPM/SQBBkChli1bK7hlEso2ViwzRUQoJSSDEAAGIYFBEjbIAKKWeu999+5e2tvZ3s48OFqu1sMQ0mI+a5knTxyfz2YGGUACGSzJGHOZuMy2beNMZxoAMMKShLjMtiRJILsBIAES2EZcZgABIDC2LWnv0qXb77jjMY9+1DCM4zBubm0pyh133vWIhz9sGkcEgG0bwABIkiSBbWMpQgIkBQAC81xsg4RtHsgAGEASEIqIOHbs2ObGRinlvnvv6fv++uuuu+nGG/q+l2RAAGAACUBcJp5JQgLjw8PDl3jxF1uvV13tDFNrEQEGA0IIGwnxbLYBMADGIAFgI55JABgsXG1sg7lCXGEQCFnGWAiBAQECBAgbDBhJYC6LEJfZgA1CYNsSCACQBBgDgG1J3E8IIalEmaZ2ww03HB7sb24uMnMcx43FfHNzO93SCbItCQAQGEkABiGwAQwSAosAIwAZEMI2liTA3M+EwDZGYBsJwCAJsHkWSVxhI7AAsO2+70+dPPHoRz1qHMfMlCSxWq0Oj5aL+XxjsTBpA5IAAwjQxYsXt7e3MrOr5dd/8zcf+tCHXn/99ZmpkEKz+SwUinA2BVJYQClVQkhAiDZNOCVqremcxrGUGSAJAGyELEgAOzE2EthGEXFweHjb7Xc+6EG3bG1uTFOTBIC5TGKapsXGZmYiQDZA389ms/k4jvOusy0ADBgJwLYkEBgQKqViQLNZL0XLlpkhlYgogSQIBVgIxHMSYCSkkubFXuzFS4SiSCq1tpbZWuZkW5BpSchGArCNBAgsCQzYNjbY2LbTAEiyucwgCUPaADZIAgADgACJKwzGNgAGMnNjc/NRj3pUqR1T3n7HnQ9+yEPnCx720IdM02iMwSgMaYMMSAqFJBsJAAsA80zmmQQGbMAAFsaAAQHGSBK2AZCkcZqOHzuW2cb18q677jq+s3PtmTM333RT2ralAMA8kG1sGwBzmblMrFYrSeM4IkUExjybuJ94TgKDwAgwz2SeSWAbEFDBICMBIDCXmcuMBAYMgEEggQAMAiSwnRERocwchjEzFeq7XhGyMy2QwAAGiWczCEk8gDGotTaf9y/9Ui9pp21JzgQkSYEYxymzScIgns0gAIEBARIGGQsZ2zYOhDC2kGUMgCQALIyQJAEYCWMhnklCAAJsJAyAuEIS4zgeP37s9OlT6/VKCoVCMU3T/sHhMI7jOILn8zk2wuaKUupyufzsz/n8j/+4j77llpsl/d3fP27n2LEHP/iWdIZkG1DEOE7L5TKCTEuKKKV2BuNQZGtnz54dhnEaxzaNUUrfdQYg01FKV0s/mx0eHAgAgREykgHbzlpnT7/1tu3tnac+7ekv/ZIvAQ0MCBkAAcJOSYBtRN/32MZdVwXDOAEgCRAYkISxLHGZs7WW2dcyjVMUT9NkO6HUSU1d1xGkU2DzABJgLAvZAhuXUgJlJhHjMNTaRa1QMnOaRi6zkcCAJNuAEQ8gGcC2bduAARuwkRRKIuzENgASIDAIA+aZzGXG6bRTVIQUmU1Spjc2Nl7plV5xGNaZzZkAEoAAbMAgO41NApKkyEzLGAnbgCTANjgUCDDIBmzAGAMgKcwVwlYobcE0jcC6tVd6xZdv6WEahJAkYRskYcBCPJsBIWFwa02SQBHONBLKTAEIhACDJAAbJC6zAUs8m8ACAyAwGAADhgriCoMwAtuWBIDACBvJgISNDQaQZABjSinTNB0cHK7XwzhNLVPQ1W42n21tbtRabUsgbAtxmW1JCBCYK2wQwhh7Gts0ji2ztVZK6ftZ13UtM1vLNtmWxP1sCwEIIbB5JmEjADS2yWnbLTOkUkopIQTIQiCeTULcTwJAPAebKwQ24pkkCRsktdamaZJkp5DEar0GulIR62FaLMKkbaGIUKi1Np8vPukTP+748Z3WWpqP+diPGVbL5XIFpB1Spi8d7J48eeIpT39GiWhtAiJiHMeuK22aFBGly/Q111xz6dKl7Z3tbC1BmYBCJeL2O+74/T/4w3d553cah0EASMYCQAigtXbLzTff+ozbbrzhOmeCQSADGDACQAAYkDEGhGwjgW2Ly2xAkjFCYAMYWqadgKRxmnJqUUIRtsFgJNtIYJsISQAgsBBgEqhd97SnPm1/f7/v+2EYJe3t7W1ubc3ns+PHj994ww3DsEYIYZDAWELGGINtW2ALpwEpwJnNIMAYRyhqB4CEJCQwBgwyEohnEQgkSQBCaJzaYj6PiGztaLnsulpriagR0aZJEZnObAqFAgmQcLpNmS0VMbW2ubklyc5pHIVbNptMR0SJWK5WbZpms1mppbUGkpAQpI0ExiAUcrpNbT6fZ5ui9EbZmiK6Gp17SZIym23scZxUC5IxlwlABkPLlvZiPs/MzDTMNzYlAc600yZba9lAYO4ncZkkAEm2ucKAARDPJIwEAFSwBBgJEBiEAEmYZzMIQDwXA1Hi0t7e7u7eNDXAdmbDrFgdHh4ul0fHdo4tFnPbAkkGAQYJYyHMsygEgJ0l4uLuxb/7u39YLBaz+Xycxlrqvffet729befDH/bQa64506ZUCAEIIQCMZQCDAAzYCo3jdHBwmJm2jUsptXYbi3ktYcxzEDI2l9mAQRYyV0iAwGAAIcAANhLmfpIQALad2UpoHEfbpZT5vI9QpgBJU5sO95dbm5t23njD9VNrmQk63LukkBRg25nZsi2Pjh50yy3Hjh230zZ2a9Pe3v7W5sJ2KSVqF1F3dy+u1+vlctV1VRKXOTM6hbSxWGQ2CRuBkcRlBkCt5bGd7Zd+yRcHWmuSBMYYxGUG2ZYAScYgBDZCQiAkY9siJIwxiGexndlaSxtwSAkliu2IEpIiJEUEYBvAwhgLEDbiCkWUWmtrbXN7axstl8sLF84f7O+VONamJgkECCyBQQhsGzBgg23AgIyNgbRtA9ggSQJsDBJgMIARIAAMgEBCgEAKpBLl8OjoSU9+ysbGxv7epRMnji+PlrNZf999ZyNia2t7GIYLF8+/8qu88ubGFiBJSJIdkCDjbO0Xf+mXr7322lnfL1fLG2+84fDgcLlc7u3tj+P4Yi/+4iGecdtt4zC0Nr3kS77kiRMnMpvBYMxlQsY289nsGc+47clPfuo115xeHh1N2ebzRZua0Nb21omTJ2+/7TaJru+H1XKxsXj0ox4zZZMtAAMGsDNriXvuOfd7v/cHj3jkI7quu3jh4iMe+ci9/b29S3u1lmmcbF+8ePHlX+5lT5w80VqzbRBGYC4zDoRtIbARIDBgkAEwwjYAVJ5JGISxEMLYGLAtSdzPMhYAkkDYpZZz587fc++9QkhOG9uAJdVShiF2L11C3txYZBojQCAwCBmEkDGXGbCRbC8Wi1se9KC+n504cSKdy+Xq2LFjbZpCzGYzAGEQlwkMEjKAuEwAGJGZR8vlcrVq05SZSF3Xz2asS9SNBeYyYSMADAUaADIWIDBI3M82AjtthSTJINtOIQAQIAAshGE2m21vbR0tV5ubG/PZrLWGhCSU6dmsL6Vk5noYI4RBVggE2I6IaZoyfeaaM621o8N97tdam6ZpaglKUtPaXs1m/WI+Wy6XwzAs5nMjCUWM43jjjTc85GEPO9zfk4TACLARRgKBoWWCASHACAyAwCCwJDCXGTAWEgCSJPFMAtsIJIEBjMCEwnJrkzNL7bra2R7H0ZmqBRsjCRwhIZ5JYC4zkgQah+HmW26+5UG35NRsA498xCMyUxHgYb2WBLYBGwMCgwSWbcDYxtiQttMtMzMxCAwYMIJsmWCuMEhgYwEGQEZcJgPYpmXr+/4RD3/4er3e3Njounr8+IlxGCKiREl03c729s42xhjbWAgAI4Ukyc4Xf7HHOnM9rE4cv2Zna7OUsr2zc+aaa2b9bHtnO6IYLebzaRqjVIMQyAYE5gGGYThx4vjLvMxLrdbrs/edPbaYz+ezWuqwHmpXp3HY2FhsbW3N5ovl8qjvKoAw2NhcIUkRU2snThx/pVd6xVJr1/fHj584duxYQJEUmsa2mM82NxcKgYXMFRKyDZIExgIZA8iAuZ+RhLANAKBqc5lB3M8YwABCGAABIGODADA4Sly4uHvrM27LtKBls0FyOkIRKqW0zH6WuoTQYjEHMDbISDYCwBiDwEZCyCTu+9kjHvYwpMxUxPGdnXLj9dlam6aptdYsZC4zSMjYAOJ+thEg2blcro6OjqapgW36WUOUEvYcc5kRQsYIzBVCwgAGAQIDEZHmaLlubZKkUIkSEaWEEAaBARtk8UwCdra3t7e2gMSSuCztvu8AOyVAgLEMyLjrun6+WB0ddl1fa7bWbIRBgIJaa9/Pau3stI0AObPZs9kMmNK1hJ22S5RpmtaXdiMKRsIgQMKAkBECwBYCc5kBBBgQlFqnqQGALWQMtgEUAcI8k7GFEHYKAYAFthNRojQTUjpLKR2d8Xq9ns3mtRqwbUSEAIExEggQNhJ2hkJGEVGKIVvr+34Yx1nfu3oYx9YmARIWGCSwQYBkIzkTY9vpzOZsTkuyAUdEZg7jEFLXyTYGQGAAMBKSbQG2MbYwANiOiM3NzZ2d7YhorU3TBL4urgMUYfu6a6+dpqm1KRRCBjCAbdtYoUc84uEYhZzZMk+fqRhjIDNBN910o50hZeY4TkUgS1wmQMgAZGvz+XyxEScibrj+eknOzEwJ27ZvvPEGIE2EDMOwFsJgBAYhUEhA388e8pAHgwBJ0zRtXHfN9XEdALJbRExTa60hhSQQgA1g21Igg7ifkAGMABmwwQAgqIC5TNiEZGwbkIRBYC4TGCMEGAxAtrzttttWq5UUmZmZNoKWTRElQqE0BolSysbGwplIAiwwEoBBIAAEWMgiJJvdS5damzBpz+ez9TB2XT+f9dhcJjCWBMYgAAziCokrQjGsh729/XEcMi1pvphna31XpUineCZjDAjAGAwGbEkBxiAuG4b1epiZDFBEFlcXO0spUkAagQSAsRCAnRhjLhMYQFKmAQlAApACbLvWun9w8Ne//wev/CqvXCPSgISRMAgpANsgG9tcJgkJkNTVMrU2n81rLUdHR5JKKbYBLDAWAiEMIDkTJAFYYAshLpPA+OLF3WPHdmrthmEICQnhBGx7GsdsE7YkIYQQ2BgAIcCGNJkpKSKmaWwt3VkoVCKIkG1nIsA4rZABI4GQAYGz1Vr+9E//bBynEydO7h8cHD92/NjxY4/7h384efLk4dHRrO9vuOH66667prUUSMJCtjHIgAEbC6dba21qUzZs25JsZ7ZsTVJEWOpqBXE/YwkhwDYCBBJCOAEkCaUzp5wm21xmUGsNZKckUDq7vg+FsZ2mcJkB29Z6PQBIIUDr9QC2DSAJeRxDSntqnnUhESAuE1cIDFJkJpkNg2wkACFjYGoNAVKElmMEOe8ESAgjxGUG0h6GAQM2hNQaxkKSIsowDJmt67q0AQzBc7ARl8kgMOYKA0YAtgAAqAAYwEgyBiQBGASAAAQGY0AIcDoizu9eOH/hYiiwLWGD7JzaBIQiIiRFqO/6YRjX62E26zNTEpfZABIYxGUCGwOl9LuXdp/8lKfccccdW5ubrU2z2Wx7+9jR0dFLvPiLnzxxYhwHhA0IQBhkJFnmOch2LaXr6+7uxVBERNSYpjoM42I+B4ONhGzAEmAjQDyLMAaEbSlsWmt2wySIlJRKN2GiIPFMBhGEsW0AI0AC24SwsS3xLMZCAAgh6dLuxd///d975Vd6xQRsCSQbBVcoymw+y5xsgwAwIISwyZy2d47/9E/91O7u7nu/z3vvXdotEYCFbJ7JIC5zZt93rWVrCQZJAjAIIO1a6xOf+KT5fHHmzKnrrrvWtghAoWFYr1ar1to4jlE7SUgAgEEIYcAAdkR0XSfF1AaBQtkSqF1Xu1q7rkQoQiAABIAAYwwgLhPSfD7PXLbMra1tgMxaopQoodVqCUgBCQAIAAwGbNJ2GglwOm1BQmYCxtnSdq2lREgBYANCxhIYAAHIIO4nyUaYiBKALQkFIAQgxmk0Au8d7QsxHh7bOAaAsQGFSomQSpEhpGYykbgsJHOZIcTUuHiYiDK001tVAQiMjQTGqAtLMs4kAUIYJIECIQzOJODCkZrLlLnj1hchECQ2dqaxMUiAJGyDJCwJSW2ahnFCGtZHGxsL2wbbgMRlArCQARnEs4lnkbABGSpCFsggzDMJQAaBMQhjAAQGhIGIcnS0zHTz5EwpwADSNDWhjAxHjKWUcZqNwzqWq9Vs1gPYlmRJXCZkAIPM/VobNxbzRz7iEY951KPXwzpb62qZL+ZHy9V83recuEwyCAAEgLnMIEBgANSyXXftNbu7u/fddxYRKrWUM6dPbW4snJaEAUsAGIQEQkKyZCwksAEAS0hqLSUkYdl2mqDZOU2llBJC2GRrmNpVsA0CAxZYgJABQGDACBkkJLCmcbru2us+49M/7ejoMJsVwiAUwgC1dhcuXvyDP/ij13+91y4RCCFLspC537hePvpRj1iv10f7eyUCJBkEgkRgAcaS5vP5rbc+Y2tr69ixndaaAAQgwAJA4pGPesRtt92xv79/7TVnbBS2ODo6GocxIaKghg3YFkIgMGAjAClKba2FNDHZrrUDSi3ZEmxEWkWSJCQhcZklYYwkbINC09Re+mVeJhS2gcxs03TTTTcM41hrlTSO0zRNkngASRgD2JkGp9OZTts22VprrbUmYVuS0waw7ZZpbIx5JmEjgcEACABFSBFx7+5dy+FoVmZpjzl2pZdUa484c+yaoO4v9+b9/AlPetyDH/zgw9WhFM5ERSGpdL2I+Ic7Dk5vRUvtbPQbc2UCAoNsIwCh5cRipr9/wp2PfvgNyyEDQYJAAAlV5bZ97FZSWwvv9EojCYQABICRlOtRDd96LrtaTtyQORFCEgLAgEEAIGELIRBCtsHjNN166zNWq+WDHnRL13cgCUkgLEAAAvM8bABJABiQAAuqEAIMAoExyNxPyDL3k8ASAkkY7+3tOTMiUhEhgySbUgpQoiBLsj21LKXtHxxub21GhEE8kEEAMs+mzCylnDi2Y3S8HAMPwzrTx4/NbLeWksAgGwkAgcFGIDAKQLYlrnjsYx59yy23XNq9VLt67Nix+azP1gyyEBgMYMAWAmxAIAQAAgO2bQBJYGxkG4OQAKm1JmiZ4zi2TGfWWmezWSnFtjGWAbCMkQQ2wkYAGHCmIwKF7aOjpRSADTYgicvsLKUoVGtnJ2CMZYwRIESsV+uHPfShEbF/eCjU912mwWCQjQRGku2/+4fH33vvPY965CNOnDg+tQaWQYBAxsbjOO5sb734iz2277v1eq3AzsOj5bAeSqklFFKUIrANBjAIJIPABlsQoZZZRIkSEYKIKBGlVoFCIQHYSOKZZBtJ2AaEMJLWq5Vt7id0tJwkpmkCSZJkGySMADAGMKCIbC0zsyUQEa21TLc2IWEiVEoJKTNDapm2QYABGUtGAkBCGGPA2HaWiGGajtZHy1wO06rW2pW+1G46ujSbzdk5Yxyh5fIo7WFY19Jnpo0xFrKxFLO+XlhmVXSdN+fKTEkAGIwFIIk8Wk/drF+up3mN1mwXSYAU6qtCHptu32Wr6vrCsZkAMIBtY5AwYJWSuS59pS9tGtUXQGBAMs9kjAEwBMJOgcEgO7u+29raiBKSEAbbYARgLPFs4jKBeSZzP9sAUAEbQAIssMCAwAgDBoQMYAwGAIQ9DmO2BiBAUoSUJFgonaGQZNPalK6ZiQCwLQkwiPuZZxM4IoZhuHDhQtd1RsMwnD59ynZrKQjJ2JZkiWcTGCHAkLbAIBAybq1tbix2trZsp7O1JklgwAgsZCRACJtnMgAySAYhAUYqtZKZThs7cQiQwOBxmlprLRuXtdaOlsvFfNZ1HQYJjIVAAEIgiyuEkS7t7R3b2ZGQVGuxwQYbSQAIUGtte3vrbd7mrVaHR6gAxhhjQEgCQZRxnGzP+h4ASwIwkpAxFpJsHz+2M+u7Y9vbmRmSJC4TMgYJARZC4ziWUjDjNGa61CpkW6WUiMy0jSEwBoTMM9lubRKks+9mhpBaZiklpFIqOKIoQtzPspBsc5lBAAKDJVCABRgECKwI7mchBAaDQBK2BcbYpDE4PbXWMtMJ2LbtpijYCUpRauEKAwghbAAZZJDAGNumZRum4cHXPrhEsbGNQUgBYA/TOj1t9puYRz78kXbbmG0cHF2KCIGzOdtq1bShR9+4AAmm1lq6FnGZBJZBgLwzp7V40I2n+8h55fyUEmAQwq0xtvbwY/GQbdVCGqArAAYMYCMBYElxajO2ek8tF8EwaRqNAQHIdq21tSYwCADzTAJgMZ/ffNMNtvuuUyltmgRCXGaQhEGAwDyTAQmMwAibZwKoxgAIwFgACGwkbAAB5jILbC6zbTObzxQRpWRrSJKiFKUmJmMZO7HBgO3ZrI8oToMExpIAAAMgLhNgu+u6e++976lPe5rN5ubmxsbi2mvOZGuSMMYYYSwEmAcwBpAEgBBgAEnYHqfRICQFAMYIEIBBCAziWQQGACMAkKTW2jgMAGAb3EqLkJCEFGkDrTXbrTWBpHEYNzc3QjIGBEgAEuYBbNv2fDZfr9egCEkB2LYNxrZtFJIkw9HhUUQAtgEwABIYAAlM2l43SYrAZGZEgJGEEICka86cznRmWy6XYCl4FoMAJEkFka1lpu1hHEG2M1tm0ziuVuu+7yOiqdmAAIS4QoDttLtaJQlJ6mqRhAQoJBkMhCSEDMICABsBArCMAYQQgAwC82zGSAJAgGxD2gZsGyOAdI7T2KamEBARKDKbYBqHElFKLSXEFUbIALZBAsRlNpdJkJv95vm9swfLvXRGBAgQ2BjbCdiWVKIYSinn9s7OZ4uudukEFXne6Y5zq66EEVhYAgRGApAwVxgioghFufcg5/Na5GwGJZnzwu27Me9UQrZt22BACAkQBkAAaUkJGC0nlqNPbzmNaJnHdrYuXtxdr9dgAAmDwABgHsB2KWWcps3NDUnGNrYFtiWBwICQMfeThMAgACEAqAIJcT+DAAFgyxiMJAxCYMQVtvCxnWOl3F2iYCKEsI0A2TYOYyxRSylRNuaLEjHlhDBI4jLbEiAwiMsiNE3T6TOnd47t1FIjIiKmaZJkIwkMIACwkDFgIwECg0FcZiMBBiQB4grbABKAQVxmA8gSgG0MwrYECGNss7nY2NnZztZAkmxnNkCSJEkgMLax0wawJJsUUmC3TAlAMghhgxOQFFEAO21PY0PYdF0nMEKSjDHGABJ2YixkIUkANhEB2DYGS7KNHVGcmRAKSREBZGvpXK1WQCgkgXggSYCE1LLJzsyWTWjW9aXrgHS2aXRmjbBkAAkQNiDAJCApIkqUUqqi2BkRpZQI2Y6ICEkCwEYSIABJGDCyLQTIQmCexYCRhLEtZIHBKGSDkQDZxghJkiSJNICUNrZBWFJma1NSqU5bUYoiQBgDIMkGwCAADAhkvDHf7rt5cwMJAIHBAGADGAAhBNrst7rSZSZCktGJzdiclUwjcYV4APEAAiBCQhtz1yAzwWClOLFga+ZmQgbbpI0xCACJywwYIG0sSWBObbmKNCIzS6mnTp0axxEwSFwhyxgBYJCwJYEjotaamREh8ZzMZUkKgcAAYBskMLINGCrIxlhIkjFXCEBIEmCMAGwuMwIp01tbm7O+S4Ai0bIJpzMECqSIqKXW2nVdN5v1s/ksMwUgYwCDkGQjGZCwucKmKDYWC9uAbSxAMljIArAtMAYQEvcTmGcy4n6yDYC4TDL3kwEQGATG5jIZy4BsxP3svu/ms36aplqKJKMQSNM0IWHb5n6SJJVS7QTZ2ImYplYiJEWEhFDagAApMw3Y4GmabJxpMChCPJNtO53OTAygEJIIUIT6vh+GcZparSWdZCALcVmt1TBNUy0lMyNivpivlivbpRRAEgjbGLAtQZSIMp/NhmENCKJERJFCkp12TlPFtGxHy5VbChAgydgIDAiM1Pd9qSWkKF1EGBskhRCEFJIUEs9mA4AAybYEEvczYCQwGEAIIYMEtg1CBgBJBjBpDFgRtXYwtpZphCQ5E6vUUkoBhcJp2RgwQgYhsBGAAAkBJGBnjVrVAYAAMM/JBgEIANMyJTBgRJq+CgkAgbEQEoCNADDGIATGXOa0JEsYCRK6Qo95gQwYBICRMBgA2UqQDBK2Jc3nMxswz0XCgAEQALbJlkgASBIAwiCuEALAgAEsZGwAJACg8kwCjDEIMFcYY8QzGQkbAAOkc2dn59rrrrvrzrsilCYiQFhGEiWi1qpQhIDNjY1Z32WmEEYS9xOSMAZsYxA2gLHT3E/CmMuMQYAEBgEIGXOFkWQMIGRsJCRsQGAQBgnMswgQMoAkHkAIAIMMEgLINLC7u9umVrvaMjN9/PhxybZ5JiEAp/f2dmut4zjO5/O+77JlmybV6syDgwPb62HddX0ppZQK3tzclJSZEpmW1DJbm2azea1VEtBasy2Kse1Mc1kpEVFsr9friFitV7VUiVAYIqQIgW3btks/s408DEMpZWqt72e1lrQxtiUAjJ2AokzTNE0l08KKWC5XwzBmZmtjSEjb2zu1lpzstLExRgJA2JYESAFIUWutpbbW0hlSiQAUIUAAyJIEgIRBgMBgJGEQQpYBjAAUoXRikMA8k2xL5pkEBowNxkJCEVFrZ4/pbFNzM1JEREhSKWEMpFMygEEYBBIANhIIwLKRMLYtAAxYyAKbZxJgzLMJAAFgBAkkCAEGGWNzhXkmG8z9jJAACZABBDbGtiQAbCMJwDYSGMACwCAEBvEANhK2W7N4JoMEgAEjMAZkjIRBEvcTz2QQALaFAIQQzyaBMQawXcESEs8kQNgGCSQAjAGBeSYBAiQ7b7n5poP9/YPDwxrKzIhoAgogCyhRQrG5uXnixDE7JQDMMwnAGMAgAAQIEAaMANuSzDMJ2UYGgcAYJGNACDC2BbKsBCGBMQbAABgJzBUGcZkxlxlxhcAYEAIMAYBtQIo777p7HAZn2z52fLVabWws5vO5DUKIywTDND7hCY/f3Nwch/VNN998+vRp22A7h3F91113DsOQputnkiJie3trPp+XEmCQRESUUiKi1rIeBkw6u1olxmmqtbMppRiAli1z6mezms12V2vX9RKlFCmmaTIYRYTt1towDH3fRYks0dpUu67r+2mcwIrous6203aKACI0jjmsl1IQUbvu3rPn7rzjdvBytdrc2Oy6+uCHzI4vjg/DCOaZhEEAkgwCQFIpgd3a5MwopZSQhJEUkiQJIZCRwLYkg8wzGYPANgIQRCjt5Xrdd32E0hZCXCEBYBC2jUEgSZIsADszEwFM06QSBYCpZVcrtkFSKQUEgjSSQVxhLAQgARIgsACEDYBBxgghAxiQZAwAQmDARoAQz2LEczPGkiQMQrYlDDaSJdnCRlwhZCMBkgBsQBKAAAtAyABINhLYWBIIbJAEBoFBYJDACMAgYSMBYBsBAjCSAZC4QhIGARgDgEHIGAQGgArYti3JIACQAsDGIADxnCyBJNSmNpvNHvnIRzzxiU88Wi5LKZIiIiQuK6XOZrPjx49fc+Z0RNgWAhAYAGEsxP1sJCTbGIHBgCQwgAEsEIBtQOIyAyBjAAkbIZ5NkjEgQLIB80xC5pmEACMwEpITy0JgnsW2sUTLfPSjH9WmKSLS1Fqy5TRNEUWAALAzXUt5uZd9WSCzgdrUIkraijKfbzz8EQ8P1PV9mohi287MZlsISRFSRDjtTN91552bW9t7e5euPXMa+K3f/h2pjNP0yEc+/OLF3dVqBX7Igx/0qEc+KlumhFmvV+Mw3Hff2cOjo5d6yZd8+q3PeOITn3jdtdeWUu+6666NzcXLv9zLzmcz29PUopTVan3nHXfceOON995713XXX7darf7g93//+LHji8WidvVlX/bllstVOmuNiMj0tddec/r0KdkRsiQUEdlaqTUihAABAiNhEAIDoFJLiRA4otYaEbaBEoGQQkISIAEggUEGgTEgZBuQQUJMLe89e/bg4HA+m914w3WllExLAvMswgbAAgsMkoSjyBa1eHQtdaotQqUUSbZLRO0qqNQiCUDIsgEwV0gCAAGAQeaZjMAgwABgDIDAPAeDwBI2gBAyYBAABiEwEBFRYhynkLgsFMYRwmQmNpJCNmAAIR5IYAkQGEDCgI2RBALABFgAIAkMEgBC3E9cIQFIABhJAAYE4pkM4lkEBnGFEGAMgMGARAVJgABxhTGWAAwYcT8BIkEgSYCk1qaNxfxRj3zE7XfcuXtpLyJKKUBmGub97MyZ06dPnyolbEuyDQgBBoEQYAwEQgA2lxkECAw2AiTAWABIAsAASGDAQgYjnkkIGdsgAQaMBMg2AOa5GATCxgbEFZKwDQawbdstHZrNZlPLjfm8RKxXyyjdcrkqtQaapkmilCoF0KbRJooQdgKhkNg5frqNw3J5NE2TREQIKSQJEGAs29RSlstV3/fz+UzsdF0Xpb72a7/WNE1SbGxutqm1bNmm+Ww2taYIQKWQYcZjx45dd/31pasPefCDzpw+1aax6/pbbrmx67q+76WQwjZ2RFx/w/X7+wfHjx/PNi3ms1d91VeJiNZa13XjNJRSnBFRFJGZs1lfutn+pQugGtFam6YWimwNCQGyDJJII3GFjZ3ZskREKbZt2ygiJCQBGMQDGQQApC0ALAM2COyu68+fv3BwcAjsHxxc3L10zZkz2UaeRQA2AmOwDWAD2LZRhKc2tcnpEhERAEYiImxFCRvbxjYGgUHCRgKDAGzzLMYgASCEAAOYywQGYwwCgxAYAInLDGAECEAIDNRa9/cPL+3t3XTD9cMwKEIwTGMpFYNdSghaa1O6lJAEBoEBgwAscZkBAzYgkIQBLAtJNs9mAyAwCBAYjEECA5JsAwgM4jIDtkE8i0EACACDMIC5wiABoAq2BWAQGARCgAQ2z2IQ2CAAkCRZYKaWs/n84Q9/2MHh0TRNy+VyHCfwfD4/duzYYj4DbCRhC4wAhLjMIIQAGwQGcT+DDGAJEPezLUlgAIHBBsAgCwEGQIAxlrEsZADAMkiywSYQssE2AALMs4lnkUAAQtM0bWwsvu7rv+Hnf+EXf+Hnf+4nf/Inv+M7v+st3/zN/uZv/vbDPvzDSsTdd999331nH/3oR77Yiz1299Klv/u7v18tj9Luu/oyL/0ym1ub2VoTGxubX/91X/PGb/wm11573V/99d8cHR2Ow/A6r/PaVcUgybZt0plNodp1U2uzvj/c349So5SzZ8/ecP31W9vbmY5FGDvdWrPTdkSUKFH4+7/8yxuuu2Zq03w+u7h76ejw4OabblRExBZ2AiAhhfF6ubznnntuuunm++6777rrrx+n8fz5C7fccvOsn6WzjeM0DijCyuaNxeIv/vIvfuiHf+xLvuSL9vf3f//3f0vwmq/xao6SmZkJAkAAGASAbcCAbSFJISFJCCRJEgDimWwLEBBgQMIGwAgkAYDtqU2HBwel1NYmbLBBACBsrrCNAIGNjZ3mMpvM5jRXCCEAgxEIAoQwzyQwgABzP3OFAIHF/YxlDBJgI2HMFQKQZDDmeUnYPICkYRzvuvueErrnvvs2Fou/+Iu/2treWq9XN998yz887nHXXnPm3Nlzx48fG4ZxtVo+8lGPfNAttwzDGMGz2EgAGAAQ9zPGkgAsg4R4NgkA80w2wiAAA0KYZxMGQAiMjQ1gAGMhAIOEAIMBEICMAYAKgAEEgASAAWwbBCCEsI2RBICdrTWVEhHFdmuT7eM7O4qwAdsJAtKJkYwBDBIgMIBBAJhnExgEIGQeyAAggwQy5nlI3E+2wZJAyAJsLrMNIGwAAwYMIMT9hIQkMAgMFjIGJEkKaZqmV3zFV9jc2p7N5y/1Ui/10R/1kbfcfPNLvtRLX3/d9XbbWMyuv+7a48ePtdbms35nexvnYmNzMZ+thvWJ/uQ0HTk9jsOpkydns34Y1ot5H3jd1YhAEuIy25Iz0+PYdf3Ozo4i5hsbtesynbYipmlyugkQYFsCZ6gguto95tGP6ruKs9baWpumycbpzEkSRClCIYTbfDY7eeI4zuPHjs1ns+Uyu74vpbbMzBYRkhCZCWRrziyl1NqDSpQSQpIEwrYNlgVYEoAQsm1jR6jUUkrBVgQgSSAJG3GFxAMYBAYknk0IgDaNO1ubx3Z2lqvVqVNnTp853VpKGAQYCYyxAYMRgEJKoQgB2aSIiHRGhCQhCUUpEVFLiYgSiGcxiMvEczG2LYTAAAILAAEGJAAJEMYYMAgMGAQIzLOIy8RlTpeIEyeOHR4enTl9prXpsS/2mFJi1vez2WxjY4598003FkWUMozD5uZmaxkhrjACxGUCI0DYiCuEuEziBRLPJABsEJcZhAEMgBBCACAE4pmEEAhsEGAjLhOYZzESuvvO206cODFNTRJXGAQYC4GNuJ8wyJIODg77vu+7eu78+YsXd3d2jh07vnNpd9fp7Z2dxWKRToEkLhOYZxICDGCBQRKAQdgGCRDPZBA2EgAGgTFIPBeDeCYbCSxkAGMQGCRsS8IACAwCBAYwCAAQmlpbD+utjc2WKQkMtiUBam06ODw6cezYOI2LxUbt50cHe33f1a5v01S6bnV0ZKcgIlo6MyVFhIShRMnMtMdxLCWc3trZWS+XwzCEiFIiSpsmJAQG0aYGtNYyW9/1UYqh1pItEbV20zi01rCRABAYexynfj6bxtb1XS2RmaDMLKUA0ziCDRjjiBiGseu6cRz7viulZEuFMjOi1NpNbXTamZKmNpVSp2mKCPBisaj9YnV0IKnWsl6vW2tRSpum5XJ1bGenZZMCbBACwLZrrefOnU9rvpgLAEkRAmxCAsCSIgKQBAASAGAjQNhIAiRsgJAs2jR1XWfbaWOeSQDYBgA7jWTTMrEzc2ptmqaW2VqbphaSJOOQQLWWrusiou/r+fMXT5862fed0wZxPwFIGsfx4sXda6+9prUGgLifBIBB2Ei8AALbSFxhwEg8gAAwIEXaIWW2UgqXZbqUkk7xTBGRma2lBAgM2FwhcYUNIGFbSJIxgEEANhLPZiQMNgIDGARIXCEwD2Qp1uth/+DgmjOnp2mSxPMngbHAgAFKLRcuXqwgQOJ+RlwmhMASIGFbwhijwHaJiFJ2dnZms/lsNuu7TsdPALUrEQoXhAAwSOIKAyCeRWAQgHgmGwQgAAwCG8AgnocQAAYMgHgmA0hgnk3ImPsJAAMA4n4Cg1BkOjEIwACWBCABSCq1II3juF6vSsSwXq9XKym8XEbIYHAmilqLbTszDbg1SRGllCgRBIf7e6GotQLgzBYlhIyRJByWFCGorWUbhnQOayJC0rAeJAFgjCSEkO2u70pERk7DMAECEEzjaFBIyDaAPbaxlqi1ZOYwjBENsA2W2nq9CoUkLlNErSUzSwlJ4zgOwxAR2dpqGkJRa5VIkZkACAAJG8sY80zq+76rFbCzRLEdIUNIXCYhhYQkDIAAMMYgiWeRBGCMBdF1toEIQSAAEJjLjDEO2wASBpoKZKYBKKW21iIUCjuRaq21Vkld7STZBgwCsEGIZxKX1VKxFcFltkGAxPMQmOfLIACMQeIBJGHbBijCdigyU5JEhDIbBgkBtJYStRYbAeKZDAJjkMAG8SwCg3g2g8CAjSQAjEGAbEsCg8AAiMuMZQBHREhOg0CAjcRzMMg8kLANOF3BNrYlQAAgZAAbQGAbwDZgDCFxaW+v73sgIsZxHMYxFMjD0ehMnslIAlsIABtsJEAIDEIAAsAY24CFkARIwrbNMwlAAEKIy4wBkJ2AkIQBA1gIMGAQADYIAQjMs0mAAIjQME5drRIpC2GMhQDbEWWapkuX9gDbdgIYxBU2gAAJAYhnMggwiNZaRJF4TgIDIGyDpMyUNE7jrJ+ljc1lEjb3k4Qk7mdbkr0ECRC2DTIAkgABQgCYkWm1XkuByEwAgbEnEEyAjcD2kY+maaq1RgjEMxmQhEGM4xRREAIwCMAGJBkkIfb391tbYNINBEiSkASSACSBBYCReABJXCYAITCAARsASTyTALANYIwBbOw0CKVtk5nTNLXW0o7QOI6Z2dXOTtBYS9/3oNVqtVqtSgnbYINAYIyRwNnVOk3ThYsXS63OBNsgnkUIQGCeg7jCRoAAMFcYg8SzGcAANmADSIDABiGBhRACwIBBAALzQMZCXGYQBhmDxBUGAQbxLAbxHARGgLjC5jKDAIgo+wf7s77HBoMkLhP3kzAYYxIECCHAoLvuuO3kyRPTOCkEgAAZhDEPZCQZgwSIcZwA22AQAiMBAsAgMJcZBICNZJBBgDEAEs9kjEHcTxKYKwwCwCAMMggABAZAtgUIAIG5TAAYBOaBDOL5ERiQVEsxz0VgQKi1NrZJCGwAxLPZIAQABkA8k4QBwCAwAMJG3E88m3kmgW0kAAMgAIFtEAIQmH+JjYRtIQQIDABImMsMAgNCCAPmfjYAAptnESABYJCkrutMCgEGQAZAAJIy8/DwyDYGbABsI4nLBCAwSMIAxgIQgJCxwLwgAvNANghACCwwlxkLIUAC24CkdDpdIlomWApJQGbOZ7P5Yp6ZQgjbSEIAGCNpnMZLe/sRwmQmVwgQAMYACADEM1kIMAjAIBDYmOdkIwzifsYCAMQDSABIAOaZJAHYBmQsns2AjcAACCEbZABzPyHE/WyDJB5ICKWNQQACwLjv+p2dHWciAAwCgwCBARAYwAIjsEup5y9eqFwh8UwGLAAhY2MhADBX2ICptUrYSAAYwBiBJfFcDOIKgXkgY5C4n7ARYBAIjEECYyTZiQQCsBEABvEAEjaAsBEABoQsZIyNxAMZAAHYFkIAtgEMAgSABQbjKDGvM5DAPIsBEBjEMxkQMoBBPJt5JoEBEFiSzf3MM0nCBhBYYAAJwAYQlwnANggQIGyDAAkbMM8msCQbAAHIIAAbhMC2kLEQgMAYAyAwAALAXCZkyExJAAYMIAFYyLYl7exsc4UEYCQAA+Z+BpAENs8kAMxzMohnEQDm+TEgQOIK4QSBDYAAbAQgZAwCCxnAkjIzM0EGgRCX2RYg0q5dd801ZwDMs0gYBDZgAASAQVwmMM8kAWDMsxgAgQEQGABhI4EBEAAGQDyAhM2zCQEGYcA8HwIDgEEAmGcTz2QABAZJ2AYBYJ6DwACmtYYEBpDACAAbCQBzhQxgQAihygMZBAiMsQwIcYWwUwowl9kGgEwkbADJTpCdgACQhG3AWBI2gMAYJAADBgCEDZjLDJYwOC0B2GCwwQjACSCBAYENso3AyCAMGJCwbQzYxggMEpgHsrnMBgFgLAswCAyWhTBpg3kAAWASJNlGgLAthAS2LYRsBMYWMuaZLEhZgDGAAZDkNBiwEGAMSAHGIGwABAhsW5KxE4nLbGMjAWAAZBuwxBU2GAkbCUwaCWPANgJjwAjAxgBIABgAAVgAYBBBGHOFAAHg1prAAOIFMs9NABgAAQLz3CRsgwCwEAKwuZ8BEJdJADZgGwkAhI14FoMQAAaEDAgDIABLXCGBPY0jAAKDAAkbCcA2xkgCgcEgEJhnkbABDMJC5tmMASFsBAiMARDPIgmwAXM/SbYBIYNkkM1zkbC5n7nCIAFgQMgCGwSAeSYBYAAEgAEjYUAIAeYKGwFgLjOAkGUbcYUBsF2FALCRxGUGEAAW2FgSEApjEJdJBoElbCQAWwLAAgOSDEgCg2wkbASIkGxsS1wmcBpAEgAGAWAJQJINQpLNZZYAMAgwIANCSGAZcz8bENggicuEwAZJYC4TgAGBkDEIgQ0gACwAIUtgDEYCMIAkEFjiCkkgbCQJwCCMQQJkIXM/gQ0gGQuBATASIAAQAsAgBBhAAoMlgcGSeCZjEJKwDUIIbAGSbUnYAiTbPJMkjMVlAkmAjXgmSwIbYUviMgMYjLGQeSCDsAFJgMBGEtiWZBAYEJgAAxgDAsBI4gFkELZBAgQgCQMgAQYZQOIyYQDE/QQWUggbMEgCDBJYkjEAkg0g8UzCNpIABBayDRJCNsJIgCSDAAlCMmAQMgIQWGAkDIAkMJYEIC4zgCTbEkgYAAlAPJN5FgESAAJL4jIhbBCWZCGMBYAtCwEGIAAwAoMA2RhkUIABEcYYgwTIgEHGkpABIWxkAIMAMJYlyRgDYJARGMRlBhBh2QYQYAAhSVwhGyQJAGNjsG3bPIt5FklIAEZCshCAzQNIXCYbsCQQALaRJAkM5jIbEAiwDQZsg7GFANvGAAaDkMC2McZcJsAYDIgHMiAA21wmwCAEGAMSxoDEFRIGg7ExgAQGEJYBMM/NCLAAjHkOMgDimSQhAUIACEDCBgSAAAwGDAYQz2IbAGwDgCTEZUZIgMFICLCEMQACgyUBYLC4QiCMEywh7mebK8Sz2ACWQRgwz0UgQCBAEgKQeCCDMQaEJCHASOKZDMZcIUkC8UwGQOIKA0iAMCAECANgsCUAsAVCAmGBMCBjEBa2JCEewEIyIAFgGxBYthGSBAKDALAkcYXAAAYwAAiDeBZJiPsZBICRBBgbIwCL5088gGyDhIwRQsgY25bBGJAxNgiwjbnCAMJISAC2ucw2CCFxhYxASMKAsGwjMBgkAIQsY2MAIQlh7mcQlwFUIUBIyDJgjLEBJCSwLQE2SBgJg21JQpYxtgEBAkBcprQlEDaAbSRsEFgCZFvCRpKEbQSALcm2hA0g8UBClo0BkIQNIAEYGzASiGeRMQgQz00AEpcZIZNOSTyTBBYyBgESGBAgrjDIIIQwiOckY4yEMQgMGLBBPJPBIEhJgJCxDQAGQLYlbIMBIRuJywQGQGCeSQDYFogrbATiWWQsBLYBIUlgAAQGQIDAGAEYcZkAhDAANgIE2BJIAnM/AXZKgAAwzykzJSTZSBgEBmwJAwawLYFBwhgEGIRtnkmAADuxAIS4zIDACJkrBBgEAstYiCuMJQEgAIxkEAZxPyEus7lMALaFEICxADDGCAxgENgACGyukAQYg2xLGGzAXGGBJQGAEIBBPJNBIJ6bQcYgwAYQ2NxP2AACxDPJGEkGbJAQGIEBEOIyg8BGPJMxIIMEAkAAIGQQgLEQQkjIGGOMAIQsY+4HUAHAmOckQNgASAJAwhgJE6HadcMwIIFKUSllmpoAIUkhp6epRYQg7VqL7VLKOE21lswmqbWUqLXLbLXWYRyFur7LlpKAzCwRLTMiWjZBZgIYhDH3k8CSbNsII/FMBglspyQExiBjJMyzGYkHElg8i40QABIYkyCBhWwkQAhhA0jcT2DAdq0F1Nokyabv+8wmCaMIcGZmS0VkutYunSViHMeIEhEGSUCbxlJKtha1tNZAmSnAIMAgABtAkgBsMMgYAIEAAWBjgcUVkjCAII0EGMT9DDYSADYCQIDAAhsBAiNkkEEgnsmpiL6frddrsKSIIsl2OgVS1D4ys7XW931rzTYQIRDYxhgotTgTcNq4lJLZSik2EldkJmAQmtWaTkybJgBAmCsE5plkIxlAyCAAWYjnIGwkEBgAIck2zykiImIaJySgliJFZgNAtksEMIxj11VQZqqoRLEz7TZNESFFa63v+2lqtYTtiMhMG2wgnQAGQFwhwCCezSAADAJAPIB5FgEKYQwGQGAMABZCAsAABgFgEADiORgLAcgYxP0sC3E/Ie5nLhMABrCMADCXAVSwZCGeiwAkAdgIDAJkW9J6tbrn4sVrr7seiNA4Tucv7O7s7GS21WqZrdnM5/Otra2DwwPSs9ls7+Cg1O5ouTxx4sR9584vZvOpjYvZrGVeunT2xIkT9913/sTJ48689957t7Z3xnEstc5ns71Ll0qJ5XJ54sSJiNLPemeCbQtACBshY2FJPB8GQDZCkkFgYZ6DbCRAYAAUwpgrxGUC80ySADAGGcAgIQnMs5nLai0HB4fDMJw6fWoax1LK2fvui1KGYYwS09Qiouvq5sZGy5zNZmfPn1/M5nv7l86cPn10eDSMYz+bTa1N0zSf9RcvXthYbIzTdPz48cyc9b2dWGAADCAusw2WZQkA8SwStgEBgAEQIGSwQVwhMIj7CQAbsBBX2AiMQMKAeACBQdiSVsvlnXfefeNNNwpsr4d1tsQgbEuxXK1ms35rc+Pee+/b2NyMCEGaiIgI7NYm4HD3cGOxERG11lrr/v7+5ubG7u6uJFtRClJf6zSNoJbt0qVLO9s7EXHs2M40jSBsZACDADCABADCRgKwDQIQ2EZCXGYbSwIwxjybwBGxXq0OD4+OHz/W2lSiXLq035Jjx47Zzmwh7e1fGofh9KmTFy9caGZzY1Oho6Nl13WZbXtrc71arYfxxIkT9953dnNjY39/v9Y6tbaxsSmplrBzNps5jbAtJGQbAWAAhI0AMJbEs1hghI0kMJdJ2MYCI8AYAPFMxiAJDAYBSGBAyDYCwBgEQiZ5FoMknodBYMAAgHg2Y3OZAKEKskEAGADxAAYQzyJIezGf/93f//0f//GffuRHfuTR0WHf93/+F39x++13XnPtNffde2+Usl6tL+5e2FgsPuADP+TWf/j7UydO4vzhH/7RRz3mMb//+7/3Sq/0SkdHRzs7O/fce8/NN91s+Ou//psHP/jBu7sX3/M93v3JT3rSH/3RH994042Zec+99x0/fnxYr6+99pq77r4npLNn7/uIj/iI5dGhBBaAACSBBRgLGQNGAjAIhAAwMgbZRmAZkAUgJGwLEAZhGwSAQVxmAIOQQQASIBsJ8QLZzBZbP/GTPzOf9W/zNm+1PDqsZfFzP/8LL/biL/60p9/6mMc85o47bg+FxMmTJ3/zN3/jlV7ple+9996Tp05dvHD+Pd7zvf/wj355f/9gmqZjx4//5V/+5WMf+2LTOGzv7IT0hCc+8Zozp9/h7d/u4OCglIIBjLlMCgBAYBAPIMA2xlgSVwgMGPFMQhJgCwwCY+5nSdxPkjECMAhsAAkkMABGGGz/1m/91tu+/dttbWx2XfzVX/3lj/7Ij73lW7/1Pffee+rkyXvuuedouXz9132djcX8R370x17jNV7ziU984slTp/7kT/7k5V/u5R7/+MffcMMN111/Xdf1f/4Xf/aIhz/8tttue+u3euszp04+8QlPeLVXecVf+sM/uuuuu8+cueaaa6+59977HvrQhz7hCU+47tprrrnm2r/9u78Ruu7aa97gDV5/GIYIAAyAeDZhLCSwAIOQhG1LAAIh2whABBhA2EgAAuPM3Fgs/vKv/vr3/+APP/ojP3xcTpub85/52Z87cfJUyzxx4sSf/smfnDxxcrG5ef2119x0y4N/52d/7mi52trcRETU2Xz+9Kc97SM+8iPPnr9w6eLFa6+/8ft/4Ace8uCHrFarF3uxF3vKk580my+Ojo5aaw9+8C2v/mqvdnR0FApJmFRK4gpxhQSAARBXCFnmMkk8gG0ALAkwSBhjEGCEQGBAwgDIXGaMeCYhsI3AkngmgTFIIACDAIFBCCFsYxAABiFxP4AAhGwDiMvEAwnA5pmMxNTazTffIsW9994363tbN954U9d199173+233y4F0jhOD37Qg9qwPDpc7uxsp72/v3/p0qXrrrtmY2NxcLB/6dKu0+fOn7v7zjtPnDixe2k3hODa6647efrk4eHhIx/5qLvvunNYr2utXdcdP3asZfu7v/s7QZsmgyTEFeJ+kgCQkLhCCGSMjAAMNpIAISwEYC4TCAy2DcIYY8BgAIR5AIMxIGMwADaAsW2byzLTbX1wuHf23NmcBqHa9499sRdbrta1lmuuOXP99dedOXN61vfr9equu+56xjOeceHC+RMnTmxtbzvz4Q9/BML2Qx/ykPvuu6/rynw+k9je2rr3nnue8YxnqJTMxLYwlhRSSGAALCzxTOYK2wBCyMYGASAhABAIsG0bjAEDBsuAJK4wWMY8i0ljGYHFFQYDSJrNFzfeeMNi1g/rJVBr9/jHP6619vSnPW09DAf7e4vFvOvqbDa75UG3XNi9eGlvL7M97SlPLiWe+pQn33PXnbc+/dbbbnvGxYu7p0+d2t7e3ljMLl3ajVLo5rsXLw7r9TQNx3e2tzY3Llw4v1werdbrre2thz7koY961COXq+U0DpkTNgKBuEwAAhDCpM0zGQxIwgASAAKDAXM/iSsSwABRMi1F6eb9bB61b5kHhwdPefKT7r7rzttvu+3Wpz9tGNYbGxtA7boTJ07uXroELBb90dHhOI7A0dHR1tYmTLsXL7Y2RejE8WPXXnfdXXfeka2dOXP6xIkTBkkYDEKIKwQGY8wVQhJXGNs8k5DBmAeSMDYW9xOXCQAZAxgA8WzGNlcYQBKAwNjmCiEACTDifgJjbNs2lwkBQjaADQZRwYhnE2AeyADimQwQkiLimmvO7F7aXSxmx44ft5mm6RGPeMR11113dHTkbK/2qq/6mEc/+vBoOZ/PNza3WuaJk8evuebUS77kiy3m/VOe8uSHPexh6/X64OBwdu3iGc+49cEPftBdd9xxdLi/Xh2N6+GGG2963D/8wyu8/CvM5rO9S5fms9me9GKPfbF5PxvHISJsS+KZZMwzCZtnEphnMgjMZeIKIzACjIUAEAIQQgAGgRBgLhM2gEFgAIQMEuI5CCEuswG3aXzogx986dL+PfedO3nyVJTu6Oio6/vNjc1sbXNjo7XWdaWW8nqv/3o33Xjz45/w+HEYDvb3x3FYro5KlGOnj9/69Fvf8A3e4MSJ43ffdefmxsbhwcHrvPZrRaluWUoxYAuBjEE8kwwStgEkACzxQBLPwSAERoBtAQIAJETYRjyTANsWQthICLAAMM9mTKnd0erwhhtvunRpfz6f2Xny1Mm3edu3OXZ850EPftCZ06dPnjixv7/f0lFnTo7t7Jw+dfJBD7rl9V73da45c+a1X/u1tzY3Ey82Nk6fPn38+InHPPoxtev29w+OHz+O81GPfMT+weFqGIZpOjo6PHPmzM721rzvb7v11utvvOGeu+5qU0OSBBIyYCMwAOKZhLifMUgACMAAYIERGARggywLIYCQjH38+PGHPuQhd95x+7GdrXnfXXf9dffcc+8jH/Wornav9MqvtOhnk/Ngfw/Y2tyaLxZnrjmzubFxzz33PPjBD9ra2mjj6ujw4Nh1166Ojl71VV755KnT586dT3tra+slX/IlI+LkqdPHju20qQHGCCEA80wCIwvxAAJLMgZAEjaAJGMhwNgACBkLSQJsgyVsAxiDJLANWBIA2JakEMYYsC0pCLC5TGAbI0AWGEBgGwAQzySMhcBgBLbuvvO2EydOTNMkCcAgLhMYwCCexQYhQCpR0rbtTEmlVkzLySAEZMuISGdEABI4W2uIWjsIFLUU261NIa1WK7uVUmrXRdSW6WzZ2jS1iIgote9qKev1CoONuJ/AgCSbyyxkAGMQCIyQMQgQGMA2IRnAPJsExjyLQVwmAMxzMQhAiGcRz2IjYRtbERHRWiokBaiUGIYBHFJmShKqfScF0DIzW44TUtf3oTAWDMN6PaxrFKONjYUU6/UazP2EDABYkgEjns0ASAAYMAhhGwBJYBC2eTYJAGNJgI0AYZsHMpKQwCAAbANIGAtJUpRSyjCMEs4GrrUbp6mrXWbrun4YxzZNpdZau1JKa621qUQMw1BrBddapbA9tYY9tam1FpKkiJDU0kBXa7plS9vZWtd3NqWU1poQwgaMMZaEMZZCGDCXGQCBASQZY5AA2xKYZxIYBAgMAiRKqYhhtbYTKF0nRdd109TA2OM4tNa6riu1E0QpmR7HsavFznEcp2mspSqi72eGaZoys5YSIVBm2ulMEAIQIAEYYwCQhI3AAsAASMJgWxIAMinEi85YCDAA4pnMZQYhnskYCwEIjDHPJAmwkXiR2K61nr9wUXfdcdvJkyemaQJJgAS2AQQGQFxhEAC2ATAmIlDY2JmZCkUUSZIAbLBtwBgjCUgbAGGDAewoRRGAM839bCnAXGa7lAAB2DyTJAyAwCDJNs+PwLxQNghsnk1gLrMBJK4wiMssxP1aJgZAYBAgQMIGHBFSRISdtjPTtsRlkgRCkEZCgMAA6XRKIGGQJGEjOROQBEjimSQAI0AABtkWGBACIwG2BSCDAPFMBgFgwACIKwRgA0gANsK2ASShdGYaAANCthHPZBARJW2cmSlJijSAW0MAkiQZwBgwyE4pwJK4QhKYy2xAkm0bCdu2AQBbElgRUoQCbB7ANghsJEDIWMY8myQAzGU2gCTZaSOBDQIQIJ4pJTkThSSMsW0bSRKAJMC2bWzbCoXCNkIKSbZtjIUkAbbBtgVIksAgQGCeTWCeTWAAxBVCYANI2Eg8FxsJgwAwYMAgCcAGkGwLkGwD4gohMAAYQNgIbCMJkJy2zRXiCoMM4vmyXWu9cPFiBXOZhI1kAwIDIB5IBjBIMQ7re++7L+2QohQQNpKkiJBCCmSn7bTNZQZsCQAEgG3AICAkJIHBNiCEBHamAZAUIZBtwE5JkkACMGAewCCEkMBCkgzY5lmMsW0bSciY5yWEABDYNsgYA0jYtnM2m588cRxhI4MAwCAbCSku7V4axjFK2M7MzMQGBEgACCEAGWMDBjDmCgkQEoANGARIGMAYIwlxhSQAG0DiCnOZAZAEYMAGQAAYMIgrxAMJ2xjEs9mApM3Nzc3NrdYmISBJIQwCQEhxdHg4tSkUdoKiFCkkMjMzM5P72WkjkCQJybZtYxkEElfYQggkDLYxYBCSAAG2EdhCCCEEyIDNM1kSAAJLAmzAQojnYCy2NjclMCDE/QyyHaGLF3bXw1BqATC2bRvAkjCAhM0z2YBBgKSQEGDABoyFDAJjQAgBEjYAkrjMBowBEPeTwBgASTyLAQMWAhsBAnOFAYwxSIAECAwC8wA2V4hnM8YACBDYtk3ozKnTEbIBZEkYy0LGAAhAyBiDkAQAFWRzhQQGCQDzXIyEATsi9g8Ojx8/sVgspmm0DSgioghJ2EiY+9kIIQBsgwAEBgHIGMCAQYC5zEjYBoyxbUncT+mUhG0ABLYVwgAIAIMkQABCXGYewAZswIhQAIjLBIBBAgMgCcAYZ0uJK2otF3cvHS2XW5ub2RLZSGAjYRwqy+VyNQynTp6c2oQxxoB5bgIDBnGFwAAIECAAm2cSQgCYy2zAkgAQz2SQQQAYA0KAsQAwYC4zCPFMBizJBpAEBmxsJMCAJIMgSj137lzX9bVWO0FCyEYh2QicOU7jxmIxTS2iUwQgRUQoQmCn02AACZCwASSeJTOxJQFIQoYI2YBtImRjHArANmDbtiQAzBUGAZIEgDEIGwkABBgwmS1tjCKwa62Hh4fTNHZdn04BiGdzhFar1WoYrr/22pZpEAYwBokrDAIQAAZAPJN5JiEwlxkE5rkJAAMgBOYBjCRkGyGwQWCeh3k2AWAAxLMZxP0EBjAAAgMgns0gAAxgACQE6Sixv39w4eLFa86cbq1Jss0VMoB4FmMAAdgGMBUsIcSzWcgSmGcSBmyuEKCI2WzW1dp3XZSIKEjOBJyZzqk1GYuQMhOIKGBeABuBZSEbcZm4nyRsAxgDGCilzubzaZoiIp0BmRkR6/UKBIB4HhIgMAYJANsGQAAYwCABEsA0tVKKbZx93wEonJmZiDY1JKHa1Vk/cxoDYEkAEmAAPLVpMV/MZ7NxCpAEBjBI2AAIDJhnE4DASFwmMGADSAAgAMwVkgDAgBBgmwewjSSusBEgAIx5JvEcjIQN4pmMQQLAgJGAWmvX9eM4dl3FWMYCCTAYgswstbaWB4eHtau1dhEFGgDUWkKSJAkMSAAIGRuJy9T3vSSnjYWihBTDMPR9tR3SMIwR6rp+HCZErTUzJdVaM1OAmMZpahMCkACDJAHGEhjATkPatqdpsp1p261N8/mi6zqeTYCxEAgsqbW2mM9LrZ5GACRknk3C5n6GAASI52KDAEPwTJZkAyAwV0hcYQySARAAiGcyCGzznCyFzQNJ2EgAGMAgAdgGhABjAASAJfEsBjBIADZgIQOFCC0W86PlCgTYkgxgEBgECMwDmctAVJCNsRAGCTCAucKAESAwIAEg2Y4S5y9cWK1W6/UwDEPfd8MwlIjtra3TZ87YBhlnJqCQE/EAAgSAbRAYY4x5NhvJNjYgCSDTIQ4O9n/3937/xV78xS7tXuq6/uLFC/NZv7e//wov/3LjMCqEDVgIjARgW3ZymcBcYRAYEFhghEE2QGtNEiB44hOebNzS8/ns2LGd1Wp9+vSpUDQ7WqazKAzGQjYSGAMAEhqncWpTtkSSJAHY2FxhG5vnIJBkwOa52AASz2IbAEUIZBsAsAHEZeIyO21zPykAsC0wICFkbAOSjAEwV9hIOAEQADbQWstMJMBIPJsB2QZwa7WfzeZzRYQUEhiwjRMVnkkSGEACAWAbJM6eOw/q+z6ztdaGYcyWD3nog++8487lanlwcPCQB908DONd99x7w/XXT60d7B8cP348Srm0t7cxnx8eHoxTu+bMma2tzdYm27aFkG2eTdggnInBjgggCk4klRLT1CICkIQBZCGwAUlAa2nbRsIGGQBsnskYJEAYsIWNAGRbAmQnIAkMgEC2bYOwJQEgG0E6JdmJBGBskIV4JoNtA7YVIcCkLQGykQDbADYgbAQIY57JNuJ+5jIbMAACbEvYAvMcbJPpkMCAMAaBACQZ8xwERggBQOWBxBUCAwhAgAEwl9kGhKRAITQOY9d1JQqiRJai2WyGQYBBXGGJRBKkEYAExgACBBgDAsQVEg9gDEIREcr03XfftbG1+Uu/+Euv/mqvds8999a+O9i79Kqv+irDei0KErYAJK6Qbe5nrjAABnGZAAECwJIkAQARpetaa8ppGNZ7e3tSKEKSnAjbgASAwABIwlxmJxiIEpkJGAmBAbBtAwaQBLYtEZKRjQDZIKPQNE1ARLEtKaJIilIEEtM0pd33s3EYQ1KotWY7pNaaAamrtes629M4Ai0bxiABAsC2kSTuJ9sSl0myJIRtQJKNbUCSuExcYSMBxkgCLCGFAjRNkzMl1VojQpKEbUASgLhM2BJIbm1ja+tHf+wnn/q0p73qq77qer1arpaHB0fXX3vmoQ9/+K/9+q93XT+b9w+6+aanPv0Z99x77zCOh4dHhwf7+wcHW1tb//D3f//Qhz705MmTT3rSkx/zmMe8zmu/1sH+oJAkDMYABgFIyBgJEODWMo2IKABO7MwEMJYxIAGAAEAAWACSANsIJJ5FCAxGQpAKgbCRAABJPJPAYJtSopQyjmNEkaSIUGTmOI2z2dxOSbalsB2ltNaw7ZSUtqCU0lorpQzrAQFIXGYJEAZxhW0JIWMbxPMQIDAG80wGSQBgELaQZS4TEgBGAALAIABjJGwBEsYYsJEAQFVCAgSAwDYIEABGYGHzbBLYaXtq04mTJ6695pphHLuuj1KANo3DsM5MSba5zEbCCDAIEGADFrIADIjLhEHGAEg8izEWAsX2zrFhHI8Ojx78oAeVWsdpuOGmG17tVV+lTQ3JNiCJZ7GNJdlcZp5JABgMWBLYgCWuMLYThP2whz0007XQWqu1QxqG0U4QIJ6DBAAGQBJXlFIOjpabGxttGjMzSu1ql7ZwlAC1bCVimqbM7PseNI5jZpMAbCRAIBuEQk5L2j/Yf+ITn3zixMm9/b1777lnc3Oz7/vz5y+80iu/0j1333Pvvfc+/GEPrbU88UlPWiwWisDsHDt2/tw57I2NjXEcX/qlX7LvZ84E8ywSILANIEtcJmzAGAQCbNuAuUxIALYlIS4zCEAoIkBpg0NyKUBI4pkkSYBtSVxmBAYwUunT7eKFC2fP3rdcLhcbG1tbm3ZC2jmMw80333Ty9DXtCU+ez2b7e/ur1VrSnXfccfz4idl83vV9iWK8Wi3bNKSzUiUZwAJbYACby4QSS4pSFE7bGEBCABhkjIQNgHgmSQKwEIBBwiAwgEFcJq4wgG0ewBgjAZIA2S4Rh4dHe/sH11xzZm//cBzH1sZxbPP5/Prrr739jrs2NjbXq1WpZRzHWuul3UsbGwsJoGVbzGci9g8Od3Z29vf3b77pxmkaDRgJwCDbIJ5JAmMZhMyzCAwgYTuFuEI8kwEhYzDCYCMBGHOZMMgggwBAYAzIgA0IGUsCA5gKgAUAGABhEAAGAwYQBpkrbJuspSyXq9vuu/3GG66/99679/YOZ/NF19Xrr7sm07YlQCAJmytsJGQhG8AYBGAjgbAtCQAknEYAoYgIJKcFLdubvdmb72xvv+xLv1TCYx7zqK3NrVk/G8ex6/pMg22HIt0ABBYYBIB4JnOFQRIAAsQzGQyA041n3PWMo+Xqxhtv6PvZM25/xs7O9onjx6cpuUI8izFIAALAtqWQotbu4oU7n/rUp73YYx5dIg4PD+68867Nza1hGPf29yNiY2Nx9uzZG264/syZM7fdfqcirj1zZjbrsiWX2QgDIIHAIGm1XD75KU/puk7SM259+oMe/JBjx451fXf77bf//d/9/Xw+K494GPjWW59x44033nDjDbV2q9X6qU992sHBwQ03XN/3/XK1ms3npLEQ2EhgjCWEbSHAJgJzhcA2EoDAPJMFSBbiChtkjAQiFEitNYVqKSUiJGxAEiCQZPMcDMJ2hIbV4Wu/1mu+/Mu93GKxgZjP5uM0nbvv3jasXuHlX25qefLkyfXy6Oabbrj7ntjY2Ey7TdODH/yQruu6vpvGabVcvuzLvPQN118/jlOJMMbYSFxmEBgAYVsSYBQR4KnZtjPTkpAQpASABAZxhQAJEIBBYCQusy0JsFMSzyLbyCBsJAshAHAmEplebM7+5u//4ed/4Rff/V3f9c///M9PnDzZdfXJT3nKa73Gq994082/8Zu/sbW5lZkPe9jDnvCEJ77US77E3//DP4zjuHtp9/SpM9ma5I3Nrd1Ll17+5V7+p3/mpz/sQz9ke3NzHEaJKwQIGQwSGIMMMhbPZgOWZECIywwygEEAxlxmA5YMwiAQlwkQQuYKGzCWJGEjBOYKA4ArADIWEjJIxgKwQQgwAAgQ2AZJtvvZxh/98Z988Rd/6c//zI+fP3f+ttvv3N/fP3bi+M03v8k4HikEkng2g5DAGHOFwFwhYSxLEoDAYJAMIY3TtFqthmGI0DRNi8VGEXt7e9vbW6vVatbPMvPcubObmxvrYVzMF9jg5Wp17NgOgAEwADLmuQkA81yMwYAi9vf39vb3r7/hhvV6OFqu/uxP/+zFXvyxx48dsy3xXGQMiCtsQAigtbaxsfH4xz3h0Y96VN/V9Xr9lKc8pdZSanfx4sW+n506dWqxsXFx99KFi7tn773v+huuv+6aM7aRQUJgnsk2toHW2okTJ1/vdV+n72elFIlhPSjixPFjd9xx5xu+wevOZrONxWK1Xr/xG71hrd329jZStvbwhz2kTW29XiNtbmxkayCukLjMgI0Q4n62ucIGC3GFwDxftgEhhJFJZ9oZoVJCIBCoBEgKCcAGEGAQAAIjCRjG8aYbbogoiSXZLqU+5EE3Hx4ePfrRj3ZLlZimduONNz7owQ8Cocg2ZWvTNCkkhLOUMrVpnCZJIGwkg7jCAAiQBEgYK22BEJIkMAgwCACDQFwmMFgghEGAATAIkMRlkgAbiSskrpAA8SxGYJBQFEnjsL7ttmc84fGPe/O3fMu777k7IubzGZ5wDuvlME7HdrYlL1fLG2644elPf1pXu83NjaPDw9NnTnddt3vxIuTB/v7B/sH25gYyEgaQMCAAMIAAYYSRsMAGCRAAxiCeg3ggG4QAy0IAmGexQSBkjABkwCAQYAQGIwCgZtoGBFjGApBBAJhnMQhAksBGaHW0/5Iv/uJf97VftV6P11x77cmTpxTRdd04rCUJwCCeg8BcYSPxLMaYK4wxzyQAu3b1/IUL586dKxH7B/ttmrq+n8Ym+cVe7MXOnT9/dLSc993u7u6DH/SgJz75SVubW4vFRq2xf3CwvfOYkIxtEGAbGQAJDAILGRuEAJvLjLhMtnd2jh0drff39h/84IdM0/i6r/c6Gxsb0zSBbe5nDIAQzyQMgJ02GaW0lq/xmq8x67thvT527Nhrv/ZrdV0nqdbaWhvHaWdn52i5zMz5S79Ua5Mzs6VCgAQoM5Fsg0CARISuv+7aTNsGYnvL9jRNt9x8o8Hp5tzq++PHj2Om1sCiohAoQmIaJ9sCY1kAMkjimQQIkGwQApCxuMzmASxANmDAQojLJMCk05khaqmAZElShIS4QtgAMgiwQYjLFNIwTvYAYEeJZ9x96/JoeerUqfV6OHny5PnzF+aLxbBeb21vtdaOjo7ms/nB/t61110rSRIAkhQRGAMIWxIAAoMABCDEZSGMVSJbhhQRbk1cZhAIjBEAxmGwbWwAxDPZCZK4TGAbCUDIADbGEiAMGAmEAVvSNA7XnDn96q/2qjdef93rvd7r1lqvv+764zvHhvUa6UEPevCJ48dXq9XR8uj4sZ3jOzs721vXnjk9tjZNLTNvuOGGcRiWy2W26bGPftTxne1pnEDGkjDmMoOwkQzCGEsCkAGMDVhIyJgrBAaBQVwhQAID5jIByJgrhDEgYxAAEmAbMAIDIDBGku664xknT56cpkkSCBsBAsCAEGDM/WxKiXPnL24s5ov5HFFrHdZjqSFJku1papLAtkOaWgK1FjAIwAYhns0YwAAIjEE8kzEOKU1ElFKmaYqIqU1OY0dE7bqWCZQSbWptGo1LlLQjIhS2weYKiSuMBBgEGMRlAsCSbGPGaeq6TkKKWmtm2pYUEa21bM3Ydi314qVLJWJ7a6tlIsT9DKKUsre/P03t5InjkjJzai0k26FIjA1IktRalhKgzJTAAAghBGBb0jCMQNd1YEk2dmIMgCSEwDaSAAQ2YPNMAnM/SQbZIGMAhMBI3E8AmMuEDNgA4grbtdZ77zu7tbW1mM8yjRBgECAuy2zL5WqxWEzjoAhFhEICI8lYYJDEAxkAYcAgAGxMuvVd/4QnPuns2XPHTxw7fuzEiZMn/uEf/mFjYwMDidnb3yulKOKlX+qlSoSRwABIXCYJbCMAW5KxEOIygQHbgNPpzMxau2EcapSu72zbgCWBANullMPDw9Vqffr0qWmaQgIMYAyAwACIBxKyjQTmMhtAAmMhg8AupdRaW2v9YiOnBs5s4zik2dzczJbpnMax1jKNI1JEKaVGyOlpmtIupbRp7Gez5XIpMBL3EwAGCczzMgjAtiQMYJB4JoOwLQnAIDAIAAMgSzEMw+6lvWuvuaa1SRIvAkm2SykXLl6sIBsQAJZkAAOAENg8gAGDJEUpSJk5DGOUaC3BNpIEtiUkIQHGmJZpGwMYAIEBkDBgsEFgCxkDmPsJNWkYhijRWgMQmNba1BpCaBqRhEK4pSVly0aCAcAGLGQACyEAjCRjnocNMLVJCLVxHMFc5rQkwFgSFTDPZCEMAjBg2whx2TgMSIFsJBkESACQdoRsY4NBCAxgm+chkRbG2LYQIAEIgZGwkQBAgARgDCCEuMxIAAiMJJCxhNMAgAwAkkDGtqUAYxAPIEBIMlcIANsQIUkSIUWEIiQJMICxEEJgI/FsAsBIIGyQhSyHytTaYx796Bd7sZI24PSrvPIr285smWkbiAgktwTANsJGNhKAbQQGjEBgIQCDsEHmmULhMEQEyAIAJGFhIwsQD2CweTaDBIAEthHPZhkBBjAICYEBSRjZRtLU2jhNpZTbb711sdgopSTe3NxQywvnz/V9N01pezabG5WIcZqWR8tpGrFLrbPZbGgT9sHhQYkCkmzAEvcTApBtBAZAAIgrhLhCyDyTuUISBkAACCwwArAlAQiBARsJDOKZDIAQAmwDxjYApgKIywQ25gGMeSCDwNhpW0iSJLCxJEAChI0AgW0AIQNIAmETYJAQAgMCBMYIIyAQ4nlIApAEBoSEjAEhJAkwkgwSIEACwMa2JLAIIWNAAhBCGDAIIdsKJGEMAgQIsK0AkBSEMYABkABjkLAtCRAYsG0DAhCYZxGywAgDNsiyDALEFQbxTJIAG5yGUHTzOcbYNsi2hE2EMt1aEzLGIBACDGCQQdgIARFhY6ckzHw+B4MAY0w6p2kCIsImIjLTNpcZAAGCBAFgAAQGA4AUEaUIAWAEFoBsAxIAGARgA0gC20iAkIUwiHGamCYJAJgmO51YSALUWkqSBMZIYHGFQQYwl4nLJK4QlxlzhSRAJZCwDWBsJCMwGIvLDAZzhUFcIXE/AxLPZAwYiWcSAAgA2wCSBIAkoEQ86UlPXq3Wx08cN5h88C23rNer++69r+/naT/8EY94ylOenJk5tWuuOXN4dHRpd7eWkpmPeOQjdo7tkOIKC1nigQzCkgCEMQAC8yzGQoC4wiDxTOLZDDKAASSuMIB4JiHzLMJGxkLiWSQDQAUwYADzTELIAObZhGxbSAhwNkACwljYCGwbEIANwhK2gFKKBOaZxBVC5gobYwm3TAyilCIFYCdgEAIQAMZYBjDOTC4rpSBhAARIALYB21whYWOnbSBKCAmZZ5PEZbYBMAg7My1AkrhMCEBCgIUABIjnYgAECCQBBoMMgRIDIGFbxrIQzySEwCAkABtsI7Far5781Kcu5ovl8mg2n9vuai2l1K7b29s7fmzn5MmT2RJAPJNBYCQsA0IIG0n33nvv6dOnStBa+7t/eEqJ0rJJ1FprqYv5/PSZU6Bau/2Dg/VqfeLEsWmaJGFknpPACAwgYQAMkiLCNnZESAEG0g4BKIptZNsRgclMACOBQQIwSLbBAMhGAiilzPvedmaChVprmYkAgRGY+wkM4lksZAAEBgQGIQsBAiQJG0CIZ5NkwAbMMwkhgQEsBJjLbAshMIDE/QQGQNgWgGQQgAwCS2qZL/NyL9Om1nVdZrZpnM3n9s7W1rG+72tXa62PftSjhmGwXWs55VO+6aZSyjAMfd/bCBkjAFmIZxEyNpJsSyAwAvMsAiPAIDCAhI2EkEFgACOusJCxLQnA5rkYAAFIYLCNuJ8tAFEBBJaxEAKwAQOI52AkAaUWSeYKGZy2bScCkATChKSITIMlDcNwdHQUkkFgkGQj2UhIQlI6s7WNjY0SJaTl0XI9DAo5DbaRAAGSDNhApsHbW5tIgt39fUypFQS2bZsrhCSM7cwGbG1tSZJ0sHcwTmNEiQhJtrnMNiDhdNqZrZSyvb0NCPF8CGMMwpJSEmCbyyRJIMnYCYqIWmubpswcxqF2fUTJTEnY5plsJAAwCIwBEIAkiWma7r333uPHj8/6zs79/YNSyjAMm5ubfdeN4ySFaUJcYQwYhCwJGyQwYFsCMCBfOH/Wqdp3gqk1qcxm/bHjx+fzORLG2DaAASOeTUjYYC4TGIPBttM2EKW0li3HrtaptRIxjKPEMB6VKIhauxynEF3X2QYwBmyBAVsCC/EsETEM49/9wz8sFhvXXnfd7oULe/t711937alTp1prYACQuJ9BgAQGMAmSAVsIEAJAPH82EoAxzyaQwcYgbHOZZRAYhCQMBmGQQVxmnsmIBzDPZBA47cViIWSnbWmedkiLxYax07b7vuv7DshMQBIwX8wz0zYgBQYZ8UDGGAkbMJItrjAIwEaAeSZhW5YAMAaMeDaBsZFkcYW4nwGQwBiDuEKSeTYBgKkABiEFGAAkANsYIQkDGAFIOjpaHR4e1lqndtCmEZRpICIUKlFsp1PQsm1ubpWI1pqdB4cHi9m863vbAtsGSTaSFBKSiFKOjo7Gceo3+8zc29/f2tqstZOkEIltYy5ThMB2ROzt7beWs/lsHMfWfOLE8UyDbWcm94sISUjYCh3sH4zjtFjMp6mthuHYsR1sSSAJmyuMBU6nMyJ2L+2N49T3nY1AyNgGJIFtAGSQscwVAjBgAIPAkhiG4a/++m+uv/765dHRxYsXd3Z2kMZxfOQjHx4KGcBGArAtiWezweaKza2t13yNVwcjiQBsK6JNUymRmdM0SuJ+xpJ4JttIYCPAwDXXXJOZQER5jdd4zcwUIAGllNZyalNrLTPn89liY54tJWGby2wADNiAkIUMALJNZmZrBkml1uXq6O677jp79myzX/IlXvxpT3vaOE6Hhwd9P5vPZy0TmM/mL/7ij6U1C0AYBIj7CcAGYTuk1fLor/7yL2+++Zbtne3lavVXf/3XO6/5mtdeW6epCSHzTAIDYMCJIkIqpbRs2dI2CHGZAIGxDQiwjbERzyQJABAAWCABxpJ4NvNswraQAAHYABLPYiMJAPOchLIlGASAhWyP4yjJWGBjA5aEsQ20bAiQZWHEA8myDEjifrZBYMDYaQBAkoQBMEKI52SBERiMATBIkngAIQw4ZUwouEIY80wCjAFEBcCIZzIgZEASBjAImWfRMKxba5nt2Paxo6Oj5XLV932USDObzUB934WEODw8PDo83NzcBDBF0fVd7apNiYgI29PUuq62zGzNNiDRd904ThHF0HXdbDaTJEXXdVJkZmZrrZVSgNYaUGudzWdRSq1dS/ezvpRiT4DErJ8ZRYTt1qZsDaSIrutm8zk2CNx1Xd/1mc0GZ5TSdb1t25nZ2kRQKKWUrnaAJDtBBkACbIOQEELYSIjLDAgZxLM5okzT1PfdOAwR2jm2s7m54fQ6JIRtjCQDYIQAMM9iJNkGbE/TZBuQpAiANgHj2ECSbITAgCTABpAQgJANSLYlIgRADMPI/Yw1TlEi0NRGQynFaUkgZAxgMICwkUEAAnOFBIAkUESb2sbG4qEPfcgtD7qlTVOJeMTDHtaydbWzMyLS2C6lOG0uM0YSGMQDSQBILXOxmL/RG75Bm9rWYn7i+LEHPeiWWmIcRwmwEGBhWwAYJJWI9bA+PDh6/BOf8FIv+ZKz2azr+sxmW+IyG2HEc5BIIwBsJEBgCQGI+9kAEhhjSSAwIAmwLYSQBIBBYJBkMAAC80wGwBI2EpeJ+6VTYCRJMohnEkJgG1ncz0gyBiwDIGMEBgQWGICudrYVMjidrSEByDxfQrYRNgCykLF5HkIWMraNAIQADBIYBAaACpYk7ifuJwAMYFkGMAggItbr9Z//2Z+96Zu80e233/G3f/t3D3rwg4Zh6GezcRxay5d8yZe85szpaZpCQtgGJCkEcrrUcscddzz9abdiHvbwhz3taU9XsLFYvORLvFgap1prdrNTSBFRakjL1fL3fvf3jHd2jh0eHi0WcztrKQ95yIN3jh1LZ7ZGrVw2TVNms5vQelj/0i//6tbmVpQIxbFjO4997GNw2mptatMUEZJAzsxstm13tT7+CU88e9/Z2tWNjY1Syou92GOmqUUEEpIkIUkYZMDmCgNgLCTxLAYwiGcxQGu5sbF46Zd6yWmasMGKArIzM7ElnskgMFhgBMgGgcDYBkIiSikFaK1JAodknGljCTD3sy0JwCDANhKXyUYS2HaESimGTGPbXh4eTtN04sRxSUfLVSlFAkkIDAKwMcZCYAwCGSMpMyVFhI2QbbIBtZSulMxW61zIIAGgELIzsxmEkATYxgIsAPFAkrp+dsuDHiRoLadpAifYSIENILAFBuyIanJ3b892c7v++uuWy6NhmvDBsWPHSq3ZJq6wAQQGQEji2SSMQQawAYlnkTAGAZIwyACAMYAASTZgABuJyyTZPIDA3E8KMBYCwEjqaicYpxEbYUsCgQ0YEM9mELYBxP0MYC4zYNtORdx6223jOLWWEdrc2rzhuuumcVIgsEE8FxsMMoAQYCwLhDBgAIENYCQBgBBXCDAgQMIIqgGwLUDi2cwV4n5CNg7FOI4hXvIlX/LgcHnLg265+eabkLq+r7VmurUJ++jwIEqdpkmKiGhtQoAkJLK1rc3Nm2+6cRrHjcX8xhuujxJ93yEJhGxnpo2d2ZozKaXr+kc/+lGHR4e2jh8/vpjPpjatlsu+723LIBlsOxMDCAGllAfdfHMtpfadzcbGIiJs27Yzs0lC3E/YQNrHj+3UUoDWxs3NTaclgSSBAQsMCAxIANjiCmEQAOYy80wGwEhCNpler9aSjA3KCQQIkGwACQADIIOwwSGZ+9lI62Gotd8/OFTEYj47Ojp0Zmut67rNjU2EDSBxhSSuEDaAhEEGkMBGRKi1PDg8qrUuFgtF7O3u7l7a3djY/MzP/JwXe/EXe9d3eeej5VIKjMEGzP0kcYVkGwQGhJCQsG3baQNERGbWrk9nmybbQlFCqKVDocCZCkkBZGuSADCSkG2EkHFEtJZ33HF3lDKNw4kTx2qttqWQAAzYkmwEilivVxcuXDh27NhiY0OKkydPrlerCKXZ3b24tbk1m82yNWMhrhCYywwIMGDE/WRksA0IIQCMQcK2JAyAAGoJFLZbS2Qh7FJqZtqOKC0zhAEjsAwC80wGENgAoTZO586da61dc801EoBkAIQExkbCIAAEgABhW4jnYIzB9LP5k5/8lCc+6cnpDFS7gjQN44MedMs4DiCDjLEknsUgQMhcIQmDDIAtnsVGwkgyNuY5GdsGA1XmMiEBGDCSsAEBSDiFDGCcXizmXde1bEfLo1Iq4MxhHEIREUBrLVtThO2trS2wFEhIREHK1nZ2dk6cOCForZ06fcp2ZrbWADvBIAkbELi1KaTrb7g+IiQhZUts43EcbUsCsO20DRYggbquf9mXfRk7QUiZHqdRXBEgEAYBSBgQrU3XX399qdW2nZk5TS0kY9uZtpExkjCAwIDB5jKDMAhzhQDbgG2DAJDAIAGSxHOTeCYDIEBgLjOXGUREHYbhj/74Tze3Nuez+f7B/oMf9KDDo+Xh4cEdt99+6tSpV3rFV5AFlgQCsBEABgjJABYACAwCqLW77+w9j3vc41ar5Wu95msuFrP1uN7c2j5x4uTv/N7vjy3f/T3fm9UKsJP7SUhCYC4TGAQANkhC2HbarjXuvvu+2267fRyHxcbGMIw7Ozshzpw+c8999xweHB07djyKDg8OIyJKTNO0Xq0f9OAH3XjjDeMwCIGEjBGAuUJIT3naU2uUv/u7v32jN3qDW26+eRhH24AAELINRJRxmu677+yp06dq0Xq17PvZ1vb2NE6tjX3fhzYuXrx45sxpSRhjSQCGAAQCEBgEBklgDMYAAmMIbEkARhIIbFxLOTw8+vM/+8udYzuttWEcHv3oRz/+cY/f2Nzo+5mdwOHhYVe7zc2NRz/6UeM4QtgWBgwCxGVGACGtsz3u8U8Yx/G1T5+utaQNCMC2JCEAxAMJGRDimYQMtoHWpnk/e8YznvHkJz257/uWratVorX2jNtu39zaOnPq5DAOIACwLcQVArAtQABgAAFIksxlxiAB2DybkG3EZZJAsqmI+xkLGQAbAQiMDTJgALXM+Wx+4sSJvu83NjYAScbYzgSQAMC2kKFlU0QoAGwsm8zMzFAYr1YrbKRQSEgB4pkkyUbC9jAMAFKJyEwkjCQuc9q2jW3AAIoQaLUe7HQaERFIWIC4wmDMMwkRiHGaxqlFRGYCEYEBY9sGA2ADSGCeSbK4nwAkABtAAgESGAuBkDHPzQDGkrhCXCGwBEaAzbN1Xfcqr/JKwzDMZ/NxHLva3XjjLFu++GMfux7WAJIABGAAG0ACMAZAYAQIAQbGcTh58tgrv+LLS1LENE072ztHR0f7e5d+9md/emdnZ1gdhcK2JBswAOKBbCQwDyCQJAVkJpubGw960E2tNaEoZTafC80XGzf1/TCsA2otnD41tTabzcdhXK1Xx7a3W2sgJLAxz2YgnbXWRz/qkefPnn3lV36FzY1FywSEQUiSMIJsrTkvnD9/4uTJxWIxDEPXlWG9+o0/+dOXedmX7fr51FopZWd769577r3hxhumaZLEZcYGAdjGRgJAgA2AJC4zAMIIDIAwiAQJtZaz2ezFXvyxQGY6s6v1MY95tE2EbEqJ1lrL1nddaw0AS2AQMs9JkjO9mM8f+chHXrhwoeu6lokRWAAC2xLPyxgAAWDuJ8n2vJ/dfuedf/anf7ZarWrXZ2bt+1pLCbWWf/d3f//oRz3i+uuvG4YBCRCywAACQALAAAgb2QIDCMBIwgBIAIABjC3EFbYBgCqFbQEIgUFcZhBGkFgAYCRAFlJIkU5MRIABSbZtZyb3iwgh2wZsMi0JAME4DhEhkISEABDPZMBgiYgAbNtZSuzv7W9ubkAgSYDBkJhnMpIkgwSSutpHiWEYsqVCXCHAYB5AkqTMLBGttcODg42NzVJq2grhBMA8i0EY29gGgcxlAsAgAInLBBJXCGMsoRAgBDbYlsAoArDNFQZhDOIyKbDB2OmM0Gw2m8/mma3WCmRrkmpXu66z0zYIACOBhAEQAAbA3E9gsAUuEWU+5zIb4MSJE1GK09M4gm2DMGAhrpAADBLigSQMCClQE7K9vbW1s70tMJYCRITtjcVcqLUpMyWFMEiKiNZaa00SD2QQAEiQbbr2zJkzp04Bxq1lrRWTmSAAsJG0XK0iytbWlu2Isn3s2J/92Z++7du+/Z/86R8/8hGPODw6FPSz2Ww2OzpazuczjG1JkgS2AQmMLAsw97MtgQQSAgAEAMggcZmNpDNnTgM2drbWNjc3hBCSAEmYdLbWJGGMJQEIIWMMEtgWkOmbbrz+5ptuHIYBsI0kBEbGvAACJGyusA0Yz2fzZ9x+x+/+7h+0No3DOB0eWprP533fd7Ubhunw4OAv/+rwFcrLnjp1qrUmCZB5JoNAYBAPIAMYASAAA0bimQSAEfczEoBxBUAG2QgECAyAuUxcZiSeydiJLVitV9M4IglFkVCU0nWdbe5nG2ynbWMEUoQODg7+5E/+9OEPf0RXa+3qNddcA9hpA7YxALYBG0kKyXra05/x1Kc89SEPvuUhD32IVGzAIO4ngbjCdsucz/o777r7L//yr17zNV9ja2uztQYIAAwIxDMJnOmu6+65556n3/qMEydOLFe333zjjadPnx7HEQwCAcY2EtgIMGAbMM9kAMRlRgjAIAAZQMLpJDFTa6WUCAk1W2IaplJLiXAaQGAQ2CAukwTYQGZKKG0k22BJSBg7ARuwJCnAgC2BAZsrxDPZCEkAxgYbkCSp1NKmXA+rnWPHezg62JfstAVgAEkAQkhgACNh7mdspxMbAyBFqZIUgbGztTZNUykFG5CUmY2UAmBqSJIwYMQzicsEtmnTePHC+cVis3Z9ywyRLZEWi3lrk20MUGrX9cyS1lpr0zgM5Padd95144033HbbbY98xEOH9bqf9bX2/XyRaUnpFAJsY55NGAMgMIABAdhgYyGeh0FCBpSZSEKhoKi1ybaQhXggGSTEZQZhGzAIA2BJGKeHaTXrZ0BETNmmcQQBiAcS4jIDYJtnEc6M0H1nz/7+7/9BsxU1ooVjnNo4Tov5YhiGbK12dTabPe5xT3jpl36pne3t1hqBDSABgGSMucwgAQZAmGcRABjEFUKWeSYh2wBABSPASELGAMhYAJj7SWCeyYBF1/V33HnnrU97+qnTp1vLo6OjEnHy1KmHP/yh4zhKsgEBNti2ARmDFNOUj3r0Y3Z3d0vtzpw+LUVmsx2yAQxgnslumYvF4mlPv3U2m7/FW731PXfd+eQnP/Uxj3n0MAyKCC6TeU52drU847bb77jz7kc+6lFPesrTXvzFHtv3XZsm2zbPZHM/27YjynoYH/awh9908y2333bbweHRmTPYKQkMBiRJBgwCG9t22kU8kwCBARDGYDAGQLYpUQ5XR0960lN2dnZ2d3drrbP5fHl4VGt3/Q3XnT173872zi233DQMowRgLAtAFmEbAEnGOJMo/WxmA9g5TVNrLSL6rm+tGYQzbRQR2GDbYASAeQAZMGCEwHbX9S0bcHR4dP7Cxdp13/Gd3/0SL/Zir/+Gb3C4fwmMhQCDAYyxbQkAYQDEM9nO1rBB/aw/e+78vffeO58vlstl389wrlbLG2684a477jQs5guVkHjwgx6EsSwJg0EAGMQDGBs8TdNf/83f3Xff2Td8wzf8m7/92wsXLvR9f/z48Td4g9c/PDwUGAOKuOvOO0+cOjWOwzSOdhL19tvvfImXfIm77r4rah3HdZQopXZdd/78hY2NBWAnSGAZMJcZhJAxAEIGbGwwz8uAkQAItWnaP1iWUkBtarWr89lMISAAYxAgHkA2EgACEA8gDcPwlKc8+SEPecjf//0/nDlzzX1n7zt9+vSDH3TLMAxCNgASGDAIjEFgrjAIEFIpdffS7tHRUcucz2Y33Hjj3v7enXfcGREXLlw4dfLUiWuu3bt0aZyaxWq9OrazAwaBAZABGwFgAAkMAhAAAoMsZMwDGQNCxjiRBIBNNYhnMgbAgHguAnM/AQZ7mqYbrr/humuvLSVsgMwEpmmSBJJAPJBtY7Ak48PDQ9DR4cF92a679nSmQQYMSMICCWPZTkkXL1685eabgc2trWEYJYEwGNs24goBtoF+Pr/jjrtuvOmmhz/iEX/xF3+xu7t73bXXTE5sLhMgrrANSIpSSqm2ATDYNs9kIRAGwIBtbNvOtMQzmQeQbRDPJgCRmfPZ/KYbb1wsFpubG1Nr0zge29mRmKbx1MmTtdbMBBuEJAEgbJMAGAEqpVy6tPeXf/lXx08cPzpaumU/68ZpqrU++MEP+qu/+qtbbnnQXXfd3aaplHLq9Omjo6Otra0Xf7EXi8DmgYRsgwHAuO/6u+66+x/+4XGllFd51VeZ9d3Bwf7Ozvbp02d+4Pu//5GPfMTrv+EbTNNUaxUCDIABjJGwJZAwCBDPTYBms/nm5mbXdRFyZjbPZn2Nsr29ZaKUMk3jsZ1t7LSFLBACDOIBBAaQJLXMjcXi5ptu3Nvb29rcBPddd+z48dYaGCRsPA7rpz/9ads725sbC8w0DdlWt99+28u93Ms/5clPARSR2bJN6/XqSU964jVnTpUSBsAoECAuExjLPJMx4oFkSzJXGAAB2JTQempPefJTNja3VsujYRi2trYf85hHARgEArARAmMQABjEcxNYMAzre++979Spax73D4/f3r5jd/fiY1/ssQ9/6EPXXisksBEWGMAGEBgAgREYhBSldn0/c6acr/96r3XzLQ9aLpc/8zM/u7u7d+Lk8Td8gzc4dfqaZzzj1j/+oz9er9ZtasYGgRCXCRDPJJ5JBgmMEZZkkDEGiWcRAowBJMAAABVjAwJsBIjLJGGb+9lICJm0MUYyllRKwZYEqrWAbYMAMEiSMZKQkFA6nW0YBoKDw/1QHD+2M4yjEJjLhHkWIamUMg7DIx/x8Ftvu33v4GB1dPSgB91iO0KAMSBAAnGZJMR6tX7lV3nFv/3bv/+t3/yNvu9Pnji2Xq0UQsI2GEAA5goppmk6c+b0U57y1MViccfttz/iEQ+bpkmSAYQE5jID4DTYRiFJgBDi2WyeSYABbEIASFxz7Rmnt7e3JGEbI2GMsadpkgRgkCRszGW2BbYQaHNz85GPelQtoQhnTtM0joMUG4vFiz32xfp+duLE8WkcbRaLRYkytUniWYQQxrYlGQOAUGu5c+zYi7/Ei9sWzsyTJ09duHjxtmc8/Zu+4Wuvvfaaw73dEgFCksAWwjYgSCRjjMAgGwmwpIiwLWlq09bWxrFjD8G2nZk4gdZ84sQJKcDG0zRmS0k2AYAxCFsSV9gISYDtxWLjFV7h5brar9bDgx/8oBJhbHu9PAIMAEbSq736q61Xg03pughN4/R3f//3d91518Mf9tCcWt/NSimZGeIVXv5lu1rTKQkD2AbbABhJthHPJIwREghsBQAGgZC5QiIzZ7P+pV7qpYzJrLVMLQEQAAYwCDDGIAAkARgEiAdwuuu6Rz/60bNZ/2Zv/qazvj84PFxsLFbrVSgAjACwAZDAYEAAGDAI4TTOjCil1sV8dubMNYcHB9vHjl97zbV3333fY667/uSJE6vDg5MnT25sLGynE5AEGINkEM/NQgDGGAw2EpdJYAAExjLPQZCAoEoAEiAJMM9kWwAIAIdkSAwYAwKhJLExl6UtCRCX2QjbFhIiAAyKsNnZ2d7cXOxsbnZdt7NzTAZZICSBwNhgY5AkWrbZrLv5huuefuutt9x887FjO61lRLGTZzOAzP0ym9BjHv3IJzzxiY9+5CMFhADbBPczgJCwhZjGcdb3N914wxOf8PiHPOTBW5ubU2sRgUHYBhA2YBtDS5tsU9NMgCGQsW2QEBhsGxCAhG0kgadpArABGwkAhBBI4goBtrERSEIS2IAzs5Zy8803OpEAhIxtt9aOHz+RmQBYEgghmKaG00ZgmSuEMQgM2G7ZNhbzrc1N42kcbaLENWfOtJxuvOH6aWqtZZQCAhthjLmfQYAwgACwLQABAmyEnTllYiNAgKIU0TIzR4EUXTdTr8wEpmm0LbABbEsCEIBtQIoIGYZx6md9ZrbWwLYBIYQkJEmHly4dHh51Xc30bDa7+97zzvzqr/7KT//0z7iwu7+5sTFNY2ZbLlf9rDcGbACwEAgEAMYIDBI2QhLGBkBgEIABkLifBMYSoSDCUGt12iRGYEk8mwSAARAIABtA2EgYz+eLhzzkWGs5TRP25uZGy2ytSQIhgwBkYwEAAnOZkGUAZDc7s02ttcOjo0t7B9ffcMPepQtPedpTDg4u3fr0Ww9e9mW3d3Yu3H337u6lkydP1FIjyjRNPJNBAAbxTAaMQWAAxDOZZxJCxoj7CRuEADBABQG2BQYJQGAAA2BJNsaAACQEgMFFJWo4MzNLKWm3lpJtLjMEYBsQUkgCk3hjsQAd2zlmO1vats0zyQYhAUIAtoFMb2xsvMxLv/QwTlPLiMC2iRAIcYUQlwkBbpb00i/1kuvVYJBkIxCSkABxPwkhy+O43trceMVXePmpTVPLiAIGA2AJG4xtG9vZWpvaNE22AbDBBiQByAgh7mcjEBgjCYwESGAQV0hgGcBCthESGAwIkLABWua4GkG2JUkCgySt1muBncZCoUACAEkSAhtAsgEQNjgNCLLlOE6ZGSEQ6TFt58gYERFhIxljGwzYYACJK4SxkEECc4XBgNDhweHh0ZGzLZfLWrv5Ym6r67psTaHlcllrHcZpPpuXWsZxOHnyZInIbAILAAMgCRC2JTLzr/7mb7uuv+euO1/8xR970003DcMAEkhCgMCZubm5eXR0NE3TbD4vXdfV8lEf9dGv8zqv9zEfc7G1CRwKQpne3t7JTCEJ2wASIAAMAgABRmAAhAQA4llsIQQAAgxSdDWm1iQyKVFKV1qbAJuWiQDbFsIACMwVNhKXWRKgiGma7rvvPmeeOn0qInJKQArbYAlsBCDEA1gS2IAAQygUEVGytXFc/+LP/8I1156+ePHiwf7+q77Kq95x++2/+Vu/vbW9dWn30jAMQKk1W7MdEYANAkAYMBIIDBIIMGAAgwCQZdmY+wkMIDBGCAmpghFCCHGZsRAy5jIbIWMuMyBAtoRW69XR0VGttev7vb29Wd9v72zbSNiAuEIAtkGSbATT1CSmBmmEJCEDwiAJACRAErZs205YLldIkuwEwIAkIcxzSdu2xHK5liSwQUhCAhnAgHkmO21Aaa+HQVKEjEEIIRBIADZkZms5TlOmx2mUBAJsAAkQGAEIgRCSMGAAYVsCwBjAQlxmAwZAxjyLACQuk2TbkubzudOKaK05s3Y100i1Vmc60860W2sIAYCRMCAD5plsEP2sjyjAer3uujpbLEAgMBhKG9dTmwRAZrbWhNIGJCRAgEEAIAvZtgAwINuASqyG4fy5C1MbWsuI2Bi2loeHs/l8Y2NRS7nrrrvt7PsZMJ/PV+vV9vZ2nc8lAVjICAzY5tmkSxd3NzY3jo4O1+u1JIwEwhiDEIDmi8XW9s5ytd7eObZaHW0s5q//eq998cK5t3nrt7h0aXd5dLTY2Lxw7vx8MS8RbUoH4lkMIAMSGCQwFjKBbfEsBnGZFNg2CGHbpdb9vf2/+7u/u+aaa7AXi4VCd9xx5/Hjx1vLWusjHv6wdGKEjAUgDAIElgCBQVxhxnH4h8c9TtJrnHk1EBgAi/sJwDaSEAAGyTaXGQQIaRiGa68989Iv/VJ/8ed/vr+/v7t70dke+vCHv8EbvfHjHvcPf/B7v3/u3LnadRFx8003Hj92bJqmiIIBABsJQAgZg7jMAAJAAAJJxuY52CDACBuBAQyugADxbAIwBkBcZgyAAGGeyVHK3v7+/t7+bDabWmttGmez7Z0dSCMJW4AEFvczAoNns26aEihdAJlurUnYYNu2DUiSABBCfT+fppEgQpi0My1JkiSDxQPZjlBEaa31fZUEatNkDCAADGAbc4XtkEqt49i6rouQ7Ta1tBUCSbJtyLSdmdkyW8t0AmAASQhjWzJgY64wYFsSz6RaZFuSARQRtu2UlC0REdGmREgyNggQdoLAtiNiGMZbb33GYmPz4u7FKkXo8OjohhtuTHywf9DVulqtWmsbG/Nbbrk50yAEwjbiMgFgsCJa+tZbbxvHsZ/NHnzLTXfccfuf/8Vfllpt7Oz72Z//xV++2Zu+2UMe+pBhvc5sXa3bW5vG4gqBwDYAAgQ2RkiybQNIkmitnTxx4uSJ40CEQDallKk1iWztmmvOKBRRS0Q60+nmzMYVQhZgLIQAABuJV36VVwa/zMu8dAmN46gIYfNMMgiJNk0njh+/cOHChQvnt7e3pnG4dHG36+qFC+dD0XXl3Nn7opRjO9vTNEoS2CBhC4n7GQQYg0DIKAQCcYUALMCSsMUz2a61nD59entnB3tne3sY1sePH9/YWNTaKcIgMACSAIGRsTCXCZtny2x93z/kIQ8+2N8rpWZLACFAMuZ+IRkBYEBg7icuMyad4Jd/+ZeNiL/5m78BVqvVffed/fmf+7n9/T3jdIa45cEPesxjHj0MI5IEBhAYg0BgQMLmWWywMc/JPIsRgACwBEgYEKo2tm1HhG0MAsAgwEKAeU7miqlNp0+fvvbaaw3ZpogAt5aAACQhAQLbBmzjdDbE7bfffvLU6Vk/372031qrtWxubGS2EoDBgG0AA9guJe697+ypU6cy2+6Fi+nsu25razttnsXYzpa2nZZYrlbrYTx9+sze3qVpHNPsbG8KDE4bgwEJCZCd2OthOLx4dM111x/s769X62kaF/P5YrFwJlHAtu0EbBvszEyDjSQwtoV4vmQDYBAg8N7eoURmq10vxTBOpSikcRwWi0VEHB0tNzc3M9MAyBgLQNzPtsRyuYpScpoOx7Hr+2EYh2HdMi/tXozQaj30/azUIgU0YyzJCAwCzGVSABFKJ3i1OhqGtU06lS0zQSAbpGzZMjPdARI2CBCAuUziMtsIIQMgnslYQgAoMzMTkKK1LLVkJsiAmaapCRAYc4VlIQRGiAewE7OzvTlNE+DMtBEgAcYABgFOjzkcP7ZzaW9vb/dS1/d93ymi72bjuL5w4eJ8PtvZOdZaCwkwloQxsjGYy4RBgABjpR0YjAABNhICwFg8kxTZcjabPfrRj7ItKdMbGxsnT53KbCCgtQZCxjyThBGXGYR5IEkyfsiDHoSYWpMQAhvAAAYBGLARL5wU2K21l3nZl54v5n/yR3+8s7MzjONtz3hG7WqtVfilX/olH3TLg9rUwIANIGQuM4grDAgQNkIS4n6yDSAAm5AQxjwXAwAVkARymucgMGAAhIzBgAEhSQqhdJumBCG1lgAoJESmASSwMQKMbdv2rJ99zud+/od+6Ie9zMu8zBOf+KTz5+7b3Nx8rdd6zfVqpBQQhJAkwEIgkZlf/3Vf92Ef/mE7Ozt//w9PuHDh3EMe/KCXfZmXWa3XjmJAAtuZTme2Nm1vbf727/zuH/zhn3zBF37B7bffcWl39/yFC6/7uq8zm/VuTUIIhAGBcLZpWsxnT3rSE3/8J372C77oC++660lPf/rTL17cfdmXealHPOLh6/XKLrYBEADhnDKdmYoAbC6TwCCBQYQQV1gCsI2ptVy4ePGuu++ttSxXy0u7l06dOr2zs/3Upz5le+cY5GK+ce2119x6660v89IvLWFbCBBCAgwgENB13Uu8xIuls5bSWrPp+7611tr0kAc/yM6IkGJqrU1Nko0ECIyMhbjCNkjSQx/6EGfaOY7TDTfe+I4PfzjPJIi3eMu3IqdxHAE7M1trKYUxgLhC4plsIQmDDRgwdpogIjKddkir9Rq7RFHEarWstZPkzHEaa619X20EiCuEANuAEM9iEOMwPPmJT3rwQx9SSpGEAHE/ARIGgRCyffzYsfUwrNfrw4PDP/mzP3ulV3zF2aw/fvz4rO9bpiQkjDAGgQ0ANgAgADAAssCWjW0wSBLYNpJ4DpIk7MyWSBEBZKYTSEklomWCkDFItgEQgMwVBnE/41wPU+36GkUR4ziGJGGbKwwCQFwhZO5nnkkAQhaZGaFrr7lmNlvUru7vHz7ikQ9/0pOevLOzc7RcHj9+fDbrh/VaEYAkIUAAArARz2TACAAcCgRgW2AhACQMYEBgzBW2MWCoPJuQMVcYiysMGDD3MwaQkATYBmMBkiSBAUm2MTYYjG1jIGo1+sqv+IrFYgPnox/9yNXq5q6WaRwVAZaEQGBsQqEQdig+8iM/YnNzo4Re5qVfcj0M81k/TZMUESqlCAtFRK1VEVHKcrV6pVd8hZd5mZce1kcPe9hDDw+Pai3z+RwshW07bYElwOlUaBinhz38ER/10R+Rbbrmmmuvueaa1tp83mc6SpUkybbtTLds4zSNw9CmSRHZGmAADBIAArAx9zMAEpDOra3Na6853XcdCknG81m/s72piKlNWCXiQQ+6xbYkJACDuJ/BkgCbYRgkpnEEImK5XEoCT1MTGAOSACFJYAAEQraRANmWsD2s1yCJUso0teHSJZAkwOBMICIkgQEkAAsAgUA8i4RlDEjYABggMyPi4sWL586dG4ZhtVrXWjY2No8fP3bH7bdvbm2N49SmaRjWx44de/SjHzlODQUgAAwYQBLGWMg2EIp03nn3XQ97+MMAmwADAmMhwIBtJHFZy+y6vu97p1/tVV5lZ2cHgW0TEQDGAiQBSEIAEs9mAMRlBgMCITAAkngejohpmu6773wtxXZELDY21ushorTWxmHo+/7Y8R2nDRJgrrABBCBkGcBGhHS4XP/N3/ztS77kS//O7/z2mWuuueeeux/+sIe91Eu95HK5DAWAeE5CyJjLJDBXCGOBkM1sNnvVV3+VrusOD48edMvNN9xw/cZiMU7T5sZGm6aIAJAAgwABYJ6DwNhIEgIwADKWDIC4zFxmnkUI2QBQAUACDCCEjCUuE89kCyEAA0jYzsyIUmtxOjMlGVprYBAYcYWEBNCmViIMQ8vFxiLbtF6PG4vF5sbCdssE2bSWIZCkyMxhWEcEgDm2sz21qU1tPp9tbm6kPU5TRKQ9DmPMOuOIYklRIt2cs8VisbGxWi4lbW8tQNM4SMpM4XEcI8IgRaYhJBJKqcd25sujw62tDTsxQGaCMj1Nk8GZxrbTRqEoCtVaEQJAgEGAAGSwAWQASUiyqaWeOXPGTkASkC2PHz8OSDJgR0RrzVgWYIwtCRCX2UhAKWFnRAFAEjgNERKyIC0B2CCwADCXSQDGEghhCMlYNgoViiQkSUBr03w2m9o0DpNCICEAzDMZDICNZCEwAAJkLLAQatO0tbnR99d3XVdKbZmhCHHq5MlxmqIUModhXbuutZQkgQ1CyBiEAAQGAUgSCpVHPvIRUYozJRkLsC2EAARIPJsk204bjh0/1lrDSEI8i4xlWxI2AQAGAIEtxP0kSZIAYyEAbIMQIACMQRHL5fpv/+4frr/u2mzt1KlT09TuuPPOnWPHjw4PDw4Oju1snzj54lObFAKEDGCEjQAw5jKDjCJaGpWz584O43B4cNBaMw9kEAA2EoBt8QIIQIhMb25uHDu2kyZC69X6sY95tDOjlHGccEoyCBkEiGcSGAwSGAAJgw3GCBAG8ZzEcxA2AgQAFQDbFkJIsgGBeSZLshVgDEggrojQ/v7BhQsXa63z+ay1VqIcP3EMAAMYQpIMwMbGxuHR0TAONoBthIwBkKQIAVKmtzY3nBZsbCwODg4jwlhgEyEQQghJYNs4M7u6yNZKKbWU/b09SZmZmbYFtg0SEQECJNWuW8wXtmuti8Xi4PBQwmljDGCbyxQREsh4Npv1Xdcynba5zAokKSRkLjMABhkESIDBAjDIBjCephEEgAFJ2SxhA5aUmSDuJ4lnkw1YYHu9WvezfhyHvp8jsk2lVDmNSikGCqvlkaDrOtsAiOckADAGwAYMON11fWYCq9Xy/PnzXdc97alPvfGmm26+6eapTSEuE5fZBmwwSGCDQBJX2BgkIcCodl3tOkBSKQWwAc/mMyHwbD7LtJ2SAJCxLGOEkcAYMJYCSGc/6x/84AePwxSlpi2wLUkGgQGMQRIPJCGptSYBAjAIAIEBSQLznOyUJJ5FYNtg7mcDCGwjcT+JNk1bWxuv/3qvk5mSIort02fOABIRMU1Ta6kQl9mWSCMhgXkmyVgSpmXbWCxe5qVfytne8i3eou+7cRiQ1ut1RAAgjAGQEBhxhUECAEm2ASGDDdBaa62B0ilYr9eSPI4RIclGgCTMcxEANgJABkBgAANIADYSQsbG4jKDACPuB1ABEIAA2eaZBGAQtgEDCGMMGGxLWq1Wl/YuzWbzcRqH9bq1aWt7s6td2oCEsDFgu+9ns9nMNgAC85wkcZlQy8xsoI2NxcbGBhiwDRIABjAIGwwgnEYC72xv2QYwgLEAZJAAMABCUmbabm3a2JjbcwCQwJhnMc8k2+DWDEo3287MTDujFhvbGAnAIK6wjY0QCAECAWBAEgDifpKAEEg2EjYABiEwAJJsS9hgj+Pw13/7913X1a5rre3u7s76Hqi1vvRLv/Tf/f1fRcS5c+evvebMNI6PfMTDjx0/Nk2TAAECYxAYJAAE2O67/p5773v8E55wdHT4mq/5GovZ7OLFi5tbWzvHjr/iK7/qW7/VW3/zt3zL/qULlmQbwNxPYACEAIwFWIAAG4MkSS6lhjQOAziiRCkRZRrHdGttEiAJSeIKIQuQhLGwkYQwgDEKZebuhV1DqXVjY8NOAPNMAiPJ5gobBBhhjATYloR4FoMAG/E8wrbE/YwBmSsESAACEcbYIEkGsG1AElJmSggQtltrEWEbsBEgDBIYgwQGwBYgEEBEzOczQTrX6yFCIDAPIAHCWAIbBAgAG2EDgAzYPJskAtlESIjABiMwYIv7CRA24lkMGElg7icBYASAMQBgIZC5zEaSZQCoACAEGAtJ2IBByCCezcbcT1Jr7dSpk9dee43tzIwI222awBI2NmAMGMhMnslcYRBCBjAgMNiAJYFbawAIEICTK2wQYJ5FEmB7mhoABoFBAJjLBAYBArANYFo2BEgiEwHCBjDGADZ2pu10y5ymqWVrraXtdGRmNsSzyEIGQJKFeDbzADYCZJtnkgVG2IAtY9nGGCSQJDD3S7ur3Uu+5EscHB6eOHb84GA/b7kJM7aWmXY+/GEPzcwbr79ue3t7nFo3620LGQuBQZYFCGwkMEhSy7a1tfmoRz0iW4bUMo8fP7FcLg/397/+a7/24Y94eBvXoQAhBDbPIoEAhCwDOJGwbAPYNuBa6+7updtuu21jsQBamw4PVxsbG11XJG686aaIYrAkzLMIjLGQjAWALQkwDsVyufyFX/7lhzz4YRd3L958800v+RIvvlotQ4HAPJMRlxmJywTIgEFIGAQIDIjLBADGPIuwAYN4APNMBoSMjSQwSBhjAIMEBkib+yWAwTgAC4HNswgZDOI5GATYaQMQEhbiWWyDBAYBNkI8k22JyyxkbAMIjEHimSRACEBgzLOJB5BkDCAAGQtsFAAGYVsIcZmNBELIAAgshGxbAhBUALCQkQBs7mchYx5AyBjAXKbMtl4PEqDWGkiSEVgCQDLO1kBpCwDbYCHEMxmEjW1JAmPbAEiSJAAMAsA2EpeJy2xLPJNlLDDPJoQMkrABsBE2gASI+xkEgAHAgNPGZGbLzMxpmjIz05JqrZhSS9f1GIlMJJBBYDBgDCAwIBAYECo1bIUw5lkkTCnFdmtTa0aqpWAMrTVbIDAghAA2NzZ2trdba6dOncQgohRJ4zhuLOa2Q8q0QpmZLRFCIIEBgwAhgwEwkJnz+Wxz8zpgmiab+Xw+n8+x3/4d376N42q5VAgAgUGABGCeyRiDQBLPJEmSbUxmAhsbGxubm86cxnE+m4/TMJ/P5hsbEQWBjTFIPIuxLARGBjDCAJJsz2bzhzzkoX1XH/PoR54/fy6zSeIyCxkEgAEM2EIGDCDEZcbcT4DAIABJiGcyFgIMBgEYgzAGwBgwCNs8kwBsC4G5QmAALDAgAAzIGAADIACEAGTMMwkZsJHAAEjYXGEQkrjCAIhnMgiJZzHmAYQAAzaXiWeThAEbAcaSALB5TkJcYRDPh8QzCRnbljAGJGwAoAI2GMRlBkA2EjaIZ7EBQAKwzWWK4JksBMi2AAFghEoppZSwwSCQAIyEDRjAAAiMQcIGEPcTDyAwBkASV9hI2ICFjAEQDyTEZcYASNhI2EhgDIBtiTS2wTaAse1srbU2jqNNZpMULrUUSaUEEs8kAGwjAEkCMAiwDSBh2Lu0bzxNE3baihJimqaNjY39/YNSymw+62qXzosXLsxms1rrsZ1tO7GFAMtChtZaaxMPNE02khIjNRsgAZDEFbaxkLjMAAgQIIydHnMEJEmyDQb2L+1JRAQGAQYJAxiQbRsJAAFgLMACEEiyobXc2dk5efJka822hEARmcZu2bCFuMwgGwmQBGAQV4hns11KvMorv+I0TcCDH/ygcRwlYQAB4gqDQOIKAWAuMwIkLjMYZBDPxYAgsXgmW0gIAISEuEw8H0I8B4UAO4y5TBhkgQUIzP2EjAWSANtgLpOwkQyBzbMIGyFII4lnsRHPZCOBMQgAAQLAABgEyCDuZxAgGfNMNhJXCBnbSICMBWAAEEJgEICQbWQQICGUtgQIDABVEpj7GQRgcZkMAsCAJGxjg23xQAIjALAECGwjAQZsA6VUYJomRSmljuNYa3U221IInA2IUls2wFgIBAaDwCDAAALANs9iCwwY80zmmYSNAIyQMSDbINuALYxlAJyJbZvWmu3MzMzWmnE6I8K2VJAiFBElwgYbJK4wSDLPxTxLRDk6Ovrrv/mbU6dPdV1XSlkuV/P5fLVarYf1vJ/deeedi42NU6dP9f1sPpsN42TUDg9PnjwxtQYgg7ifwAgAJACQZAAEIIywwBgkMIDARuJ+xgIDFkgyCAsAg0CQpQQIjAAA21whISRJBmRZxgC2Q7KwDbYthMjWVtMkARgwgARIwpKMQSCDhEE8B4N4FhswsF6vJYEyRyQMgAGBERiJZ7IACxkJYyQZAAEIQAAYG4n7CTBgLInLBMIGI8DGQhjE8yFsZAAE2AgECIy5wrIMgAEQIABjLLB5JgECYwkQGAFgEAIkMJYEgAEQwkhcJoFBiMsM4goDGHGFBMYABoQwxgghGwnAIDC2ETaSLQCBJGEM4jKDMEYAxhgkg8RlBgOGCkaSeE5ClmQbDOKZzBVGEiAAbAkj7iewsZBkQFKmay333Xf2D//wj06cOI7JbIqyvbNzdHi0Wq9OnTr1yIc/7Pbbbztz5ozt++47++CHPHixWGQmCIElMAZJGMsgASBsSzIGsMCSjAGQjDFIWMI2QghASAZhWwZhJIHtTNvZ0pl25tSm1to4jrZBpRQbG6SIKBFSAAJjMEJgC4wk4TTmmQQgMM7Mvu9f4RVePrMhhZRpQWYaSim33HKzQqWUo8Oj7e1tRZQI2601AQIEYBBCxgiBzWUCBOZZJEDcz0KAsSQAgwDEsxgwgJC5wkZAYFsWgMCABAACZJ7JWMYAkgAjbIkrLACJkABDIAW2bSQAGWOQQWAsxLMIwIAthAAEBkyEsAwgAWCQwEYABgEIbJAAEAAWgATGILAtJDCWBOYBBEjGIIMAIwDxAOKZDAKDwCDAaQMYIZM2EpcJUpIxKQnbILAEEoAAAxgE2DbIMkiAMYAlAWmDhRC2kSRsy0KyAYTNZRYABtmAAYxBEhhsC5CwEeIyIZ7FIMQzSWAJIduIy8SzCQzGWBJXiMvMZTYgAKiAAAMghMBgkG0QgA0gAPNMkhAGQOIBBGAj2QYiMCBlenNz42Vf9qW7rs/WJPWz+Xw+Pzg8qLXO+r529cSJk33fRymnTp2qtQKSMDaAMQC2BTIIQGAA2wAIQOJZbIOxwJYEMsayBGAjbAHCANh22pnOdMtm01q2ltkyIsZxEm4GqXYVCIVCJk10XQ2FbdsIAAHYRhgQSAAIEMKO0Hw+Q8KAAduSAIMQtvFiPm8tAdsSNpIwiGcyxhKAjcRlBgwYBCDJNhiwLckAxkKAucKAAGSeSWAhAzZCAFgIgcE8k8BcZmxbyLJtIYSxAEhAAEK2hRA2ElfYliQAIwxC3E8IAZKwLQQoAGEj2QYkIQCEuJ8QAJIM4JAQNkCEAGwukwCBAYSxQIBBCAHCPIAMQjyAAZlnE5gHkMCA7a7ruq4HwAA2YACDeBYjgQRItJbr9RoLAQZKLRjEsxkEgDFIAMYCEJdlJjYSBiglJAG2eS4GITDPJMkGjGmZQgYZg8AGkAwCQGDARgKDkJAAMJcZBCAwkgAQAAZjEIDEZQgqyMZYCBAYgcEgbAQCg7G4n82z2CCexQAII4lnknBmzufzW265BUCSAsiW29tbdmZrmXnNtdfYlrS9vd1a2gYQMpeJKySwDSCBZUkYADDGQgphMAABRsI2SBIGQGAAhG1JThvbZMtMp23T2jS1zExJGFBmiyIJbCQAAxIBwgZAGAQGmWcyCIwBkMBCxplp85wMBgFgIDNBAoQNAoTEFeIy21xhJEBgAMQVNs8iCQQGJBuBEGBAABiBATBgDCAAAzYCzDMJDLaReCZhGxDifjYSEhgbYwDZ5jKBbEuaWjoTkGQAY4O4nwBhnkWAwHYpJSRj7tda49kkMACSwDyTASMBGIMADKGQEEJgEBhkLJ5FAAgAc5kAY55TGokHMGAc0rlz586ev1BKtTNbtmm0EwRGCkWUogjA6cxmp51bm9u33HKzMSCptbZ/cCjJtm2uMMZCCEkgMIBtLGTY3Njouuo0WNLh4dE4jkg8kA0gAeKZbAMIoYiyubnACBAYY5AAC3GZJdlIxiAwCAzYGPFMFjLifuZZxLMZkKQKAJIAjGUQCAxGYBAIkDDCFkggACQBGIME2JaEuMJYggRgam0YxpAUShtju5QQSqeN0oCkaZzSrrUATrdM7heS7VKKRLZcD0MokCRJysxSopbq9HockASAbTsjou9ntsdpwhZKG0kYVGu1aZlpt9aytak12601INNpOzOzlVKi61tLzDAMtVZVlSgRilBmGguBESAwBgkbhA1CSFwmYwwgQALzTLKRuEw8kwCwjQDZtiQwtgEoEYpIG3OZAYRtSYBthAzINgIkyTYYwIBBFmBAyAAGQAAYg0ACsJF4JgGQNrYNQraNJQkZAwjAxuYKSRiBwTa41Lq/f3Dhwm7f19ZaRESEpIgC2I4QpjmdBmODjAFQRAzDcMP11wnSWUo5d/5Cm6au65BCgRAYMm2nbUlAKAwRAQCZLVsDkFrLa86cxgYjcYVBBmwQmGcyiMuMEQhjAAEgwCAQtoWAzNw8dvLbvv07PuGTPuXUqZOtNaBlTlPL1ris1lJrLVEQmTlOE/bupb3Xea3X/OVf+vn1eogopZRLewfDer21vdnS2AKDhG0pbEeEFIKWzZnOjFqG9bi3f3DNmdOZAxKwu7u7tbUpgRQRQgYhAIFBshPbtp1AKeXSpb1Z39Wus1MIAPE8nDaWxBXCxgLAXGFbPJOQMQYhsEHCgBEIsKEiJAAM4jKDACxkxLMZY8DYPJONJDCXCQE2EmAbhDE2Eulaa62ltSxg3KYJO0pko9Zaag0pbbe2HtZtcq1dc4tQKQWQAmkah8wsJYZhwMzmvaJGCfB6tc6cqDUzjeezWZtaOkvUkIb1YBvIzL7rwcUYJMZxsg1kpgFjsBmHoaVtIwGSolRFTK0JbJCMMzPVIGqt3E8CBOYKG3GZsDG2BQgbIWSeSWAQGMm2xLMYhAGJZzGWxGWllAsXLi5X62vOnI5QZtqOiGlspZTMFpIk2wrZ1FqcNh7GsZYSkm0EyEa2pHRyhQCwEVjIALYBEM9iAInnJAkwBjCIKySEDTYSAEaSbexxHE6fOrGzsz2OIwAOBSq160qJ1WpdSpQoLdu4XiOVEsYY27XWO++6exzHvu9AoGztxInjfd8LFKXU0qbMbEBm1loNQi1bV2vLlJQtwZkpEYp777uvtamUYiTuJzAIACMBAgMYBIC4TAAIZJDAXCEEGIMAFC2ztTZNkyJCsbHo+n4mUUodhmEch3GcbCsUUpTS913takQVo52tuU3DfNZvLhaGiJBibNM0tq6rTnd9NwwDJrPNSicJqLWuVutLly61NtmWAM3n8+PHjzuNnOlSSpSaLdPGBo/jGKULhSBKycxSYrVapxMAYUsyYBCYZzKWhbjCRohnMsYAkrifMYC4TAgAcYVtAFwxzyQBkm3AAOIKIWNsMAIjEBgQEmBAANgAksA2z2QkJBAlYrlc3XXX3Rubi2vPXCOFQigkl4iI8vjHPf706VPXXHNmPaxBCBAQUf7u7x+3vbXx0Ic8eEwrpIhaOyDtJz/hCcM0PuLhD5/1nV2kkLKr9dLupfvOnt3Y2BiH4SEPfpAEThRCAhQKbGMkANs2BgMmnYoiN6BlllKkqLVM4xQSECEpjLFtAxFRSkFCkCBzmUHifpaEABCAABkAgQEbyYAwAoQNAJJBYACDADAgRFe7S5cuTa2FdOHixf29vac+7Wk33Xjj0XLZ9/0tN9984cKFc2fPPujBD37iE59Ya3dsZ2e9XpVaNze3ptbsfMyjH+WWIAAZZJAEYDAIy0LG4jIhwGADCtlgwGBAGGwQYJ7NWBYARmBxmXk2G2ittZY2tktw731nn/a0W9PtYH//5MlTfddf3N3dObZz6dLuy7z0S21v79gpZDxNE7ZCkgKVWmutQGtTiXL23nuf8rSn1VIODw/n88WjH/3oxz3ucVJEicODg77vl8uj2nWzvnvwgx98w/XXt7SFeSYZAAEYJGxCIAxgELLA5nkYmcuEDGCEMeBMILNFqJTaWmLWw+raax/0dm/7drc+49bVanXDDTc89SlP+YM//MPMrFEUESVqlIiCZIyBkJR2pqc2zfrZPzz+cc94xjMWG5ullOXRUd/34zi0lrWWhzzoloc+7GHjOCk8jkO25mzYBiHAqDkX88Xf/f0/POmJTzxx8mSJODjYf/SjHvW7v/e7N9908zCMUeIRD3/Egx/8oHEckTMTBAYjYSQQAOIKA4hnsoUsJJ6DbBDiuYj7CQwgAWBTbdvYSIBtQGAQtkHIAoMACYxBAEJgsJGQsDFIAgABksRlwkgy3H333Y961CPuuuueS3v7J0+eGMcRYaekx/3D399000333nfffD7f3NwYxxFFhGfz+dOe9vRLe5fuu+/ejY356VNnWmaUWirzxeJxj3v8Dddfa/ibv/6bV3+NV2u5kgQSjON4zenT11533W233d7SSAZhwCDbXCakkMIkkJnTNLXWsmXaihAg2Qa3acpskpCcjrBCJUqpJZBtMJcZwDJI2CCeh21JSGCMQQID2EgAtiUQIDAABmEjnsW27dZa13e7l/a6rp46eXJnZ/vEyRO11HEc+75bLBaLxfzEieMbi8VjH/tYSfP5rLVMG5j13ThOmYnEZUIAmCsEBhDCSAAYScaIy2QbhIwBSYCwwDaSwLYlAUKJDQgMwraQBABSREQppUTIBofE8ePHHvrQh0BmenNzs5ayWg+tTTfdeP3m5mYpYQvbtrAEBiQhFBG11lIK9s7O1sMf9rCIgui6bjGfP+IRD9/a3r60e6nvu9Vymc5aK3hzc0tSKVFKqaWCbAuMMAIBBkBgcYUNsox4JmOMQGBJCFnmMiHAYAzjMAzjMGY2Luu67vz5cz/yoz+CfbQ8ms3mR8slUEo4nTjT62E9rNc5DXZGlFq7rp/1XdfNeg3Y7frrrr322mu3trYODg5ns34Y1tM4lqgWi8VcUiklQrXWKAVkLEBIClBomsaHPvhB1193bWaG1LJtbW69+Zu/haRSynq93ljMM1uEiiQJEAJzhUEANoCEBMYCAwKQsBGYZxGXGQCBAZBtEIABg2wMANW2hHgmIWOuEBgwBgHCRgaMsQU2GElgG0ACDAAIMJaEMcK2xLHjx+6++960N7c2W2tg0pmepvHUyZN33nV33/cbmxutNQPY9jSOJ44fu/POO7e3t3Z2dlprSDjtlq1tbW3dc9+5aRqvv/7aYT20acpa7AQitHtpL0rd29+/9tprWmuSuMK2wIAkSQILJISxnZmtIVBIKqXYmS2n1mxqrQACXErtuy5KCSgRgNM8kwwCxP0MGAMggQ2yACEMIDDPIskgAPNMAiMBIAkDGNza2HfdjTdcl+lSS6llY7FIW8jOTJdS5/NFZjuzWAC2pZAAMnNjQ601DAKwLQljLAmDADDGQgDCBkBcZgAMSBJXCCEB2ClJEoCxkBD3M5KMZXGFJMVqtSolxmE0KTtKPX58B0kKZwJbXc1M7GEYhmEEZzbsiFgPA8JOp5u8Wq/iIObzeTqlOHb8GEZSOsdxvbm1MU3j8RM7Qjs7OwhMOnOa9g8OIiKiTNMUIcCAjIUAEJjLjAEQ9xMAIAthYYxtI57FGCMhCbpSCmAUEYDxarXe27tdUinRclegELYUJUqUKKX2/ax0sxibhJ2ZeXh4GFGmaWxt6md9qEzjuLExt5nP58znQEi29/f3sUut62EgotTO44gUUYZh2Nvfk8iWiuhKUAuoj35qbbGxQdrOurnRpml/f0+KEmUYBoUQtsRlwiAj8UAyAAKDbBAghAxgEIB4JvFM4jKBkcAAIKiAzTMZy0LGYIzEAxiBBQYsQAACjAEQGCQwAAJzhQWAMn361OnzFy7sbGzP+361XklCRASK666/XqXsbG+XiGG9Apxy5jSNJ06ceMxjHzPv+42NzdVqiWnTNAzDOI433XTDfffVcRyvv+661WoFdhqTzmPHjg9jOzg8PHn8uCTbSAJJCgGYy5zZAGNJUkQpssPOdJsa2MjOUEgChvWgUN/3UQoGKBG2JUniAQRYAgTmMmNjwEgyNojnZEncTzyTbUnCBonLLAkDCIwyU5JEm5pEM88iYXuaUmKaJp4pwTyTJJ5FEoAQwiCuMJYkZAwg81wMAmMMAmMAQBLPIgQGQGAwlhGyLCRwy82Nxf5BW60HbGNst3E9jGAUArBt2yCFJIHAkqaWJ06c7Gpnp3FrbWd7a70eVquVJAM22LYxxjbSOIwSQkhIAklAa5M9bG1tRoTTAAawLYS4QhLPZtsSlwlASAYJARiDQJIxYFNKGVaH7/zO7/xar/26tZSWzXZmAgZhAORMG4UiIiIk2d7Z3p6mUZKd4zjMZ93hOB4dHhBgpqlxmbHABkBgJC5TSzu9s7XlNBJge3t7exgHIbBbjjwnISTJAAaER6bNra2uVqfBIAQgQDyTbSTxbALzQAIhrjAIDOK5CNlGgACgSgIbCyEAg40EAgQGgQEbCYyQkG0wlxkAgTG2JMBOAOG0MS7ANI3TNO1sb2e2o6Mj467rEJKmaZpaO37sWGvT0dFRZtZabBAt8/DocHtr0+nVapXpUsIQEeM47l3aPba9HaWsVivbEQFWqA1NiuuuPeO07dVqaSNjsD2OoyQbAHtqresindlsQBIoAqekTE9tMi5hgSFKRITBtoqA1lpI2JIigssECNvIsiwDIMAYwFxhGxACjIUwBgFgLAQIAQbANpdFhI1tEJfZ5jKby8RlNoCEDYjLBBZYYAQGsJHAGAsZwEIANmAbAWAjARhjQAiBMQbEFbYtBCAENoBlQBKXCSFsYwBwOiPi5InjGMQzGQMYwCDuJwnABiEDGGdLkASwsdjc3NyyLSHCGADxLAIDxiCeD7tlgiQw5pkMYNsGxLMIYRBgACNJAhACJADbAFgINE3TmdOnbrj+ettgAASAAYENgHgWSUBmrteDBAjTdf2p0wvbIAHiWWwDIAkA2zyTUNrNTcIms21ubmxp0zYIkABsg8CAwDwfmYmQATAGCWNZAJJ4NttIEgIQBgE2FgE2YAtAgEFcYfMsxhhXAASAJdkGSzwnYwwSGACRmaVErTVbAohnM4hnMggpwFL0fQ+WlJmlBB2gkBClFBts41J6IcQVUk0bwBAoBAjZWUqZzWYABjGbzXgmC2qtNmBCglmtkiScLvOZbSkQGKC3bduemFqmMw1CpQS41loz0y6lZKZwRCm1SBKKElFKLSVCXa1aKTMxYCwALITACAGl1FqKbUk8gJAxDyAAbBCAAATmmWTM/YQQtgWAAYMABAZAiAcwgAUgY54fGQsBYMBIPC8DIDD3s0uEQgYkSRgEYIQMkrANRAgCEELmmQQYMhPAAALznMwz2RYAxlgCBEQIAAEGp8EGkxgEmGcxAAaBbSMEIIO4rEQACAADYSxAKhEBmGcyCACDABCYiJBASMIYI4SQABvhcRyH9YAABCDAGMQzGQSAAQAjoQhQRGCMsyUCnDYIAAMYAAkQgI3AAAiQACSwMpPLJNkGQAAYjEEIzDNJwjYIARZCyAIQgBAygAEhQ0g8kyUiwjZXCEAAQmAQ4n4GgXgmAVRJYBCQmZIkYWwDyFwhyQYQWEBX67lzF2bzWWYKGfNABiEAbAM2gDEPEApJCEw6eQAhxBU2YJ6LAYxBYC4TQmAAZCwkQGAMYCPxbJLEZZkNsN1atmmaWptac6ZtQ1EYEFKUEMhOG4WESgSi62pEUWgax2tOnzIWQgCYKyTZLqVc2tuttWQ2AFsSyFjIGAkAC/ECCUBgA4B5JvFstgFJgJAxSMIG8Uw29xOY5yEwgJAxCMxzEBgAgUEIDLYiVsvV9taWDYAAYYMlGWyHYmrt4OAoJARgg8CAeSZJALYBDALAIK4wyCAAGwESAAZsJC6ThG0AsJGQhLEABIANAAZAgABhwIABEM9kEBiQYrVeb/e9bcyzCQzCdilltX8wjFNmA0lgLASAbSGwucxcJmSDANuAwOaZDABCtt0SAeKZDIDAPJABjCVxhQFbArAxCAAElsQVxiABGAQYYy4TMkgAGMAASDyLbUAStgEQMgYJAOMCR8tliZAEgDEIA0YACBljECAwzwSgu++8/fjx461NkjAIQMiY+9kIECAA21gRw3pIWwAYwBgjYSRAABiwucyAeSYREhIAtgFj7icJAyAwVxjAPJvAPDcBYIEBJEBgwCAAAdgGScaYyyRAgEIy5jJJYEDIAAgbbACcaQlJBuxSSq2dnZJsJAAbAQKQdGlvb1gPtRSDQWAACxnAQlwhiWcyCAzi+TBgA0jYCBCALckgCQCDuEw8HwbAGAMIECAwBiFk21gIMM8kACSZy2zAMJ/NNjYWTiMMGAHiAZSZwzgKEFhgAIF5JoExV5grDAIQMgZAgMAgns0YCwGIZ7NBiOchAWDMs0nYAAIDGMBCBvFspZauVqcRz0PgiNi9tLder0uEbcAYBEgCwDYYZJC4TAKwkQBskLG4TAIkbK6QhG0ABEgANmAABMYgbJ6TARD3kwBsJMC2AAHi2WzzbJJ4bgLzLAZhI0AAgA1CAALDiRPHQ2EbWQiwLYkHspAxiCtKKecvXKy2ucxYEgg7sQRgIxCXGbCEhRD2fD4DbAshsEHGAsA8mxAYMAILjLhMgAAwyFhgEDLGAAgBljEggTEgCQDbCCEw9zMIABsASTwXA5grLGTMsxkLMCBkEAYMmPtJ4tmEjLFtpxAgybaExBVCto8fOyYJwCAAbCSeySBAyBiDeBYbARgJc5m5QmAhbAshAMwziQcSmAcwCMwzCQADBkA8k3kmgblCwhgkns0ggMx0GgGIy8SzSLIpJTbqHAMgAAxgECAA29xPCDAGhABkGyFjSTyQbZAA2eZ+QlxmLAAZBIB5NgkAm2eRMGCDwCDJtsAgZNtpxLMZxGUGMvP4sR0AAwYMgMAACIGRANtCiGczYAMgAcIgMAjABpDMFeYKgwBkLAnANpLAIJ7FRlwmDNhCiGcyCACMhQCDADAW2FwhQBgAIWwECIyxEJcZC5AADAJbUsvElgABGCGMMUIWAhlAXGEDCCpYAoRBgA0CDEICgwCMhQwYJHC2RABpiysMJAACAzKWsDEIDAaQMBJG2ACAMRZgGwQGQBgwBoElwEakJTCAsbGQucIAiMskbGOeTQAYwCCRtgBhG4GRsAEwBhlzhUFgwDYIQAg7AQSSABvJEvcTYBvRWuM/lEFgLCRknsUACAwgYYSRMOYKg4SNADCXCRmDwAAIAPNMAvMcJAAMEhhjQBICgwAkjATGQCaSMwELEJgrbCQMGNsg8UxJIjBCxgYJjDGQsgCDAGwDIDAYAAGSbQsZg5AFNgiMAZBwAiAwCAOZIAljIYwxYACMASSBMWAjnltrDQCBhYx5fiQBxhgABLYBA0IGY0AAIACbyywEGAMggcGkJNu2JWEbDAIDMuYBJDAWQtgAAsAASCYxlgRgTIJ4pgSEDJCSbIElANsgMCBkMCkJYwwIAQgAg0BgACEA8WwGQEgAQJXCBizJICMhyTbGQuIKIcBYElcIDEICACTZxkiAsIUMxpIwCFsSGEBgnkWAsCRjASCeTRaAAAECBGAQQhYyEgZA2AjABpAEGPNcJDAgCQxIAhCABMZCxgAIjBAYEEiysSwEILCQAcQVAgNgAAFI4tkMAjCAASGeH4N4bgaQwEgyxkjcTzyTAAAJACEEYFuSAHGFMAiMJIwljAQAAgAMEoBBXGEjIS4TQtzPWAgwgEFCxsKAAAkMgACwBCDJtiSBAYMAAQjANhIG8UzmmQxCEs8mG3GFBBZCPIsAEOJ+AgNCAALEFUIYxHMSNtggybYAgQEQACBJyBhkgyQAbCOEQNiAkAEsMAYESAgMIATmfkLINpIwCCEAgwAJQEAIwBJYAAhAXCEuEyDAYEIy5rJAxgBCiCuEEAZAQIABGSRAspAxIMlGEvcTAhBC3M9GAsAgIWMQz2QQAOKZDGAIxLOIZ7JtAMT9zBVCxmAMxgDmfrYBcYUlbCSksDG2LQEgEAYABIDBGBsAg7mfAATCPJMNBiOBjAGEbWwAFCCQBGDbGACBbDAIsACwbQPimQTCWMgAEs8iIwkhGZBlACQQ2AgkBAjM8yEM5jIhAQiEpJAAGxAIxBUSz0sgAGODLGOb+wkEAjAgMAAICwAJMCDEFeLZhEDiuQnbAMLmCkk8k0AgwLaNJABjAzIYA0ggBBgEgMEgALAtATIACAwgnkmSDBIGwAgQCCQQBgMYbAALy8YWmH+ZZBsMBoNAAIAQwtxPYO5n82wCCQQAAts2V8gANoAQAAaEjDEgIwADYGTuZ66wAWOMBIDAPJPEZZLAgBEABmxxhYWEAIHAYAAB2OZ+xjyQweZ+5goDIAQgBLK4QpIE5pkM5tnMZUJcYQBjACFAiOdhAMCBkQBxmbmfeSYbjHgWIRsLBBjE/WxAXCYESADYApAkAIsrJAkwiCsEGIRAAjBgEJcJgQ0gJATmWWwkJAAwGMwzCQOAwRKIZzKAQALbXGHbCAHCAEhYSBgMMrYNCIlnkQSAAduAkBAIJACBkZBAIKd5ANsgCTAYDALAIEmSeB5CGECSBEgABoNBCGwMIGww5tlkAGxsAwgsEA9knkUSSEjifgaBMBhsQAqJZxLiWcRzEoBAQgAIBLLFAwkBRoDBSAIjMAACsLENBgw2AgkJgZBAgLCxwWAA80xCPJMlbGwuM5hnMUggAAwANoAwCMQzWYDBGBASGAQChADxLMIYJAE2tgGQkIwAEAgJAIEAMFeY+wkMArAlEALzTJIBDLJkACwAcZltZGPMs5lnMUYCMAiJBzAIMLbtNAhkmyuMDQIBgEAIwBhjDCAwCIRtjDECg7nCAAaAamMDBgESV0hgMEiYKwwChIRN2hEChNIGC2WmBAZIW0LINmAACdIpAJyWMAgDIJ4pJdkJMhkoM6UAwIBtiUxHCAEgMOJ+BiHJNgYJQDwXG0BcJjAIcZmRAGwQz2anwY4SgJDTCWAQIGETIcA2YIPIzFAYI4FtwLYjBAKDbANgkJ0RyrQEIIwkyTgTQDLINmC7RElsG4lMJMAYZFsCrAiBMWAuMwjANgAGSdjiCgHmgcQVmSkFJAousw2CBDAWAgzYJkKA00g4JTmNBAmSAGwbgQ3GoQAyMyLAaYeUTiGMQWATIQPGAhkQwggsAIQwCDAGhABjDBIggQEwErYlGWMuE1hg7mcQVxhzhUGAELIxFmAECAwYIzAYBICQQYAFCAMgnsUGQIAAJIyxbINthwKBwE5bIdk2gCEUYNsChMFpiWYHMoClsG1byLYk24AxSJIAkAAA20I8gCSuEM+PMYAEgM0VAgFgbCQA25IAG0ACi2cxAOIKGwHiCoEBEKomEZK4QmAwzyQwiCtkjEHYtdau61erJWC7ltL1XWtNitZaRIBLrcMwCEopkiLKsF63bBsbG9MwIkKRzlJKy3Q6M2sttkMahrHrOttSzcz5fDZNk+0S0TIjAtzV7ujoEAmDQDybAGwDSGAAYyEQMsYSIIPAAAKQhLHMZcK2JIEjou/6qbWu1qPlMqR09rNekHYogHTWUtfDGuj7PtOSMnO+6MZhjAg7gZBay67v1us1qOtmwzjMZnNAUpumKNGmNp/VcZwUEkq7tSZFP+vsdNq2JEREWa1WfVejlGmcFDUiMlPCptaa2SJivV4b8Sw2CDBIAjDPJO5nAIN4LhsbG22aFLFerZEQtXatta7rbIMilJm2Q6q1W66WpdRuXsdxlKK11s0qICkzM5tAUYCIsK3QOIzgxWI+rAcUs77LNs1q31qWKMa2Q7Far4URAiyEQQIMYCFAgDEPZElgLAwCBAhbCIN4JhmDkHk2AyAQlwkZiwCbZzEIMAbxTOLZLGQAgzDIIAFgng9hQOD5fN6m1vf9crVKp6DUMu+6cRxtuq7aRGi1WpdSSsTUmhRA7bppGue1G8dREngcxlpr7bs2NZCz1a5mpqRpmrI1JB5ACPFs5pmEAVsSgEEgMAhsgyzEAxkknkUABiQADAKQQdgGhACMxAMILAkAdNcdt508eaJNDQkMAEIGMAYQWGAQAFBK2dvbe9rTn/GSL/FirbVaysWLF59x+x3XXHPNwcHhqZMnDw4PSym7u7s333zzNI5nz90nxf7+/qMe9ejjx4//1V/91bXXXtOmaX//YLGxWC1XJ06e7Lo6n83uu+++ruumcbjpppvuvvueKKW1PHHy5G233Xb9ddch9vb2t7a2jpZH2HfecccrvuIrZEuEjQSAARDPh4UAYxDPZCQZ8y8JxWq9fsYzbjt58uTd99z78i//skeHh10tT33a0zI9n83HqbU29X1/7tzZRz7yERFxzz33bm3vGO1sb9/6jFtvuummw4ODvu9aa8ujg8Vi8/bb73jJl3wxzNnzF26++eY77rhzmqZhGHe2N8+fP3/y5MmzZ8896MEPbq2lHWJjMbd9331na+1qrYqYxmEcx/39g8c8+hF33nX3weHyhhtuGMdxGIau1mEc5/P5Pffcu7Oztb+//+hHPXKaGiDxbAYB2EZghBAGGQABYBDPIukJT3ziyROnDo4OH/WIR6zXK4nd3b2dnZ2z5871fQ/s7e1vbGzUUo6Oju69956XfemXOjg8uvve+2644cblcnlsZ/vue+7p+34Yhr7vtre2pmlardbzxfzoaBlRDg/3b7zxxlnfP+O22x90yy3pvO++sxsbG3fddefGxsbR4dF8sVgsFocHBw996EOwAcSLyjybAAwYCcwzCQwCAyAwAAIDIACMQQIEgAEQGAAMGAAhwCAAbCQus0EGyRgAAeKFq7V78lOecvzY8aff+vQXf/EXn81mcl7cvXT3PffefPPNhnvvvberdb1ePeYxj75w/sLF3d3jx4+31ubzxX1nz11z5sw999x97bXXHB4eZpuuv+76i7uXLly8eN111y2XRxsbi/vuO7ux2Dg8PDx16uTx48emaZLE87AtiedhWwgAIWMQGADxLLYlCQw2EgAYZANIYBCAjQQgZAwIGfM8SinnL1wsH/dxH7NYLDItQAJsI55JIBAA4jJlerGY//3f/8OP/uiPv+qrvFKJWGxs/MVf/fX+/sE99977tKc97QlPfOKv/vIvz2az3/qt35pae8pTnnznXXdtbW494YmPf8TDHzau1z/zsz83jtPjH/cP995738lTp37t139juVoeHR1FlF/4xV88PDx88pOf9Iqv/Gq/8iu/fO7c+Sc84YnzxfxXfvXXjA8PD3/nd35HEd/2rd/2sIc99LbbnvHSL/VSwzhKEiCJ+4n7CbCRQAKDAONQAAgQYBBgwEjGQjyAQuth+N3f/f3lev0Xf/7nr/AKLz+u15ubGz/zcz//l3/5V835lKc+9dLe3mKx8Vd/9Zcv/VIvOQzrL/jCL2ktn/70pzfnz/z0T5dSf+xHf3R7e/uee+/9wR/4wfli8eSnPvklX+zFDw4On/CEJzzikY/+nd/57Zb5G7/+G3ffc+/h4eF6GO65597VavXUpz31KU95ynK1vvaaMyF9+Zd/5V1333P+/PmzZ8/+zV//zV133XXhwvmXeblX/L3f+73f+73f72p3++23/8Iv/MLB4eFv/fZvr1erc+fPrlbLn/vZn33N13xNbBAggUGAkbifJGMESAKBeSbxTKaW8gu/9Muz+eLJT37SS730Sw/rda3dn//5X5w4deonfuInl0fLv//7v7/1Gbfdd999T3j8E6Y23nHH7S//Mi/1J3/+509/+q17+3t/87d/W2r927/5m6c9/dZ77r23RLlw8cLupb1f+7Vf/6M//pPVaj2O4+Of8PgXf/EXH8bpR37oh17xFV/+4PDwsz7rszY2N/7oD/9oPpvtXrp0xx132H7CEx7/Ui/1km2akCRswIAkwFiI+xkDQlwhEABGQkKAQCCeSUIgAATi2QSAACSusJEAjEUIMICEAJDAIJC4wkhgSQACAQKwLUncz0YSAmXmYrHx27/9O/PF4hm3PmNn59iZ02ck/8M/PO5pT3/6hQsXn/iEJ95+x+0HB/tPftITX/GVXvVv/vqvvuVbvv3MNWf+5m/+xugXfvEXWsvbb799GMbf+Z3f+b0/+L03epM3/6M/+sM777zr3vvu+/u/+9v1ev23f/O3T37KU+6+556HPvShm5sbmZbAAIAkDCDJBlkIg7hCEoBAAAgMgLjCtiRJgG0hsCTASEgCWQhAYARI3M8GcT+JZ7IdEavVKmQACcQzSVwmhAGEMBgMWGIax1OnTvazbrUeSu1U+oiyubnZdZ2kcRh2L+5m+hVf8RWH9fr222/f2Ng8eerU8RMn+6r16rC1tlj0BwcHx08cjwg7Nzc2VsP63Lmzt9/2jFOnTz3koQ8BNre2h3G85957n/GM28Zh2Fgs9vb3b3vGbXuXLu3v74Ouv/56ITCAAIMQCCGeD9uAJSQZgwBsQAhAIAFCPAe11ra3tq+59tr1apWZh3u7YEq3sblZuzqOU631+LFj6/Xq9Jkzu5f2T56+9vDwcLVaP+MZtz79aU8bx3GxMb9w8fxyudzYWBimlkdHRyrdcr0+dmyHNlx37TXPeMYzjh079hIv/uLCtdYz11wDuveee+6+687lcjmM4+bmxmq13N3dvfOuuy5cuLBarba3t7e2toDZfFG77vY7brv99ttKjUuXLmUbdy9dWizmLbPr+1pKZiLAPJsAQJIQRhIAtnkmgcBckc6u76+//vrtre2NxeJw/5Kk2vdTaxcvXLz16U87fvzYQx7y4MypTdOFi+dms9nNt9xCv1lKd/fdd58/f+7wYG+9WtVaJYFr0f7+Xmttc2Pjwvnz47g+c+b05sbm4eFRm6anPv3pd9x222I2Wy6Xy+Vq+9ix7Z2d6669trXpxhtuaJmHBwcRAQYACUkYQMg8mxCAARCYKww2lwnzbBIYIySDeSYh8SwSzyJxhSzAgJC4wnbagBAWBoPASAAIhMQVkgCDkBASBgMGIV9//XXDMG4sFsd2tlerI1RuueUWhZ761Kc84xm3bm5sbG5sbG9uAfPFxu7F86vl0a23Pv3C+fOkJW67/RmHhwebGxsH+0cA+O6779zb2ztartbD2PWdodTS951tAEAgEMYIBEiSEIB4NvPcxLMJSbZtA5IASVwmAAOyMAgAmWcxQhJIAOYy8Wxgysd/3McuFgs7ARAg7mcABICwkACBFbEeho2NzRMnTvRd13VF0l133nnjDTfOZrNHP/rRD37Ig2+55eZHPOJh29vbN910U62ds91yy4O2trcWi4377jv7mMc86pprrj11+nRr7ZGPfMSJkyf2L13a3t566EMfeuMNN54+feb4ieOzrj927NgNN1534vixhzz4QTs728d2dh784Adff8P1j3jEwx/0oFs2Fhs7O9tOS7ItCcAgAMC2BCBAABK2QQaJZxK2JUCAEM9NgIRRRBzb2ZnN+o2trb6fLebzaWo33HDjDTfcuLO15WzzWb9aLW+5+ebFfH7q1KlHPPxhN99000033vDQhz7k1KnTj3rkI2+86cbjx48/4mEPf/CDHmTzmMc+5uDgYHNz69jO9l133y14+Zd/uZtvvumee++74Ybr77777gc/+MHHjh170IMetDw6mvXd8WM72zs7j3zEIx784AfdeNONt9zyoOuuv3a1Xj3kQTcdHR1ubW094pGPPHP69KMf/eiHPPTBD37wQ26++eb1enXzTTfdcP31p0+fLqUCEiCDACEAbCMkACEhQMIAiMsEYCPJcPLkycViY70eNjYWtda77767tekRD3/Ytddec+21101Tu+WWW+bzxS233Ly9tX3y5Ilau8y8+aabNhbzRzz8oUdHR9dde83GxsZiMT88OLz++utvvvmmF3/xF9ve2Y6IYVjfeOMNEhfOn3/YQx967Nix666//lGPfJTQwx/+0H7WtWkqJVqbHvKQh0aEMUIICYMAbCSezRYgcZmxJEBCPIB4FmNJQhYA4rkZBIj72ZaEsC0JEAIBkiQBCAkEAgMgbCQAIYxBgAAwAOKZhCRJToe46+47t7e3JbZ3tvcPDncvXnqxF3uxm2666REPf9g111x7eHT04Afd0nK64Ybrbrzx5uuuu+6GG2548INvOXH8eN/VRz/60dddf93DHv7wG2+4bhzHaRxvvummra3NRz3yUWluedAtG4uNra3Nra3NzASEEBgEAALzTOKZxBXimcyziWeRJITAAAgAg3gAI2EgDOAIASAQGCRJAsz9IuJoudI9d91x7NixzAYCg7ARDyRkDDKWjWS7lNL13TSMLTMza61d37dpUhTbtZTWpnGaSikhSULhzHEaMbP5bBjWtVQbJIGdpZRM11rGcbSZpqnrOkkhtWy2bSvU1W5qrZQyjSNomkZJAAbxorKQMc8kns0ILB7IRsK2pK7rwYL1MHDZbL5RanEmdma2NpUSw3pomRsbG61lKcW2RGsZJVpr2BGRmV3Xr9drScZtan3flVKnaWwtu65O09R1XWut1E6QzmG9ztYWGwuIiLBt5zRNwDAMfd/X2oGlMLYNdqaN7VLKOE4AmCvMcxAAxhgQspBBPJNBXCbsru/TLhHjOLTWgNlslpmllHEcbc9mc9tRyjis7Zym1vd938+mNgmGYailgqfW0tl1ve0SJUpxempTCa1WK2Bzc2O1Wqe9WCxayxJlGNZ2RoQz+75frdeYZxKAjQRgEADGQjyLQTyAADBgWxLGAlsI8TwEgDEGIWSDAIMAMIjnxyAMwgaQADCI52aeTQjZRoAkbJdSgVJiWA8mbbqu7/oeG5imyabUul4tI2LW98M4lVqytYjIdNd3bRqNSonl0VEpteu6zKaI1lpXO4Mzx3GwDQiBkHkmCRtsJIExiCtsS+IKgwAwCBAGmctkLDAAAhCksS1QyEZCyJhnMQZJACCeyWBnqfX8hQu6+87bTpw40VoDgTGI52UbkASAJGxnWhIgkbbTksAANpIkYyywARRCKJ2SbPNcJGxJgBR22gYk2ZZkwAZsRwQggTFIAoGNMUII25K4wiAeQGAAYyGDADCIB7JBYNdaQzFNU2uTQQpJkmwbC2wABEYClNkAJIFtSQYQ2LYk7IgCgEG2AYRQZgNsK4RBCEmSlGkwD2AoEZlOWwIbEJhnigibiABjnknYgBECjKFEiRLANE0YxLMIDCAwCIzkNM/ktCWRRkiykWQbAYRk27Yk25IyLQFIMgiBba6wU5KkzIwIpMwUMikCgS3JaUUgsCUBGMQVxoCQsSwEgAEQz2YABBYyYBuQBGCQQSAALGQMYEkYA1jIPIsBEM/BIB7IRkLI2DYgBRjAAIjnwxhLqrWCpmmyLQlIpzOFEFJISjskIDOlMCmEDRgkbNtEhDFGkm1JdgJIIYEEBgnABhAgABsB2EjCBiwJwACAQWAMCAEIAIMAbAMSIENIpRTb49iEEc9DYAAE5gFsai3nL1yoAGAjASCeRZYxl0kChIwBGxsJiStCOAQSAizAAikshDAGCSAIi0A8k0GAZQgE2E4gFAgMQpLAAArZkgBzmQEBiCsEIAnAIBCAsQgwNuKZbBtAEgLAAMggCdtd191551333nfv8ePHbr7p5kAKATYCIUQIJBACwJYKz2QIQMgYBAIExoAIMAousygqPItBCIwkSgAyYCMBkoBSVMA2NggZgwRI4gqLAISNkGwLJGzR1XLu3Pmz587PZ7NbbrnFJIABAEsAGACQMBEyOA2EBCIkAZIAgwAJbEASEBFAKTIISdgGbEkGAClAwqWEAbtEgO0CSLYkS0UGjCRsCwQgC4FBPD8GCWwigkCQtjGXCRlsJBAgG8lCRsYgMLJBYGQsrhAYgcEgnk08m0FIALYBSYBtCQABGAvxXISIzPa0p986Te2aM6c3NjYyE8A2GGODAbCRMQgSLACMjMUztZYgLhMkBiQ5M5EECNs8m3gmgwQA2AACg8AYkGQbAyCEjEES95NtY4FNKXHx0v6F3YuL+eKG668FMAASAAaMhQAwIGQMAsAAqAI2EhI2gMBcJoSMARDYGABjd10XEa21aZokgSQAjEECC8AACIQMBgECAwgDSAAIWchCIC4T2FgSgC0JMMgACEAIMAaELAOAjXg2G0lgEBiDQNRSSymZOU0TV4jLBAgMku69994brr9+a3trGMZSijLstI1tDJIESIBsA2AeQNxPwgbMs0gCwCDAmCsM4jkYCwyAEM8kMM/JAIQCYRsAY5CQMHZiI0nCnqZxPp8/+MEPfsatt47j0HWdbQRgSzyLwEKIzBQqJSS1lgDYtsQVkoVsA9gGAZIkELZwpkOyjR2lZBosMBgJsJEAW2AAS8IgjBGAQOKZLAOSDOYygUFYlgUYSinrYUynM7uuKyWcCUIIBEYSkiTZdhoMSNhIIQknRiGMMbZBAvG8bEviMhtkIQCMBUhgAMtCQtxPyGAsqLWcO38pW7vxhutCIUCSANk8k8CAQRLifsZCgBG2QTyAAGEQOCJsAIQQYMBIYACDQAKwiQCwEQaFsA1IAkAAEAAYBAYJEGADSGxsLDY2Nu6+557Dw6Od7a2ppQADRkhgwCAAMAbAABgAV0ACsI1BAsCAMc9mHkAR99133+Hh0bFjO8ePH8+WiGeShAEEgAnJAEgYA8gCBCAuExghMDIAAuNEksQVEpcJIQBJtnkA2wgAkACEELZDAsxl4oqIcml3d/fSpfl8fubMGdsYBGAjMAC2t7a3N7e2d3cvdX3nzIhSagXZmTZ2a2kntgEkSVJm2gYkSQrJ2LZtG4QAIcQzWWDAGABJAgO2AWMsSZIkLrNtG5DEMxmDsKm11lqyNYMESCKiZHq9XkeEQph0Cq3XqzOnz2xub4NsjGUhSYBBWMiSlkdH6/X6+PHjijJO0zS1rc3NcRox4GkanYmJUmy6rkYUY4EhWwMk1a4DbK+WR0DX9cvlajbrJWEkDICQAQNIYCwwAEgAAiPABiEhABAYCwEIQAiwXWvd2z+47fY7SqnOduL48Ruuv7aBbUBSa62U2jJzGsdpqqXUWhGhCIVqmcZxWK9LLRElW5YSsixjMIjnYpvLhCzLgAAECABhJIxlIR7I2EYSNiDY2Tm2s7OzWq0FgIQkA+YKBQaMBAhsoxDYBgEWgBDYIABZBM8kMDYI8QACwLxgtkGShRC2BZYENgIExhiQAAEY49ms7/vZpb2FbSMBAgzYxkJcZp6LuQyg2gA2EgiwDeLZDOLZjEKZvueee6+/4fpSamvNIHM/AxgEgLGNAGwj8XwZwDIWGABzhc0LZpvnZJABACFjY8xlNkjCIADbma3Ubnvn2H333nvixIlSCwbAiMskQZvaQx/ykPV63fXdiRMnp2mUJIUiAJvMlpkhhYQEDoWEJO4nCUBgBAiMsRDCgAEQmMuMxLMYAAxCAAKMeTaBBSBkDAgBxhjbxlLYzkybxWLRsgkZSgmhNm2M43Dj9ddnNtsCC9mSDGAk26XE055+68WLuw97+MMj4tLe/mq5fJmXeSlJrU21lD//i7/Z29tfr9anT5++6+473/zN3uy3f+c3X+3VXv2+++69447bH3TLg++5++79/b1hnBAtc3tr2869vf3Tp0++7Mu8TN/3BgHGMghjIWMDwoj7CdviMkvcT2AQQoBBANiAS8Th4dGTnvSUvus2F4uu31DEhd1LJ06cyNbSOZ8vfvu3f2e1Wk5T29zcXCzm+/v7m5tbFy9efM3XeI0///M/O3/+wmJjY2dnZ2Nz49577nm5l33Z06dPD8MaxDMJG/FAkgBjAAEIcZkBG0gQSBgwzyQACbCk1trm5mZmDsMITK1xP4N4HpLAWAgM2NhGwpYEBnGFjcQLIDAAEja2JUkCYSPbPF8SGAuMEAIM2AAC2wZwRJRShmHY2d6utWamQQZACCEAIYwxAgSAERgAVHkmg7hCAJhnMwgAgwAyc2tru+/68xfO7+93UkTIAAjSBmTMAwgM4lkECBsMIEnCPAchMICEARswYCRAYMCAQQhJGMDYRhgJwIABJNvYAEgRmXnq1OnjJ06kXa1UygKQwAJDOiMCLAVIKq1NLcfWUqCIUGSmQiGFZFJIIiJACElCgITNA0nYABIYYwESBoEBEM/FRuLZjHkASTyLQcbYNgq31jLTdtrTONmW1CaBsMGSMBIgGSQDSMI2YPu666/d2t6+9tprJC0W8+VyJZRtAtv54Ac9OO1ZP2vZTp06AX7Qg25u03D8+PGu6/quf9gjHn7x/PnadRKlVilqreM4bW9vllIyUwobBBYGDDLPYgNIYNuAAQxCAmMMIAsBCADbQsZR4sKFC4b5Yo5US+267uDgYGtzQ5LtaRwe8pAHg8dh3NzcmM/mq2FYD8M1114ToYc85ME33HC9pGuuva5lXn/ddcePHx/HASNhbMAGYcBCCCEMIjNDYQwgbK6QsJFB2DyTeA7GIBERgJ2SVqtV3/eZCbYdCmOegwDbISFsMMggAGwjCWyDEDLGPIBBkiRswJJsZzpCUkhkGhAY20gSINkGEOJZBGCbZ7FtG8D25tYWdq0lQoAAMGAkrrCNuJ+5TGAEAFWSbUkgMADYgCXx3ASAS8T111936dLeNWfObG5uZlrCNggAgySlEwNI4jIJwOYBDOKZzBWS0yCwJCRsACRhjHnhBIgrbMCAbSTb2IAkSRFltVod7O+fOH6iFBnLQtgIAGOQAFsSYBuQhIWddoBDpRQJSSHsEiEJECAhhMQVsgDE/SSDwAoJ2QgQxpIAxBVGYIzEMwmBQQCAjcQDCSxAIdkQkkpp6WK7GsjmCKWdaTCAALAQAmPAFpeV0i0Wm5ksFotpHMjErU2DMyW1zJtuvKHUDtOy3XzzTcNq/RIv9hLDMNTaXX/ttbZbthuvv8EYe5ymUJRaJVpr4zgAobAUkm1AMLUWElJmllK4rLVWa4BsYysCbCMB2M6WBmzAGARgQKXWvu9n83mNYrtN4zCsp2kspUgxrNcPuuXmKNXpbNM0TTul1Fqx18P65ptvKaVIapmyOb4zjaOiZCCQJAmcadulFqC1VktJW6iUMo6jJASAkWTbNqJlYvOCCDAIbBtIZ611Pp/bBoN4NoMAMAgAgwTmWcwDSAKBbfNMEhgDkjCAAZB4JmMMIGGeRWCuMPcTMsYGWQgBYO63XC4zW0g2NmAEBgG2EQIQz8sABoAKgGxzmYSxEAowz0UGbCEvFvP9gwNQZrbWuq7ruy5tQ0ittXEc+35m23bLhg2yzXOyAQuMJXGF3fe9jSKmaRKUWjMTmMYRcZkAbMRlAgOAjQQGBC5RopRxmrp+ZqdspExPbXKm7damzDbru6k1DBIgmeciAS1zGIbMZltSRNjGttNGSAIkCUkStgEEgAGQEDLmuUjiMgmby2QBYBCAMIBkGwCwjXg2CQxgAWAkBAbbXCZsSQYpMlvLBpGZmQ4B2EhCAMYYBBgkUUq55577zl84b7ReLc+dOzus1qdPnTQCQnHrrc9I52Kx2NjYvOfue46dOD6bzY+ODsdh6GpMU9ve3h6naRimw8OD06dPDeN04cLFk6dOloi+64b1em9/f75YtGmazeYS62E4fuzY4eGhnVtbW8vlMtPr9XDixPH9/b1xnEopm5sb+wcHJcrW1tZyuQRqrcePHSMEYABhJFBr7cTx4+fPXzw6PFos5tjgne2dvp/ZgPvZ7M4775xa7uwcu3jhwmJjAb7nnns2FgvbOzvHVuthNuvdWmtTtjZfLNbrYWtru+/7dO7u7q7X69ms39ravv2O2685c81iPrv7nntOnjwZpZ4/f/7GG24c1qv1MLSpGY/jeGxnJyIM29vbAJKwERiDuJ/AAEYSgElnZrMthMxlNoAwwgYSBEi2MQACAyCBQdjmMtuSANtgQJJtjIUAsLEBBAYBMmADFrIwYK4QIIy5TCCwEwCBbQtshEAgSSAwQshGAsA8i5CxjSSwEACuYAkhAAEIIcAYxHORZNu2bUlINl2tT3jCE87dd+7YieMbm5vL5XK5XL7iy7/sn/35n4OAl32Zl0obbEsyAAIDEiCwEAhsM5/P//AP/2hre/ueu+9+xVd6Rdt333XPMKy3t7ce+tCHDMMgZAwgSdgGgwBAAhAY11ovXLhwz733vfRLv/Qf/MEfXnPNmdVyef7ChQc/5CE33XDDarWSACEZg5FsS8Igg7CREQJJ4JZtGkdAEhARiigRgBRgkCSMZQlxmQSAucKAuZ8QgA1CgIXABiHAGEuAuMxcJgECbO5nQAgAgQUAyLadkjJbpg2ZOU3NdrZ0S4QiBIAEGMCAwFwhsKY2HT+2XUtsby425n2IcZxq7abWgCjlaLnc29trrT3kIQ++tHfprrvvvummG7u+v+OOO0qtbZxuuvmmJzz+cdddd8Pewf7W9vZ6GIZxvO0Zty2Xy0c94uFnz507ODqspZYS4zgtFgugTS1K7O3tHR0tn/KUp9x8803L5TKz3XvvPYo4tnNsf39vd/fS5ubWwcEBsF6vbc9ns42NRbOFAIMMKDMXi/lDHnzLU59262q1mvX9yVMnTp8+5TQCZDSO063PeMY0jn3f93134uTJc+fOHz9+IsTu7qWNjQ17856775nPZ+M4dV03DsPm1sGJ4yfuve/eaZq6vj93/vxNN9VhmO65596bbrzh/LkLFy7uZsu+77a3tu64/Y7ZfNZaXn/99WfPnjtarjLT9iMe/rC+72yDwAACYywJAAEIDEgyBgNCAgAJCdsYI2EUYK4Q4pkEIDASz2RAEpdJgGwDIGQhMACSAIMEYAwgAQHGCBAAxnIQxuPYpmlMu6u17zsMMiAJsJPLJMBgGwFC4pnEs6QtkAADCMCm2gAGcZkBEDYCEJj7GbABIcC203bOFlt33HH3r/zyrz7ykQ8/dvz4crU+eep4v9h6+q3PmM1mN1x/vSQbhLhCYEm2ATCIZ5KEpKffeuvG5uZdd9zxYi/+2Kc//WmP/4fHv/wrvuI0TVLYEGBAgA0IjAzCXGZzmZHKhQsXp3GYpunxT3jivffcXWs3m81vuuF6Z6pUSQIQgJEwFlfYIABANhhJSM4UIEkqEVFqhABwSCCwAARI3E9cYRDPZCwLLAAZI0AIsLlMgEGAsXgWm/sZAPFM4pkMsm0bsA2AbQQStgWKkARAgnkgcT8JENM4njp96vTpU3aCdnZ2gNaaJKC1fNjDHxaSpNba6VOn0+66LjNvuflmg2CapmPHj29tbYU0tVZKlFKPjg4xfd+dPnM6SuGZLGQ7MyOiPOiWo6Oj6667bmNj0VoDHvKQh4Az03ZEgABJ4MxsrWVayDyTsRDSNE2bm5uPeuTDp9YC9bMuM20kgHFY33TTTdddd904DrXWaRz72exhD32YIgDb2Rr4QbfcAsq0ZClaNsw1110rIbQe1qXUm2+6MTMz89Ve/dWmacpsXa3T1K699tqIsA2+/vrrbBtjWptsY1IWAsAIIRDYSACYKxQRSLJtA8bjerTp+y4iZJDAPJvAPJMAEM9kWxJgnkmAhI0ECMwzGQQCwAASz2IAxDMJoeZcrdZtaukcx+mgtY3FfHt7ywZZRhKI5yJjYSOezQBIkrlMCDAGBBWwARAYCZBtCRAYBGAjxP0EgAFLGtbrl3iJF9s5vlOi1BJd169Wy2kcX+yxjx2n8frrruMyIWTuZxsEBrAREliJjR/ykAfv7Bzb3tqstd50442zfrZ78cK11zymtSaBLWSBDZKwRVrCAAZA4JZtsTG//vrrbr31Vmd7yRd/8cOHPvj8+QvXX39tm5oiDMaABMaykBACDEiAAGMw4HSJsBQRtiUhSSCEBFIgMBIgAxgbCQwCkMAAYCEwCNkYA4ABBBYCgwwYAwYMsgEDIADE8zKWAQlb2IAkgSEiANsRYadt8ZwEGMRlNldka4ANWAIMEjIInG4kADKWNAyDRGvNWCDF1uZmm6YJC6Y2DQy1VGCaJkmtNSRAPFtmTuNUa6fKOI4AaL1eS4CA1hIAAyAAWQiQwDIIAzZCrU19X3t3FrZtS7IRSBqHQRF939vuZ7O0cxy4zICRmFoTAsAASJDZAJtQOHO1WiGEpmmUJMUwTUKtTa0BAmCShDFIYCyweRYBYANgI0A8kwSAEErnOIzjOC5X6widOnkSYVsCsAEkcz/bEphnEpJtwABI2ABIGGMEiPuZZxIA5jKBBYgrbIRhGqfWWmZrLTPT9v7BYT/r57OZE2MAMBYC2wLJIAAMgHgmAQZAGGMDWIDQXXfeduL4iWwTBDIIDIAAAWAQGLARIOxSy9lz5xfz+cbGomXWWvuuN3ZracDjOPb9TKK11loTAhAYg7EMEhgkMJZkA4Ls+95G0jCso5QSpbUxmxFXSMKYZ5KweRYJY1nGQqXEOE19P8vWogSQma0loNByuTw6PDpz5vQ0TUIIQMgABmwkQloPw+6l/dl8HpLtUgp2lBISUkTIRiAJJEkANkAp0aaGhBDYBmU2QApnRgkbsKTMjAhJBmyQnaFo2SLCmSDAtkIgwLYEKDNLCQAEALZ5NttkJjjtTNvOzGmcFJFO2RFx4sTxaWoSIDAgyYDNFRYyiGcyCGwDAsCAAAkAg8xlNs/BQgbJtgABgAAwBgRYFgKDwCCBARtAAguMAAwYhAwCAyAwloUw5goDIDAIECBsALAknk1g2yBJYBtA4tmMBTb3kwRgWxLYIIOwJGMAAyABwrbAFuIKgUE8i6TWWqZrLbbX6/VsNheoxHo9DOthGIflaj2sh9OnTx7b2W5TUwiwAUmAQSWilBinJii1gDKztRYRERGhTGdriNaaFLYlsBAAtmUh7mcjQDwngYHMHIZxnFprrbXWMp1pmPXdyRPHMxOQtFyu5vO5pGmaIhRRsAEEgEE8k7EQV0hgbLvWcv7CbhVXSMIGGQABgDEAMoARIADMM8kGexiGYT0IECCwpNVqBUgSsgxgwCAgbWEQ2ADYBiBtlsslYDuiZE6jRwGSDICwjUGAAIxBwgZsCzAGp3Nqk6TVagV4SIwiIgKQBZJkAxgwSGAMgJAADBiwAAmQhAAQCgFIYIEE2JYkybZ3L+4eP3E8M0GAJDs3FhvGy+Vye2f76OhoNuslTdM0W2wsDw9sSkSEsEvpV6v19vb2crns+h7IdO26tNs02S4l0s7Wtra2jo4Obe5nIQthg40xYIMBbAMIO0MCJACJywwS2EZCYABkELYBLIQMIIQBkG2DMAACBBgLDEjYAEIIYSQwADIWAhAAIowBy0IGOUEAQlwmABvxPARgLAkLMEaSASGwkTAGwABIgAAhA1hgAAS2EQACBLYFFghAgMUz2QYwliSukDEIjLifjcAIITDPJJ6HkEGADWBMuk3j1KZMA+l0GkA8mwzYlKLlanXh4u6pkyday4sXL5ZSNrc2jx07vr+/f3R0tFqtaqnbO9s4tzY3W6YEgMz9hAAMYC4Tz2QByGBAEmCw09i2M1trwDjyQLa5zLYtwACIywSAuSLAPJuQMUhQQYABQFwmwEYyV9gIEAAGQFxmHNLYMjMlhMyzCRCAjQAwlgSAjDFTm7raYVtgnslGXOE0QshgALCNAYTQ1FqJEpIxCBth8yy2JUACsMFGztYIRel7AEkCoxAYDCAAgwAEImRbUigIDBgJQAYZJEmSwBicmV1Xb7v9jj/4gz96u7d961prphFCi43NP/iDP5za+Iqv8Ao//KM/9tqv/Vq3Pv3WUutDHvSQX/ylX33jN3qDWsv58+cu7u6GyoWL5x/z6Mf81A/84Gu+xqvffvud3ay//rrr773vvo3FfGtzo2XefffdGxsb15y55hd/8Zff8A3foJRiGwAsYwxgbABsbFsSEoAkhcAkl9kWQgJbwmDzXERXaillmqbWGkIAAtsGA1jGEpkGJDkNSE4DILCQAQECA0LYlgRgLBCAkEECy1ggxDMZkLCREDKAMYCFwDYSGCMwCDAGDIAABAjbIMBOQFKSAChtCSwA2wKDE4EEIAAZC2OQBGCQMUgAiGcSNoAERoCwASQASbZ5FgMIcT+Bwc5SSrZ1a21cr/uu29rezEwQYFsSBgEO6dLe7m/99m9tbm6OY7v2mjMXLlx49KMeVWr3Yz/242fOnL79jjuuv+76re3Nu+66+/3e6z0Ol8sSBUBcJgljAGEbJMAgAGTARgKwDcLGZEvbrbXMlun5rJeEhAGMAQlJAgAhgzEIEADiuRgDkgCgAhLPIrCNCMlIYEAIA+aZDABYYOi6CoDAIADMFQZAPJNBXCEpbY3q+95OnkkAtjEgBCBAAmMQAMY2RITGsZQaIdsgns22hQBzhYUQVxiwTWJjAwgwBgEIGcsggRECDAgspJCQFGBASCIkA5IAJKXNvfede8xjHnPb7bc/7CEPaW2KiLSjdH/6p396eHT0iEc8+jd/87ce/OCH/Pmf/8WLv8SLP+GJT7z1GbeWWuV23333PPVpt509e/av//KvP/KjP/K2Z9zmV48/+/O/OHHy5PnzF3/sx3705V72ZR/72Mf0/ex7v/f7HvXIR77yq7zy02+9tWV2XZ2m5H4SNjYABghFUwIY20KAbdtGGBASGMAGgQEQGASupd59z7333HvvQx/y4M3NTTu5X1erJEXYlmIcx/m8SmqtKSIisiU4SslpmtqUaZ6bxP0EmGexkJGxuMyAkbgiJGNjMAiBwTYCg7EQtqWwU4CEHSrNKQHYdF0nhe1SSrYGINlWCDNOY1d7SRLjNJZSimKcpmmaQhgBCGEcADZCAhsMwgBIYGNJXCEMMggMBmEbAyDuZ9tgsAAQMvT9bGsrDg4P6vb2sWPbIdlIAJIABCBpau3E8eOv+iqv3Hcd6Nrrrt+9eLGU0tXyRm/0hhsbi2zt0qVLtXaPesQjjpbLUBhLsgGEjQ2AQBJXGIF5JgkbCUyEIqJl2m6tgVom1s7OsczEgEEyxkYAAowBQAJkIcsgwDaSZKcRgG1AUgVAAmyEETJgkGxzhQEMYAFgwAgkSAPYaWdEgCRsJJAkbMC2QTIAwgYD2MYgjAR2llIy07axJEkYO6VIG7AtIWRjLjPYxiBB2s5USBICIwAh2yAB2AAWwgDYCBAAxjKAAANCNgawFIoIIUkSKBSSwLYRtoVMbmxuPe7xT9je2aklLl64eFu9/UG33LIeBjs9rbq+m7XZ0dHhmTNnnPmqr/pqT37yk9/0Td/k7/7+7/b29na2FgBiY2Nx9tzZaRwe8+hH33jzTfP5vKv1xInjZ++5u0axLWlnZ+vcuXN9P1sulwf7BxvzM/YUEbYBEFiSDWREARllpoQs2+IyWxLiMkvYAJJBtsEg27WWc+fP1372kIc85Oy5s8OwPnni5NQmoO/qU57yFCSj1nI9rB/xsIc9/dan7+3t7ewcO1ouW2s72zu1lvPnz89m3XXXXHPixMmWDQSSMAZbYEk2ADLmCgMgAWDAlgQIGRtzmS0wCCwEWAgB2Kq92hi1WoVxXaKuptW8LlqORl3X3X33PYdHh1HKarWa9TPsaZqGYZwv5tM0PeQhD777njuG9QC+/vrrb7/jjr1Luzdef931N9wwjZMEYIERBgwyCGNJPJsBWQACg5BtCSMus5EQzyZsbAO2MxNhI7Dd9/XU7ISkzLQtyUYIjDAIQLb7fvaYRz/KtqJM43TdtWckpXnIg2/JlobrrrsWg7ReryPCmYgSxZCtSUIA2TKdXCEMGEAibcAACPV9NwzDMKzHcQBKxMkTJ7saaQshCdIWwuZ+EiBsLrNtAEtYCNtCGMQVGKptMGCBkcz9bAAbiWeRsC0MYIMBBPZs1nezWZumYb02hDRNEzjTpVSg1tpaQwIMwlxhAzYS4Nlsvre/v1hsFCndxmEYx0lQuzq1oe96sCQUgCQhwNhIgLA9n/e174flahzHiFprtHS2FJJsAEAA4lkkIS4TMs9iEBiwhNMOSFsikAAhJGwsBLYRpZTz58/feccdr/d6r3PnnXc9/GEP+73f+/1bHvTg2vXTMGS2+Xy2Wi53tjcPDg9OnDz5uMc9frVa7+7u3n333cN67Y153/eLxcbpU6df7dVf7brrrvvxn/zJF3+pl9ra2gRvbCxe8qVe6sw1p2ezWSnlpV76ZYROnDixPDpCMhYAkngAY8A2MthOoQhKLYK0hZCEJEAYMIBlAEDgWsvBweE99977Ui/1UtM4dFV/9md/8Wqv+ioCQ0RprV24eGEcp+uuu+5wf2+1PBxWy71Lu3t7l2azRa31/IVzO9s7e3uXZrP+2M6xU6GpWUiyzRXiMgOSQMaWBNiWhAySAXGZMQZAAkuAbAsBFkIYSHUznX1G/sI3eL5V3ugDtXX6px7//X937q9e75Y3efUHv+GYY6n14PDw7rvvPnZs5/z5804b2jTdcMMN+3u7BwcHD7rl5r1Ll5bLo2G9Xq/XFy9e3N/fO33yhCRjQBCEZcAIm8skYZAtZPEsAoN4FgEgYWQjIWSMASQpAiRJERjAINmWnTyAJGwDBgAh11r2Dw4f9/gnnDlzxpldLV3t7jt3tqu1RESpijBIMU3jyRMndi/t4dzcWOxeuiSpdh0mSkzjtL21tXP8WE4N8UwSOI0kG0BCCLG9vTWfzYZxVGg+m5VSMlOSbSGExGUC2xKybVIIBEYIQGABYFuSACwBgHXXHbedOHGitSaBQeIKgwwCAyAwVxig1nLv2XMbi8Xm5sY4jtvb27/267/xLd/6HY961CM/49M+pbVp1vd/8Vd/dfbc+eVyub21Y7vv6ou92GNPnjw5jqMEgBmnqdYqsJAppUwtf+EXf+mmm29+lVd+pXFY333XXX/yZ39+7bXXrtfrpz79qW/9Fm9+4viJqTUpJElM0xRRJGwkMnNjsfEHf/iHX/+N3/S5n/2ZD37wg2rtnvCkp5w9e+7C+fOPfOTDH/3IR67Wq5CMwBGxXK2OjpZnTp+apiYBAsAYAAFgKRiG4cLF3c3N7VoKQiIUkpAkhCTAAMjOra3tX/6VX73jjjsf+tCH7F66dOr06b/72797zdd8jZd48Rc/OthHXq1WUsxmi2EcNje3xnFURAkdHh7M+m4aJ0kRJWqNiBKxXA+zvh+GtTORi8J22hElSi2lAKvlUa3VtiQwiGeyjW3bBolMZ2sGSdM02ZbCOUk6fuz41CYABIB5NoFrrRcuXHzyU57yqq/8Si2ztXzCE574mMc+uk0NkFRrBTuztSZpHMdaaynFKEoJRWvNuJbSsmVL2xLOBBvZRAhjAAM2kiRsDCGATEsS2IkECCJKOgHbgJAFtgAEGMupzeP5Y1/MX/969nXjVd7pCS/3qt/6h59Vutk8Nz72VT9ra7GTzloq0jRNXVfHYbCJUGartUJkZqkVcOY4jLVGrbW1nFqTMGCwFQJsItRakwSAbSQBIGwkCWNAFsK2JKF0CgEIAAMo1FqzqbXYHB0dbWxsAGCuMAgAgwDZRgYJhIxLqUfL5TNuuy0U4zi0cbjl5gfde/becT0cHh3tHD926tTpS3t7bWqbG4vjJ07ce8+9OztbR0dH+/sHtasnTpwYhuHw4LDWes01Z44dO9ZaE0JcYYMQYBAgANsQEoDINFgS9xM6PDpcLDYkTdMUoRLFtkECwCCezSAeQOBSyoULF6ttAGxLAgwCGzASAAaBQQAIjAFkhLHtzK6Wn/iJH3/v93qvWV8v7S27rjt+/MTd99y3v78/TW1jY2Nzc/F3f/f3r//6rzcMgyTAAJYABGnPuu4Ztz8NOH/u7Gq1qiVa5ubm5vbW9j333L2/fzCOE1eIK2wEANhWay267s//8q9+9Ed/7IM/6IMe9ZjH5jTc+vSnnjt3YblcPuiWm6MExkIySAgAA9hIYIyFJAyAbVIEAEgyhCJCEkIIAQLbIAGWYrk8eqVXesXHPnY/M2upU5se9pAHb29vL48OjZ2OKKCW2c/mwzCUCJzLo1WI1Wpday21GiFJMU5TjVgtj1qbJGXLAZdSF4uFUcvmydM4lJAzkcA8m20DgKTMZuM0WAqBEOBMA8YACIwBIWOeyaBxHE+ePPHgWx709Ftv29jcGMfpEY98RCiSZow0DEOUqKWrKsM41K4vEeM0AWFHhNMKrVYrOzc2t9rU1uuVpFJKSH0/W6/XKhFSlOJ0hMZxbK3VrgvUsmXmbD5zZras3Wyaxohi5zAMs35uHBHY6WytgcDGgBCIbNz4yPInvxjjup289tTG6Ws3brp7uOdhJ27Z6Ddbm8DraSqlzmb9ej2UqAhwrTVby5xKrc6cpkmSQlNLM9Va+1ra1ABJpZTWMluLwnq93tzcnKYpIiQBoNaaRCllmqbWmiSuMEKAsRCAsC2EZCcWALaxLXGZsZC5wiAMGGEJWwCSAWitbSzmL/2SL2nTMrM18ImTJxXKbKXUdN58002SbA/DsLW5ga2IWqvN1KaQIsJ2ay0zhYxlkABxmUFcZi6TSBvACIywkYSMLUCAhAAwBgQYAAlsWxKAEOIyYwADGOuuO247ceJEa5MQAhACgwxgnp+0u1rvO3tusVhsbW5kZmZubGz8yZ/8ycMe+tDtne1parV26/X68Gh56dKlvu8i4uSJE7uXLt1w/fWtTbYB2+M49X3HM8nOxWL+27/9uzfffNPNN91kOH9h9+LF3Y2NRS2xv79/yy231FKMJQGShmGstUbIBmxb0tFy+bSn3fqSL/kSGJzL1XK5XO7v7Z84derYzk5rExay7YhYrlaHh0dnTp9u06QQAALblsRlhpCGYbhw8dL2zk5IQhERISQBIAHmMoMAKKWUUkAAwpnTNGUmUGv5y7/+23EYS4ljx48Pq9U0jbWU9TAul8sbrr/uhptuetrTng5SxMZicd99Z08c3zl9+vTjHv/4rc0tiTa1zc2N9XogJJT2rK9bm1s33HjjOI6SeCbb2AaMgWwt0wY7hYyzJWCwDT5x/HibGuIKIQtsAARGOB0R99139tKlvZtuunFjY5GZtoH5fPGnf/Zn4zj1fbder2+88cZz584JTp482bLdd+9ZidV6VaK0Nj3oQQ/a299frYb9/f1jx44t5vNrrjlz55133nff2TPXXHPttdc8/WlP39jcHIfhsY997D887h+wFxsbh4dHi9lsY3Pz3vvuK6VIPPjBD967tLe3v79erbY2N9NGsn3jjTdce82ZaZwQILAEFsKS/u73aa29xKvN+4179u968qUnvtS1L71djq3HZa31SU9+6u7uJcHNN9+0u7uL1PX90eHher0+dfJEa+3ixYut5cbmRi311MlT9509O0yjpIhYLVfAzs6xcRiGcXjYQx966223CR72sIfdededRweHpZTMNpvNMzOz3XTTTWfOnG5TQ2CMETJIPJPAGIOEUMuWdq3V6eXyaGNjE4wxzyQBYAwSIADM/SQNw3DPPfeUKJL29g9OnDhx7Nix2++4Y3t7q0Tp++7ixYu1VsTO9s729pZtEJcJDNgIkMQzGQRgA0g8i22QwCBhI7DARAiwLXF4eLRYbEiaplGKUsK2JIxBQsg2IAkwFjLmMptay/kLF3TnHbedPHEiW0MCYxAgDAKMQWAhc4UxrrXee9/ZjY2NzY1FpiVl5sbGYr1et9YkYRQRJUJhjMnMUso0jZJswLbHceq7ziABQjhzPpsN4zCOk6Su62utxtgRMQxD2thcJmkcp1pLRNhcZtsRZT6fL5dLwLZEKSUiptZaayHZYBsitFqtj5bLa06fHqdJAgtAtpG4wiZCw3rY3dvb2tpWRECUIgEIkARgAMQD2QACCYMABJIODpfYR0eHrU2z2UzScrlazOfrYehns9OnTu3v7x8tl9jjOEXEfD6bz+fnz1+YL+allL7rDvb3JbWW4zRKzOfzvuuPnzgxTZOQMWAbbCORNqZlc9pO22mXUqdxMilkED5x/MQ4jZJAAJjnILANci21RIzT2FqGAoEUEQcHh0dHR61Nu7uXbrrpxkzv7+11Xb+xsbh48cKs7zNznMbZbLaxsXl4eBQR/WwGSHRdf+7s2Vpr13WSlkdHi42Ng4ODkydPttbGYZQ0TuOs742HYTx37lyp5SEPfvD+wSF213XTNNkGJNVaThw/YRsBYBsk2RYwWxhYLw2zbt5Fv55WUw4YiUuXLi2Xq2kcj584sVyuopQoxZkRUSJWq+U0TlFq13c1opSyf3CAHIpMg6JE7bq+6y9cuLCzvdX33cXd3TOnzyyXR8MwDMMoaTGfl1ruvPOu06dOXXf9ddM0SZJl2SDzTAKwjZCFAGVribtaM71cLjc2NowxkgCwjbhMgMAABoGFLMV6WN93773jOEpxeHi4WCxuuOGGs+fO1VJaa4vF4t5779ve3jo6Ojpx4sR1113XWgMECCwwAsAAlmUBiMsEBjAgMIDAgC1kIWxHxDS1zOy7zvjocLnYWEia2hQoStggZJ6DeA4GAdjUWi5cuKi77njGyZMn29QQVwgZc4UBwEiAhI0N2ObChYvbO1ubGxuZKQlorUVESAYbMLYNEliAEDKAQiRM49R1lWcSGMhMCRBgGxsJBA4JYYMNKGIcx1prhGyezU47JCQwxmBbEoANgBAlYrke9g8Odra2QpLEswiDALAdimEcLu7ubW1vhyRRoigECIElQGAQl0myzWUC80wSV0QUQCFsG3BEsS0pndmylAAwxiDbQK3FBpxpbAAhhLANtJYCwDZgwDYgAMw4jU6nE8jMiDKNk0IR4TT4+PFjrU0gAIME5n42gARg27YkSTYSIONaihSBEFNrpRRFZCaZSHYCkmxnZimV+9lOZy2dnc40LqVkuhRNUxOKCABIN1Ao7JQ0tRZRJDCSDGCMna0lEpjLbMCSMHYToGIwhhRFEth2KSFFRLTWSikgMJLTrbWQFAKBnTaOCMBGQhJg2zZStgaUUqZpiohQRMjgNAKU2VprCAxCFgLAAAgAg7hCqGWzXWu1vVqt5vM5BkAC8yKRpFIrNqCQ022aSi2Aje1aStqSMts0NYnnYhAAtiUBGMRzMwDiCoMMAkBM03R0tFqv11ubmxsbi4ODg42NTUnTNEVERNhGyCABYMAGLMkGLAmDAKLExYu71eYKIcDYGACBEQAIg7ABRTCO7e6779k5duzixUvr1TqdPJOwJRmwQWAeSBIghCQBwzjVWsg0SDLPJv4FkiSN41hKkZS2eP4ESAYwVxgDdkSsx2FzY/Pc2XMnT53su842gABkjCVJ4jJjIQAwlgEsCwFgQMIGsM0z2RKAAWyuaK0BNBACQ8sUGDAS09QAZAwIIRiGBMCAjQSIZzPIXCbZljDiskzbmZm2MxOYpqlWtcwSxWAsALAQIAljwEYCkBCyjJEEAmwA24DENDVoksBAZrMBg8Ag7icxTYMNBgEC1m0lnqlNDTFNPFMDjIUE5jIbSZkjCGwjARIYC4GNZQESWAACBQYMCEQBwCBJmbYnIURrCYABkGACGs8iaK2BeCYDINsCBChzkmitNRrPQxJgzBUGgXg28VwMNoABcz9zPyFjns0QtiUk2bY9DgMYwEIGtXESxiCmNgkASTw/4pkkAZhnsZEAMAYJwAaQABnLSBqHcb1aLZerrtbNzQ0knpuFAGOMxBWSAAksAAmMEcJUSYB5FmEQYGwkrhDPZBsUOjg4OH36VImNrusM4n4CsBHPl7hMwiBpNsNOA0bCIEAImcuMhDGWxAMIbOj7nuciYYMACXOZQQCAwIBtW6GWbbU8unjx4ukzp5AxV9gGQAbZRABO2ymFbcAAyCBAEiCwBMY8iwAhYwkAY5C4QhKAwUaSANtIACgkbAsMksAgDELiOVgWMoBBEgAGnOnMtDMTDCBJsi0hEGQaGTCWBWkEWIhnS7soSg2DDVhSay1bAgZJkkBcZlsAkoRkIzAII9kICJ7NAiQAYxAgYSMBQgBYBiDEZQKMIgAwgCTbsiQhMADCBiwJYWNb4jKDuJ9CQjaSQZhnErKQQdxPCMAGUABgJMwVEgASIGMQAAaJZxFCAvNABnE/IwEYsG1sBMYgns2YZxIYBEgCbAMgiWeSuEwAQgAyCBC2hJEwAAIDIDAIDCAADAJhjJEksC0EABjLMoDtxXwxjGNE7OzsZKYQgHgWIQwCWxIGIYFBCFnGIAPGgKFK2IC5wiCeSeI5CNtYVlfqqVMnz124cGxnZ7FYZKbE82Uj8S8RmGcTGACBQQCYZxKY+xnEFQLzLxMAxkayXUoZx/Hc2XMnTp2otbMTAWCQBBgACWw7M52ZkgQggUGAABvJgG0kDNhIgG2QAGyeiw0YQIAxgEDIGNuAscCAkcCABNgGJJ5JBmEDBtk2djozWzYpQAYEYGjZ0g6TmS1bSIAAAWAQAoMAsInQalivlsuIkEIRmdl3Xd93zhTCNkjYxrYNSGGMASGBM40NkgBsJEDCAAZJ4tmEAZBBAAIEyLYESDaAQQAYJGMhDAIDCIxsgNpZoWkAA2CMBQgsA1jI2FiAZAPGhGQSAEnYIABsBAgs7mcACQMgQADYIADzQtiWBBiJKwwCC4EghUBgnoPAAAgA8xzMM1nIAAZshJAxCARIXCFhkDEYBOaBBCAbBTKXSbKRuEIAQgYQx48dk8i0bdtgLAAMNohnskEIMM8kMIgrhABBtZEAgYQNNhIABvEARggJpfOGG64HsrXWJsAWGBAyABK2ASzAWAAyFiBhAGMhYxAggW0AwAJj7icAAwawEMJgwBYA5tkEiOdkjAHAlpimaWd75+SJk5ltmiauMIDARtzPSJKUdmRGCSkkgSUBAmMsBAiQBGDAIAEILAkAYwAEGASAeRZhLjMIBIC4n5AxRsIGgwCEbHOZ7DRgAEREAZCyNQyQU4sSIYWIKBkpYdsgA0IAGMSzSFqv13fdfY/TSBGS4rrrrt3Y2JimEVRLsTMzQ1IppVTb0zQBXS1Ty8yMiDqfAdmytSZcutpay2wIG0AYsJEABDYSCBuJK4wlbCQjAARgW5IAy0ICQIBsA6BSfd8z2Nv1LY9S7WQDgEEhZTqi1FqmNpEoBMrMiCKp7/v1ahkRtjMNSMIyINtIFg8gnskgQNggcT8hBGADFuLZJAHGQlxmc4WFwBIAFhgADGAsQIAxAALEA9hIGGMAJMlgACFhC8BGgA1gAIOMMUgCgwAwCAxgrpCwASRACMCAAWcCSAJACABzmUGAEM8ihGwb8wDGAFB5FtsCkAQGEM9kEM9lmkZbgCSMAUm2sYQNliQDBklcZiRxhQCJK4SRAIER4rnJIIFBsi1xPwHCRkIAGMQVAgvM/YQQGDCW1FqbpkmSxLMJG8AYhCklsCKilBKSFBKAJInLJATmMvFAApDAIO4nYZ7FIBCYZzOABOYyIcAABiGEsYSRADDPZBshsAFcItK2CUUqWptsSyGFTZRSSrGd2UJqtiWJZxJX2CBP03TyxMlxmM6eO4fkbDtbG6dOnpymCaKf9f/wD/9wdHS4PFrNNza6ri6PlvPF4lGPeMSFCxce97h/OH7ixDiNh4fLY8eORcTu7u6J48fTuX9pb2Nz8VIv+ZJ939sIAwYJEIAtBAYEAAYQWAgwAMJGQpJtSQjxQOayKF7u6+//IC5dovb5kMd6HCQh1Pf93/zN347DcGnv0mq5nC3mW1vbtVYpJGW21nL34u51112zHoZrrjnzoFtuGYYBg7hCAgMgMEhgACPxbDLPJDAgYQAJANsSVxhkGUviAYQMGAsZAwKEDAjZFpcJEBgMspEAJIEBJAAsZMxltkFgBAACYxAIACGeSdgIJGEMIGwkgRHiCnOZALABgwBJAAaMBIAAsJHAtiTAGAFgEIANIDBUnslIAMJOSTyLQTyTQRgLGSQwAAJbBkm2DWAsJIPEs4grDAIwlwkQgG2EAAQGBCBsAGwj2QLLWOJZJJ5FgAVGgGwjrrCRzGVCgIQQAsAgLGSuEMJILJfLqbX1MBwvRZKEMwkJjABhwDyTDTYYhHgm2yCBbTDPQRiEwDYPZEAInFgIgUEGbMAANgYwFkIIbBtj26TTyHY6ASQhQlJIjghJrY2ZuVoPJULiCttCEoAESGIc1zs72+cuXCgRk33q1MlhWAOYNk3HdnY2FvP11qAoiPl80aZ2cHCw2Fhcf/31m1sby9X62muuHcdJ0skTJ4AIHT92bGtrs0RkaygQNoABDAjAAMZYljEAYAwgQCAB2OYKgwCBAUDCxpkq7hYxH8t8SyAADM7MY8d2ptY2tjaztYiI0Hy+aK2dPn3m4sWLdi5m/cbG4uSJkzvHtnNqIpABjAEMiAAbcIIEgG1J2BjEM9nGQjZI2AgbAQaBESCEQIAEGANIIGEU2AgAEABI4gGMBAiBEVjCFpcJkABZCJtnkgQ2AiMJAAFgnknCCABjnkkRACABYFtgBBZCgLEQoIjgMoMBQDbIEiCEuJ+QMYABJGwZwLrrjttOnDjR2iQJCwwgng8DIEAyxggAgwCMZUAGsCQQGACBQWDMM0lgAIMEBmwECBCYZxLYAAgwAOJZbCTAIB7IAIjnyyYkY+5nW8iAjJEE2OCsXffEJz3phutv3NvbQwLbDskgACRJAgAJwIDNM4nLJCHEM5krJDAWAhAYwLZtBICRxANI4n62ucI22JYkCduAwLadNggAt5aApDTYIYFtj9N4w/U33H3PvTdcf23f9emUhEE8gADbIZ87f/He+85df/11p0+fatPkTMBk380UAQhKrYoCHtbraZz6vjOOiIgKtu1sU2td10etbm29WgEIgyxk2xHFmemUBCql2M6WtRaklk0A2AayJVeIZzMAEtgGCJEGua21WsaJ05qmFuSYSMrMjY2NKNVpwM5sDamUIG272V0tU2tSCE9TS2eUgo0BAzaZqRKhkLBxpkIRxZkITMsGkpBCIWxQa02SICJaa5lpGZAFAAq11lrLWit4uVzO53MQCCxhIzCXCYzAPDcBkjHmudlIAvNMBgEgYYPACBAYCwwgAMwVBgFgAMT9BIABDAJzhVmuVpsbC6RpmqSICAkbcT9xhYwFIGQbAdiutZ6/cKHa5llkAATGIIRsG0tCYACMMeKZhI2EkEEgAQLANhICGzASwlgABoGRABAYMAjAPJsBAWAjCQCDwIAEAMIgMAACAQIDgG1JQsYYCWOegxAyBgQ2SMIoFK3l3t6l48ePzWZzSZIA22AQGATmMiFjnk3YSGAABICRZCFjEIABAwYBAvNMAmMABOZ+kmzuZxAAYCMhZIwl2UgAGAshMAhsm8uG9TAMw/7BgXQ9WMiAEFcIAAOSFLG1tXnx0t7mxjyz2VbIttB9991rxXy+6PtuHIfWpsODw1rryROnLl3aszRN0zCsa8Q0jZKOHz++e/GSShmHYWdnexin1ibBOI5SbCzmB4eHtesW83lmZvrS/t5sNtvZ3j5777lpmjY3N8dxdGbXdZK2t7cwCMC2JMyzCCHbIJ27M8eVrn1Qd82N+rOnjn92N6/54Hj48Wlo9F331Kc9rUQ9c82Z1to4Tl0t4zi2Ng3D2PczhUAlwmJ1tJzPuq2trf3DI2xjG9td188X8/VqvVwux2kqEYvFYhzHvf2DjcWilEBazBd2ay2HccrWZrPZMI6LWb8e1tM0HR0enT5zZrGYOy2EADA2mbYtCWQzDGM6hQDAdkQgnDYIJDKNEMJGsh0hJKdtC5AMAsC2AQiBSdtQSwEA2wjAaSmMBWAQIAmwbVsSYBshZFsSGAQIGSOcRhIYA0YCpxWWwCAADOJZzBUyRgLbXAZQeSbxTAIDCMAYIQsAEBhk27IABCCweSbxQALAGAkAAwJJtm1LAsAASDLmudlIGLAkMAAC81wEgLifQTYSgCTAGIMAMADimcQzWQgEBhBqmTfecMOlvUsHB4ezfmYwxiCEbEtgAxYYYwQGgYEUYIwBCYwFaWQMYAMIAIMwkDYIkDAABrC4QmDbNgKDBBhjIQG2AQE2QBpsALATAAEG4YgyTtPe/v51117T1c4kAiNxmcBcYRCZOZ/Pr7/2mr7vc5pABtullIuXLh0dLTPzlltuuffee4f1+tLeXt91/aP6S/t7l/b2ADuH9fro8OjkyZOz2fxxj3/cYrFRSiyXJ57wxCfO5/PFYrGxWFy8cGGxWGxtba2G4djOzp133XX61OkLFy/WWm+4/trHPf4JG4uF8fbWtqT1MMxns4c97KGzvrdBSOIKAYCNbGrl0oWcVrGYl7ufPsXD2u/frtsOus07/ejTjHaUslquzp07t3dp1+ZweXTLLbecO3v24OCg1np0tNzYWCw2NodhkMjWcmqPfsyjnviEJyyXq342O378hCLuufuuRzziEXt7l+69597a1ZOnzly6tOtM0DSOOzvbSJtbW7O+f8atz9jY3FgeLWezWdd3J08cv/UZz5jP5xcv7h4cHT72MY8BIRAYoJS4dOlwHMfrrrt2HMetrU3bILAQYADEZQLAAAYwIASADUKAQVwmAAzCBpAAEDKAeQAbhHgmgwAwgDEgxGUGMEiAwCCexQYMAjJbrd3ZS+c2Fovtne3WmhAG8S8QQgBId91x24mTJ9rUJJ7FWAiMhcAASGCek20hhI0ACWwDSFwmAIxBAttIABgEAMJGgMA8gI0kbMBYCPFsBkCAwAAGQEgyxmAQGADxLELGAAYBAnOZjQRgWwgB2JQSpRSnpzYZBBgEBvEsNgKDAGEDBkAIGQMCkDEgC4EwyCBsBAYwlsQLIxvJPAeBucxGAgQGQGAbQAAggQEs41KilMhkmiYJEBgAgTGIywQGbEqJzARswIAkKSJCEa1NzgRK6YynYYhSICOKbdsR0aaWdtd1gsyW9nK52ljMDRExTW21Wh0/fsxmuVpl5sbGhp2kp9aihACICNtc1lpDkgFbCGEQz8lO7n6G1kc+cW05dXr4raeVv7on3viRvOT1Wo0WjlKAbAmUWrJlZouIWuvR0bLruggBIPA0NWzjTM9mvVHfdRcuXCgR/ayPCInW3FouFnPbzlQI07IJLVfLxWIBYBSSQGFb0FraKQkAAXZ2XXf27Nnl0fKWW25ar0dJkhCAkDEgZMz9hGwjAIF5FoF5JolnMgYwCCHEs5lnMVcYEDKAhcA2AOIKIQAM4nkYwBhjAaif9c94xm1bW1snjh+bWpOEARBCYHOZucIgYYyptZ4/f0F33fGMkydPTtMkhHg2g8A8mwAwlxmJ52IQgG1JPDcBYAziWWwkhAxgwEaAuEwYMOI5GAAB2BZC2AgQAAbxbAZAPH8G8UA2EgAGQNhcZpAkMGAjQDx/BmHAiGcySALbFkLYSAKEjcAACAzYSABYYAAJ2yBxhSQA24BBgLCRwLYkAyCwjSSwDSABYCxkELa5TBKAQQAYkLEkAIxBYAySsC2EuEJg27aRkGRbCAmnJacFCEASyE5AkiEisiUYKaSI0loDFJLUpgYGJBmwAQziCkkYC9kWGEkABgkAbEe4Tdh0fWSz5GHyvGNKCQyAjSSJTCMkMIYSYdtpAAGSuF/YDQQupdjOtMAgISnTPJMBECApMyUuEyAwzySBMQgbgIgyjuNtt99eSpw8cXIxn9tGEhgwYAQIGwESGAMgnoN5JmEjAWAAxP0krrB5HuaZBAiMARBgG5AEgHk28ZxsA+BQ7B8c7F66FBE33XhDKcW2JJ7JIJ5JYAADIK4opZw7f1533XHbiZMn2jRJAtmWwIBRgHkmYSMwiAeSZFsAMgaBAcAgrpCEDVhgAHGFQQZAYB5AYASAeTZhG0sCCWwjARhkEBjAQoBtCwGI52AQAAYBGITAPJNsSwA2V0g8kJBlDAiMQbxABgEC8wAGcZmFDEjCGHOZjSQAzHMQGBAygEESNmAAxGW2JQAbCRA2wkbCIABsJIF5JoEBDIB4JoO4TGAAZFsCkLC5woCRsLnMgJBB4rnYCBA2gAQAsg2EhLBtEALbPAcZSwIDWIBlIZ4fgW0kJDIBA4AhwDyLEDKAeSYJGwHifsI2CAyAAGQsQAA2lxmEDBLPZPNMAnOFxLMZwBgESNiUUpCyNZ7JBgwACMwVFrIE5jIZBIBBBgEYhI1kGxAACAALjIQNAAYkGQQYBAhsEDIGxGXGIDBIYIxBEjYAQmDAgCTABuyIsMFGAEK2AYMECFuSMQASIJyutZw7f76CAQxCGLABJGEjbAMSCNuSuMzGNhCBDWAZI4zANoAAg2Qn5jLZFhgMEmAQgA1YyDyLzRUWMog0AmwD5jKbKwwYjADLGEAGMEZgg5AE2IBBGGwkZMAGzGVOkHk22cZCSBg7AXOZsC0J2wAIDAIbhGTbIMAACBnAAkxiQHaCEAAGyExJYADEZZJtwAZhA9hIANgGwIAkwDZgCyxhA9gAxiAbSJ5JwsaAkDGABQYwIJwIkEkZA2ADSLLNZTbPZhBgGxAYJHGZDVgAYCNhG0A2OLnCpI0ECAAbZAE2z2RABtJIEjYAGIMAA2kpjbANAEgGY5AAjDHPwQZkwAZAYC4zBgAbZJBBYBswErItABvxXMwVxhgQGAQGG2EkrmitgXkmgQ2AADDYkgwYcAIGIWMMCIy5n20wGAuRIAMIjAFsABsJUKYlDAAWGAAbc1kiYYPAALLBthBOg0HIJAiBgbTBQjZtaoqQBICNuUziMiPMZQZhjDE2ABWEkQTYgCQDQogkJQnZRkiSZBuotYQCABsJEBjE82GQARCAQfwLDAKwkQAwCAAEBjAGCduAJACDsJEAMIj7GQthA0gGARgAgUEANs8iDDLPJEAANhLYIARgI0AANhIYBAYBYBAYy1jcT2AQIGzAkngWgwBsJDCAAZB4PgySMUZgnknYPJskDALAIGwACcA2IDBXiMsknskAxjwHgUESNpcZBJZkIzAAAsAgAWAbAIG5QgLEFQaBDVjIIPEstnk2gUEAGEDCIGTARoAAbJ6LwDyQkWSQwDaABADCRtxP2OaZBIABEPcTGMAgnsk2EgiMwEjCgLnMXCbJRgCYK8wVtpGEkAEMAsDYkszzIa4QAmMQgEHGPJsExiAwGAQAkrABEMIGAIQNEljGAoMQD2AAAwLzLAZhIQMYAAl7ahMAAiMwz0FgkHgmgwCkCgaMsQRgLrONEOIKcYVtQNL58xfWw1oKgcEYEM8iMPcTQthcZgyAhEFgEIDAXGHABgzi+REgbLBByBgESGAQzyIwYIxBgHgAAQLEczDGABYCDGAAAyBAkng22wgMAmMAwAAIISTANpdJYJ7FGCQuExgkAAxgAAMgAWAQIAwCDNgA2NxPEgLAPItBgIRtECAwBkkStkEABnE/Y4wxzyYAEM9mDCAJYfNMNpK4n8BcYe5nI3E/AQIEthEA5pkEgA1CPJMxSDyAeBYhALDNMxlkDALAGMRlAmNAEgaMxLMJDAKDJGGDbQDEAwgQNiBhS+IKAzaAADAIDIAA8UwG2cZGEtgGkCQeQDIGMAIDRgIZk+a5CIF5AANI4tkMMsYg7icJzLMYxPNhjAGjEM9mwDZIArAlDEKAQWA862cnThzPtGQQGAFgIQMyIGMAAwIDmApIABIgMAZAABhE2hIABgAhZrNZKUUSYMBGAsSz2AjAlsT9DIAAMAbxnAQIjDEAEgAGQGAAhMCAQYgrBAbMFRKAQcYYsAFJSNg8kIQBI0AAGPNswuYy80wCBAZxhcAAkp0YAGEjkAQgMM9BADaAeAAJGwQgYwziMgmMASFjDIDAIAAM2CAJSeZ+BgADCIy5wgAghcCADYB4JiMw5gFsSYABDGCQhEGAAYMsZBDPQwKwAQSWsQQGAMyzGCQAbC6zJBtA4rkYBAaBQQBCBjCAARshxBUCAxiDxPNhAMQDCAwSgG0b8UyWBGAQz0niWQyAjHluEsZYPJOxEMgYgxAPIDAGCQxgAMQVNtgIkIQBkEE8kwEsBIAAsAEsxBXCRmAAxDMZJDAPZIwBJBmwESAAG0DiMgmDDGAjYbuUYgNgkHkmgUGAMYgrBIABDBUEgGyEEYhnMghAPCfZZnNzQ5IB8xwEgJGwETIGJNmWAIEBG0DIMg8gMGAkAIPAAMhcYZAAAWAewEYCAPFsBgFgAASAbSQBNmAJEAAG8UzmMoPAIAABYAPmCgHiORiDAAkMYBkjMCDJGMCAwAASIAAMgAAwyJjLBCAAG0DimQwCwEYCwCAMAiOwAAkbMGAQAtsgBIABg8AAAgvxTDYSGAMgQBgwgIQB80xCAALbABKXCcA2kgCDuMy2AMkYI2FzhcA8mwRgGxAySFxhI7AQAAbxbAbMcxDCtgAERuIygQGDkDEgZIwRWDyTQWCelwABGDAIEDZCPJO5zJIMAsBcZp5JYIOQsRAYAAwCENhGwjyQBAAYMGCQBMg2lwkhwAZxhcAgY0CIZzPIGBAyxgAIgQFzhQTIGJAxBvEAEoBBCIEBbHOF3TIlbMSzGGEsnkVgLhMCJFUeSDybQTyTwACIZ8mW3M88i0EAGCQwzyTxLDbPJDDPJMQDGITNZQbxbBYygCXZAALzTJKNBBgAAdiAJRnEc7ABJGwACcDmASQZc4VBwrYkjAEMgCQwBgHCBpCwkcAAxpIwCMAGEADGAEiAAAziuRjE/WwkABsJG0ACsJEAbCQeyEbCIAMYAyABwgaQwBiDwCCeRWDAPJPAIEBgAHOZJMBGwgYMEiAAG0ACwBgkABsJW2DuJ2EDFiDZCMwDGQABYCSBjYSNxBU2gIQNABZC2FxmQJKNAEBgDBKYZzFIYIxBErZBYBAgMIABkMQVNoDAPJuEzQNJABiEMQYECBAABgAjGbB5JgECA5jLhABjSYBtIWSQDQAGiQcQAGBzhQSAAcxzMSAwVwgAg7ifADCAARCYyyTxbAKDwDZgIfE8DELcz0aAsBGXIVElcZnEZQIDSMLmfuI5CWwsJAnsNALARkLCRiEAAyAJpwGwkAFbko0kwLbEMwkbCcBGYCwEgBACW4AkMCCwkQCFhG1JwgYsAQICGWxLXCEJDEiAADBIAgziCgmQENiWAkAWwiCwwEiyEc8kAHGZAIRAyCBssCQuE+KZBAaEwAAIAINAPJORANsSIMkgnsmAQRIABgGSQWABAhDCQgYAiWeSxBXCgBCAjWQbIa6QuJ8ACwGyLQkMhAQCG7AQEhgwgBCAjCUAyVgSxlwmAcICSwAYAQKwBYjLJC6TACQBYEBCyDYYgcVlkmwLIQCJB5IAIQMgjGSeSQKMFLYlcT8ByAawkQAkbBACENjGRgAYJAAbCYRtIWMJG4MAQAC2sG1LIQECgxCyQUDaAmPAmUgYhI1AAiRkDICwDdiSbEuyLQkADBLYtqUAI2EBBkDifgHGQoABGzDIgFPCloSNhEEIbBsshbCFbSFjSRgEgHg+bMRlBmwqYHOZsAHEZTYvmB2lSJJorWF1XZ3aJKQSmc0GZLuUsLEBbHddbS0RtksUSc5UxDRN4K7r2jQBpRanJbVsTnddP02jAAMgMBb3M2AjSTKAlSAQ2IB5FmMZkASAQcgYQJJtLpMQgAxgDDJgA2DASAAYsC0BAiOukABsJAmDjG2EEQBCCMAgMAACgwQGg8AAGGOusAQIDEji2QwCSwABBjAABtkSGEnYgEFgDGAhnsU2gCQEWMi2JEASz8nmCgEILAEWAAawJGwEGEACQAA2WALAQkY2z49BAAIEBoEshEE8kI0wYCHAIJBkDBKAbTASVxgEgLnCtgQIACOeRQKwwRaAsC0EWMgSBoHAAEgCA2BA4gEMAkkGbNdSbJDsLCUyEyMp3aRSSrEzIqZpBAFSSLSWEjYh9bVM0yQAatdPrZVaWmuzvh/H0TZgKKVmpp0Ima7rpzZ1Xc20FFObIsKZpZTM7Ptqe5paKdGmFjUyExQRrU08k6UwiQEsai22QSVCEZkJtNZsC0ICUACC1poBJJnLjIVAYJ7FAAiMkDHGILCzfPzHfex8PrMTkAABCAADIJ6HI+Ls+fMHh0f7+wddra1Nz3jGraV2Y2tPevKTjx071s96ZwLLoyOEBHYt5SlPe7qhpSH2Dw+f/vRbFXr60562WMxn/ewpT3nK5uZG13VPecrTEt9x551d1y02Fk976tM2Nha19tiIZ5EAARiBhQwCIQSSAPNAEgYhCQwCcz8BgHkm8WzifsJYILCEEAghBIhnMQiQJGyEEJYACQssAWAQQgjLsiSBeSaBJEBIEhKSQJKRQGCuMAgQzyQMAgDZkgziChuEABAGgQRgWxJGQgKwkQAhAAyAAAE2EhKAJIRBRhIIAWCezSCeySAAgwSAQVxhEM8mhMwVAkAgbCQJEPcTAAgQIAmQJGPbAEiAkITAAktCPJNAICRhECCeTQgAI5BAGBCAAHGFDOIBxPNjwJK4ItPz+expT7/10t6eoO/7+86enVq7++67di/tXnPmzOHh4X33nW2Zt99+x5kzZ7CB1qb1alVLwY7QOLWnPu1pXe2mNkWUpz391tNnrrnr7rv7bvb4xz9hY2PRdZ1tidV6VUqRAii1PPFJT+r62d1332Nzx513zfr+iU98ohTPuO22vu/vvOvuS3v78/n8vvvujVKe/OSnzheLYRjuuP2OjY2Nvu8zU9J6vcIoBPSz2ROe8MRhGNo03Xf27D333mtz5513zWaz1qZLu5fuvOuulu38ufPjNJ07e+7kyZOZTQgJI0kIQAIwCCGEsRACyQYBRMTRchm2QTyLjHgmgQAwWDyTbEqt99xz79Oe9vQ777prGFbLw4O//tu/O1ouDw+P5rNFKQVk03fdH/3xn128eLFI6YwSly5dunDh4r33nT08Ojp79ty58xfuve/sXXffExEt86//5m/39vamcbjn3nvPnj2/u3upn81Af/f3f7976VIpYcwVQsIGG0AgCRSSuMxgzPMwIITBgHkAAwgJgbhMIAMIBIABGUAyMs8kDJgHMmAAgTFGBrCREQbAPJsQwjYAArAB25gHMLYTbAnAXCYuMwhjGwSAAAkMGAwGwDYAlgQSl0myjQBsbEuAwFwmiWcyRjyLjYUEgDEYABCIZxKAjTH3k8QVAhACYdvmCgMgIZ5JXCHAMuIKg9M2IAlABsDGgCRJEgjbGCEJhA2AwVxhAyAAMIhnMgZAPIuMDGBjMJhnsw2AAfFAAjASgG0bREScO3deijvuvGO9Wj/hCU98+tOfsbVzbDabl1KGcby4e3F/f/+OO+8cx1GihC5cuPB7v/+HtdbMrF13eHS0XA1W3HPf2aPl+q677r506dIf/MEfHC2P/vpv/ubee+/rarVdu+73f/8Pjo6OIsJ2rfX8hQt7e/vnz184Ojo6e+7shYsX5xsbinLPvfdJ+r3f+/0nPOEJ589f+Iu//OtSa9d3u5f27rr77qOjZdf3tltrs1n/Z3/253fdfVfXdbYjQhEQ5y5cuOeee37nt3/n7Nmz99x77+Hh0dmz5/YODg4OD1Hcc9+9y9XqGbffhsSzGTBXGEBgbAOhQFxmCYEQIIXuuuO2EydOtNYQAhAYg3g2A0LmfqXU3d2LhweH2zs7s76PEnt7+33fd11tLWezXgowIMm2baCUcu78ua72q/V6c2Oj1Hrh/PmTJ0/u7x8cO7Yzn83uufee7a2tjY3FPffeN5vNNzY2+r6T4vz5cxsbG/P5wpkIzLMYBIj7iStkDIYQ5jLzTAKwQQiwkLmfbRAACCHANhIA5jJjIWNZiAcSMsYghBC2AcBGAgMgAAwChI14NhsJsC0JBAYBYBuJ+wlAYMAACBAYc4UBEJJscz8hYwxgkAAM4gUzAAIEBmwECMC2JAyAADAAEhjAAAhZxohnEQLbAAgAg3gAgQEQNuI5GCQwgEECYwCEkDGAARDPwQCIZzIIAIMwloV4DgYBYADEczAIAIME5jkJzHMyiGczCECKo6Ojzc3N+86e7bqulmK773vwxsbGxd3do8Ojzc3N/f2DG2+8obUJAEnYloQkuOfee08cP3HhwsUTJ45fvHBxZ2f7aHm0tbW9XC5ns9nW1lbLFpKkzARs11rvO3t2NpvPuk6h8+fOLzYWfT/r+v7cufMnT5y4cOHCbD5bLDaGYb2Yz8dxsB1RLl68ePLkycVi0doECmGeKRSHy6NSSrZM596lvWPHju3uXjy2c2zv4OD4sWPL5XJzc2Nvb39za3Nvb+/6665rLQWWhTAA4gqDABuEADCIZymlXLhwUXfd8YyTJ09OU5ME2JZ4DsYgIYSxAGzXWiRltkwDtdR02paUmTaAhI2EEbZErdVpSZlpXEttrUWJ1ppNrSVbZmbtaqYzExtRSnVmZiKeg0EAGMRl4pkMArARlwkM4jKBMQgA20iAMMgYBAgDRjyTARCAwICRZMyzCZsrBIB5JvFMBvFMBkBgDGBJAAZA3E9gAASAAQwSAOaZBOaBDOI5GMQD2UgAGASAQdiWJGSMARAGGcRlArANEs9mEPcTGACBAQyAAGwkMAgh24hnMgACJLCNEBiBQQJkEMYYwAAIDALAPJN4TgYZC/EsBiFkDGCukGQusxEYxPMlZMxzkG1AgHgW20IIDIB4JoO4n7BVlM1dVzMtME6nkDNLqQply1LLOIwIDIC4TDiRuq5rrUVEa1lKZMtSYmqtRElnaynJtsSz2O66znZm2tRaMtO2Ta2ltVZrtZ2ZkrKlhAGotbbWsiUSmMuEDHZGFDBIopTapilKtNZqqS2bpMwspTgdJYZhlACMhQAbCcA2SICwDUjCIAADdq31woWLuuuOZ5w8eXKaJkk8i4UAAxiDAAnM/Wwus5C5wpJsJDBIYACwASRsc5kQYFtS2pIAsBDCtiSb+xmQBAgMGAABYAAECAxgAMT9hA0gABAYCxkEgG0kAAzimSwAGZBkG/NMAvNMAgSAeTZhkAEMgABsAIlnM89BCAG2DRIABvEcDBLYRoDEM9kgns1GAsBcJmSexRgQQhjEA9i2JEAosRA24goJLGNAyDbiOQmMQQIDILBtIQTGIC4T9xPPZJ5NYIwkA5hnEhgECGwDSGCei0EANghsIcSzGQDxfBjEczOIy4QNGCSemwEQL5AxliRkjEGAbEsAtoWMARD3k4RtDGAkITCXCYy4wjYIWyGnFbKRsA0SAEYSYIMA5EwkQGAMAiTSFgIDkpxGkrjCRoC4TAJzhQGbBxIYg8BCthEgAJB4JoMAMFdYiMuMQUKWMQJjgV1rvXDhYgUBIBsBAkAWmMskYRAAAoOAwJZA2FwmCRACkMFcZkAIMCIQlxkkgVEII4QEBiQBAsRl4n5pS0JgAIHFM9kIAIHBIAAwD2QjkDHIIEASIEAYwEKWDTJImUhCBoQAy1xhkAGDeABxmZC5wkg8L2MhhEHIGDAIAMxlAvMsAgxI3M9cFpJtIQNY4jIByJgrJGwhhEFgBMZIAgxI4jJjARgJDAA2krEAY8RzMMgAAswVNiBJCDCWAGwEGASYBzIIMAYwBgEgAAyAbYERIDCAARAPILAEBgnASDIGEJhnMohnE8+HwCDAAEIAIDDPJjDPZBDPZCEDCCFMkpJ4JosrJAFgCRD3EzaSuEw8m8BGPIsIZCRAIZBkQAowlwkDIGyDsEIgbEASl0kKLrNAYAIBIGQs8QA2EhgDIGQZAAnAliRkAEk8iw0IjAEwBgFgEAIDCIENMmBbkpAxBgieyQgEBnOZxBUGwNgCDDbCAgxGkpDAYJCxAcAGJCQAEMZgMMa2jQEjQAYDIK4Qz2QAECCJZzE2z2IAhEAIAHOFBQLAIACZy8wzGWywbQwY28YgAIlnMTYGMLYBDCAQQuKBbK4wkmzzLAZASAIM2NgARuKZBIAB8UwCMAAGBObZDBhLABgQGAECY2FswNggnkUIwDZX2BgAm/vJCASyAWPzAEIgxLPYBjDGCMDY2BgjJAAMGEAIAwgB2BgACbATAIO5X8hIGDAGg0AAGAAB5lkMgLCNeSYJwDwvIZ6XAGwQgG0MBsA8m3gm8Wwyz0kSBoEAkAAwlwmQeDYjwBgMgAEQgMT9BIAxD2CeyQAIAGzAEhIIwDYCcT/ZxgiBwICQJMA8iyQJQDa2MTbYAoQkwAYBArCMASwbGwljGwABkkAgJMBcYS6zbSAUGLAkCSBsc5m4TCABxgbMMxmEbQsDaRDPRSABiCskADDPw1hYQkIYYYMBgXkuAgzmgQTCYANgJAmBwQACcYUQl0niMgsECGwDGLARAgMQkgAEgMGYZzMISQjEFbYxIDAYhLhCEiDJtm0MwhhzhUASApDEAwlkjBAPZC4zCAQC2QAY24AEGAADCGTEM0kAWDyLbSSukBAISeJ+woC4nyQAgQDb2DyLkYRBSAJAXCYJSNsASFxhjLjMAAgJCYyRxBUGc4V5JhsEQggAEEI8i0EgnkmYZzEGAQBCmCuMAduAMQ8gkIWRBAgJARjMczO2bdvGCAG2jQEEFhaADQC2eSbzQAZjAcYgnsXGBsQVAvEskngmCWEbAUI8BwEYAIN5FmNkAwhk85xsYwSWjEBIIACQDVgyCGyMLABMAhIgjAQCg7CxsQEBGAECIyQEGBsAG4NxcD+bK2xzmQ3imcQVMpIQYBCAzLMZg7lMBjA2VxgJDCAJiSsUgAQCzAMYAIwRIARgnkVCQggBBkA8kLnMGMAYAIFsbAAJAIPAYAkBNkhgbK4QxrYBAyCeRYABLJ5J4lnSacxlkhCShBDGiGezbAMIEAgAIRsD2AACgcSzGcwV4jIZgXgm80zimQwGQAAIIRkAGQwYYwAEBgNgY0AIDEhcJgQC80wCQGDuZ55FEkhgMAjbGAxgQCCBwQACxBWSBeZ+Rojnw5jLbANCGEAACDBXGGMQgG3EsxgLYYQwzyaMuUySsTECYZ5JSAhASJIkCWEMSJLEFTIYQNgAkgBjLrOxsUEgZJAQAOaZhAQ2mMuEACRJNiAQ2BghDCBjbPNMlkAASEhgjAEQkgCDwSCwDQgAc4UBDBgMAAZjANs8izGAJEC2EQAGISwAJMBcZu4nEFdIXGZAKCRsAMk2GInLJAGYBxAIMM9kDAkGA7JBIC6zAISEARAAEuaBbNvYPJPBYAFCQghsAIxBAJgrbJv7CWNjrjDPYp5FYLCExGUCJAAEAoxBgLmfEEaWJEACMJcZ24AkSWAbACME2EjiMiHbGNsAIIvLbGMjW9hcZjAA5lkkrjDiCoNBPJsAsG0wiGcSAOZ+NiBjnk0AGPNchHhOxhiDbWxsnk1CGIwN4llsYy4zgJGEACQhEIABBOY52QKBBQgMCLAF2AaMeQ7CSJJkQADmMoEAMJLMZcYYEAIAIQTCGPEsQogrbGMwkiTAXGZsbNs2/xIJSYB4NklcJiEhAeJ+QgACwAAgA4CxMRbCtgGDwSAQCLDBICRhBICNzWUGgwABYMz9DBgQAOYKG0ACywCIZxIIjASAwUbIiCssENhYYBIASTyLADAgjG2exVwGOMwz2ZIwz2IMIACEuJ9tLjNGIBAIsIQknoMBxAMYCTDmMgkJMEbIAgEGBLYBSYARD2DbBgTmMtuALAAwGAM2iMvEAxkMNhYghGVbgGSbKwTGmGcTYO4nJAFg27Z4JtvGSGAwIAQI8UC2MZKQjDGSQDwHYQRgDIBI2wYAYUASSNxPEgabK2whABCSJIlnM8jGICQJgwABYEASiGcxiGeSEBgMAmwbgZAAMBhAEuKZBBLPJCEQBhCAeSaBjMCSAUkgEBIYKwQCxHMxdhpAADYA4lkMgLARzyQEGGMADAAI2eYK8wACEAjbtiTxTAIkScI8B4OxjQGBsGwbG/NMBgSAALCxzRXGGPNMAgALsJBC2KQN4n4GMJjLJBAYDGAAxHMxAiGeSTyTMaCQQIhnEgBCSMI8ByEkhEACkEA2NghAQmAQQoB5LkKBJB5ISAKAwFwmgQFhGwMgMM9mbNuWBGCEQDynzLSNASEBGIx5IAOyMJgHMhZgEAbbiAcwAsAAkgDEc5IkDEZCEgCSxRVCCAQgEMaWAQOywAhbCGMDIAAEwjYYCIkrDDbmfkZgbAAkWQACG5CwwWAAhCQEBpAlBIAxIElCEgohAQiQQCABgJHBtrABEABWCMkGQEIIMAbbYLCQEACWEBiDJS4zADK2LQCEhCSBeCYDhBBCXGEwzyaezQgBwuYKG4NBPAdxmXg2GzA2GEA2BiSemyQkATZGYIRBXCaJywQIAIHAYBA2z2YkcYUwBhBgJCEAYxIDYLB5FvFsBkBIQhiDjTGyEIAsLMAGYwAkJJ7NIDDPQSADBoEkYWQEIAMCwAAggQAQzyQkMJgHMs9kBAgkgbENxiAkMFcYYwSAxf2MAUmAucISEhgAYyMBBjAYGwBxhW1jIR7ANgAEGAAD2AJJiGcSIBtjhJAkLrPAYPNARpIkBBgbQCDEFcI8k4RAYAAhxDNJgABhzGU2zyYQQiHEAxjAgITE/SQjAwJsMJj7SRJXGEAACIQkicsEAgAhALDNFQJxhRBCCHE/GxtAiCskLACQQFwmAAnEZUICbBvbtm0bBAIbECAbjBAABgFgALANSALANgbEA4jnZPPcbAAEGAMGhDGyJBAAyADGgAEhSVwmLjP3M8bYgLnCAMg8B4PBYJ7JYAkESAgwAELcTwACI2wAEAgwgLnMNs8mAAMgAIzEFUKI52AewLYBhBDCgJDAPH8Cg8GAAQyAEMIYc4VAXGEAgZAQiOfD3E8IMEgWBkDiWYzBCYB4JoOxjUA8mwEQkrC5QiDxbBYGwAACBIAlY57Ftm1APCeBBUhgMM8kJAAMBgPCIK6wzTNhE1KAQRZIWIAECIPBFgIBSICNDTbiX0VIWJIQAOYySRjEA5hnkixeAGMjDAgEQhKAwWAABBKAAGPAgAGBuMLCYDBCYAxgDAKwbUAAAgCBeCZhEIAxIC4TCAAhnkkIBBJCwrYx4n5GkhH3s5B4FgmEQSAAG0CYZxKAeSYBYDDPZEkSYBAANjaAAJAE5gqb+xnMsxkbhAHAAMYYAwhJAMbmMgsEAmEQAAJh80wCxANIPJAQCARyAgiMgZAkIUvimQQWAgkAMDYCg8FgEBgAAcYAGAABYBCAbR7IIADbtgEEBnOFjBCAADCYZxMAAoHAAAjEFRIIAItnMTK2sbG5wjyLEGABgMFcZmwsSZIADAgAWTwXYczzEgDGtiSQEAYbEBICzBUCAWAAZEA8k0E8gBEYDICMeA4SiGcRADaABcJI4pkwDgkhMCAAAzYAAoGQEFcYI5CQhEEAWOJ+5lnEZUYAGBtZNgZxP2NzP3OZeCYjANsS95OQEEgYcZnBgME8FxvAPJAAgwEhCQQCYRDiMiEwgJDABoSEwNgABkAC8Uwy5n5CAEIAMgaDwWAEAgwIYQFOMJcZgTAAQoBtG7AECCFxmSVJMuaZxLMJEALZxoDAIAAQFs8iY4yQuEziOQkZsEE2gCwEgBAChDAgLAwymCsEiPtJXCYADAgJgWyeRZIxNliAEBgDINvYGIwQYAwyYAMYAIEBLAwIAHGFEIBAPJNAABjEFUIYYy4TEuKZjLhCwjhtrhAvhCRASEgIZAAhFBbiCgkhASAADAIJJASAxDPZxjyLbduAEGBAQiCeg5EkiWcSIJ5Nlm1sY7AQYNs2FkhIAAaEhHgOQjwfAoGxDQIQCBAYDGCeSSAQYDACwFyGpDAYQAIMAsAAIJAQMlgIg0ACARLPJIMABOJZzGXCICQAZAmBuUwIEFcIwBJIAgEgjBCXCYGNjcHmCvNMxg4kBMICMFcIgQTigWRsDOIygTFCkgEQEhKWBLJtDEJgIcBg7icAgYRAtkEgY8RlEkgSgEBcZlAARggEAMYGBDIGIyEBtsEgEFfYgBAgJAwGAWDAIAAZYQBhnknGgAADgQAjADAAEgKEwAIJYTDIMgASGIzBCgkkkABxhQGwLRCAucwCSUjGxmCBuEK2AQSAEAKBMGCQwWBsDBLiCoGQBAIQkgQSz0kGJJ4vIa6QMUISCEAgnkkhxGU2GCm4TAjx/IgrjDHYGBsAAxiEEAjxTAIEIIHAwoBBAhAAkhAA5lmMARAgIQyAAAyAAAkJAQKQQUhIyDICgZFlDCAkSQgbG3OZMZj7SZJ4bubZJEnYXCYEBgAhBAYQ4goBEpcJECBFFbKNbQCEbCTAAMbcz0ZgkDGAAXGFbYQNAiMB2IAl2RgLjA0CgwBhGzBgJCOw02DEFTZGyELYRtgWQtgAAoSNADC2AUvCABiEMcZgECAuMwaBzWWWARtsg4QxBkC2ATDCgDG2JAyyjcAylxlsBGAMgG0AA2AbsISNwJjLbMCAQQLMA9gWIGwuMyBhg8C2kTC2kQDzLLbBgBAABgzCGLAx5n4GG0BgACMAYxsB4grbEgC2AQwYbAMSGMBgkLABJNsIEBiDQZjLbCRsDBJgm2cS2ICNAIEBcz+DZBsAYQMgYxCAbQCBMSBkjAEJGwnAthCAAAwYMPczlgBsrhA2GBASgG1A2ICwkQBsCwHIXCEwFgDiChsEto2EE4lnsg1gAcLGGMAgDDYSGGMQRjyTZS7LtATGJACSQWBbABjLNmAEgDFIYBDGGAAwBgwSGARgY5AAbMAABvFsAgNGsg0gY0BgrhDGXGESS9gWAieAhcBOC2pmm836Yb1WBA8gAAyAwAgMCMwVAoQNAhDYIAAZA+KZDBjEFQKDELKNwAjMcxIy5jKBARCYywwCwCAJGwTm+RMYACFjEBiQZCPMZeaBBIB5AAEIDBgEIAMYAIElABuQAGwAhABjIWMQAJZkA5aweRaBASTMZeYFkDBgAAQAAjCAZJvLBEjYgAXmASRsnoOQMc9BwhZYYEm2eQCBARCYZxMABkCABMYyBkm2wUIIjCUwSBhjLhOADMKAhYxBABgAIbABgQEkbJ5FYF4kAvPCCMz9DIB4FvEczAsjsMAA4gohbAsMgAAwAAgZ8zwM4rkZCfNsQsaAwAjMAwgZc4URIEAIbBAANggAg7hCYAMgAAwC80wC88IIzLMJQGAQ2DyTwDwnAyAA233fG+q3f+d3f8D7vreNAUlcITBgIyGEMMbcT2AbMM8kiX+RENg8k21AEmADBgBJNsIGAAMgACTMMwlxPwmQMRgD2DYSIAnAgAEkgQEQwiBbEmADBgCDAIEFBmyDBEgAMhZOc4V4ICEEBpBkjM0zCZCwuUyAZNuAAcBcJgkJAwYk8QC2MQYJQAiBQQA2YAAhC2FjW+IKAWAASdg2CISMjYW4zCBkjAEkrrABJJ4/gwBsA5K4zEY8m8Uz2YAAhAAwgEHiMoEBIQTG2CAeSGAeyBgDIIRAEpfZBiSBbTAGhAQGhMCAAZCEbdsACFmI52QbSRIGjEE8kAEQSLJtwJYEgMAACAwIIQCDeDYbBIAN2AASQgjbXCFhcz9JXGbbNiCJ58cg7iewwDwng7ifQQBI2DybJABsgwCEeCbbABgkhAAbbNuI+0lggZEAhAxgLpOweRZJEfHt3/Fd/wixwKWjfDJO3wAAAABJRU5ErkJggg==",
"media_type": "image/png"
}
}
]
Read (E:/a327ex/RICOCHET/reference/02 - GENERAL UI ELEMENTS .png)
[
{
"type": "image",
"source": {
"type": "base64",
"data": "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",
"media_type": "image/png"
}
}
]
The RICOCHET templates page confirms the standard layouts (HUD, shop, pause, settings, results, etc.). Here's my concrete plan.
Design brief — Chunk 7f: ui_modal + 3 reference screens
ui_modal (→ widgets.lua, the one real widget)
A scrim + centered panel + buttons. opts: title, body (string or lines), buttons (array of {label, variant, value}), id, width? (default ~240), dismiss_on_scrim? (default true), edition?. Returns { result } — the clicked button's value, or 'dismiss' on an outside click, else nil. Auto-sizes height to content, centers on screen.
Input capture — the honest immediate-mode mechanism: a global ui_input_locked, checked by one new line in ui_claim_hot (if ui_input_locked then return end). The contract: the caller raises ui_input_locked = modal_open before drawing the screen behind the modal, so background widgets go inert; ui_modal lowers it as its first act, so its own buttons (drawn last, on top) work normally. Dismiss = a mouse press outside the panel rect. Scrim = a full-screen translucent dark rect (drawn raw, like the slot's disabled dimmer).
Three reference composition pages (no new widgets — pure assembly)
page_hud — in-game overlay: HP + MP bars stacked top-left (with labels); score/wave/gold chips (ui_label) top-right; a row of ~5 ability ui_slots bottom-center with keybind labels; center left empty (the play area).
page_shop — SHOP title top-center, gold chip top-right; a row of 3 ui_cards; bottom bar with a reroll button (secondary) and a leave button (primary). Leave opens a confirm ui_modal ("Leave the shop?" / Cancel · Leave) — this is where the modal is demoed and where input-capture is exercised (the cards behind it go inert).
page_inventory — ui_tabs (items / orbs / relics) top; a 5×4 ui_slot grid on the left; a detail panel on the right (selected item's icon + name + desc + a couple stat lines); selecting a grid slot updates the detail panel.
All three are full-screen (480×270), prepended to the gallery. Spacing/structure is the focus; visual cohesion is your later pass.
Touched files
widgets.lua (ui_modal), state.lua (ui_input_locked global + the ui_claim_hot line), gallery.lua (3 pages + file-local state), CLAUDE.md.
That's 3 new pages + 1 widget — the minimum, since full screens each need their own page. Sound right?
Yes.
Implementing — starting with the input-lock plumbing in state.lua.
Edit (E:/a327ex/attack-template/snkrx/ui/state.lua)
The file E:/a327ex/attack-template/snkrx/ui/state.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/state.lua)
The file E:/a327ex/attack-template/snkrx/ui/state.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the three composite pages in gallery.lua.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/state.lua snkrx/ui/widgets.lua...)
snkrx/ui/state.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
All three files syntax-check. Updating docs.
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
All files syntax-check, docs synced.
What's new:
ui_modal (widgets.lua) — a modal dialog: full-screen translucent scrim + a centered auto-height panel with title / body / button row. Returns { result } (clicked button's value, or 'dismiss' on an outside press). Input capture via the new ui_input_locked global — ui_claim_hot refuses every widget while it's raised; the caller raises it before drawing the screen behind, and ui_modal lowers it for its own buttons.
Three composite reference screens (gallery pages, assembled purely from existing elements — no new widgets):
- HUD — HP/MP bars top-left, boss bar top-center, score/wave/gold chips top-right, a 5-slot ability bar with keybind captions bottom-center.
- Shop —
SHOPtitle + gold chip, a row of 3 ability cards, reroll + leave buttons; leave opens a confirm modal. - Inventory — section tabs, a 5×4 item slot grid, and a detail panel showing the selected item's icon/name/desc/stats.
Gallery now opens on hud (page 1/13).
To test: F4, then [/] across the first three pages:
- hud — check bars/chips/slots are spaced sensibly, ability slots hover.
- shop — hover/select cards; click leave → modal appears. Confirm the cards behind it go inert (can't hover/click them), clicking outside the panel dismisses it, and cancel/leave close it.
- inventory — switch tabs, click grid slots — the detail panel updates to the selected item.
Spacing/structure is the focus here; the visual-cohesion pass is yours later. Let me know what needs adjusting.
You can remove the red dots all over the place on elements, not necessary anymore.
Grep (audit_dot|red_dot|ui_new_editions|ui_is_new_edition)
attack-template\snkrx\ui\primitives.lua:40: ui_audit_dot(r, fill, ed)
attack-template\snkrx\ui\primitives.lua:201: ui_audit_dot(r, opts.bg or charcoal, opts.edition)
attack-template\snkrx\ui\widgets.lua:252: ui_audit_dot(lr, dot_color, ed)
attack-template\snkrx\ui\paint.lua:22: Editions 50..58 (the chrome greys) are flagged in ui_new_editions —
attack-template\snkrx\ui\paint.lua:44:ui_new_editions = {}
attack-template\snkrx\ui\paint.lua:45:for e = 50, 58 do ui_new_editions[e] = true end
attack-template\snkrx\ui\paint.lua:54:-- ui_is_new_edition(ed) -> bool — true for a newly-created chrome edition.
attack-template\snkrx\ui\paint.lua:55:function ui_is_new_edition(ed)
attack-template\snkrx\ui\paint.lua:56: return ui_new_editions[ed] == true
attack-template\snkrx\ui\paint.lua:111: ui_red_dot(rect) — a 4px flat red marker at rect's top-right.
attack-template\snkrx\ui\paint.lua:112: ui_audit_dot(rect, color, override)
attack-template\snkrx\ui\paint.lua:116: Box widgets (panel, button, label) call ui_audit_dot on their fill
attack-template\snkrx\ui\paint.lua:123:function ui_red_dot(rect)
attack-template\snkrx\ui\paint.lua:128:function ui_audit_dot(rect, color, override)
attack-template\snkrx\ui\paint.lua:129: if ui_is_new_edition(ui_edition_for(color, override)) then
attack-template\snkrx\ui\paint.lua:130: ui_red_dot(rect)
Removing the audit-dot machinery entirely — calls + the now-dead functions.
Edit (E:/a327ex/attack-template/snkrx/ui/paint.lua)
The file E:/a327ex/attack-template/snkrx/ui/paint.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/paint.lua)
The file E:/a327ex/attack-template/snkrx/ui/paint.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/paint.lua)
The file E:/a327ex/attack-template/snkrx/ui/paint.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/paint.lua)
The file E:/a327ex/attack-template/snkrx/ui/paint.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/paint.lua snkrx/ui/primitives....)
snkrx/ui/paint.lua OK
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
---leftover refs---
none
Bash (grep -niE 'red.dot|red audit|audit dot|new_edition|ui_new_edition' E:/a327ex/att...)
636:- **Red audit dots:** the chrome editions (50..58) are flagged "new"
637: in `ui_new_editions`; `ui_panel` / `ui_label` / `ui_button` draw a
638: small flat red dot top-right when their fill resolves to one — an
728: ├── paint.lua # edition-backed coloring (draw wrappers + red dots)
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
624 - `paint.lua` holds `ui_color_edition` (token → edition) and the
625 `ui_rrect` / `ui_rect` / `ui_glyph_text` draw wrappers that bracket
626 each draw with `edition_set`. Widgets go through these, never raw
627 `layer_*` for colored draws.
628 - Edition resolution (`ui_edition_for`): global override → per-element
629 `opts.edition` → the token table. Every widget accepts `opts.edition`.
630 - `ui_global_edition` is the gallery's preview override — it cycles
631 only colour-PRESERVING editions: per-color / dynamic (23) /
632 palette-cycle (24) / polychrome (12). Hue-locked editions are
633 excluded from the UI — they force one hue and erase the colour
634 semantics the UI depends on.
635 - `ui_field_scale` / `ui_dither` tune shimmer density and dither.
636 - **Red audit dots:** the chrome editions (50..58) are flagged "new"
637 in `ui_new_editions`; `ui_panel` / `ui_label` / `ui_button` draw a
638 small flat red dot top-right when their fill resolves to one — an
639 audit of the invented per-color table. Dots show only in per-color
640 mode (a global override resolves to a non-chrome edition).
641
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
All audit-dot machinery removed — ui_red_dot, ui_audit_dot, ui_new_editions, ui_is_new_edition deleted from paint.lua, the calls dropped from ui_panel / ui_label / ui_button, stale docblock mentions cleaned up in all three files + CLAUDE.md. Syntax-checks clean, no leftover references.
To test: F4 — the small red dots on the top-right corner of panels, labels, buttons (and slots) are gone across every page.
[Pasted image/webp]
[Pasted image/webp]
[Pasted image/webp]
[Pasted image/webp]
I just uploaded 4 images to you. Try to create these 4 with our existing elements. You can use more than 4 screens for this. Don't worry about matching them visually, just logically. Make sure that the elements you create have unique names I can refer to later because I'll ask for edits on them and from those edits we'll decide how their final form should be in the full generalizable API.
I've studied all four sheets. They're a comprehensive pixel-game UI kit — and they're a superset of what we've built. Most of it maps onto existing elements; a handful are genuinely new. Here's the survey and plan.
What maps to existing elements
panels, buttons (+states), labels, rich-text tags, item-icon tiles, slot states, inventory grids, progress/health bars, slider, tabs, segmented controls (= ui_tabs), checkbox, radio, text input, dividers, list/table rows, info card (≈ ui_tooltip), item cards, drag-drop targets, HUD/shop composites. All reusable as-is or with minor params.
New elements I'd create (each gets a unique ui_* name)
ui_badge— a small solid-color uppercase pill. Covers sheet 2's NEW/HOT/PRO/VIP/SALE badges and sheet 3's new/hot/sale/rare/quest/event pill labels.ui_tag— an outlined chip: colored icon glyph + label (magic / ranged / aoe / unique / binds…).ui_stat_chip— a compact icon + value readout (XP +25, gold 120, lvl 7, dur 64/100, slots 18/30) — sheet 2's utility chips and sheet 3's data badges.ui_pips— a row of filled/empty dots for tiered progress (tier ●●●○○ on sheet 4's skillset).ui_icon_button— a square icon-only button (the small play/save/x glyph buttons on sheet 2).
Extensions to existing elements (no new name, just params)
ui_divider→ astyleparam: thick / dotted / dashed / double.ui_panel→ coloredvariantconvenience (primary/warning/success/danger — currently doable viaborder/bg).ui_slot→targetgains a'partial'(orange) state + a locked-drag visual.
Approach
Recreate the sheets as gallery pages one sheet at a time (likely ~1–2 gallery pages per sheet, so 5–8 total), reusing existing elements and building the new named ones as the sheet that needs them comes up. After each sheet you review, request edits on named elements, and we lock their final API form. Logical fidelity over visual — as you said.
Two questions before I start:
AskUserQuestion
Your questions have been answered: "Which sheet should I recreate first?"="Create all of them at once.", "How should the new elements (ui_badge, ui_tag, etc.) be built?"="Create elements first then the sheet, but don't give me a turn in between, do it all at once,.". You can now continue with these answers in mind.
The user wants the whole build at once. Executing — new elements first, then the sheet pages. Starting with primitives.lua.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
All syntax-check. Updating docs.
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
All four sheets are now covered by the gallery — new named elements built first, then the screens assembled. Syntax-checks clean, docs synced.
New elements (the names to refer to for edits)
| Name | What it is |
|---|---|
ui_badge |
Solid-color pill marker — sheet 2's NEW/HOT/PRO/VIP/SALE and sheet 3's rarity pill labels. |
ui_tag |
Outlined chip: colored icon glyph + label (magic / ranged / aoe / unique / binds). |
ui_stat_chip |
Compact icon + label + value readout (gold 120, lvl 7, dur 64/100). |
ui_pips |
A row of filled/empty progress dots (tier ●●●○○). |
ui_icon_button |
Square glyph-only button — ui_button with a glyph label, full juice + variants. |
ui_divider (extended) |
New style: thin / thick / dotted / dashed / double. |
ui_slot (extended) |
target gains 'partial' (orange drag ring). |
Panel variants (primary/warning/success/danger) are just ui_panel with a colored border — no new widget needed.
New gallery pages (4)
badges— badges, pill labels, tags, stat chips, pips.chrome— divider styles, panel variants, icon buttons, drag-target states.skillset— composite: ability slot column + a detail panel with tags, stats, tiered pip rows (sheet 4's compose screen).pause— composite: compact status strip, pause menu, status-effects panel, minimap (sheet 4).
The rest of the 4 sheets — typography, slots, buttons, form controls, cards, HUD, shop, inventory, list rows, item cards — was already covered by the existing 13 pages. Gallery is now 17 pages, opening on badges.
To test: F4, page with [/] through badges, chrome, skillset, pause (pages 1–4). Check each new element reads logically and is spaced sensibly. Then tell me which named elements need edits — we'll refine those into their final API form.
Let's work on elements one by one. The main throughline we need to fix is that all elements need to look cohesively thick. One line borders = out. Either thick borders or no borders at all, negative space used well, like with the [ ] on the tags. Let's start with the badges, where are those supposed to be used? Are they like tags inside a card or similar?
Good throughline — let me answer the placement question first, then propose how badges should look under "thick / no thin border."
Where badges live
Badges are status / promo markers that ride on other elements, almost never standalone. Three patterns:
- On cards — a "NEW" / "SALE" badge pinned to a shop card's corner; a "RARE" / "LEGENDARY" rarity pill on an item card.
- Inline with a title — "EQUIPPED" / "LOCKED" next to an ability name in a detail panel (exactly how
EQUIPPEDis used on theskillsetpage right now). - On list rows / tabs — a small count badge ("3") next to a tab label or a row item.
Distinct from the other small-text elements:
ui_tag— category (magic / ranged / aoe). Outlined, icon + word, usually in a group of tags listing what an item is.ui_stat_chip— numeric readout (gold 120, lvl 7). One label + value.ui_label— generic dark rounded container holding any text.ui_badge— one-word status / promo. A single attention-getter, riding something else.
So yes — basically "promo marker on a card or detail panel."
Thickness — the design fix
ui_badge already has no border (solid color fill, dark text) — that's the "no thin border, contrast via fill" option, which fits your rule. What makes it read thin right now is the body font (LanaPixel @11 — a slim pixel font) and modest padding.
Proposed changes — visual only, API unchanged:
- Font →
ui_font_pixul(PixulBrush @8) by default — the bold brushy font we already use for buttons. Stays compact but reads chunky. (ui_font_header_s/ FatPixel renders much taller and would blow up the badge size; I'd save that for a futuresize = 'large'opt if needed.) - Padding bump —
pad_x 5 → 7,pad_y 2 → 3. Beefier presence. - Stay no-border solid-fill — consistent with the "either thick or none" rule, and lets the badge color speak.
That should hit "cohesively thick" without changing the API or the use sites.
Gallery rework for the showcase
Right now the badges page shows two floating rows of badges and nothing else — which doesn't tell you where they go. I'd rework the page's badges section to demonstrate placement:
- A small mock shop card with a
NEWbadge pinned in the corner. - A list row with
EQUIPPEDinline next to the item name. - A detail-panel snippet with a rarity pill (
RARE/LEGENDARY) under the title. - And keep a single small "vocabulary" strip at the bottom — the raw badges + rarity pills — for color reference.
Sound right on all three (placement understanding / thickness via PixulBrush + padding / showcase rework)? Once you confirm, I'll do it as one change.
Go ahead.
Implementing. First the ui_badge widget tweaks:
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/galler...)
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
Both files syntax-check.
What changed:
ui_badge — default font is now ui_font_pixul (PixulBrush — the bold/chunky font), padding bumped to pad_x=7 / pad_y=3 (was 5/2). No border, solid fill, dark text. API unchanged. Docblock updated to spell out the "rides another element / never standalone" intent and the no-border-by-design rationale.
badges gallery page — section 01 reworked to demonstrate placement:
- (A) A mini "shop card" mock with NEW pinned to its top-right corner.
- (B) A list-row mock with EQUIPPED inline at the right.
- (C) A title line with LEGENDARY alongside it.
- A vocabulary strip below — all 11 available colors (5 status + 6 rarity) in one row, for color reference.
Page renumbered: 01 Badges, 02 Tags, 03 Stat Chips, 04 Pips (was 5 sections, the floating "Pill Labels" section collapsed into the badges vocab).
To test: F4 → badges page. Check the three placement mocks read like real placements (corner badge on card, inline badge on row, pill next to title), the vocab strip stays on one row, and the badges themselves now feel chunkier with the PixulBrush font + heavier padding.
Tell me what to adjust on ui_badge — or what to move to next.
These are not functionally any different from buttons, so basically let's just have a button object, a non-interactable button object that looks the same.
Right — consolidating. The change: ui_button gains an auto-size mode (no rect → sizes from x/y + label + padding) and an arbitrary color opt that overrides the variant preset. Without an id it's already static (no juice, no hover). Drop ui_badge. Existing button callers (rects + variants) are unaffected — purely additive.
Default label color: stays text (light) — same as today's variant buttons, since "looks the same as buttons" is the whole point. Caller can pass label_color = bg for dark text where a bright fill needs it.
Rewriting ui_button:
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now drop ui_badge from primitives.lua:
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Update the gallery callers:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
--- leftover ui_badge ---
none
All clean. Updating docs:
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (grep -nE 'ui_button|button (SNKRX' E:/a327ex/attack-template/.claude/CLAUDE.md ...)
575: `ui_button`, `ui_bar`, `ui_tabs`, `ui_checkbox`, `ui_radio`,
589:occupied states + drag-target overlay), button (SNKRX-style: flat,
612:(a square glyph-only button — ui_button with a glyph label).
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
588 Widgets: slot (inventory cell — selected/locked/disabled/
589 occupied states + drag-target overlay), button (SNKRX-style: flat,
590 scale-pop, inverts white on hover, layered hover sounds; variants
591 primary/secondary/danger/ghost), bar (progress / health — health mode
592 is the v1 two-bar tween: a fast `front` bar + a delayed slow white
593 `back` bar exposing the lost-health chunk, a counting-down value text,
594 and the Emoji-Aimer cash-register kick on damage; fill is flat-cut on
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (grep -n 'ui_badge|badge' E:/a327ex/attack-template/.claude/CLAUDE.md)
592:"badges" by passing `x, y` + `color` instead of `rect` + `variant`,
Done. ui_badge is gone — ui_button is the unified element.
ui_button now does both roles:
- Interactive button — pass
rect+id+variant. Unchanged behavior. - Static "badge" — pass
x, y+color+label(noid, norect). Auto-sizes from the label, no juice, no hover, just a flat colored rect with text.
Same widget, same look, same chunky ui_font_pixul font, same pad_x=7 / pad_y=3 padding in auto-size mode. The decision tree is:
rectgiven → caller-sized. Otherwise auto-sized fromx, y.colorgiven → that fill. Otherwise the variant preset (primary/secondary/danger/ghost).idgiven → interactive (juice, hover-invert, click). Otherwise static.label_colorgiven → that text color. Otherwisetext(light) — passbgfor dark text on a bright fill.
Returns { hovered, clicked, x, y, w, h } — the rect info lets the vocab-strip-style chaining (x = x + ui_button({...}).w + 4) work.
Callers updated: page_badges (4 placements + vocab strip) and page_skillset (EQUIPPED) now call ui_button directly. text= → label=. The text color default changed: vocab strip badges now use light text (button-style) instead of dark. The EQUIPPED and corner NEW and inline LEGENDARY badges still read well; the vocab strip's yellow VIP and light_blue rare may have low contrast — if so, easy fix is label_color = bg per badge or as a default-when-color-is-given.
To test: F4 → badges page. The placements should look indistinguishable from before in shape. The vocab strip will read with light text now — eyeball it and tell me if any of the bright fills (yellow, light_blue) need dark text reinstated, or anything else to tweak.
[Pasted image/png]
They look odd in some circumstances in terms of spacing, just fix that for now.
Two spacing issues visible: the NEW badge overlapping "whirl" in the card mock, and the vocab strip overflowing off the right (legendary cut off, mythic lost). Also the EQUIPPED sits in a huge empty gap on the list-row mock. Fixing those — no other changes.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
Three spacing fixes:
- Card mock: widened 90→134 and the title rect now reserves room for the corner badge (
ca.w - 30 - nw - 6), sowhirlstops cleanly beforeNEW. - List-row / title mocks: shifted both to a tighter 200-wide range (
lr_x = 152), soEQUIPPEDandLEGENDARYsit just past their text instead of stranded near the right edge. - Vocab strip: split into two rows — uppercase (y=92) and rarity (y=108). Fits on screen, nothing clipped.
Sections 02 / 03 / 04 shifted down accordingly (130 / 168 / 206) — pips end at y=256, still inside 270.
To test: F4 → badges page. NEW should clear whirl; EQUIPPED and LEGENDARY should sit near their elements; both vocab rows fully on screen.
If we want these to be used as tags inside other elements, then I think it makes more sense to just use the [ tag ] construct that we use in other elements. These look better than these badges, which look too big.
Right — bracket motif over colored pills for inline tags. The badge-via-button experiment is overshooting visually for this use case.
Adding ui_bracket_tag and switching the placements + vocab to it.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the gallery's badges page — switch placements + vocab to bracket tags, rename sections, collapse vocab to one row (brackets are narrower so they all fit).
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Update the skillset page's EQUIPPED marker:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/galler...)
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Both files syntax-check.
What changed:
New: ui_bracket_tag (primitives.lua) — [label] rendered inline via the bracket-motif rich text. Muted Awesome brackets, label in opts.color (default text) in PixulBrush between them. No container, no fill — just text. Returns the rect it occupied.
badges gallery page — section 01 retitled Tags:
- (A) card with
[NEW]pinned near the corner. - (B) list row with
[EQUIPPED]right-anchored. - (C) title with
[LEGENDARY]alongside. - A single-row vocab strip below — all 11 colors fit because brackets are narrower than the pills.
Section 02 renamed to Icon Tags (still ui_tag, the heavier outlined-chip alternative). Sections 03/04 shifted up since the vocab collapses to one row.
skillset page — the EQUIPPED marker next to the ability title is now [EQUIPPED] rather than a green pill.
ui_button's auto-size + color additions are left intact (still work for any other use case), just no longer used for the tag role.
To test: F4 → badges page. All three placements + the vocab strip should now read as lightweight bracket tags. Also page through to skillset to see [EQUIPPED] instead of the green pill.
These look better, I think what we could use for these is a font that is thick but smaller than the current one. Let me try to find it.
Acknowledged — waiting on the font. When you have it, a couple of slots to think about:
- The bracket tag uses two fonts right now:
ui_font_pixulfor the label andui_font_bracket(Awesome @16) for the[ ]glyphs (since PixulBrush has no brackets). If the new font has bracket glyphs, we can drop the two-font kludge and use one font for everything — simpler and thedybaseline nudge goes away. - If it doesn't have brackets, just swap it in as the label font (smaller body + same Awesome brackets) and tune the
dy. - Either way: drop the TTF into
attack-template/assets/, register it insnkrx/ui/init.luanext to the other fonts, and we pointui_bracket_tag'sfontdefault at it.
If you also want it tried on other small-text spots (button labels, tag chips, stat chips, list rows), let me know and I can swap those defaults in the same pass.
I added 3 fonts, Bold Pixel, More, Pirkkala, let's first just test which sizes are right for each. Create a new view where you just have test with each font at different sizes so I can see what looks right/wrong.
Let me find the new fonts in assets and then build the test view.
Bash (ls E:/a327ex/attack-template/assets/ | grep -iE 'bold|pirkkala|more|pixel' )
BoldPixels.ttf
FatPixelFont.ttf
LanaPixel.ttf
More 15.ttf
ark-pixel-10px-proportional-latin.ttf
ark-pixel-12px-proportional-latin.ttf
pirkkala.ttf
Found BoldPixels.ttf, More 15.ttf, pirkkala.ttf. Setting up the test view.
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the gallery page:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/init.lua snkrx/ui/gallery.lua;...)
snkrx/ui/init.lua OK
snkrx/ui/gallery.lua OK
Both clean.
What's there:
ui/init.luaregisters atest_fontsglobal: 3 candidates (Bold,More,Pirkkala) × 4 sizes (6, 8, 10, 12) = 12 font handles, accessible astest_fonts.fonts[i].at[sz].- New gallery fonts page (now page 1/18, the gallery opens on it). Sample string
Sample [TAG] 123— covers brackets, mixed case, digits. Each row isFontName @size Sample [TAG] 123; row height adapts to the test font with an 11-pixel floor so the caption never clips.
To test: F4 opens on fonts. Eyeball each font/size combo — note which ones look thick + readable at small sizes (focus is below the current PixulBrush @8). Tell me the size(s) you like for each font, or which font wins outright, and I'll wire it into ui_bracket_tag (and anywhere else worth swapping). If you want a different sample string or different size points (e.g. add 7, 9, 14), say so.
Loaded font: ui_head_l (16.0px, rough) atlas=512x512 Loaded font: ui_head_s (8.0px, rough) atlas=512x512 Loaded font: ui_body_lana (11.0px, rough) atlas=512x512 Loaded font: ui_body_ark (10.0px, rough) atlas=512x512 Loaded font: ui_pixul (8.0px, rough) atlas=512x512 Loaded font: ui_bracket (16.0px, rough) atlas=512x512 Loaded font: test_bold_6 (6.0px, rough) atlas=512x512 Loaded font: test_bold_8 (8.0px, rough) atlas=512x512 Loaded font: test_bold_10 (10.0px, rough) atlas=512x512 Loaded font: test_bold_12 (12.0px, rough) atlas=512x512 Loaded font: test_more_6 (6.0px, rough) atlas=512x512 Loaded font: test_more_8 (8.0px, rough) atlas=512x512 Loaded font: test_more_10 (10.0px, rough) atlas=512x512 Loaded font: test_more_12 (12.0px, rough) atlas=512x512 Loaded font: test_pirkkala_6 (6.0px, rough) atlas=512x512 Maximum number of fonts (16) reached ERROR: anchor/font.lua:22: Failed to load font: assets/pirkkala.ttf stack traceback: [C]: in function 'font_load' anchor/font.lua:22: in field 'new' anchor/class.lua:28: in global 'font' anchor/font.lua:40: in function 'font_register' snkrx/ui/init.lua:67: in main chunk [C]: in function 'require' snkrx/init.lua:154: in main chunk [C]: in function 'require' main.lua:42: in main chunk
Hit the engine's 16-font limit. 6 UI fonts + 12 trial = 18; loaded 15 before the error. Let me also check if sound_tuner or main.lua registers another font that'd push us over even with reductions.
Bash (grep -rn 'font_register|font_load' E:/a327ex/attack-template/main.lua E:/a327ex...)
E:/a327ex/attack-template/snkrx/sound_tuner.lua:40:fonts.tune = font_register('monogram', 'assets/monogram.ttf', 12)
Bash (grep -rn 'font_register|font_load' E:/a327ex/attack-template/ --include='*.lua'...)
E:/a327ex/attack-template/anchor/font.lua:5: fonts.main = font_register('main', 'assets/monogram.ttf', 11)
E:/a327ex/attack-template/anchor/font.lua:22: font_load(name, path, size, filter)
E:/a327ex/attack-template/anchor/font.lua:39:function font_register(name, path, size, filter)
E:/a327ex/attack-template/snkrx/sound_tuner.lua:40:fonts.tune = font_register('monogram', 'assets/monogram.ttf', 12)
E:/a327ex/attack-template/snkrx/ui/init.lua:26:ui_font_header_l = font_register('ui_head_l', 'assets/Awesome 9.ttf', 16)
E:/a327ex/attack-template/snkrx/ui/init.lua:27:ui_font_header_s = font_register('ui_head_s', 'assets/FatPixelFont.ttf', 8)
E:/a327ex/attack-template/snkrx/ui/init.lua:28:ui_font_body_lana = font_register('ui_body_lana', 'assets/LanaPixel.ttf', 11)
E:/a327ex/attack-template/snkrx/ui/init.lua:29:ui_font_body_ark = font_register('ui_body_ark', 'assets/ark-pixel-10px-proportional-latin.ttf', 10)
E:/a327ex/attack-template/snkrx/ui/init.lua:33:ui_font_pixul = font_register('ui_pixul', 'assets/PixulBrush.ttf', 8)
E:/a327ex/attack-template/snkrx/ui/init.lua:38:ui_font_bracket = font_register('ui_bracket', 'assets/Awesome 9.ttf', 16)
E:/a327ex/attack-template/snkrx/ui/init.lua:67: f.at[sz] = font_register('test_' .. f.name:lower() .. '_' .. sz,
Read (E:/a327ex/attack-template/anchor/font.lua)
1 --[[
2 font — thin wrapper over C font functions.
3
4 Usage:
5 fonts.main = font_register('main', 'assets/monogram.ttf', 11)
6 layer_text(game_layer, "Hello", fonts.main, 100, 50, color)
7
8 A font is a plain table with .name, .size, .height plus query methods.
9 Stays as a simple class/struct pattern for consistent access.
10 ]]
11
12 font = class()
13
14 --- `filter` is optional: 'smooth' (grayscale atlas + linear sampling) or
15 --- 'rough' (1-bit mono atlas + nearest sampling). Defaults to the engine's
Bash (grep -n 'require' E:/a327ex/attack-template/snkrx/init.lua | head -20)
4: `require('snkrx')`, from main.lua and AFTER `require('anchor')({...})`,
17: The toolkit files live flat in snkrx/; this file requires them as
29:require('snkrx.palette')
30:require('snkrx.edition')
32:require('snkrx.geometry')
34:-- stack but, as in the pre-refactor scene, nothing requires them yet.)
46:require('snkrx.stats')
47:require('snkrx.fx')
50:sound_tuning = require('snkrx.sound_tuning')
138:require('snkrx.player')
139:require('snkrx.seeker')
140:require('snkrx.wall')
143:require('snkrx.projectile')
144:require('snkrx.area')
145:require('snkrx.beam')
146:require('snkrx.flicker')
147:require('snkrx.airborne')
148:require('snkrx.prop')
151:require('snkrx.sound_tuner')
154:require('snkrx.ui')
Read (E:/a327ex/attack-template/snkrx/sound_tuner.lua)
35 bind('tune_sr_up', 'key:=')
36 bind('tune_replay', 'key:space')
37 bind('tune_save', 'key:s')
38
39 if not fonts then fonts = {} end
40 fonts.tune = font_register('monogram', 'assets/monogram.ttf', 12)
41
42 local tune_layer = layer_new('tune')
43 local tune_bg = color(0, 0, 0, 220)
44 local tune_mode = false
45 local tune_index = 1
46 local tune_list = {}
47 local tune_replay_timer = 0
48 local tune_last_handle = -1
49 local REPLAY_INTERVAL = 0.5
Bash (grep -nE 'MAX_FONTS|font_count|max.*font' E:/a327ex/Anchor2/engine/src/anchor.c ...)
122:// Font bytes derive from font_count * atlas_size^2 * 4 — not tracked here.
1002:#define MAX_FONTS 16
1003:static Font* font_registry[MAX_FONTS];
1004:static int font_count = 0;
1047: for (int i = 0; i < font_count; i++) {
1054: if (font_count >= MAX_FONTS) {
1055: fprintf(stderr, "Maximum number of fonts (%d) reached\n", MAX_FONTS);
1225: font_registry[font_count++] = font;
1233: for (int i = 0; i < font_count; i++) {
1243: for (int j = i; j < font_count - 1; j++) {
Bash (grep -rnE 'font_register|font_load' E:/a327ex/attack-template/anchor/ 2>/dev/nul...)
E:/a327ex/attack-template/anchor/font.lua:5: fonts.main = font_register('main', 'assets/monogram.ttf', 11)
E:/a327ex/attack-template/anchor/font.lua:22: font_load(name, path, size, filter)
E:/a327ex/attack-template/anchor/font.lua:39:function font_register(name, path, size, filter)
Engine cap is 16 fonts and we're sneaking past it (the hidden one is monogram from sound_tuner, registered before the log started). Two changes to fit 3 sizes × 3 fonts safely:
- Make
ui_font_bracketan alias ofui_font_header_l— they were registering the sameAwesome 9.ttf @16twice. Frees a slot, behavior unchanged. - Drop test sizes from 4 → 3 per font:
{6, 8, 10}.
That gives 5 UI + monogram + 9 test = 15 fonts, one slot of buffer under the cap.
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
init.lua OK
Try again — should now load cleanly. The fonts page shows each of the three candidates at 6 / 8 / 10. Tell me which font + size feels right and I'll re-register that one at the chosen size (and a couple of nearby sizes for fine-tuning) so we can wire it into the bracket tag (and elsewhere if you want).
Just up the limit to 64 instead.
Engine change — bumping MAX_FONTS from 16 to 64 in anchor.c, then rebuilding. Let me also check no other related constants are tied to 16, and restore the 4th test size + drop the workarounds where useful.
Bash (grep -nE 'MAX_FONTS|font_registry[|font_count' E:/a327ex/Anchor2/engine/src/anc...)
122:// Font bytes derive from font_count * atlas_size^2 * 4 — not tracked here.
1002:#define MAX_FONTS 16
1003:static Font* font_registry[MAX_FONTS];
1004:static int font_count = 0;
1047: for (int i = 0; i < font_count; i++) {
1048: if (strcmp(font_registry[i]->name, name) == 0) {
1050: return font_registry[i];
1054: if (font_count >= MAX_FONTS) {
1055: fprintf(stderr, "Maximum number of fonts (%d) reached\n", MAX_FONTS);
1225: font_registry[font_count++] = font;
1233: for (int i = 0; i < font_count; i++) {
1234: if (strcmp(font_registry[i]->name, name) == 0) {
1235: Font* font = font_registry[i];
1243: for (int j = i; j < font_count - 1; j++) {
1244: font_registry[j] = font_registry[j + 1];
1246: font_count--;
1255: for (int i = 0; i < font_count; i++) {
1256: if (strcmp(font_registry[i]->name, name) == 0) {
1257: return font_registry[i];
8650: lua_pushinteger(L, font_count);
Bash (cat E:/a327ex/Anchor2/engine/build.bat 2>/dev/null | head -20; echo "---"; ls -l...)
Exit code 2
@echo off
setlocal
cd /d "%~dp0"
:: Find and run vcvarsall.bat for Visual Studio
if exist "C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvarsall.bat" (
call "C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 >nul 2>&1
) else if exist "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" (
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 >nul 2>&1
) else if exist "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvarsall.bat" (
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvarsall.bat" x64 >nul 2>&1
) else if exist "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" (
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 >nul 2>&1
) else (
echo ERROR: Could not find Visual Studio
exit /b 1
)
if not exist build mkdir build
---
-rwxr-xr-x 1 adn 197121 4185088 May 17 22:07 E:/a327ex/attack-template/anchor.exe*
Bash (cat E:/a327ex/Anchor2/engine/build.bat | sed -n '20,80p')
if not exist build mkdir build
:: Build Lua library if it doesn't exist
if not exist lib\lua.lib (
echo Building Lua library...
if not exist build\lua_obj mkdir build\lua_obj
cl.exe /nologo /O2 /W3 /c /I"include/lua" ^
include/lua/lapi.c include/lua/lauxlib.c include/lua/lbaselib.c ^
include/lua/lcode.c include/lua/lcorolib.c include/lua/lctype.c ^
include/lua/ldblib.c include/lua/ldebug.c include/lua/ldo.c ^
include/lua/ldump.c include/lua/lfunc.c include/lua/lgc.c ^
include/lua/linit.c include/lua/liolib.c include/lua/llex.c ^
include/lua/lmathlib.c include/lua/lmem.c include/lua/loadlib.c ^
include/lua/lobject.c include/lua/lopcodes.c include/lua/loslib.c ^
include/lua/lparser.c include/lua/lstate.c include/lua/lstring.c ^
include/lua/lstrlib.c include/lua/ltable.c include/lua/ltablib.c ^
include/lua/ltm.c include/lua/lundump.c include/lua/lutf8lib.c ^
include/lua/lvm.c include/lua/lzio.c ^
/Fo"build\lua_obj\\"
if %ERRORLEVEL% neq 0 (
echo Lua build failed!
exit /b 1
)
lib.exe /nologo /out:lib\lua.lib build\lua_obj\*.obj
if %ERRORLEVEL% neq 0 (
echo Lua library creation failed!
exit /b 1
)
rmdir /s /q build\lua_obj
echo Lua library built.
... [31 more lines]
Bash (grep -nE 'anchor.exe|copy|\copy|.exe' E:/a327ex/Anchor2/engine/build.bat | hea...)
26: cl.exe /nologo /O2 /W3 /c /I"include/lua" ^
43: lib.exe /nologo /out:lib\lua.lib build\lua_obj\*.obj
56: cl.exe /nologo /O2 /W3 /c /std:c17 /DNDEBUG /I"include" /I"include/box2d" ^
74: lib.exe /nologo /out:lib\box2d.lib build\box2d_obj\*.obj
84:cl.exe /nologo /O2 /W3 ^
87: /Fe"build/anchor.exe" ^
99:echo Build successful: build/anchor.exe
103: copy /Y "build\anchor.exe" "E:\a327ex\emoji-ball-battles\tools\anchor.exe" >nul
Bash (sed -n '95,130p' E:/a327ex/Anchor2/engine/build.bat)
echo Build failed!
exit /b 1
)
echo Build successful: build/anchor.exe
:: Copy to emoji-ball-battles if it exists
if exist "E:\a327ex\emoji-ball-battles\tools" (
copy /Y "build\anchor.exe" "E:\a327ex\emoji-ball-battles\tools\anchor.exe" >nul
echo Copied to emoji-ball-battles/tools/
)
Plan: bump MAX_FONTS to 64 in anchor.c, rebuild, copy the new exe into attack-template/, and restore the 4-size test grid. Keeping the ui_font_bracket alias — it's a real improvement either way (no point loading the same font twice).
Edit (E:/a327ex/Anchor2/engine/src/anchor.c)
<tool_use_error>File has not been read yet. Read it first before writing to it.</tool_use_error>
Read (E:/a327ex/Anchor2/engine/src/anchor.c)
1000 static FT_Library ft_library = NULL;
1001
1002 #define MAX_FONTS 16
1003 static Font* font_registry[MAX_FONTS];
1004 static int font_count = 0;
1005
1006 // UTF-8 decoding helper - returns codepoint and advances pointer
1007 static uint32_t utf8_decode(const char** str) {
1008 const unsigned char* s = (const unsigned char*)*str;
1009 uint32_t codepoint;
Edit (E:/a327ex/Anchor2/engine/src/anchor.c)
The file E:/a327ex/Anchor2/engine/src/anchor.c has been updated successfully. (file state is current in your context — no need to Read it back)
Now rebuild the engine:
Bash (cd /e/a327ex/Anchor2/engine && cmd //c build.bat 2>&1 | tail -25)
'build.bat' is not recognized as an internal or external command,
operable program or batch file.
Bash (cmd //c "cd /d E:\a327ex\Anchor2\engine && build.bat" 2>&1 | tail -25)
'build.bat' is not recognized as an internal or external command,
operable program or batch file.
Bash (ls -la E:/a327ex/Anchor2/engine/*.bat)
-rw-r--r-- 1 adn 197121 4830 Apr 13 09:47 E:/a327ex/Anchor2/engine/build.bat
-rw-r--r-- 1 adn 197121 101 Apr 13 09:47 E:/a327ex/Anchor2/engine/run-web.bat
-rw-r--r-- 1 adn 197121 171 Apr 13 09:47 E:/a327ex/Anchor2/engine/run.bat
Bash (cmd //c "E:\a327ex\Anchor2\engine\build.bat" 2>&1 | tail -25)
src/anchor.c(3649): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(4894): warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup. See online help for details.
src/anchor.c(6013): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(6898): warning C4244: 'initializing': conversion from 'lua_Number' to 'float', possible loss of data
src/anchor.c(6899): warning C4244: 'initializing': conversion from 'lua_Number' to 'float', possible loss of data
src/anchor.c(8672): warning C4244: '=': conversion from 'lua_Integer' to 'int', possible loss of data
src/anchor.c(8673): warning C4244: '=': conversion from 'lua_Integer' to 'int', possible loss of data
src/anchor.c(8679): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(8793): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10131): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10135): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10140): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10144): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10150): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10154): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10160): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10164): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10703): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10705): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10708): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
src/anchor.c(10711): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
gl.c
Generating Code...
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
Build successful: build/anchor.exe
Build succeeded. Copy the new exe to attack-template and restore the 4-size grid:
Bash (cp E:/a327ex/Anchor2/engine/build/anchor.exe E:/a327ex/attack-template/anchor.ex...)
Exit code 1
cp: cannot create regular file 'E:/a327ex/attack-template/anchor.exe': Device or resource busy
Bash (cmd //c "copy /Y E:\a327ex\Anchor2\engine\build\anchor.exe E:\a327ex\attack-temp...)
Exit code 1
The process cannot access the file because it is being used by another process.
0 file(s) copied.
The current attack-template anchor.exe is locked — the game is open. Restoring the 4-size grid in the meantime:
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
init.lua OK
Status:
- Engine:
MAX_FONTSbumped to 64 inAnchor2/engine/src/anchor.c, rebuilt successfully (Anchor2/engine/build/anchor.exe). - Test grid: restored to 4 sizes per font (
6, 8, 10, 12) — 12 test fonts + 5 UI + monogram = 18, well under the new 64-font cap. Theui_font_bracketalias stays. - Blocked: the existing
attack-template/anchor.exeis locked because your game is running. The new binary is sitting inAnchor2/engine/build/anchor.exewaiting to be copied.
Close the running game, then either:
- I'll re-run the copy (let me know when it's closed), or
- copy it yourself:
copy /Y E:\a327ex\Anchor2\engine\build\anchor.exe E:\a327ex\attack-template\anchor.exe
Then F4 → fonts page should show all 12 trial-font cells.
Loaded font: ui_head_l (16.0px, rough) atlas=512x512 Loaded font: ui_head_s (8.0px, rough) atlas=512x512 Loaded font: ui_body_lana (11.0px, rough) atlas=512x512 Loaded font: ui_body_ark (10.0px, rough) atlas=512x512 Loaded font: ui_pixul (8.0px, rough) atlas=512x512 Loaded font: test_bold_6 (6.0px, rough) atlas=512x512 Loaded font: test_bold_8 (8.0px, rough) atlas=512x512 Loaded font: test_bold_10 (10.0px, rough) atlas=512x512 Loaded font: test_bold_12 (12.0px, rough) atlas=512x512 Loaded font: test_more_6 (6.0px, rough) atlas=512x512 Loaded font: test_more_8 (8.0px, rough) atlas=512x512 Loaded font: test_more_10 (10.0px, rough) atlas=512x512 Loaded font: test_more_12 (12.0px, rough) atlas=512x512 Loaded font: test_pirkkala_6 (6.0px, rough) atlas=512x512 Loaded font: test_pirkkala_8 (8.0px, rough) atlas=512x512 Maximum number of fonts (16) reached ERROR: anchor/font.lua:22: Failed to load font: assets/pirkkala.ttf stack traceback: [C]: in function 'font_load' anchor/font.lua:22: in field 'new' anchor/class.lua:28: in global 'font' anchor/font.lua:40: in function 'font_register' snkrx/ui/init.lua:70: in main chunk [C]: in function 'require' snkrx/init.lua:154: in main chunk [C]: in function 'require' main.lua:42: in main chunk
[Request interrupted by user]
Common mistake is forgetting to copy the new Anchor.exe, ah, I see it was locked, copy it now.
Bash (cp E:/a327ex/Anchor2/engine/build/anchor.exe E:/a327ex/attack-template/anchor.ex...)
-rwxr-xr-x 1 adn 197121 4185088 May 24 11:46 E:/a327ex/attack-template/anchor.exe*
Copied (May 24 11:46 confirms the new binary). Run again — all 12 trial fonts should load this time, and the fonts page will show the full grid.
16, 24, 32 for more and bold, 14 in intervals of 2 up to 32 for pirkala
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/init.lua snkrx/ui/gallery.lua;...)
snkrx/ui/init.lua OK
snkrx/ui/gallery.lua OK
Done. Two pages now:
fonts(page 1) — Bold at 16/24/32 then More at 16/24/32.fonts-pirk(page 2) — Pirkkala at 14, 16, 18, 20, 22, 24, 26, 28, 30, 32.
Split because Pirkkala alone at those sizes (sum of row heights ~240px) fills the screen and leaves no room for the others. F4 opens on fonts; ] to flip to fonts-pirk. Tell me which sizes look right per font.
pirkala and bold work at 16, more at 32, you can remove the pages now. I think for the badges let's try to see what pirkala looks like, i like it more than bold, and more is too big for it
Picked Pirkkala@16 for tags. Cleanup + wire-up:
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now wire ui_bracket_tag to use Pirkkala for everything (no separate bracket font kludge needed — Pirkkala has its own brackets if it's a real pixel font):
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/init.lua snkrx/ui/gallery.lua ...)
snkrx/ui/init.lua OK
snkrx/ui/gallery.lua OK
snkrx/ui/primitives.lua OK
One thing I should fix — the badge placements' right-anchor calcs were measuring with ui_font_bracket + ui_font_pixul, but ui_bracket_tag now uses just Pirkkala for everything. Updating:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
Done. Summary:
init.lua: dropped thetest_fontsfixture, registeredui_font_pirkkalaat 16.gallery.lua: removed both font-test pages (fonts,fonts-pirk) and thefonts_renderhelper. Updated the badge placement width calcs to measure with Pirkkala instead of the old Pixul+Awesome split.primitives.lua:ui_bracket_tagnow uses one font for both brackets and label (defaultui_font_pirkkala) — the two-font bracket kludge is gone, on the assumption Pirkkala has[ ]glyphs.
Gallery opens back on badges. Heads-up: the bracket tags will be visibly larger now (Pirkkala@16 vs the old ~10px mixed font), so the [NEW] / [EQUIPPED] / [LEGENDARY] placements may need to breathe more — eyeball it and tell me what to tune (font size, padding, placement y-offsets). And if Pirkkala doesn't render [ ] cleanly we'll add the bracket-font opt back.
Hmmm, still too big, let's try the [ tag ] but with Ark Pixel instead.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated. All occurrences were successfully replaced. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/galler...)
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
Swapped — ui_bracket_tag defaults to ui_font_body_ark (Ark Pixel @10) now, and the badge placements' width measurements use it too. ui_font_pirkkala stays registered (harmless under the 64-font cap) in case you want to come back to it.
F4 → badges. Tags should be substantially smaller. May still need a couple of placement y-offset tweaks once you see it — just say what's off.
It works, remove the icon tags, make it so that the stat chips also default to Ark, and make sure that any text inside stat chips is always capitalized.
Let me first verify ui_tag isn't used outside the gallery, then make all three changes.
Bash (grep -rn 'ui_tag\b' E:/a327ex/attack-template/ --include='*.lua' 2>/dev/null)
E:/a327ex/attack-template/snkrx/ui/gallery.lua:692:-- ── Page: badges (ui_bracket_tag / ui_tag / ui_stat_chip / ui_pips) ─
E:/a327ex/attack-template/snkrx/ui/gallery.lua:748: x = x + ui_tag({ x = x, y = 136, glyph = t[1], glyph_color = t[2],
E:/a327ex/attack-template/snkrx/ui/primitives.lua:332: ui_tag(opts) -> rect
E:/a327ex/attack-template/snkrx/ui/primitives.lua:346:function ui_tag(opts)
Read (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
328 return r
329 end
330
331 --[[
332 ui_tag(opts) -> rect
333
334 An outlined chip: a colored icon glyph + a label — magic / ranged /
335 aoe / unique. charcoal fill + panel_border outline. Auto-sizes.
336
337 opts:
338 x, y top-left
339 glyph optional icon glyph (drawn in glyph_color)
340 glyph_color icon accent color (default text)
341 text the label
342 text_color label color (default text)
343 font (default ui_font_body)
344 edition
345 ]]
346 function ui_tag(opts)
347 local font = opts.font or ui_font_body
348 local px, py, gap = 5, 2, 4
349 local gw = opts.glyph and font:text_width(opts.glyph) or 0
350 local tw = font:text_width(opts.text)
351 local r = { x = opts.x, y = opts.y, h = font.height + 2*py,
352 w = px + (opts.glyph and (gw + gap) or 0) + tw + px }
353 local ed = opts.edition
354 ui_rrect(r.x, r.y, r.w, r.h, 3, panel_border, ed)
355 ui_rrect(r.x + 1, r.y + 1, r.w - 2, r.h - 2, 2, charcoal, ed)
356 local x = r.x + px
357 if opts.glyph then
... [12 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now update ui_stat_chip — default to Ark, force-uppercase the text:
Read (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
331 --[[
332 ui_stat_chip(opts) -> rect
333
334 A compact stat / resource readout — an optional icon glyph, a muted
335 label, and a colored value: 'gold 120', 'lvl 7', 'dur 64/100'. Built
336 as a ui_label with stat-shaped runs; the charcoal container + auto-
337 sizing come from ui_label. Returns its rect.
338
339 opts:
340 x, y top-left
341 glyph optional icon glyph
342 glyph_color icon color (default value_color)
343 label optional muted label text
344 value the value text
345 value_color value color (default yellow)
346 font, edition
347 ]]
348 function ui_stat_chip(opts)
349 local vcol = opts.value_color or yellow
350 local runs = {}
351 if opts.glyph then
352 runs[#runs + 1] = { text = opts.glyph .. ' ',
353 color = opts.glyph_color or vcol }
354 end
355 if opts.label then
356 runs[#runs + 1] = { text = opts.label .. ' ', color = text_muted }
357 end
358 runs[#runs + 1] = { text = opts.value, color = vcol }
359 return ui_label({ x = opts.x, y = opts.y, runs = runs,
360 font = opts.font, edition = opts.edition })
... [5 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now strip the icon-tags section from the gallery and renumber what's left:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/galler...)
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
---leftover ui_tag---
none
Quick doc sync:
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Summary:
ui_tagremoved fromprimitives.luaentirely (was only used by the gallery section).ui_stat_chipnow defaults toui_font_body_arkand force-:upper()s bothlabelandvalue(glyph stays as-is). Pass any case in, the widget normalises.- Badges page: section 02 (Icon Tags) gone; renumbered Stat Chips → 02 (y=122) and Pips → 03 (y=160). Stat chips will now read
XP +25,GOLD 120,LVL 7,DUR 64/100,SLOTS 18/30. - CLAUDE.md element list / file map synced.
F4 → badges to confirm.
OK, page 1 is done, and I also understand another issue with the UI currently. In SNKRX, all elements go through the shadow layer, so usually UI panels have a soft shadow to the right and down, like literally everything else in the game. Inside a panel, there's no such thing, but the panels themselves and other UI elements outside panels do. This gives elements the classic SNKRX UI thickness that I'm after. So the change is: instead of panels and other UI elements having a 1-pixel border around them, they have no such border, but they go through the shadow system. For this to be visible, the background also has to be a bit brighter than it is now, since it's too dark.
Let me check what shadow infrastructure exists in the project before designing.
Bash (grep -rniE 'shadow' E:/a327ex/attack-template/snkrx/ E:/a327ex/attack-template/m...)
---v1 shadow---
This is a real architectural shift — shadow system, drop the 1px borders, brighten the background. Brief before code.
Design brief — UI shadow system + brighter bg
Approach. A new ui_shadow_layer paired with ui_layer. Every colored UI draw (ui_rrect/ui_rect/ui_glyph_text in paint.lua) writes the same shape twice: once to ui_shadow_layer at offset (+2, +2) in a flat dark shadow color, once to ui_layer normally. In ui_gallery_draw, render the shadow layer first then ui_layer on top.
The "no shadow on stuff inside panels" rule emerges automatically from draw order: a text inside a panel writes its shadow at panel.x+10+2 / panel.y+10+2 — which is inside the panel's body rect. The panel's own body fill on ui_layer covers that region, so the text shadow is hidden. The panel's own shadow only protrudes at its right + bottom edges (the only parts not covered by anything). Same SNKRX look, no per-element opt-in needed.
Borders go away. ui_panel's two-rect border + fill collapses to a single rrect fill. ui_label, ui_button (solid variants), ui_text_input, ui_modal, etc. also drop their 1px border. The shadow IS the chrome now. The two-rect outlines stay only where they were a deliberate visual (the segment-active green-outline cell in ui_tabs, the green-selected slot border, etc.).
Background brighten. Bumping the bg palette token a few shades brighter so shadows have something to read against. This is a global palette change — it affects the game floor too, which matches SNKRX (their bg is noticeably brighter than ours).
Tunables. ui_shadow_color (default ~rgba(0,0,0,100)), ui_shadow_offset_x/y (default 2, 2). Exposed as globals next to ui_field_scale/ui_dither so you can iterate without code edits.
Files touched.
snkrx/palette.lua— brightenbg.ui/init.lua— addui_shadow_layer = layer_new('ui_shadow').ui/paint.lua—ui_rrect/ui_rect/ui_glyph_textadd the shadow-layer draw + the offset/color globals.ui/primitives.lua—ui_panel,ui_label,ui_tooltipdrop the border two-rect; same forui_item_icon.ui/widgets.lua—ui_button/ui_text_input/ui_modalsimilarly. The drag-target ring and selected-state outlines stay (intentional visuals).ui/gallery.lua—ui_gallery_drawrendersui_shadow_layerbeforeui_layer.
One concern. The edition shader pipeline writes to a single layer at a time. The shadow draws go through layer_rounded_rectangle directly (no edition bracketing — shadows are flat black, the edition system shouldn't touch them). So per-element draw work goes from 1 shader-bracketed call to 1 shader-bracketed + 1 plain call. Cheap.
One scoping question:
AskUserQuestion
Your questions have been answered: "How should the `bg` brighten work?"="[No preference]". You can now continue with these answers in mind.
[Request interrupted by user]
Your approach for the shadow seems incorrect, there's no need to draw the same shape twice, just draw the shape to a layer, and then the shadow layer itself is derived from the canvas of the layers that it applies to, this is how the shadow is done in every other project. Look at how it's done in the recent projects, like Emoji Aimer, but also Invoker/Orblike itself.
Bash (grep -rniE 'shadow' E:/a327ex/emoji-aimer/main.lua 2>/dev/null | head -25)
11: at scale 3, sky gradient bg, layer pipeline with shadow + outline shaders).
205:shadow_layer = layer_new('shadow')
288:shadow_shader = shader_load_file('assets/shadow.frag')
564:-- to effects_layer so it gets the outline + shadow.
599:-- completes. Drawn on effects_layer so it gets the outline + shadow.
5631: -- Derive shadow + outline passes via the outline / shadow shaders.
5632: layer_clear(shadow_layer)
5633: layer_draw_from(shadow_layer, game_layer, shadow_shader)
5634: layer_draw_from(shadow_layer, effects_layer, shadow_shader)
5659: layer_draw(shadow_layer, 4, 4)
Bash (sed -n '5625,5670p' E:/a327ex/emoji-aimer/main.lua)
-- badges onto shop_level_layer too. Empty queue is a no-op.
layer_render(shop_level_layer)
shader_set_vec4_immediate(recolor_shader,
'u_target_color', 83/255, 175/255, 239/255, 1)
layer_draw_from(ui_content_layer, shop_level_layer, recolor_shader)
-- Derive shadow + outline passes via the outline / shadow shaders.
layer_clear(shadow_layer)
layer_draw_from(shadow_layer, game_layer, shadow_shader)
layer_draw_from(shadow_layer, effects_layer, shadow_shader)
layer_clear(game_outline)
layer_draw_from(game_outline, game_layer, outline_shader)
layer_clear(effects_outline)
layer_draw_from(effects_outline, effects_layer, outline_shader)
layer_clear(ui_panel_outline)
layer_draw_from(ui_panel_outline, ui_panel_layer, outline_shader)
layer_clear(ui_content_outline)
layer_draw_from(ui_content_outline, ui_content_layer, outline_shader)
layer_clear(ui_top_panel_outline)
layer_draw_from(ui_top_panel_outline, ui_top_panel_layer, outline_shader)
layer_clear(ui_top_content_outline)
layer_draw_from(ui_top_content_outline, ui_top_content_layer, outline_shader)
layer_clear(shop_particle_outline)
layer_draw_from(shop_particle_outline, shop_particle_layer, outline_shader)
layer_clear(cursor_outline)
layer_draw_from(cursor_outline, cursor_layer, outline_shader)
layer_clear(transition_outline)
layer_draw_from(transition_outline, transition_layer, outline_shader)
layer_clear(payout_outline)
... [16 more lines]
Got it — derived via a shader. Let me find the shader file used elsewhere.
Bash (find E:/a327ex/emoji-aimer/assets E:/a327ex/Invoker/assets -name 'shadow*' 2>/de...)
E:/a327ex/emoji-aimer/assets/shadow.frag
E:/a327ex/Invoker/assets/shadow.frag
---
// Shadow shader - creates a dark, semi-transparent silhouette
// Draw this layer at an offset to create drop shadow effect
in vec2 TexCoord;
out vec4 FragColor;
uniform sampler2D u_texture;
void main() {
float a = texture(u_texture, TexCoord).a;
FragColor = vec4(0.5, 0.5, 0.5, a * 0.5);
}
Bash (cat E:/a327ex/Invoker/assets/shadow.frag 2>/dev/null)
// Shadow shader - creates a dark, semi-transparent silhouette
// Draw this layer at an offset to create drop shadow effect
in vec2 TexCoord;
out vec4 FragColor;
uniform sampler2D u_texture;
void main() {
float a = texture(u_texture, TexCoord).a;
FragColor = vec4(0.1, 0.1, 0.1, a * 0.5);
}
Right — derive the shadow from the layer's own canvas via a shader, no double draws. Let me check the palette and revise the plan.
Bash (grep -n '^bg ' E:/a327ex/attack-template/snkrx/palette.lua; echo "---invoker bg-...)
53:bg = color(22, 28, 34)
---invoker bg---
75:bg_color = color(17, 17, 17)
4976:bg = an:layer('bg')
4977:bg.camera = nil
Bash (sed -n '48,65p' E:/a327ex/attack-template/snkrx/palette.lua)
-- =============================================================================
-- Chrome / grayscale ladder, dark → light. Use these for backgrounds,
-- panels, borders, and text. The 9-step ladder gives enough resolution to
-- distinguish UI strata without going cluttered.
bg = color(22, 28, 34)
slot_fill = color(27, 31, 34)
panel_fill = color(31, 33, 38)
charcoal = color(45, 48, 51)
panel_border = color(56, 60, 65)
grey = color(74, 77, 80)
text_muted = color(140, 140, 145)
white = color(200, 200, 200)
text = color(240, 240, 235)
-- Accents, roughly by hue. These 9 colors are deliberately matched to the
-- shader's palette_color() table for the palette-cycling polychrome edition
-- (mode 24). Keeping that lockstep is what makes mode 24 look like "the
Right — layer_draw_from(shadow_layer, ui_layer, shadow_shader) derives the shadow from ui_layer's canvas. No paint.lua changes — the only places that touch the pipeline are gallery.lua's render flow and init.lua (load shader, create layer). Plus ui_panel drops its border, and the dark end of the palette ladder bumps up (bg above slot_fill above panel_fill — have to lift all three or the chrome semantic inverts).
Executing.
Bash (cp E:/a327ex/Invoker/assets/shadow.frag E:/a327ex/attack-template/assets/shadow....)
-rw-r--r-- 1 adn 197121 312 May 24 18:01 E:/a327ex/attack-template/assets/shadow.frag
Edit (E:/a327ex/attack-template/snkrx/palette.lua)
The file E:/a327ex/attack-template/snkrx/palette.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now wire the shadow layer + shader into init.lua:
Edit (E:/a327ex/attack-template/snkrx/ui/init.lua)
The file E:/a327ex/attack-template/snkrx/ui/init.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now update ui_gallery_draw to use the shadow pipeline:
Bash (grep -n 'ui_gallery_draw|layer_render(ui_layer)|layer_draw(ui_layer)' E:/a327e...)
20: ui_layer commands from ui_gallery_update(); ui_gallery_draw() is
1009: ui_gallery_draw()
1014:function ui_gallery_draw()
1016: layer_render(ui_layer)
1017: layer_draw(ui_layer)
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
1005 pg.draw(ui_layer)
1006 end
1007
1008 --[[
1009 ui_gallery_draw()
1010
1011 Flush ui_layer to the screen. All command queueing happened in
1012 ui_gallery_update; this is just the render/draw pair.
1013 ]]
1014 function ui_gallery_draw()
1015 if not ui_gallery_active then return end
1016 layer_render(ui_layer)
1017 layer_draw(ui_layer)
1018 end
1019
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now drop ui_panel's default border (collapse two-rect → single rrect fill):
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/palette.lua snkrx/ui/init.lua snk...)
snkrx/palette.lua OK
snkrx/ui/init.lua OK
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
Bash (grep -n 'shader_load_file|layer_draw_from|layer_clear' E:/a327ex/Anchor2/docs/...)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:36:layer_clear(layer)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:37:layer_draw_from(dst, src, shader?)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:101:shader_load_file(path) -> shader
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:287:layer_clear(lyr) -- clear the layer's FBO
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:289:layer_draw_from(dst, src, shader?) -- sample src's texture into dst
All API functions exist. Done.
Summary:
assets/shadow.frag— copied from Invoker (alpha → dark gray @ 50% alpha).snkrx/palette.lua— bumped the bottom of the chrome ladder:bg (34,40,46),slot_fill (40,44,47),panel_fill (46,48,52). Ladder order preserved (bg < slot < panel < charcoal); rest of palette untouched.snkrx/ui/init.lua— addedui_shadow_layer,ui_shadow_shader, and tunable offsetsui_shadow_offset_x/y = 2. Documented the render pipeline at the layer block.snkrx/ui/gallery.lua—ui_gallery_drawnow flushesui_layer, derivesui_shadow_layervialayer_draw_from(... ui_shadow_shader), composites the shadow at offset, thenui_layeron top.snkrx/ui/primitives.lua—ui_panelcollapsed to a single rrect fill by default. An explicitopts.borderstill triggers the two-rect outline (so caller-driven state borders like cards' selected-state still work).
No paint.lua / per-element draw changes — shadow is purely a layer-composite effect, no double draws.
To test: F4 — every panel/widget should now cast a soft drop shadow down-right; the background should read noticeably brighter; inside-panel content should naturally have no shadow on the panel surface (because the panel's body fill covers it). Tunables to fiddle live: ui_shadow_offset_x/y (1–3 px is the usable range) and you can edit assets/shadow.frag to change the shadow color/alpha.
Tell me what's off and what's next.
I see the background change, I see the removal of the borders, I don't see the drop shadow.
I see the bug. The gallery's bg fill — layer_rectangle(ui_layer, 0, 0, width, height, bg()) — paints the entire ui_layer opaque, so when the shader derives the shadow from its alpha channel, the shadow is a full-screen dark tint at offset, not discrete drop shadows behind chrome.
Fix: put the bg fill on a separate layer so ui_layer stays transparent except where actual chrome/text is drawn.
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
983 end
984 end
985
986 ui_state_begin_frame()
987 ui_juice_update(dt)
988
989 -- Queue the overlay onto ui_layer.
990 local pg = ui_gallery_pages[ui_gallery_page]
991 layer_rectangle(ui_layer, 0, 0, width, height, bg())
992 layer_text(ui_layer, 'UI KIT', ui_font_header_l, 8, 6, text())
993 local edname = (ui_global_edition == 0) and 'per-color'
994 or edition_name(ui_global_edition)
995 layer_text(ui_layer,
996 'body: ' .. ui_font_body_name() .. ' edition: ' .. edname
997 .. string.format(' fs: %.2f', ui_field_scale)
998 .. ' dither: ' .. dither_name(ui_dither),
999 ui_font_body, 8, 24, text_muted())
1000
1001 local ind = ui_gallery_page .. '/' .. #ui_gallery_pages .. ' ' .. pg.name
1002 layer_text(ui_layer, ind, ui_font_body,
1003 width - ui_font_body:text_width(ind) - 8, 11, text_muted())
1004
1005 pg.draw(ui_layer)
1006 end
1007
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
Fixed. The cause: the gallery's bg fill was painting ui_layer fully opaque, so the shader was deriving a full-screen shadow that became a screen-wide dark tint at offset — invisible against the dark bg.
Now:
gallery_bg_layer(new, file-local) holds the screen-wide bg fill.ui_layeronly carries chrome + text — transparent everywhere else.- The shader-derived shadow contains only the alphas of real UI elements, so individual drop shadows show up behind each panel/button/text at (+2, +2).
- Composite order in
ui_gallery_draw: bg → shadow (offset) → ui.
F4 → drop shadows should now be visible down-right of every panel, button, text, badge, etc. The header text at the top will also cast small shadows. Tunables: ui_shadow_offset_x/y (currently 2 each) live in init.lua; the shadow color/alpha is in assets/shadow.frag (vec4(0.1, 0.1, 0.1, a * 0.5)).
[Pasted image/png]
Yes, this looks very good. Is the shadow currently 2 pixels away on both directions?
Yes — ui_shadow_offset_x = 2 and ui_shadow_offset_y = 2, both set in snkrx/ui/init.lua (the line right under ui_shadow_layer = layer_new('ui_shadow')). Tweak either live to thin/fatten the shadow, change them asymmetrically, or even set negatives to flip the direction.
OK. The elements on the first page are good. For the elements on the second page we need to fix PANEL VARIANTS and DRAG TARGETS. Why do panel variants have different color 1 pixel borders? Same for drag targets, but dashed ones. Can we find another way of conveying whatever information those borders are coveying?
Right — both need non-thin-border replacements:
- Panel variants → drop the colored border, add a thick (3px) colored stripe on the left edge of the panel (Notion-callout style). The variant color reads from a single saturated accent instead of a thin outline.
- Drag targets → drop the dashed ring entirely; the slot's interior tints to the target color (semi-transparent ~130/255 alpha — clearly colored, but the icon underneath still reads).
Implementing.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the drag-target overlay — replace the dashed ring with a tinted fill:
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (grep -n 'draw_drag_target|gap_color' E:/a327ex/attack-template/snkrx/ui/widgets...)
12: loops (draw_drag_target). Every widget accepts opts.edition to force
33: draw_drag_target(r, kind, override)
41:local function draw_drag_target(r, kind, override)
75: gap_color color of the 1px gap inside the dashed ring (default bg)
139: draw_drag_target(lr, opts.target, opts.gap_color, ed)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the gallery — switch panel variants to stripe:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Done.
Panel variants — ui_panel gains a stripe opt (color, optional stripe_width default 3). Draws a thick vertical bar on the left edge, inset from the rounded corners so it doesn't poke past them. The chrome page's variants now use the stripe instead of a 1px border; default has no stripe (it's the baseline).
Drag targets — draw_drag_target collapsed to a single semi-transparent (~130/255 alpha) colored wash over the slot, edition-shaded. The dashed-perimeter + gap-ring logic is gone. The slot's icon / lock glyph stays visible through the tint, but the slot clearly reads green / orange / red. gap_color opt removed from ui_slot (it was the gap-ring color, no longer needed).
To test: F4 → page to chrome. Panel Variants should now show a colored bar on the left of each (except default). Drag Targets should show three tinted slots (green / orange / red) instead of dashed rings, plus the locked one at the end.
In the previous changes you made regarding the shadow, did you somehow also change the base color of the elements in some way?
Yes — I did. To keep the chrome ladder consistent (bg < slot_fill < panel_fill), I lifted all three of the dark-end tokens, not just bg. From snkrx/palette.lua:
| Token | Old | New |
|---|---|---|
bg |
(22, 28, 34) | (34, 40, 46) |
slot_fill |
(27, 31, 34) | (40, 44, 47) |
panel_fill |
(31, 33, 38) | (46, 48, 52) |
(I called it out in the brief — "Have to lift all three or the chrome semantic inverts" — but it was a single line buried in a longer message, easy to miss.)
So panels and slots are visibly brighter too, not just the bg. The rest of the palette (charcoal, panel_border, grey, all accents) was left alone.
If you want only the bg brighter and panels/slots back to their old tones, I can revert slot_fill and panel_fill — but then the bg will read brighter than the slots, which inverts the "slot is a recessed cell inside the panel surface" semantic (slot would appear lighter than its surrounding bg, like a raised tile instead of a recessed one). Two options if so:
- Revert slot/panel, accept the inverted ladder (slots and panels become darker than the floor).
- Brighten only bg by a smaller amount (e.g. (28, 32, 38)) that stays below slot_fill's old (27, 31, 34) — so the ladder ordering is preserved without lifting slot/panel.
Which direction, or leave it as-is?
Change slot_fill and panel_fill back, I just to see what it looks like.
Edit (E:/a327ex/attack-template/snkrx/palette.lua)
The file E:/a327ex/attack-template/snkrx/palette.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Reverted. bg stays at the brighter (34, 40, 46); slot_fill and panel_fill back to their originals. Panels/slots will now read darker than the bg (the "raised tile" inversion I mentioned). Take a look and let me know if that's better or worse.
This is better, but it's like the delta between colors got different. You didn't change anything about the editions themselves, right?
I didn't touch paint.lua or the edition shader directly, BUT changing palette Lua values has a subtle cascade through the edition system that explains the "different delta" you're seeing.
The setup: each of the 18 palette tokens has a "mimic edition" (50–67) in assets/draw_shader.frag's ui_palette_color(i) function — and those RGBs are hardcoded in the shader. The Lua bg = color(34, 40, 46) change updates the Lua-side color, but edition 50 (the bg mimic) in the shader still outputs the old (22, 28, 34) plus shimmer.
So you've got two different "bg" colors floating around now:
gallery_bg_layeris drawn raw (no edition pipeline) → renders at the new (34, 40, 46). That's the visibly brighter screen background.- Anywhere on
ui_layerthat usesbgcolor goes through edition 50 → still renders the old (22, 28, 34). Specifically the ghost-button interior surface andui_card's default chrome can hit this path.
Same logic applied to slot_fill / panel_fill, but those are now BACK in sync (Lua reverted to original, shader hardcode was original).
So if anything looks visually inconsistent (e.g. a ghost button reads as a different shade than the floor around it), that's the drift. To fix: bump edition 50's RGB in ui_palette_color() to match the new bg. Want me to do that?
What is the purpose of the panel variants? Where would they be used in a real life scenario?
Panel variants are a web/productivity-app idiom — colored containers that convey semantic category of the contained content:
- primary (blue): informational callouts ("Tip: hold shift to dash", active quest panel)
- warning (orange): non-blocking attention ("inventory full", "low MP", "wave starting in 3")
- success (green): positive feedback ("wave complete +50 gold", "achievement unlocked")
- danger (red): destructive / error ("leave run — unsaved progress will be lost", "out of revives")
In an actual SNKRX-style game UI, the only place I'd reach for them is a confirmation modal with a danger stripe ("leave shop?", "quit run?") and maybe a toast/notification stack with green/red toasts for rewards vs errors. Possibly a HUD low-HP warning banner.
Honestly, most game UIs convey state through other channels — icon color, text color, a status chip, a flash on the bar — rather than coloring a whole panel. The web pattern of "colored alert callouts" maps poorly to game HUDs/menus where every pixel is already chrome.
So: panel variants are real and used in a handful of spots (modals, toasts, banners), but if you're trying to keep the toolkit minimal, you could drop the stripe opt entirely and just use those spots' existing accents (the modal's primary/danger button, a danger-tinted toast bg). Want me to keep it or pull it?
[Pasted image/png]
Those can be removed then. For some reason now the per-color edition shader has some portion of it that are getting way too dark, this wasn't happening before from what I can remember. Do you have any idea what might have changed it? This is across the board and probably something to do with the color being used, or something else...
Two things — removing the panel variants first, then I'll dig into the shimmer issue.
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/galler...)
snkrx/ui/primitives.lua OK
snkrx/ui/gallery.lua OK
Now the shimmer issue. I have a theory — let me verify by reading the edition shader's alpha handling.
Bash (grep -nE 'FragColor|gl_FragColor|out vec4|noise|shimmer|ui_palette_color|u_editi...)
26:// apply_edition() as the basis for the organic_field shimmer,
27:// so the shimmer is world-stable as the camera moves.
39:// u_edition Edition mode (integer-as-float). 0 = no transform.
40:// 2..14 = HSL-driven shimmer presets (ruby, rose, amber,
44:// preserve original lightness, no shimmer).
45:// 23 = dynamic-hue shimmer (centered on the input color's
51:// u_time Elapsed seconds, used by the shimmer / palette-cycle modes
100:out vec4 FragColor;
106:uniform float u_edition;
109:// Field scale: how tightly the organic-field noise is packed in world space.
110:// 0.15 (the original Invoker default) gives a slow, broad shimmer — useful
112:// 0.5, 1.0) compress the noise so a small entity (a 10×10 player, an 8×8
120:// of continuous shimmer. The underlying field still animates over time;
125:// Optional HP-bar uniforms (only read when u_edition is 30 or 31).
186:// EDITION SUPPORT — HSL helpers, organic noise field, accent palette table,
189:// rgb<->hsl conversions and the organic_field noise pattern are from
231:// - pseudo-random noise hashed from pixel position (modes 7..8)
235:// place of smooth shimmer. Inspired by Surma's ditherpunk catalog —
246:// 7 noise / 4 lvl grainy 4-level pseudo-random stipple
247:// 8 noise / 8 lvl grainy 8-level pseudo-random stipple
313:float dither_noise(vec2 pix) {
396: if (mode == 7) return dither_quantize(field, 4.0, dither_noise(pix));
397: if (mode == 8) return dither_quantize(field, 8.0, dither_noise(pix));
424:// Smooth pseudo-noise driven by three drifting sample points. Returns a
454:// position (= vPos), which anchors the shimmer to world coords.
456:// reproduce one of these exactly (plus a lightness shimmer) so the UI
459:vec3 ui_palette_color(int i) {
485: // remain readable, skip the organic shimmer entirely. These are the
487: // override rather than a hue-locked shimmer.
504: // Shared field computation for all hue-shimmer modes. The slight sat
Bash (grep -nE 'main()|FragColor =|color.a|premult|color.rgb' E:/a327ex/attack-tem...)
134:// dispatches it in main(). For the template we use the engine's existing
452:// Apply the edition color transformation. Called from main() at the END
624:void main() {
667: FragColor = vec4(col, sprite_alpha);
750: FragColor = vec4(col, vColor.a * alpha);
Read (E:/a327ex/attack-template/assets/draw_shader.frag)
720 alpha = 1.0 - smoothstep(-u_aa_width, u_aa_width, d);
721 } else {
722 alpha = 1.0 - step(0.0, d);
723 }
724
725 // Discard fragments outside the SDF shape. Critical for stencil
726 // correctness — if we just emitted alpha=0 the fragment would still
727 // count as "drawn" and write 1 to the stencil buffer, making any
728 // SDF shape (layer_circle etc.) function as a rectangular stencil
729 // mask the size of its bounding quad. Discard skips color, depth,
730 // AND stencil writes for that fragment.
731 if (alpha <= 0.0) discard;
732
733 vec3 col = vColor.rgb + vAddColor;
734
735 int edition = int(u_edition + 0.5);
736
737 // HP-bar horizontal clipping (editions 30 and 31). Discard fragments
738 // past u_hp_clip_r so a full-width rounded rect renders as a partial
739 // fill with sharp vertical cutoffs at the fill boundary.
740 if ((edition == 30 || edition == 31) && vUV.x > u_hp_clip_r) {
741 discard;
742 }
743
744 // Apply edition on non-zero alpha. Alpha-zero pixels stay transparent —
745 // no point spending shimmer math on them.
746 if (edition > 0 && alpha > 0.01) {
747 col = apply_edition(col, edition, vPos);
748 }
749
... [3 more lines]
Read (E:/a327ex/attack-template/assets/draw_shader.frag)
455 // The 18 locked UI palette tokens, indexed 0..17. Editions 50..67 each
456 // reproduce one of these exactly (plus a lightness shimmer) so the UI
457 // can be drawn through the edition pipeline without drifting off the
458 // locked palette. Keep in lockstep with palette.lua.
459 vec3 ui_palette_color(int i) {
460 if (i == 0) return vec3( 22.0, 28.0, 34.0) / 255.0; // bg
461 if (i == 1) return vec3( 27.0, 31.0, 34.0) / 255.0; // slot_fill
462 if (i == 2) return vec3( 31.0, 33.0, 38.0) / 255.0; // panel_fill
463 if (i == 3) return vec3( 45.0, 48.0, 51.0) / 255.0; // charcoal
464 if (i == 4) return vec3( 56.0, 60.0, 65.0) / 255.0; // panel_border
465 if (i == 5) return vec3( 74.0, 77.0, 80.0) / 255.0; // grey
466 if (i == 6) return vec3(140.0, 140.0, 145.0) / 255.0; // text_muted
467 if (i == 7) return vec3(200.0, 200.0, 200.0) / 255.0; // white
468 if (i == 8) return vec3(240.0, 240.0, 235.0) / 255.0; // text
469 if (i == 9) return vec3(210.0, 49.0, 56.0) / 255.0; // red
470 if (i == 10) return vec3(233.0, 108.0, 27.0) / 255.0; // orange
471 if (i == 11) return vec3(234.0, 171.0, 28.0) / 255.0; // yellow
472 if (i == 12) return vec3(148.0, 176.0, 41.0) / 255.0; // lime
473 if (i == 13) return vec3(106.0, 166.0, 52.0) / 255.0; // green
474 if (i == 14) return vec3( 35.0, 143.0, 194.0) / 255.0; // light_blue
475 if (i == 15) return vec3( 39.0, 88.0, 180.0) / 255.0; // blue
476 if (i == 16) return vec3(110.0, 63.0, 178.0) / 255.0; // violet
477 return vec3(208.0, 66.0, 120.0) / 255.0; // pink (17)
478 }
479
480 vec3 apply_edition(vec3 col, int edition, vec2 world_pos) {
481 if (edition <= 0) return col;
482
483 // Flat-color override range (15..22): force the color to a specific
484 // RGB triplet, preserve the original lightness so highlights/shadows
... [65 more lines]
Read (E:/a327ex/attack-template/assets/draw_shader.frag)
555 vec3 b = palette_color(i_b);
556 vec3 mixed = mix(a, b, lerp_t);
557 vec3 mixed_hsl = rgb2hsl(mixed);
558 mixed_hsl.z = hsl.z;
559 return hsl2rgb(mixed_hsl);
560 } else if (edition >= 50 && edition <= 67) {
561 // UI mimic editions (50..67): reproduce a locked palette token
562 // exactly, plus a subtle lightness shimmer so the UI breathes.
563 // The draw's base color is ignored — the edition IS the color.
564 vec3 uc = ui_palette_color(edition - 50);
565 vec3 uh = rgb2hsl(uc);
566 uh.z = clamp(uh.z + (res - 0.5)*0.18, 0.0, 1.0);
567 return hsl2rgb(uh);
568 } else {
569 // Hue-locked shimmers: each tied to a specific hue center.
570 // Spread is ±0.05 except gold (5), which is tightened to ±0.03 to
571 // stay in the warm-yellow band without bleeding into green.
572 //
573 // Two flavors:
574 // STATIC (modes 2..11) hue + sat shift only. The hue wobble
575 // is small (±0.05) so the color reads as
576 // "ruby/amber/lime/etc." without obvious
577 // animation — though it IS animating.
578 // MOVING (modes 40..49) same hue + sat as the static version,
579 // PLUS a lightness wave (0.65×..1.1×)
580 // driven by the same `res` factor that
581 // silver uses. The brightness modulation
582 // is what actually makes the shimmer
583 // visible to the eye — hue shifts of the
584 // same magnitude read as near-static.
... [35 more lines]
Found it. The UI mimic editions (50–67) modulate lightness by (res - 0.5) * 0.18 — a ±0.09 HSL-lightness swing applied to the locked palette color. For dark chrome (panel_fill HSL lightness ~0.135), that swing covers roughly 0.045 → 0.225 — almost half the way to black on the dark end. The shimmer has always been doing this; from the shader (draw_shader.frag line 566):
uh.z = clamp(uh.z + (res - 0.5)*0.18, 0.0, 1.0);
What changed isn't the shimmer math — it's the bg contrast. The bg went brighter (34, 40, 46) while panel_fill stayed at the original dark (31, 33, 38). The panel is now visibly darker than its surrounding bg, so the same shimmer-noise dark valleys that were always there now read as "way too dark" by comparison. Your eye is reading the brighter bg as the reference, which makes the chrome's natural dark patches feel exaggerated.
Three ways to fix (pick one):
AskUserQuestion
Your questions have been answered: "How should the shimmer-on-dark-chrome darkening be fixed?"="Re-darken the bg". You can now continue with these answers in mind.
Edit (E:/a327ex/attack-template/snkrx/palette.lua)
The file E:/a327ex/attack-template/snkrx/palette.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
palette.lua OK
bg is now (26, 30, 36) — modestly above the original (22, 28, 34), basically tied with slot_fill's perceived brightness (avg 30.7 vs slot's 30.6). The contrast that was making the panel-interior shimmer valleys feel "way too dark" should reduce — chrome shimmer's natural ±0.09 lightness range now sits closer to bg's reference luminance, so the dark patches read less extreme.
If it's still too dark or now too dark-against-bg, knobs to try: smaller bg bump (24, 30, 36), or move to one of the shader-level fixes (cap shimmer to brighten-only, or reduce amplitude).
By those can be removed I mean the panel variants entirely.
Bash (grep -nE 'stripe|panel_variant|Panel Variants' E:/a327ex/attack-template/snkrx/u...)
E:/a327ex/attack-template/snkrx/edition.lua:53: Diagonal stripes / "line-diag" (modes 12..18):
E:/a327ex/attack-template/snkrx/edition.lua:54: 12 line diag 2x2 .. 18 line diag 8x8 — stripes at sizes 2..8
E:/a327ex/attack-template/snkrx/edition.lua:55: Anti-diagonal stripes / "line-diag-flip" (modes 19..25):
E:/a327ex/attack-template/snkrx/edition.lua:58: 26 line horizontal 2-level horizontal stripes
E:/a327ex/attack-template/snkrx/edition.lua:59: 27 line vertical 2-level vertical stripes
Bash (grep -n 'function ui_panel|stripe|opts.border' E:/a327ex/attack-template/snkrx...)
33:function ui_panel(opts)
39: if opts.border then
40: local bw = opts.border_width or 1
41: ui_rrect(r.x, r.y, r.w, r.h, rad, opts.border, ed)
Panel variants are already fully gone — both the chrome-page section and the stripe opt on ui_panel were removed in the earlier edit. Confirming the current state:
- Gallery
chromepage — has only Icon Buttons (02) + Drag Targets (03). No Panel Variants section. ui_panel—stripeopt and its draw block stripped out.ui_panel(opts)acceptsrect / bg / radius / edition / border / border_widthand that's it.
The border opt on ui_panel stays in the API — but it's not for variants anymore. It's used by ui_slot and ui_card to draw a state-indicator border on selected/hovered (the 2px green selected border, etc.). Different concept from the rejected colored-variant idea.
If you also want border removed (e.g., move state indication to a different mechanism), let me know — but the panel variants themselves are gone.
Even with bg darkened it's still off, increase bg again and do one of the other options, of changing the amplitude, but make sure that it only applies to UI.
Edit (E:/a327ex/attack-template/snkrx/palette.lua)
The file E:/a327ex/attack-template/snkrx/palette.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now reduce shimmer amplitude on the UI mimic editions (50–67) only. Game editions (2–14, 23, 24, etc.) are untouched.
Edit (E:/a327ex/attack-template/assets/draw_shader.frag)
The file E:/a327ex/attack-template/assets/draw_shader.frag has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
palette.lua OK
Done — two changes:
palette.lua—bgback to (34, 40, 46) (the brighter value).assets/draw_shader.frag— UI mimic editions (50–67) amplitude reduced from ±0.09 → ±0.04 (multiplier0.18 → 0.08). The dark patches onbg/slot_fill/panel_fillchrome should shrink to less than half their previous swing.
This is UI-only by construction — editions 50–67 are exclusively used by the toolkit (via paint.lua's ui_color_edition table). Game entities use editions 2–14 (hue-locked), 23 (dynamic), 24 (palette-cycle), etc., which retain their original amplitudes.
If 0.08 over-flattens the breathing (shimmer becomes too subtle to read), I can push it back up — say 0.12. If still too dark in patches, drop further. The knob is the 0.08 in draw_shader.frag line 567.
OK. A few element edits now. Rightmost icon button (?) still has single line border. Drag targets still have single line borders. On page 3, the elements to the left still have single line borders AND the selection green border on them looks off, we need another visual phrase here. The one you reached for with the panel variants was the right idea, and it's also present in page 9 with the list, where you have items in a sort of list and the vertical green marker on the side, do that here for those elements to the side, have them in a sort of list and the selection is based on this vertical element to the left instead of around each element.
Let me look at the current skillset page to figure out the rework, and inspect the slot/button to plan border drops.
Bash (grep -nE 'page_skillset|gallery_skill_sel' E:/a327ex/attack-template/snkrx/ui/ga...)
800:local gallery_skill_sel = 1
802:local function page_skillset(lyr)
813: selected = (gallery_skill_sel == i) })
814: if res.clicked and sk then gallery_skill_sel = i end
820: local sel = skills[gallery_skill_sel] or skills[1]
924: { name = 'skillset', draw = page_skillset },
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
800 local gallery_skill_sel = 1
801
802 local function page_skillset(lyr)
803 gallery_section_label(lyr, 8, 38, 1, 'Skillset')
804
805 -- Left: a vertical column of ability slots; empties read as locked.
806 local skills = { { fill = light_blue, glyph = 'W' },
807 { fill = red, glyph = 'F' },
808 { fill = green, glyph = 'T' } }
809 for i = 1, 5 do
810 local sk = skills[i]
811 local res = ui_slot({ rect = rect_new(8, 56 + (i - 1)*34, 30, 30),
812 id = 'skill' .. i, icon = sk, locked = (sk == nil),
813 selected = (gallery_skill_sel == i) })
814 if res.clicked and sk then gallery_skill_sel = i end
815 end
816
817 -- Right: the detail panel for the selected ability.
818 local panel = rect_new(52, 56, width - 52 - 8, 198)
819 ui_panel({ rect = panel })
820 local sel = skills[gallery_skill_sel] or skills[1]
821 local px, py = panel.x + 12, panel.y + 12
Three changes:
ui_slot— drops the defaultpanel_borderand hovergreyborders (both 1px). Only the selected state still draws a border (2px green), kept as an option for callers that want it (like the inventory grid).ui_buttonghost variant — label-only when not hovered (drop the 1px panel_border outline). Hovered ghost still inverts to white-fill, so the button is visible once moused over.page_skillset— rework the left column as a list with a left vertical green stripe for selection (theui_list_rowaccent style); ditch the green border around the selected slot.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the skillset rework — list-style with left-stripe selection:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/widgets.lua snkrx/ui/gallery.l...)
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Done. Summary:
ui_slotchrome is now borderless by default (shadow does the chrome). Onlyselected = truestill draws the 2px green border, kept for callers like the inventory grid that want the boxed look.ui_buttonghost variant is label-only when at rest — no 1px outline. Hovered ghost falls through to the solid branch and inverts to white, so it's visible the moment you hover.page_skillsetleft column shifted right by 6px; the selected ability now shows a 2px green vertical stripe atx=8(the slot's row left edge) instead of a border. Same accent idiom asui_list_row.
Effects across pages:
- chrome page → ghost icon button (
?) is now invisible until hovered; drag-target slots have no underlying 1px border (just shadow + the tint overlay). - skillset page → left column reads as a list, green left stripe marks the selected ability, no border around it.
- slots / cards / pause / hud / inventory pages → all
ui_slotuse sites lose their 1px default chrome border. The inventory grid's selected slot still shows the 2px green border (usesselected = true).
Tell me which to tune next.
The color is still bothering me. Is the amplitude change only applying to the gray color with the panels or with everything? It should only affect that. And currently, what's the lowest/highest values reached?
Honest answer: the amplitude change is applying to all 18 UI mimic editions (50–67) — that includes the accent colors (red/orange/green/etc.), not just the grayscale chrome. Fixing that now to only affect 50–58 (the chrome tokens).
Edit (E:/a327ex/attack-template/assets/draw_shader.frag)
The file E:/a327ex/attack-template/assets/draw_shader.frag has been updated successfully. (file state is current in your context — no need to Read it back)
Fixed — only editions 50–58 (the chrome tokens: bg / slot_fill / panel_fill / charcoal / panel_border / grey / text_muted / white / text) now use the reduced amplitude. Editions 59–67 (the accents: red / orange / yellow / lime / green / light_blue / blue / violet / pink) are back to the original 0.18 — they have higher base lightness and benefit from the lively shimmer.
Current lightness ranges (HSL L, 0..1 scale) at amp 0.08 (±0.04) for chrome:
| Token | Base L | Range | Approx avg RGB at extremes |
|---|---|---|---|
bg |
0.110 | 0.070..0.150 | ~14 → ~30 |
slot_fill |
0.120 | 0.080..0.160 | ~16 → ~33 |
panel_fill |
0.135 | 0.095..0.175 | ~22 → ~40 |
charcoal |
0.188 | 0.148..0.228 | ~29 → ~46 |
panel_border |
0.237 | 0.197..0.277 | ~39 → ~56 |
grey |
0.302 | 0.262..0.342 | ~57 → ~77 |
text_muted |
0.559 | 0.519..0.599 | ~127 → ~157 |
white |
0.784 | 0.744..0.824 | ~187 → ~213 |
text |
0.931 | 0.891..0.971 | ~225 → ~250 |
Caveat that may still bother you: panel_fill at its dark extreme (~RGB 22) is still noticeably darker than the new bg (34, 40, 46), so the dark patches are smaller but not gone. Two further moves if it still reads off:
- Brighten-only clamp — chrome lightness only goes ≥ base, never below. Panel_fill stays at base or brighter, never dips into "dark patches" territory. Cleanest fix.
- Even smaller amp — drop chrome to 0.04 or 0.02; shimmer becomes barely perceptible.
Want either of those, or leave as-is?
Let's try brighten only? I do need the delta to exist though because I need to see the dither effect and that requires a big enough gradient.
Switching chrome (50–58) to brighten-only at amp 0.18. That gives a 0..+0.09 lightness shift — same total width as the old symmetric ±0.04 but all upward. The dither gradient stays visible (the field still varies across the same range, just one-sided). Accents (59–67) keep their symmetric ±0.09.
Edit (E:/a327ex/attack-template/assets/draw_shader.frag)
The file E:/a327ex/attack-template/assets/draw_shader.frag has been updated successfully. (file state is current in your context — no need to Read it back)
Done. Updated chrome lightness ranges (brighten-only, 0..+0.09 from base):
| Token | Base L | Range | Approx RGB avg |
|---|---|---|---|
bg |
0.110 | 0.110..0.200 | ~28 → ~46 |
slot_fill |
0.120 | 0.120..0.210 | ~31 → ~48 |
panel_fill |
0.135 | 0.135..0.225 | ~34 → ~52 |
charcoal |
0.188 | 0.188..0.278 | ~48 → ~67 |
panel_border |
0.237 | 0.237..0.327 | ~60 → ~78 |
grey |
0.302 | 0.302..0.392 | ~77 → ~93 |
text_muted |
0.559 | 0.559..0.649 | ~143 → ~170 |
white |
0.784 | 0.784..0.874 | ~200 → ~222 |
text |
0.931 | 0.931..1.000 | ~237 → ~255 |
So panel_fill always stays ≥ ~34 RGB avg (its base), never dips into the "dark patch" territory it had with the symmetric swing. The dither/noise field still varies across that 0.09 range, so the shimmer pattern remains visible — just always brighter than base, never below.
If the shimmer reads as too subtle (since you only see the brighten direction), I can push the amp to 0.30 (range 0..+0.15) for a more pronounced "highlight" effect. Otherwise this should settle the dark-patch issue.
We'll do a pass on this in another session I think, including adding additional background patterns instead of only this one noise pattern we have now. But let's leave that for later. Now let's continue fixing elements. On page 4, that particular HP bar is too thin and doesn't need any values in it. The minimap is supposed to have dashed lines between the points? Those aren't visible. General rule: font for text = Lana, font for single UI lines and other individual UI elements = Ark. So inside the status panel it should be Ark. Then from page 5 to page 17 you need to apply the general changes to elements we made in the previous pages. Do the ones you're sure about in one go, flag the ones you're unsure about explaining to me what you're unsure about and I'll give more direction.
Let me handle page 4 first, then sweep 5–17.
Bash (grep -n 'page_pause|page_hud|page_shop|page_inventory|page_cards|page_conte...)
64:local function page_primitives(lyr)
117:local function page_compose(lyr)
183:local function page_slots(lyr)
275:local function page_buttons(lyr)
301:local function page_tags(lyr)
336:local function page_bars(lyr)
371:local function page_tabs(lyr)
399:local function page_form(lyr)
439:local function page_content(lyr)
490:local function page_cards(lyr)
519:local function page_hud(lyr)
567:local function page_shop(lyr)
647:local function page_inventory(lyr)
861:local function page_pause(lyr)
932: { name = 'pause', draw = page_pause },
933: { name = 'hud', draw = page_hud },
934: { name = 'shop', draw = page_shop },
935: { name = 'inventory', draw = page_inventory },
936: { name = 'cards', draw = page_cards },
937: { name = 'content', draw = page_content },
938: { name = 'form', draw = page_form },
939: { name = 'tabs', draw = page_tabs },
940: { name = 'bars', draw = page_bars },
941: { name = 'compose', draw = page_compose },
942: { name = 'tags', draw = page_tags },
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
861 local function page_pause(lyr)
862 -- Top: a compact status strip.
863 ui_text({ rect = rect_new(8, 40, 18, 8), text = 'HP', color = text_muted })
864 ui_bar({ rect = rect_new(28, 40, 90, 8), value = 64, max = 100,
865 color = green })
866 ui_text({ rect = rect_new(8, 50, 18, 8), text = 'MP', color = text_muted })
867 ui_bar({ rect = rect_new(28, 51, 90, 6), fill = 0.45, color = light_blue })
868 local mini = { { red, 'F' }, { light_blue, 'I' }, { green, 'S' },
869 { violet, 'T' } }
870 local x = 128
871 for _, m in ipairs(mini) do
872 ui_item_icon({ rect = rect_new(x, 40, 16, 16), fill = m[1],
873 glyph = m[2] })
874 x = x + 20
875 end
876 ui_stat_chip({ x = 224, y = 42, label = 'wave', value = '7',
877 value_color = text })
878 ui_stat_chip({ x = 286, y = 42, glyph = 'o', label = 'gold',
879 value = '236' })
880
881 -- Pause menu panel (left).
882 local pm = rect_new(8, 72, 200, 180)
883 ui_panel({ rect = pm })
884 ui_text({ rect = rect_new(pm.x, pm.y + 12, pm.w, 16), text = 'PAUSED',
885 font = ui_font_header_l, align_h = 'center' })
886 local pbtns = { { 'resume', 'primary' }, { 'options', 'secondary' },
887 { 'return to town', 'secondary' }, { 'quit run', 'danger' } }
888 local by = pm.y + 42
889 for i, b in ipairs(pbtns) do
890 ui_button({ rect = rect_new(pm.x + 20, by, pm.w - 40, 24),
... [30 more lines]
Bash (grep -nE 'layer_line\b|^### layer_line' E:/a327ex/Anchor2/docs/ENGINE_API_QUICK....)
E:/a327ex/Anchor2/docs/ENGINE_API_QUICK.md:15:layer_line(layer, x1, y1, x2, y2, width, color)
E:/a327ex/Anchor2/docs/FRAMEWORK_API_QUICK.md:241:layer_line(lyr, x1, y1, x2, y2, width, color)
Let me check what the other pages need by reading them. Then I'll do a focused pass.
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
519 local function page_hud(lyr)
520 -- Top-left: HP + MP bars.
521 ui_text({ rect = rect_new(8, 42, 18, 10), text = 'HP', color = text_muted })
522 ui_bar({ rect = rect_new(28, 42, 124, 10), value = 72, max = 100,
523 color = green })
524 ui_text({ rect = rect_new(8, 56, 18, 8), text = 'MP', color = text_muted })
525 ui_bar({ rect = rect_new(28, 57, 124, 6), fill = 0.6, color = light_blue })
526
527 -- Top-right: resource chips, laid out left-to-right.
528 local x = 300
529 local function chip(label, val, vc)
530 local r = ui_label({ x = x, y = 42, runs = {
531 { text = label .. ' ', color = text_muted },
532 { text = val, color = vc } } })
533 x = x + r.w + 6
534 end
535 chip('score', '1240', text)
536 chip('wave', '7', yellow)
537 chip('gold', '86', yellow)
538
539 -- Top-center: an enemy / boss HP bar.
540 ui_text({ rect = rect_new(0, 60, width, 8), text = 'STONE GOLEM',
541 color = text_muted, align_h = 'center' })
542 ui_bar({ rect = rect_new(math.floor(width/2 - 80), 70, 160, 6),
543 fill = 0.85, color = red })
544
545 -- Bottom-center: the ability slot bar with keybind captions.
546 local icons = {
547 { fill = red, glyph = 'F' }, { fill = light_blue, glyph = 'I' },
548 { fill = green, glyph = 'S' }, { fill = violet, glyph = 'T' },
... [20 more lines]
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
336 local function page_bars(lyr)
337 -- 01 PROGRESS BARS — static (no id, no juice); thick + thin.
338 gallery_section_label(lyr, 8, 38, 1, 'Progress Bars')
339 ui_bar({ rect = rect_new(8, 54, 200, 12), fill = 0.72 })
340 ui_text({ rect = rect_new(214, 54, 40, 12), text = '72%', color = text_muted })
341 ui_bar({ rect = rect_new(8, 74, 200, 5), fill = 0.45, color = light_blue })
342 ui_text({ rect = rect_new(214, 73, 40, 7), text = '45%', color = text_muted })
343 ui_bar({ rect = rect_new(8, 88, 200, 12), fill = 1.0, color = yellow })
344
345 -- 02 HEALTH BAR — interactive: damage drops it; watch the bar pop,
346 -- flash white, and the trailing chunk ease down to the new fill.
347 gallery_section_label(lyr, 8, 122, 2, 'Health Bar')
348 ui_bar({ rect = rect_new(8, 140, 220, 14), id = 'hp', color = green,
349 value = gallery_hp*100, max = 100 })
350 if ui_button({ rect = rect_new(8, 166, 66, 22), id = 'hp_dmg',
351 label = 'damage', variant = 'danger' }).clicked then
352 gallery_hp = math.max(0, gallery_hp - 0.18)
353 end
354 if ui_button({ rect = rect_new(82, 166, 52, 22), id = 'hp_heal',
355 label = 'heal', variant = 'primary' }).clicked then
356 gallery_hp = math.min(1, gallery_hp + 0.25)
357 end
358 if ui_button({ rect = rect_new(142, 166, 56, 22), id = 'hp_reset',
359 label = 'reset', variant = 'secondary' }).clicked then
360 gallery_hp = 1.0
361 end
362 end
363
364 -- ── Page: tabs ────────────────────────────────────────────────────
365 -- Active selections for the demo strips. Caller-owned, file-scope so
... [35 more lines]
Bash (grep -n 'local gallery_bg_layer|function gallery_section_label' E:/a327ex/attac...)
31:local gallery_bg_layer = layer_new('ui_gallery_bg')
39:function gallery_section_label(lyr, x, y, num, title)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now page 4 fixes — HP bar thicker + no value, fonts → Ark, dashed minimap connectors:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
935 ui_panel({ rect = mp })
936 ui_text({ rect = rect_new(mp.x + 10, mp.y + 8, 100, 10), text = 'MINIMAP',
937 color = text_muted, font = ui_font_body_ark })
938 local nodes = { { 0.15, 0.55 }, { 0.4, 0.35 }, { 0.62, 0.7 },
939 { 0.85, 0.45 } }
940 -- Pre-compute node screen positions, draw dashed connectors first
941 -- so the node dots overlap them at the joints.
942 local pos = {}
943 for i, nd in ipairs(nodes) do
944 pos[i] = { mp.x + 14 + nd[1]*(mp.w - 34),
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
948 draw_dashed_line(lyr, pos[i][1] + 3, pos[i][2] + 3,
949 pos[i + 1][1] + 3, pos[i + 1][2] + 3,
950 panel_border())
951 end
952 for i, p in ipairs(pos) do
953 ui_rrect(p[1], p[2], 6, 6, 3,
954 (i == #nodes) and red or green, nil)
955 end
956 end
957
Now widget defaults — switching ui_label, ui_tabs, ui_checkbox, ui_radio defaults to Ark per the rule.
Bash (grep -n 'opts.font or ui_font_body\b|opts.font or ui_font_body$' E:/a327ex/atta...)
E:/a327ex/attack-template/snkrx/ui/primitives.lua:162: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/primitives.lua:205: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:525: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:581: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:910: local font = opts.font or ui_font_body
Bash (grep -nB1 'opts.font or ui_font_body\b' E:/a327ex/attack-template/snkrx/ui/primi...)
E:/a327ex/attack-template/snkrx/ui/primitives.lua-161-function ui_rich_text(opts)
E:/a327ex/attack-template/snkrx/ui/primitives.lua:162: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/primitives.lua-204-function ui_label(opts)
E:/a327ex/attack-template/snkrx/ui/primitives.lua:205: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:525: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:581: local font = opts.font or ui_font_body
E:/a327ex/attack-template/snkrx/ui/widgets.lua:910: local font = opts.font or ui_font_body
Bash (grep -nE '^function ui_(checkbox|radio|text_input|tabs)' E:/a327ex/attack-templa...)
370:function ui_tabs(opts)
522:function ui_checkbox(opts)
578:function ui_radio(opts)
907:function ui_text_input(opts)
Bash (grep -nB1 -A2 'opts.font' E:/a327ex/attack-template/snkrx/ui/widgets.lua | grep ...)
---
local rad = opts.radius or 6
local pad = opts.pad or 3
local ed = opts.edition
local font = opts.font
or (variant == 'segment' and ui_font_header_l or ui_font_body)
local n = #items
local gap = 2
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
203 ]]
204 function ui_label(opts)
205 local font = opts.font or ui_font_body
206 local pad_x = opts.pad_x or 6
207 local pad_y = opts.pad_y or 3
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
522 function ui_checkbox(opts)
523 local r = opts.rect
524 local id = opts.id
525 local font = opts.font or ui_font_body
526 local ed = opts.edition
527 local on = opts.checked
528
529 -- Hit region spans the indicator box plus the label.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
578 function ui_radio(opts)
579 local r = opts.rect
580 local id = opts.id
581 local font = opts.font or ui_font_body
582 local ed = opts.edition
583 local on = opts.selected
584
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Page 5 (HUD) — HP/MP labels, boss-name label, keybind captions → Ark:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Page 12 (bars) — percentage labels → Ark:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/gallery.lua OK
Wait — I changed the HUD HP bar to drop its value text too, but the user only specified the pause HP bar. Reverting HUD back to showing the value, since HUD bars usually want exact HP/100:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
gallery.lua OK
Done
Page 4 (pause):
- HP bar thickened (h=8 → h=10) and value text dropped (now
fill = 0.64). - MP bar nudged down 1px (y=51 → y=52) to keep spacing.
- HP/MP labels, STATUS/MINIMAP section headers, status-effect rows (name + timer) → Ark.
- Minimap: new
draw_dashed_linehelper drawspanel_border-colored dashed connectors between consecutive nodes vialayer_line.
Page 5 (HUD):
- HP/MP labels, STONE GOLEM boss-name label, ability keybind captions (Q/W/E/R/F) → Ark.
Page 12 (bars):
- Progress-bar percentage labels (72%, 45%) → Ark.
Widget defaults updated (cascades to every caller — these are the "individual UI element" widgets the rule covers):
ui_labeldefault font: Lana → Ark.ui_tabs(non-segment variant) default: Lana → Ark.ui_checkboxlabel default: Lana → Ark.ui_radiolabel default: Lana → Ark.
Effects: chips on the HUD (score/wave/gold), tabs on inventory, checkboxes on form, etc., all flip to Ark automatically.
Flagged — want your call
ui_textdefault: kept at Lana. It's used both for description lines (Lana, per rule) and single UI lines (should be Ark). If I switch the default to Ark, every desc/paragraph caller (tooltip body, card desc, skillset desc, inventory desc) needs an explicitfont = ui_font_bodyoverride. Switch the default and add explicit Lana to desc callers, or leave default and explicitly pass Ark to single-line callers? (Currently I'm doing the latter, per-call.)ui_buttondefault font (PixulBrush): per the rule, buttons are single UI lines → Ark. But PixulBrush was a deliberate "distinctive button font" choice (chunky brush). Keep PixulBrush as the button font's identity, or switch to Ark for consistency?gallery_section_label(the "01 BADGES" / "02 STAT CHIPS" headers atop each gallery page): currently Lana. They're single UI lines. Switch to Ark too?ui_cardtitle font andui_tooltiptitle font: both currently Awesomeheader_l@16 — chunky distinctive titles. Keep, or switch to Ark for consistency?- Inventory detail panel & skillset detail panel desc lines: I left them as default Lana (they're description paragraphs). The
typefield on inventory (single word like "orb") is currently default Lana — should it be Ark? Same for stat lines that aren'tui_stat_chip? - HUD HP bar value display: kept value/max text. Want me to drop it like the pause one and make HP a plain bar with no text?
Pages 6 / 7 / 8 / 9 / 10 / 11 / 13 / 14 / 15 / 16 / 17 weren't explicitly edited because the changes I'm sure about (widget defaults) already propagate to them, and any further per-page font swaps depend on your answers above. Once you weigh in I'll sweep them.
stat chips failed to propagate, their rule was always capitalized, they're not after page 4. HP values on page 5 need to go down 1 pixel, the general SLOT + ICON construct, where there's a slot and an icon inside it, currently the icon is smaller which leaves a border of 1-2 pixels from the slot, let's make it so that the icon is always the same size as the slot, so when the slot is filled it's just as though it were a button with the icon with nothing around it. Such elements are present in page 3, 5, 7, 13, 16. Cards on page 6 still have 1 pixel border, shouldn't be the case. We should find another way to make it visible that one card is selected versus another, I don't know how though. But maybe something that's visually similar to the solution we have in page 3. Juice on the cards is too abrupt and odd, is the way things are juice across the board the same in terms of the spring pulls? We want springs that feel softer and less aggressive in general. The buttons are for the most part fine, but on bigger elements like the cards it seems odd. The tabs we have on page 7 look odd now with the awesome font, let's try the Ark font there too, all caps. Selection of inventory items with the full green border is a no-go in that same page, we need a new general way of showing selection when elements are in a grid. In a vertical/horizontal line we what we did in page 3, but in a grid we might need something else, don't know what though. Page 8 same problems with the cards. Page 9 is all ok. Page 10 has all elements (Except slider) with 1 pixel borders, those need to go. Page 11 has tabs, same change as in the other page that also had tabs, you can remove the SEGMENTS elements entirely. Text on health bar in page 12 can also go 1 pixel down. stat chips in page 13 need to have the all caps change to them too, we already decided that stat chips will be all caps Ark, so you can remove the ones with pixul on page 14. Buttons will use pixul, can remove the other 2 fonts entirely on page 15. Page 16 contains everything we already talked about from other pages that also needs changing, page 17 whatever.
Big batch — let me work through this systematically. First, let me investigate a few things before coding.
Bash (grep -nE '^### spring_new|^### spring_add|^### spring_pull' E:/a327ex/Anchor2/do...)
---
grep: Unmatched ( or \(
Bash (grep -nE 'spring_new|spring_add|spring_pull|spring_update' E:/a327ex/Anchor2/doc...)
545:spring at value 1 is created by `spring_new()`.
548:spring_new() -> s -- auto-adds 'main' at x=1
549:spring_add(s, name, x?, frequency?, bounce?) -- frequency default 5, bounce default 0.5
550:spring_pull(s, name, force, frequency?, bounce?)
553:spring_update(s, dt)
Read (E:/a327ex/attack-template/anchor/spring.lua)
1 --[[
2 spring — procedural damped spring animation.
3
4 Usage:
5 self.spring = spring_new() -- in constructor
6 spring_add(self.spring, 'scale', 1, 5, 0.5) -- name, initial value, frequency, bounce
7 spring_pull(self.spring, 'scale', 0.3) -- apply impulse
8 spring_update(self.spring, dt) -- in update
9
10 -- Read current value:
11 local s = self.spring.scale.x
12
13 A default 'main' spring at value 1 is created on spring_new() for convenience.
14 You typically use spring.main.x as a single pulsing value for hit flashes,
15 click feedback, etc.
16
17 Spring parameters:
18 frequency - oscillations per second (higher = faster)
19 bounce - bounciness 0-1 (0=no overshoot, 1=infinite oscillation)
20 bounce=0.5 is moderate overshoot, common for hit reactions.
21 ]]
22
23 --[[
24 spring_new()
25 Creates a new spring container with a default 'main' spring at value 1.
26 ]]
27 function spring_new()
28 local s = {
29 _names = {},
30 }
... [30 more lines]
Read (E:/a327ex/attack-template/anchor/spring.lua)
58 --[[
59 spring_pull(s, name, force, [frequency], [bounce])
60 Applies an impulse to a named spring. Optionally updates frequency/bounce.
61 This is the "jolt" operation used for hit reactions.
62 ]]
63 function spring_pull(s, name, force, frequency, bounce)
64 local sp = s[name]
65 if not sp then return end
66 if frequency then
67 sp.k = (2*math.pi*frequency)^2
68 sp.d = 4*math.pi*(1 - (bounce or 0.5))*frequency
69 end
70 sp.x = sp.x + force
71 end
72
73 --[[
74 spring_set_target(s, name, value)
75 Changes where the named spring settles.
76 ]]
77 function spring_set_target(s, name, value)
78 if s[name] then s[name].target_x = value end
79 end
80
81 --[[
82 spring_at_rest(s, name, [threshold])
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
671 }
672
673 local function page_inventory(lyr)
674 -- Section tabs.
675 local tabs = ui_tabs({ rect = rect_new(8, 40, 200, 22), id = 'inv_tabs',
676 items = { 'items', 'orbs', 'relics' }, active = gallery_inv_tab,
677 font = ui_font_pixul })
678 if tabs.clicked then gallery_inv_tab = tabs.clicked end
679
680 -- Left: a 5x4 item grid.
Let me check stat-chip-like usages across pages and read the pages I haven't seen:
Bash (grep -n 'ui_stat_chip|ui_label.runs.color = ' E:/a327ex/attack-template/snkrx...)
724:-- ── Page: badges (ui_bracket_tag / ui_stat_chip / ui_pips) ───────
780: x = x + ui_stat_chip({ x = x, y = 136, label = c[1], value = c[2],
866: ui_stat_chip({ x = px, y = py + 62, glyph = '*', label = 'damage',
868: ui_stat_chip({ x = px + 96, y = py + 62, label = 'cooldown',
903: ui_stat_chip({ x = 224, y = 42, label = 'wave', value = '7',
905: ui_stat_chip({ x = 286, y = 42, glyph = 'o', label = 'gold',
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
117
118 y = y + 4
119 local ar = rect_new(8, y, 200, 38)
120 ui_panel({ rect = ar })
121 local arows = rect_split_v(rect_contract(ar, 3), 3)
122 ui_text({ rect = arows[1], text = 'left', align_h = 'left' })
123 ui_text({ rect = arows[2], text = 'center', align_h = 'center' })
124 ui_text({ rect = arows[3], text = 'right', align_h = 'right' })
125 y = y + 38 + 10
126
127 -- 03 DIVIDER — horizontal + vertical.
128 gallery_section_label(lyr, 8, y, 3, 'Divider')
129 y = y + 14
130 ui_divider({ rect = rect_new(8, y + 6, 220, 1) })
131 ui_divider({ rect = rect_new(244, y, 1, 28), orient = 'v' })
132 end
133
134 -- ── Page: composition demo ────────────────────────────────────────
135 -- A shop screen composed from EVERY element built so far — panel,
136 -- text, divider, item_icon, slot, button, rich_text, label.
137 local function page_compose(lyr)
138 -- Top bar: gold label · SHOP title · level label · underline.
139 ui_label({ x = 8, y = 40, runs = {
140 { text = 'gold ', color = text_muted }, { text = '26', color = yellow } } })
141 ui_text({ rect = rect_new(0, 40, width, 16), text = 'SHOP',
142 font = ui_font_header_l, align_h = 'center' })
143 local lw = ui_font_body:text_width('level 7') + 12
144 ui_label({ x = width - 8 - lw, y = 40, runs = {
145 { text = 'level ', color = text_muted }, { text = '7', color = yellow } } })
146 ui_divider({ rect = rect_new(8, 62, width - 16, 1) })
... [45 more lines]
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
301 color = text_muted })
302 button_row(64, ui_font_header_l, 'awe_')
303
304 ui_text({ rect = rect_new(8, 92, 200, 10), text = 'PixulBrush',
305 color = text_muted })
306 button_row(104, ui_font_pixul, 'pix_')
307
308 ui_text({ rect = rect_new(8, 132, 200, 10), text = 'body font',
309 color = text_muted })
310 button_row(144, ui_font_body, 'bod_')
311
312 ui_text({ rect = rect_new(8, 176, 320, 12), color = text_muted,
313 text = 'last clicked: ' .. gallery_btn_log })
314
315 gallery_section_label(lyr, 8, 196, 2, 'Disabled')
316 ui_button({ rect = rect_new(8, 210, 80, 22), label = 'locked',
317 variant = 'primary', disabled = true })
318 end
319
320 -- ── Page: rich text & labels ──────────────────────────────────────
321 local function page_tags(lyr)
322 -- A small muted caption naming the font a row is drawn in.
323 local function caption(y, s)
324 ui_text({ rect = rect_new(8, y, 48, 14), text = s, color = text_muted })
325 end
326
327 -- 01 RICH TEXT — the metadata motif: PixulBrush words with the [ ]
328 -- glyphs in Awesome (see meta_runs). Shown left-aligned and centered.
329 gallery_section_label(lyr, 8, 38, 1, 'Rich Text')
330 ui_rich_text({ x = 8, y = 56, runs = meta_runs, font = ui_font_pixul })
... [10 more lines]
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
340 r = ui_label({ x = x, y = y, font = font, runs = {
341 { text = 'level ', color = text_muted }, { text = '7', color = yellow } } })
342 x = x + r.w + 8
343 ui_label({ x = x, y = y, font = font, runs = {
344 { text = 'gold ', color = text_muted }, { text = '26', color = yellow } } })
345 end
346 caption(124, 'body')
347 label_row(120, ui_font_body)
348 caption(152, 'pixul')
349 label_row(148, ui_font_pixul)
350 end
351
352 -- ── Page: bars ────────────────────────────────────────────────────
353 -- Current health fraction for the interactive demo. Caller-owned.
354 local gallery_hp = 1.0
355
356 local function page_bars(lyr)
357 -- 01 PROGRESS BARS — static (no id, no juice); thick + thin.
358 gallery_section_label(lyr, 8, 38, 1, 'Progress Bars')
359 ui_bar({ rect = rect_new(8, 54, 200, 12), fill = 0.72 })
360 ui_text({ rect = rect_new(214, 54, 40, 12), text = '72%', color = text_muted,
361 font = ui_font_body_ark })
362 ui_bar({ rect = rect_new(8, 74, 200, 5), fill = 0.45, color = light_blue })
363 ui_text({ rect = rect_new(214, 73, 40, 7), text = '45%', color = text_muted,
364 font = ui_font_body_ark })
365 ui_bar({ rect = rect_new(8, 88, 200, 12), fill = 1.0, color = yellow })
366
367 -- 02 HEALTH BAR — interactive: damage drops it; watch the bar pop,
368 -- flash white, and the trailing chunk ease down to the new fill.
369 gallery_section_label(lyr, 8, 122, 2, 'Health Bar')
Big batch. Let me work through widget-level changes first, then per-page.
Bash (grep -nE 'opts.icon_pad|opts.icon\b' E:/a327ex/attack-template/snkrx/ui/widgets....)
117: if opts.icon then
118: local pad = opts.icon_pad or 2
120: fill = opts.icon.fill, glyph = opts.icon.glyph,
121: glyph_font = opts.icon.glyph_font,
122: glyph_color = opts.icon.glyph_color, edition = ed })
842: if opts.icon then
844: fill = opts.icon.fill, glyph = opts.icon.glyph,
845: glyph_font = opts.icon.glyph_font, edition = ed })
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
95 ui_state.active_id = nil
96 end
97 end
98 if id then ui_juice_hover(id, hovered) end
99
100 -- Scale-spring bounce around the slot center.
101 local s = (id and not opts.disabled) and ui_juice_scale(id) or 1
102 layer_push(ui_layer, r.x + r.w/2, r.y + r.h/2, 0, s, s)
103 local lr = { x = -r.w/2, y = -r.h/2, w = r.w, h = r.h }
104
105 -- Chrome — no default border (the shadow gives chrome thickness);
106 -- selected still draws a 2px green border (thick enough to satisfy
107 -- the "no thin borders" rule). Hover is now indicated by the
108 -- scale-pop juice alone.
109 if opts.selected then
110 ui_panel({ rect = lr, bg = slot_fill, border = green,
111 border_width = 2, radius = rad, edition = ed })
112 else
113 ui_panel({ rect = lr, bg = slot_fill, radius = rad, edition = ed })
114 end
115
116 -- Occupancy.
117 if opts.icon then
118 local pad = opts.icon_pad or 2
119 ui_item_icon({ rect = rect_contract(lr, pad),
120 fill = opts.icon.fill, glyph = opts.icon.glyph,
121 glyph_font = opts.icon.glyph_font,
122 glyph_color = opts.icon.glyph_color, edition = ed })
123 end
124
... [25 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now ui_card — drop the border, add top stripe for selected:
Bash (grep -nE 'function ui_card|opts.selected.+border|ui_panel.+border' E:/a327ex/att...)
808:function ui_card(opts)
838: if opts.selected then border = green
841: ui_panel({ rect = lr, border = border, radius = 4, edition = ed })
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
832 local s = (id and ui_juice_scale(id)) or 1
833 layer_push(ui_layer, r.x + r.w/2, r.y + r.h/2, 0, s, s)
834 local lr = { x = -r.w/2, y = -r.h/2, w = r.w, h = r.h }
835
836 -- Chrome: border by state.
837 local border = panel_border
838 if opts.selected then border = green
839 elseif hovered then border = grey
840 end
841 ui_panel({ rect = lr, border = border, radius = 4, edition = ed })
842
843 -- Icon tile, centered horizontally near the top.
844 local isz = opts.icon_size or 40
845 if opts.icon then
846 ui_item_icon({ rect = { x = -isz/2, y = lr.y + pad, w = isz, h = isz },
847 fill = opts.icon.fill, glyph = opts.icon.glyph,
848 glyph_font = opts.icon.glyph_font, edition = ed })
849 end
850
851 -- Title, centered, below the icon.
852 local ty = lr.y + pad + isz + 6
853 ui_text({ rect = { x = lr.x, y = ty, w = lr.w, h = ui_font_header_l.height },
854 text = opts.title, font = ui_font_header_l,
855 color = opts.title_color or text, align_h = 'center',
856 align_v = 'top', edition = ed })
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now ui_checkbox / ui_radio — drop off-state border outlines:
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
555 -- Label, to the right (drawn outside the scale push).
556 if opts.label then
557 ui_text({ rect = { x = r.x + r.w + 6, y = r.y, w = lw + 4, h = r.h },
558 text = opts.label, font = font, color = text,
559 align_v = 'center', edition = ed })
560 end
561
562 return { checked = checked, clicked = clicked }
563 end
564
565 --[[
566 ui_radio(opts) -> { selected, clicked }
567
568 One radio button: a circular indicator + an optional label, the whole
569 row clickable, with the SNKRX juice. The caller places each radio of
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
540
541 -- Indicator — scale-popped around the box center.
542 local s = (id and ui_juice_scale(id)) or 1
543 layer_push(ui_layer, r.x + r.w/2, r.y + r.h/2, 0, s, s)
544 local lc = { x = -r.w/2, y = -r.h/2, w = r.w, h = r.h }
545 if on then
546 ui_rrect(lc.x, lc.y, lc.w, lc.h, 3, green, ed)
547 draw_checkmark(lc.w, lc.h, text, ed)
548 else
549 ui_rrect(lc.x, lc.y, lc.w, lc.h, 3,
550 hovered and grey or panel_border, ed)
551 ui_rrect(lc.x + 1, lc.y + 1, lc.w - 2, lc.h - 2, 2, charcoal, ed)
552 end
553 layer_pop(ui_layer)
554
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
595 local s = (id and ui_juice_scale(id)) or 1
596 layer_push(ui_layer, r.x + r.w/2, r.y + r.h/2, 0, s, s)
597 local lc = { x = -r.w/2, y = -r.h/2, w = r.w, h = r.h }
598 -- Circle = border ring + charcoal interior (radius = side/2).
599 ui_rrect(lc.x, lc.y, lc.w, lc.h, lc.w/2,
600 hovered and grey or panel_border, ed)
601 ui_rrect(lc.x + 1, lc.y + 1, lc.w - 2, lc.h - 2, (lc.w - 2)/2,
602 charcoal, ed)
603 if on then
604 local d = math.floor(lc.w*0.45 + 0.5)
605 ui_rrect(-d/2, -d/2, d, d, d/2, green, ed)
606 end
607 layer_pop(ui_layer)
608
609 if opts.label then
610 ui_text({ rect = { x = r.x + r.w + 6, y = r.y, w = lw + 4, h = r.h },
611 text = opts.label, font = font, color = text,
612 align_v = 'center', edition = ed })
613 end
614
615 return { selected = clicked or on, clicked = clicked }
616 end
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now ui_text_input — drop border:
Bash (grep -n 'function ui_text_input|border = panel_border|border = green|border =...)
910:function ui_text_input(opts)
945: local border = panel_border
946: if focused then border = green
947: elseif hovered then border = grey
949: ui_rrect(r.x, r.y, r.w, r.h, 4, border, ed)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
942 end
943
944 -- Chrome — charcoal field, border by state.
945 local border = panel_border
946 if focused then border = green
947 elseif hovered then border = grey
948 end
949 ui_rrect(r.x, r.y, r.w, r.h, 4, border, ed)
950 ui_rrect(r.x + 1, r.y + 1, r.w - 2, r.h - 2, 3, charcoal, ed)
951
952 -- Content + caret, stencil-clipped to the field interior.
953 local inner_x, inner_w = r.x + pad, r.w - 2*pad
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now softer springs in juice.lua:
Read (E:/a327ex/attack-template/snkrx/ui/juice.lua)
35
36 -- HP bar tween tuning (seconds). The front bar snaps fast toward the
37 -- current HP; the back bar waits out the delay then eases slowly down;
38 -- the value text counts down on its own ease.
39 local BAR_FRONT_DUR = 0.18
40 local BAR_BACK_DELAY = 0.15
41 local BAR_BACK_DUR = 0.5
42 local BAR_VALUE_DUR = 0.35
43
44 -- The "cash-register kick" (Emoji Aimer's gold chip): on damage the
45 -- whole bar drops BAR_KICK px instantly, then returns linearly to 0.
46 local BAR_KICK = 4
47 local BAR_KICK_DUR = 0.25
48
49 local function entry(id)
Bash (sed -n '49,58p' E:/a327ex/attack-template/snkrx/ui/juice.lua)
local function entry(id)
local e = ui_juice[id]
if not e then
e = { spring = spring_new(), was_hovered = false }
ui_juice[id] = e
end
return e
end
-- Tick every spring + the shared HP bar scheduler. Call once per frame
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now ui_bar value text shift down 1px:
Bash (grep -n 'opts.max then|text = math.floor' E:/a327ex/attack-template/snkrx/ui/wi...)
316: if opts.max then
341: if opts.max then
343: text = math.floor((shown_v or 0) + 0.5) .. ' / ' .. opts.max })
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
339
340 -- Centered value text — health mode only (counts down via shown_v).
341 if opts.max then
342 ui_text({ rect = dr, align_h = 'center', color = text, edition = ed,
343 text = math.floor((shown_v or 0) + 0.5) .. ' / ' .. opts.max })
344 end
345 end
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now page changes — HUD chips → ui_stat_chip:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Inventory tabs — uppercased + drop pixul override:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Tabs page — uppercase + drop pixul override + remove segments:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Buttons page — keep only PixulBrush row:
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
293 end
294
295 local function page_buttons(lyr)
296 gallery_section_label(lyr, 8, 38, 1, 'Buttons')
297
298 -- The same buttons in three fonts — Awesome / PixulBrush / body
299 -- (B flips the body row between LanaPixel and Ark Pixel).
300 ui_text({ rect = rect_new(8, 52, 200, 10), text = 'Awesome',
301 color = text_muted })
302 button_row(64, ui_font_header_l, 'awe_')
303
304 ui_text({ rect = rect_new(8, 92, 200, 10), text = 'PixulBrush',
305 color = text_muted })
306 button_row(104, ui_font_pixul, 'pix_')
307
308 ui_text({ rect = rect_new(8, 132, 200, 10), text = 'body font',
309 color = text_muted })
310 button_row(144, ui_font_body, 'bod_')
311
312 ui_text({ rect = rect_new(8, 176, 320, 12), color = text_muted,
313 text = 'last clicked: ' .. gallery_btn_log })
314
315 gallery_section_label(lyr, 8, 196, 2, 'Disabled')
316 ui_button({ rect = rect_new(8, 210, 80, 22), label = 'locked',
317 variant = 'primary', disabled = true })
318 end
319
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Tags page — remove the PixulBrush label row:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Compose page — replace ui_label stat-chip-like calls with ui_stat_chip:
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/primitives.lua snkrx/ui/widget...)
snkrx/ui/primitives.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/juice.lua OK
snkrx/ui/gallery.lua OK
All clean. Here's everything in this pass:
Widget-level changes (cascade to all callers)
ui_slot: icon pad default 2 → 0 (icon fills the slot, occupied = just an icon, no slot frame around it). Icon radius matched to slot radius. Selected state dropped the green border — now draws a 2px green top stripe (the horizontal analog of page-3's vertical stripe), inset from the rounded corners.ui_card: same idiom — dropped border (default + hover + selected), selected gets a 3px green top stripe.ui_checkbox/ui_radiooff state: dropped the panel-border 1px outline; just a single charcoal fill (or circle). Hover indication is the scale-pop alone.ui_text_input: dropped border. Focus is indicated by the blinking caret only (no border state, no fill change).ui_barvalue text:+1 pxy-shift to compensate for the body font's top-heavy baseline. Applied globally — affects page 5 HUD HP and page 12 health bar.ui_juice: all UI springs created withfreq=3, bounce=0.4(was5, 0.5). Softer / less aggressive across the board — cards, buttons, slots, etc.
Per-page changes
- Page 5 (HUD) — resource chips (score/wave/gold) now go through
ui_stat_chip, so they auto-uppercase (SCORE 1240,WAVE 7,GOLD 86). - Page 7 (inventory) — tab items uppercased (
ITEMS/ORBS/RELICS), pixul font override dropped (now uses the widget's Ark default). - Page 11 (tabs) — same uppercase + Ark; Segments section removed entirely.
- Page 13 (compose) — top-bar
gold/levelchips switched toui_stat_chipso they uppercase (GOLD 26,LEVEL 7). - Page 14 (tags) — removed the
label_row(148, ui_font_pixul)pixul row from the labels showcase. - Page 15 (buttons) — kept only the PixulBrush row; Awesome and body-font rows removed. Page now shorter / cleaner.
Things to flag
- Inventory grid selection: I went with the same top stripe for
ui_slotselected, on the theory that the page-3 vertical-stripe-on-the-side has a natural horizontal analog (top stripe on the cell). It might still feel cramped on a 4×5 grid where every selection shifts visual weight to the top edge. If you want something more grid-native (corner triangle marker, brighter cell fill, raised cell, etc.), say so. - Cards selection: same top-stripe treatment. The card is wide enough that a 3px green bar across the top reads as a tab-style "active" marker. If you'd rather it be the bottom edge (underline-style) or something else, easy to swap.
ui_text_inputfocus: now caret-only. If that feels too quiet (the field doesn't visibly change when focused, only the caret appears), I can add a small thick (2px) green left stripe when focused — same idiom as the page-3 selection.- Stat chip text:
ui_stat_chipauto-uppercases label + value. I noticed the page-13 compose page hardcoded'gold'as the value — should the chip's value sometimes stay original-case (e.g., for labels that are already words, or proper-noun values)? Right now everything in a chip goes through:upper(). Could exempt the value if it's a non-numeric string. - HUD HP bar text shift: applied via the global ui_bar +1 y. Should look right on page 5 (h=10 bar) and page 12 (h=14 bar). If page 12's text now sits TOO low, the +1 might need to apply only when bar h is below some threshold.
Tell me where to tune.
Let's have the green selection thing be on the bottom right corner, like the green thing is like a line on the bottom right corner of the element, make sure that it's rounded like the element too, and make sure that it's another color when the element is green, otherwise it isn't visible. Juice amount (intensity) should be lower based on the area of the element, bigger area = lower intensity.
Two pieces — selection corner-marker, and area-scaled juice. Doing both in one pass.
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/juice.lua)
75 end
76 return e
77 end
78
79 -- Tick every spring + the shared HP bar scheduler. Call once per frame
80 -- before widgets draw.
81 function ui_juice_update(dt)
82 for _, e in pairs(ui_juice) do
83 spring_update(e.spring, dt)
84 end
85 timer_update(ui_timer, dt)
86 end
87
88 -- Current scale for widget `id` — 1 at rest, bounces after a pull.
89 function ui_juice_scale(id)
90 return entry(id).spring.main.x
91 end
92
93 -- Kick the widget's spring (a bounce). force defaults to 0.2.
94 function ui_juice_pull(id, force)
95 spring_pull(entry(id).spring, 'main', force or 0.2)
96 end
97
98 -- Feed this frame's hover state. On the hover-enter edge (was false,
99 -- now true) it bounces the spring and plays the SNKRX hover sound,
100 -- pitch-jittered so repeats don't sound mechanical.
101 --
102 -- SNKRX has two hover sounds: clickable elements layer the click 'pop'
103 -- over the bamboo; hover-only (non-clickable) elements get the bamboo
104 -- alone. `clickable` defaults to true — pass false for the latter. No
... [5 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now update all widget call sites to pass their rect for area scaling:
Bash (grep -n 'ui_juice_pull|ui_juice_hover' E:/a327ex/attack-template/snkrx/ui/widge...)
91: ui_juice_pull(id, 0.15)
98: if id then ui_juice_hover(id, hovered) end
221: ui_juice_pull(id, 0.2)
228: if id then ui_juice_hover(id, hovered) end
416: ui_juice_pull(cid, 0.2)
422: ui_juice_hover(cid, hovered)
472: ui_juice_pull(id, 0.2)
478: ui_juice_hover(id, hovered)
662: ui_juice_pull(id, 0.2)
669: ui_juice_hover(id, hovered)
738: ui_juice_hover(id, hovered) -- hover sound only; scale unused
824: ui_juice_pull(id, 0.15)
830: ui_juice_hover(id, hovered)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
85 if id and not opts.disabled then
86 ui_claim_hot(id, r)
87 hovered = ui_is_hot(id)
88 if hovered and mouse_is_pressed(1) then
89 ui_state.active_id = id
90 ui_state.focus_id = id
91 ui_juice_pull(id, 0.15)
92 end
93 if ui_state.active_id == id and mouse_is_released(1) then
94 if hovered then clicked = true end
95 ui_state.active_id = nil
96 end
97 end
98 if id then ui_juice_hover(id, hovered) end
99
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
215 if id and not opts.disabled then
216 ui_claim_hot(id, r)
217 hovered = ui_is_hot(id)
218 if hovered and mouse_is_pressed(1) then
219 ui_state.active_id = id
220 ui_state.focus_id = id
221 ui_juice_pull(id, 0.2)
222 end
223 if ui_state.active_id == id and mouse_is_released(1) then
224 if hovered then clicked = true end
225 ui_state.active_id = nil
226 end
227 end
228 if id then ui_juice_hover(id, hovered) end
229
230 -- Scale-spring bounce around the center.
231 local s = (id and not opts.disabled) and ui_juice_scale(id) or 1
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
410 if cid then
411 ui_claim_hot(cid, cell)
412 hovered = ui_is_hot(cid)
413 if hovered and mouse_is_pressed(1) then
414 ui_state.active_id = cid
415 ui_state.focus_id = cid
416 ui_juice_pull(cid, 0.2)
417 end
418 if ui_state.active_id == cid and mouse_is_released(1) then
419 if hovered then clicked = i end
420 ui_state.active_id = nil
421 end
422 ui_juice_hover(cid, hovered)
423 end
424
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
464 local function form_control_interact(id, hit)
465 local hovered, clicked = false, false
466 if id then
467 ui_claim_hot(id, hit)
468 hovered = ui_is_hot(id)
469 if hovered and mouse_is_pressed(1) then
470 ui_state.active_id = id
471 ui_state.focus_id = id
472 ui_juice_pull(id, 0.2)
473 end
474 if ui_state.active_id == id and mouse_is_released(1) then
475 if hovered then clicked = true end
476 ui_state.active_id = nil
477 end
478 ui_juice_hover(id, hovered)
479 end
480 return hovered, clicked
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
655 local hovered = false
656 if id then
657 ui_claim_hot(id, r)
658 hovered = ui_is_hot(id)
659 if hovered and mouse_is_pressed(1) then
660 ui_state.active_id = id
661 ui_state.focus_id = id
662 ui_juice_pull(id, 0.2)
663 end
664 if ui_state.active_id == id then
665 local mx = mouse_position()
666 value = math.clamp((mx - r.x - knob_r)/travel, 0, 1)
667 if mouse_is_released(1) then ui_state.active_id = nil end
668 end
669 ui_juice_hover(id, hovered)
670 end
671
672 local cy = math.floor(r.y + r.h/2 + 0.5)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
734 if ui_state.active_id == id and mouse_is_released(1) then
735 if hovered then clicked = true end
736 ui_state.active_id = nil
737 end
738 ui_juice_hover(id, hovered) -- hover sound only; scale unused
739 end
740
741 -- Background: header / hover / selected all get the charcoal fill.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
818 if id then
819 ui_claim_hot(id, r)
820 hovered = ui_is_hot(id)
821 if hovered and mouse_is_pressed(1) then
822 ui_state.active_id = id
823 ui_state.focus_id = id
824 ui_juice_pull(id, 0.15)
825 end
826 if ui_state.active_id == id and mouse_is_released(1) then
827 if hovered then clicked = true end
828 ui_state.active_id = nil
829 end
830 ui_juice_hover(id, hovered)
831 end
832
833 -- Scale-spring bounce around the card center.
834 local s = (id and ui_juice_scale(id)) or 1
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the corner-marker selection — bottom-right rounded accent that matches the element's corner curve.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/juice.lua snkrx/ui/widgets.lua...)
snkrx/ui/juice.lua OK
snkrx/ui/widgets.lua OK
Done.
Selection corner-marker (replaces top stripe on both ui_slot and ui_card):
- Small rounded rect anchored to the bottom-right corner of the element.
- Same
radas the element, so the marker's bottom-right corner naturally lines up with the element's bottom-right curve. - Size scales with the element: slot gets ~10×6, card gets ~18×10 (capped both ways).
- Color flips to
text(light) if the element's primary visible color is itselfgreen, otherwise staysgreen. "Primary visible color" isopts.icon.fill(cards/slots) oropts.title_color(cards) — anything else falls back to green.
Area-scaled juice:
juice.luagets anarea_scale(rect)helper —sqrt(900/area), clamped[0.3, 1.0]. 900px² is the baseline (a ~30×30 slot = full intensity).ui_juice_pull(id, force, rect?)andui_juice_hover(id, hovered, clickable?, rect?)now take an optional rect — the pull/hover force gets multiplied by the area scale.- All widget call sites pass their rect:
ui_slot,ui_button,ui_tabs(per-cell),form_control_interact(checkbox/radio),ui_slider,ui_list_row,ui_card.
Effect: a ~144×180 card now pulls at 30% of a slot's intensity. A button at ~60×22 pulls at ~83%. Cards should feel decisively softer.
To check:
- Page 3 (skillset): note this still uses the page-side left stripe, not the widget's corner marker (gallery code draws the stripe externally, doesn't pass
selected = trueto the slot). Want me to switch it to use the widget's corner-marker instead, or keep the left-stripe for the vertical-list case? - Page 7 (inventory): grid selection now uses corner-marker.
- Pages 6 / 8 (cards): bottom-right corner marker, softer pop.
- Green-themed elements (iron-blade slot with
fill=greenon page 7, twin-shot card withtitle_color=greenon page 6): marker should appear intext(near-white) instead of green so it stays visible.
The corner thing you added is a small rect, I meant it should be a line following the edge of the element, like the corner of the area attack objects.
Let me look at how the area attack corner brackets are drawn.
Bash (grep -n 'corner_brackets|bracket|corner' E:/a327ex/attack-template/snkrx/area....)
7: 'rect' + jagged=false: filled rect + bracket corners
146: self.corner_brackets = args.corner_brackets or false
402: -- Smooth rect: filled rect + bracket corners.
406: local bracket = math.min(w, h)*0.1
410: layer_line(layer, -hw, -hh, -hw + bracket, -hh, 2, c)
411: layer_line(layer, -hw, -hh, -hw, -hh + bracket, 2, c)
412: layer_line(layer, hw, -hh, hw - bracket, -hh, 2, c)
413: layer_line(layer, hw, -hh, hw, -hh + bracket, 2, c)
414: layer_line(layer, -hw, hh, -hw + bracket, hh, 2, c)
415: layer_line(layer, -hw, hh, -hw, hh - bracket, 2, c)
416: layer_line(layer, hw, hh, hw - bracket, hh, 2, c)
417: layer_line(layer, hw, hh, hw, hh - bracket, 2, c)
439: if self.corner_brackets then
440: -- Per-vertex bracket marks: two short line segments at each
442: -- Mirrors the smooth-rect bracket style applied to N-gons.
Read (E:/a327ex/attack-template/snkrx/area.lua)
400
401 elseif self.shape == 'rect' and not self.jagged then
402 -- Smooth rect: filled rect + bracket corners.
403 local w = r*2
404 local h = (self.rect_h or self.visual_radius)*2*s
405 local hw, hh = w/2, h/2
406 local bracket = math.min(w, h)*0.1
407
408 layer_push(layer, self.x, self.y, self.r, 1, 1)
409 layer_rectangle(layer, -hw, -hh, w, h, self.fill_color())
410 layer_line(layer, -hw, -hh, -hw + bracket, -hh, 2, c)
411 layer_line(layer, -hw, -hh, -hw, -hh + bracket, 2, c)
412 layer_line(layer, hw, -hh, hw - bracket, -hh, 2, c)
413 layer_line(layer, hw, -hh, hw, -hh + bracket, 2, c)
414 layer_line(layer, -hw, hh, -hw + bracket, hh, 2, c)
415 layer_line(layer, -hw, hh, -hw, hh - bracket, 2, c)
416 layer_line(layer, hw, hh, hw - bracket, hh, 2, c)
417 layer_line(layer, hw, hh, hw, hh - bracket, 2, c)
418 layer_pop(layer)
419
420 else
421 -- Vertex-driven shapes: jagged circle, jagged rect, polygon (smooth or jagged).
422 -- All draw a fill + polygon outline. Rect is non-radial so it uses
423 -- triangle fan from center; circle and polygon use a cheap radial
424 -- disc fill at 0.85r (matches v1).
Got it — an L-bracket following the edge, with the corner curving along the element's rounded corner. Replacing the rect marker with that.
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
30 end
31
32 --[[
33 draw_drag_target(r, kind, override)
34
35 The drag-target overlay: a semi-transparent colored wash drawn ON
36 TOP of the slot chrome (and any icon / lock glyph). The slot still
37 reads as itself, but it's clearly tinted green / orange / red to
38 indicate valid / partial / invalid. Replaces the old dashed-ring
39 border, which violated the "no thin borders" rule.
40 ]]
41 local function draw_drag_target(r, kind, override)
42 local col = green
43 if kind == 'invalid' then col = red
44 elseif kind == 'partial' then col = orange
45 end
46 edition_set(ui_layer, ui_edition_for(col, override),
47 ui_field_scale, ui_dither)
48 layer_rounded_rectangle(ui_layer, r.x, r.y, r.w, r.h, 3,
49 with_alpha(col, 130)())
50 edition_clear(ui_layer)
51 end
52
53 --[[
54 ui_slot(opts) -> { hovered, clicked }
55
56 The square slot — inventory cells, equipment slots, orb sockets.
57
58 opts:
59 rect {x, y, w, h}
... [5 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now swap the rect markers in ui_slot and ui_card to use the bracket:
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
widgets.lua OK
Done. The selected marker is now a draw_corner_bracket — two straight layer_line arms (one along the bottom edge, one along the right edge) joined by a layer_line-polyline quarter-arc that follows the element's rad corner curve. Same idea as snkrx/area.lua's corner_brackets on a smooth rect, but adapted to follow a rounded corner instead of meeting at a sharp 90°.
Per-element arm lengths:
ui_slot:arm = min(10, max(5, min(w,h)*0.3))— ~7px on a 22px slot, ~9px on a 30px slot.ui_card:arm = min(20, max(10, min(w,h)*0.15))— capped at 20 for the bigger cards.
Thickness 2 everywhere. Color logic unchanged (green default, flips to text if the element's primary color is green).
To check: F4 → page 7 (inventory) — a selected grid slot should show an L-bracket hugging the bottom-right. Same on page 6/8 cards (selected card → bottom-right bracket). For a green-themed item (iron blade fill, twin-shot card title), the bracket should appear in light text color so it's visible against the green.
Hm, let's try a little square on the top-left, with a small margin so it's not touching the edges.
[Request interrupted by user]
Hm, let's try a little square on the top-left, with a small margin so it's not touching the edges. Blue color for green one, and the color should change only on elements where the green element takes over entirely, like in inventory slots, for the cards it can remain green when the color of the element is green.
Switching to a small top-left square marker with margin. Removing the now-unused corner-bracket helper.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
widgets.lua OK
Done.
ui_slotselected: 5×5 rounded square (rad 1) atlr.x+3, lr.y+3— top-left with 3px margin. Color =greendefault; flips tobluewhen the slot's primary visible color is green (icon fills the slot entirely, so a green icon would otherwise hide the marker).ui_cardselected: 6×6 rounded square atlr.x+5, lr.y+5— slightly bigger marker + bigger margin to suit the card's scale. Always green, since the card's bg ispanel_fill(dark) and a green title/icon doesn't dominate the surface enough to obscure the marker.draw_corner_brackethelper removed (no callers now).
Let's just try 2 pixel border for the cards, 1 pixel border for the inventory slots. Like it was before.
Switching back to border-based selection — 1px green border for slots, 2px green border for cards. Dropping the top-left square markers.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
<tool_use_error>String to replace not found in file.
String: -- Chrome — no default border (the shadow gives chrome thickness);
-- selected still draws a 2px green border (thick enough to satisfy
-- the "no thin borders" rule). Hover is now indicated by the
-- scale-pop juice alone.
if opts.selected then
ui_panel({ rect = lr, bg = slot_fill, border = green,
border_width = 2, radius = rad, edition = ed })
else
ui_panel({ rect = lr, bg = slot_fill, radius = rad, edition = ed })
end
(note: Edit also tried swapping \uXXXX escapes and their characters; neither form matched, so the mismatch is likely elsewhere in old_string. Re-read the file and copy the exact surrounding text.)</tool_use_error>
Bash (grep -n 'opts.selected|border = green|ui_rrect.green.ed' E:/a327ex/attack-te...)
145: if opts.selected then
436: ui_rrect(lc.x, lc.y, lc.w, lc.h, cell_rad, green, ed)
553: ui_rrect(lc.x, lc.y, lc.w, lc.h, 3, green, ed)
586: Returns `clicked` and `selected` (= clicked or opts.selected).
593: local on = opts.selected
610: ui_rrect(-d/2, -d/2, d, d, d/2, green, ed)
683: ui_rrect(r.x, cy - track_h/2, fill_w, track_h, trad, green, ed)
689: ui_rrect(-knob_r, -knob_r, knob_d, knob_d, knob_r, green, ed)
745: if header or hovered or opts.selected then
748: if opts.selected and not header then
848: if opts.selected then
849: ui_rrect(lr.x + 5, lr.y + 5, 6, 6, 1, green, ed)
885: ui_rrect(fx, fy, fw, fh, 3, f.color or green, ed)
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
142 -- so it doesn't touch the edges. The icon fills the slot entirely,
143 -- so when its fill is green the marker would vanish — flip to blue
144 -- in that case.
145 if opts.selected then
146 local primary = (opts.icon and opts.icon.fill) or slot_fill
147 local mc = (primary == green) and blue or green
148 ui_rrect(lr.x + 3, lr.y + 3, 5, 5, 1, mc, ed)
149 end
150
151 layer_pop(ui_layer)
152 return { hovered = hovered, clicked = clicked }
153 end
154
155 --[[
156 ui_button(opts) -> { hovered, clicked, x, y, w, h }
157
158 A SNKRX-style button: a flat rounded rect that bounces on a scale
159 spring (hover-enter + click), plays the layered hover sounds, and
160 inverts to near-white on hover.
161
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
122 if opts.locked then
123 ui_text({ rect = lr, text = opts.lock_glyph or 'L',
124 font = ui_font_header_l, color = text_muted,
125 align_h = 'center', align_v = 'center', edition = ed })
126 end
127
128 -- Disabled: dim the whole slot toward the bg (a flat overlay, drawn
129 -- raw — it's a translucent dimmer, not a normal coloured element).
130 if opts.disabled then
131 layer_rounded_rectangle(ui_layer, lr.x, lr.y, lr.w, lr.h, rad,
132 with_alpha(bg, 150)())
133 end
134
135 -- Drag-target overlay, on top of everything.
136 if opts.target == 'valid' or opts.target == 'invalid'
137 or opts.target == 'partial' then
138 draw_drag_target(lr, opts.target, ed)
139 end
140
141 -- Selected: a small square pinned to the top-left, with a margin
142 -- so it doesn't touch the edges. The icon fills the slot entirely,
143 -- so when its fill is green the marker would vanish — flip to blue
144 -- in that case.
145 if opts.selected then
146 local primary = (opts.icon and opts.icon.fill) or slot_fill
147 local mc = (primary == green) and blue or green
148 ui_rrect(lr.x + 3, lr.y + 3, 5, 5, 1, mc, ed)
149 end
Bash (grep -n 'ui_panel.*slot_fill|ui_panel({ rect = lr' E:/a327ex/attack-template/sn...)
107: ui_panel({ rect = lr, bg = slot_fill, radius = rad, edition = ed })
847: ui_panel({ rect = lr, radius = rad, edition = ed })
Read (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
98 if id then ui_juice_hover(id, hovered, nil, r) end
99
100 -- Scale-spring bounce around the slot center.
101 local s = (id and not opts.disabled) and ui_juice_scale(id) or 1
102 layer_push(ui_layer, r.x + r.w/2, r.y + r.h/2, 0, s, s)
103 local lr = { x = -r.w/2, y = -r.h/2, w = r.w, h = r.h }
104
105 -- Chrome — no default border (the shadow gives chrome thickness).
106 -- Hover is indicated by the scale-pop juice alone.
107 ui_panel({ rect = lr, bg = slot_fill, radius = rad, edition = ed })
108
109 -- Occupancy. Default pad is 0 — the icon fills the slot so an
110 -- occupied slot reads as just the icon (no slot frame around it).
111 -- The icon inherits the slot's radius so its corners match.
112 if opts.icon then
The icon fills the slot now (no padding), so a panel-border approach would be hidden behind the icon. Using stencil to cut a clean 1px rounded outline drawn on top of the icon. Cards still work via the regular panel-border path since their content has internal padding.
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/widgets.lua)
The file E:/a327ex/attack-template/snkrx/ui/widgets.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
widgets.lua OK
Done.
ui_slotselected — 1px rounded outline drawn on top of the icon via stencil-test-inverse (since the icon now fills the slot, a panel-level border would be hidden behind it). Color:greendefault,bluewhen the icon's fill is itself green.ui_cardselected — 2px green border viaui_panel's standard two-rect trick. The card's internal padding keeps the border off the content, so it's visible without overlap. Always green (no flip needed — the card surface ispanel_fill, not a green field).
Great, seems like everything is finally done. What does the general code for doing the elements looks like? What does a new instance have to do in general?
One-time setup
In main.lua, after require('anchor')({...}):
require('snkrx') -- pulls UI + attack carriers
ui_typed_text = engine_get_typed_text() -- in update() — drains SDL text input AND captures it for ui_text_input
The toolkit auto-creates ui_layer, ui_shadow_layer, ui_shadow_shader, loads fonts, etc. — no extra plumbing.
Per-frame contract (without the gallery)
function update(dt)
ui_typed_text = engine_get_typed_text()
...
ui_state_begin_frame() -- reset hot_id, ui_capturing_text, ui_input_locked
ui_juice_update(dt) -- tick springs + HP-bar tweens
-- Queue widget draws here (they push to ui_layer).
ui_panel({ rect = ... })
if ui_button({ rect = ..., id = 'play', label = 'play',
variant = 'primary' }).clicked then ... end
end
function draw()
-- ... game layers ...
-- UI shadow pipeline (last):
layer_render(ui_layer)
layer_clear(ui_shadow_layer)
layer_draw_from(ui_shadow_layer, ui_layer, ui_shadow_shader)
layer_draw(ui_shadow_layer, ui_shadow_offset_x, ui_shadow_offset_y)
layer_draw(ui_layer)
end
(The gallery does the equivalent inside ui_gallery_update/ui_gallery_draw.)
Calling convention
Every widget takes one opts table, returns a table.
- Static (no interaction): omit
id. Just draws. - Interactive: pass
id(caller-chosen string). Widget hit-tests, runs juice, returns{ hovered, clicked, ... }. - State is caller-owned (immediate-mode). Pass current value in (
opts.checked,opts.selected,opts.value); widget reports clicks; caller updates its own state. - Layout via RectCut (
rect.lua):rect_new / rect_cut_left / rect_cut_top / rect_split_v / rect_contract. Or just plain{x,y,w,h}tables.
-- typical pattern
local r = ui_text_input({ rect=..., id='name', text=my_name,
placeholder='player name' })
my_name = r.text
if r.submitted then ... end
Widget toolkit
Primitives (pure draw, primitives.lua): ui_panel, ui_text, ui_divider, ui_item_icon, ui_rich_text, ui_label, ui_tooltip, ui_bracket_tag, ui_stat_chip, ui_pips.
Interactive widgets (widgets.lua): ui_slot, ui_button (primary/secondary/danger/ghost), ui_icon_button, ui_bar (progress / health with juice), ui_tabs (tab/segment), ui_checkbox, ui_radio, ui_slider, ui_list_row, ui_card, ui_text_input, ui_modal.
Key idioms
- Coloring goes through editions — widgets use
ui_rrect/ui_rect/ui_glyph_text(inpaint.lua) which bracket each draw withedition_setso palette tokens shimmer. - Fonts:
ui_font_body_arkfor single UI lines (labels, chips, list cells),ui_font_body(Lana) for prose/desc,ui_font_pixulfor button labels,ui_font_header_lfor titles,ui_font_pirkkalaregistered (currently unused). - Juice: hover-enter / click bounce + layered hover sounds, area-scaled (big elements pop less). Free with any widget that takes an
id. - Shadow: derived from
ui_layer's alpha; no per-widget effort. UI elements inside panels naturally don't cast visible shadows (the panel's body covers them). - Modals: caller raises
ui_input_locked = truebefore drawing the screen behind a modal;ui_modallowers it for its own content. - Bg fill: NOT done on
ui_layer(would break the shadow derivation). Use a separate layer (gallery usesgallery_bg_layer) or paint the game world behind UI normally.
That's the whole API surface. A forking game does the per-frame contract, calls widgets where it wants UI, and that's it.
OK, make sure that everything is documented properly, that the final main.lua file contains the code necessary to make the UI work, but not any actual UI code, it should just be the player as it is now. Comments can include explanations on how to use the UI module, like there are comments for the attack system. Don't know if the attack system has any other documentation, but if you feel new instances will need it for the UI system, you can add it in more detail wherever you wish. Make sure everything is properly compartmentalized without hiding details from main.lua, the same way we decided for the attack system. Ask any questions on decisions you aren't sure about. After you're done with this, if you have no questions to ask me, you can proceed directly to ending the session, naming it "UI Generalization 2"
Let me read the current state of main.lua and the attack-template docs to match style.
Read (E:/a327ex/attack-template/main.lua)
1 --[[
2 attack-template / main.lua — clean reference scene.
3
4 This is your file. It is a complete, minimal scene: a player you can
5 move (WASD / arrows), the five-layer render stack, a camera, physics,
6 and the update / draw skeleton — all wired and ready, but firing no
7 attacks. Read it top to bottom; it is the contract you build on.
8
9 THE TOOLKIT. `require('snkrx')` (below) pulls in the SNKRX attack
10 toolkit from snkrx/ — the carriers (projectile / area / beam /
11 flicker / prop), the edition draw-shader stack, fx, sounds, the
12 example entities, and all the plumbing. snkrx/ is plain, readable
13 Lua, not a black box: open snkrx/<carrier>.lua for the full set of
14 opts each spawn_* helper accepts.
15
16 ADDING AN ATTACK. Every carrier already has its object list and its
17 update / draw loop wired below. To add an attack you only:
18 1. bind a key in the INPUT section,
19 2. call the carrier's spawn_* helper on that press inside update()
20 — see the ATTACKS comment block there.
21 Nothing else: no new list, no new loop.
22
23 TEST ENTITIES. player / seeker / wall live in snkrx/. Treat them as
24 the real files for those features — either edit snkrx/player.lua etc.
25 directly, or drop a replacement player.lua / seeker.lua / wall.lua
26 beside this main.lua and require it right after require('snkrx').
27
28 DEBUG. F2 toggles the collider overlay. F3 opens the per-sound DSP
29 tuner.
30 ]]
... [262 more lines]
Let me look at the current state of the UI section in CLAUDE.md and any module docblocks that may be stale.
Bash (grep -n '## UI toolkit|^### |^---' E:/a327ex/attack-template/.claude/CLAUDE.md...)
14:### What a design brief contains
33:### After the brief is agreed
40:### Trivial changes skip the brief
58:---
91:---
117:---
145:---
152:### Visual / edition stack (from edition-template)
165:### Entities
193:### Carriers
254:### Sounds
282:### Physics
315:### Hit-stop / time scale
324:### Collisions handled (in main.lua's `update`)
334:### `seeker:wall_bump` — streak-based wall response
344:### Edition system integration
358:### Debug
372:### Runtime DSP + sound tuning
393:### Keybindings — the clean `main.lua`
406:---
410:### Edition shader integration
417:### Camera mouse coords
420:### Rotatable collider bodies
428:### Player rotation: r vs visual_r
432:### Update order in main.lua
449:### Layer hierarchy (draw order, bottom to top)
460:### Anchor 2 procedural style
466:---
518:---
547:---
Bash (grep -n 'UI toolkit|## UI|UI kit' E:/a327ex/attack-template/.claude/CLAUDE.md ...)
75:- **`snkrx/ui/`** — the UI toolkit: a generalizable SNKRX / GLIMPO-style
78: the "UI toolkit" section below.
113:8. **`snkrx/ui/`** — the UI toolkit (only when doing UI work). Start
114: at `snkrx/ui/gallery.lua` (the F4 test scene) and the "UI toolkit"
549:## UI toolkit (snkrx/ui/)
671:- **`engine_get_typed_text()` must be drained** each frame even if nothing consumes typed input — otherwise SDL's text-input queue fills up after ~32 keypresses and warns per-press forever. main.lua does this at the top of `update()` as `ui_typed_text = engine_get_typed_text()` — draining it AND capturing the frame's typed string into the global the focused `ui_text_input` reads. A game using the UI toolkit must keep this line.
728: └── ui/ # the UI toolkit — require('snkrx') loads it
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
549 ## UI toolkit (snkrx/ui/)
550
551 A generalizable SNKRX / GLIMPO-style UI element set, loaded by
552 `require('snkrx')` alongside the attack carriers. Built one element at
553 a time from the Orblike / Invoker UI mockups and SNKRX's own source.
554
555 ### Calling convention
556
557 Every widget takes ONE opts table; the rect is `opts.rect` — a
558 `{x,y,w,h}` table, exactly what RectCut (`ui/rect.lua`) produces.
559 Widgets draw to the global `ui_layer`. Colors are the 18 locked
560 palette tokens from `snkrx/palette.lua`.
561
562 ### Files
563
564 - `rect.lua` — RectCut layout primitive (cut / get / add / contract /
565 center / split).
566 - `state.lua` — `ui_state`: frame-local hot/active/focus, explicit
567 string widget ids. The rules-based interaction substrate.
568 - `juice.lua` — per-id retained juice: a scale spring (hover/click
569 bounce + the SNKRX hover sounds) and the bar trail/flash registry.
570 - `paint.lua` — edition-backed coloring (see below).
571 - `primitives.lua` — pure draw: `ui_panel`, `ui_text`, `ui_divider`,
572 `ui_item_icon`, `ui_rich_text`, `ui_label`, `ui_tooltip`,
573 `ui_bracket_tag`, `ui_stat_chip`, `ui_pips`, + `rarity_color`.
574 - `widgets.lua` — interactive (consult ui_state + juice): `ui_slot`,
575 `ui_button`, `ui_bar`, `ui_tabs`, `ui_checkbox`, `ui_radio`,
576 `ui_slider`, `ui_list_row`, `ui_card`, `ui_text_input`, `ui_modal`,
577 `ui_icon_button`.
578 - `gallery.lua` — the F4 test scene; the in-engine mockup kit.
... [70 more lines]
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
647 ### Fonts (in `assets/`)
648
649 Headers: `Awesome 9.ttf` @16 (`ui_font_header_l`), `FatPixelFont.ttf`
650 @8 (`ui_font_header_s`). Body: `LanaPixel.ttf` @11 and `ark-pixel-
651 10px-proportional-latin.ttf` @10 — `ui_font_body` toggles between the
652 two. `PixulBrush.ttf` @8 (`ui_font_pixul`) is the button font.
653 `Awesome 9.ttf` @8 (`ui_font_bracket`) supplies `[ ]` glyphs for the
654 metadata rich-text motif (PixulBrush has no brackets). UI hover
655 sounds: `bamboo_hit_by_lord.ogg` + `467951__benzix2__ui-button-click.ogg`.
656
657 ### Gallery keys
658
659 `F4` toggle · `[` `]` page · `B` body font · `O`/`P` global edition ·
660 `K`/`L` field_scale · `U` dither.
661
662 ---
663
664 ## Common gotchas
665
666 - **`triangulate` returns 6-number arrays in attack-template** (`{t1[1..6], t2[1..6], ...}`), NOT the v1 index-triple format (`{tri[1], tri[2], tri[3]}`). Adjust draw loops when porting v1 entity code that uses the v1 format.
667 - **`physics_raycast(x1, y1, x2, y2, tags)`** takes a tags TABLE (list of tag strings). Single-element list is `{'wall'}`, not `'wall'`.
668 - **`set_edition(layer, 0)` after every bracketed draw** — the shader uniform persists across subsequent draws on the same layer if you don't reset it.
669 - **Sensor fixtures need `physics_enable_sensor`, not `physics_enable_collision`.** The engine has separate masks for blocking collisions vs sensor events. Projectile (sensor) ↔ enemy uses the sensor enable; player/seeker (solid) ↔ wall uses collision enable. Cost us a debug cycle when projectiles wouldn't fire enemy events.
670 - **Mouse buttons follow LÖVE2D convention** — `mouse:2` = right, `mouse:3` = middle. The engine swaps SDL's native 2↔3 at the event boundary (`sdl_to_anchor_mouse_button` in anchor.c). All downstream code sees the Anchor convention. No mental remap needed.
671 - **`engine_get_typed_text()` must be drained** each frame even if nothing consumes typed input — otherwise SDL's text-input queue fills up after ~32 keypresses and warns per-press forever. main.lua does this at the top of `update()` as `ui_typed_text = engine_get_typed_text()` — draining it AND capturing the frame's typed string into the global the focused `ui_text_input` reads. A game using the UI toolkit must keep this line.
672 - **Sounds load as originals** (NOT `_lightmed`). Bitcrush + SR-reduce applied at runtime via `sound_tuner` (F3) per the `sound_tuning.lua` table.
673 - **Don't run `./run.bat` yourself** — the user runs and tests. After framework changes, `lua54.exe -e "loadfile('main.lua')"` is the syntax-check (path: `E:/a327ex/Anchor/reference/love-compare/tools/lua54.exe`).
674
675 ---
676
Bash (grep -rn 'ui_font_pirkkala' E:/a327ex/attack-template 2>/dev/null)
E:/a327ex/attack-template/snkrx/ui/init.lua:58:ui_font_pirkkala = font_register('ui_pirkkala', 'assets/pirkkala.ttf', 16)
Bash (sed -n '1,25p' E:/a327ex/attack-template/snkrx/ui/widgets.lua)
--[[
ui/widgets.lua — interactive UI widgets.
Same opts-table / ui_layer convention as ui/primitives.lua. These
widgets consult `ui_state` (ui/state.lua) — they derive hover via
ui_claim_hot, run the mouse-down→up click machine, and return an
interaction result. Each takes opts.id, an explicit caller-provided
string identity.
Coloring goes through the edition pipeline (ui/paint.lua): draws use
the ui_rrect / ui_text wrappers, or bracket edition_set manually for
loops (draw_drag_target). Every widget accepts opts.edition to force
a specific edition for all its draws — the per-element override.
They also carry SNKRX-style juice via ui/juice.lua: a per-id scale
spring that bounces on hover-enter and click, and the hover sounds.
The action-vs-rules split: a widget's *data* states (a slot's
selected / occupied / locked / disabled) are caller-owned and passed
in via opts. Its *interaction* state (hover, active, focus) is
frame-local, derived here from ui_state. The juice + bar registries
are the one retained sliver — keyed by the explicit id.
]]
-- Clone a palette token with a fixed alpha. Returns a callable color.
Bash (sed -n '1,20p' E:/a327ex/attack-template/snkrx/ui/primitives.lua; echo "==="; se...)
--[[
ui/primitives.lua — Tier-1 UI primitives: panel, text, divider,
item_icon, rich_text, label.
Calling convention (whole toolkit): each widget takes ONE opts table.
The rect is opts.rect — a {x, y, w, h} table, exactly what RectCut
(ui/rect.lua) produces.
Coloring goes through the edition pipeline (ui/paint.lua): these
functions don't call layer_* directly, they call the ui_rrect /
ui_rect / ui_glyph_text wrappers, which bracket each draw with the
edition that mimics its palette color. Every primitive accepts an
optional `opts.edition` to force a specific edition for its draws.
These six are pure draw — no interaction, no ui_state. Interactive
widgets live in ui/widgets.lua.
]]
--[[
ui_panel(opts)
===
--[[
ui/juice.lua — per-widget retained juice.
Immediate-mode widgets are pure functions — they have nowhere to keep
a spring, a hover edge, or an eased value. These registries are that
place, keyed by the widget's explicit string id. The small, retained,
action-based sliver the UI doctrine puts behind an id; everything
else stays rules-based.
... [16 more lines]
Going to ask one clarifying question before proceeding, since I'm about to refactor more than just docs.
AskUserQuestion
Your questions have been answered: "The gallery currently couples per-frame plumbing into its hooks (ui_state_begin_frame + ui_juice_update fire only when the gallery is active). For a clean separation where main.lua always runs that plumbing regardless of the gallery, I'd refactor gallery.lua so:
- `ui_gallery_update` no longer calls begin_frame / juice_update internally (the dev's main.lua owns those, called once per frame).
- `ui_gallery_draw` is split into `ui_gallery_bg_draw` (handles only the gallery's full-screen bg fill, when active) — the UI shadow + composite live in main.lua so they apply to both gallery and real-game UI through the same pipeline.
This is a small but real refactor inside gallery.lua. Do it, or keep the gallery's hooks self-contained?"="Refactor for clean separation". You can now continue with these answers in mind.
Executing the refactor + cleanup. Step 1: state.lua snapshot so hotkey gating still works when begin_frame is hoisted to main.lua.
Read (E:/a327ex/attack-template/snkrx/ui/state.lua)
1 --[[
2 ui/state.lua — frame-local UI interaction state.
3
4 `ui_state` holds the three interaction IDs, rebuilt every frame:
5 hot_id widget under the cursor this frame
6 active_id widget the mouse-down landed on (persists until release)
7 focus_id widget last clicked (persists until the next click)
8
9 `ui_state_begin_frame()` clears hot_id; call it once per frame before
10 any widget calls (the gallery does this in ui_gallery_update; a real
11 game calls it once per frame too). Widget IDs are explicit, caller-
12 provided strings — no auto-IDs.
13
14 This is the rules-based, frame-local interaction layer the project's
15 action-vs-rules UI doctrine sanctions — it is NOT hidden persistent
16 state. Persistent UI state (what occupies a slot, a drag in progress)
17 is action-based and lives in caller-owned data, never here.
18 ]]
19
20 ui_state = { hot_id = nil, active_id = nil, focus_id = nil }
21
22 -- True for any frame a ui_text_input is focused (it sets this). The
23 -- caller (or the gallery) checks it to suppress letter hotkeys so
24 -- typing into a field doesn't also fire keybinds. Reset every frame
25 -- by ui_state_begin_frame, re-set by the focused field during draw —
26 -- so readers see a one-frame-lagged value, which is the safe lag.
27 ui_capturing_text = false
28
29 -- Raised by the caller while a modal is open, BEFORE drawing the
30 -- screen behind it — ui_claim_hot then refuses every widget, so the
... [35 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/state.lua)
The file E:/a327ex/attack-template/snkrx/ui/state.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now refactor gallery.lua — drop begin_frame + juice_update from update, split draw into a bg-only function, use the snapshot for hotkey gating.
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
975 once per frame from main.lua's update().
976 ]]
977 function ui_gallery_update(dt)
978 if is_pressed('toggle_ui_gallery') then
979 ui_gallery_active = not ui_gallery_active
980 end
981 if not ui_gallery_active then return end
982
983 -- Secondary hotkeys are letter/bracket keys, so they collide with
984 -- typing — suppress them while a ui_text_input is focused (the flag
985 -- lags one frame, which is the safe direction).
986 if not ui_capturing_text then
987 if is_pressed('ui_gallery_prev') then ui_gallery_cycle_page(-1) end
988 if is_pressed('ui_gallery_next') then ui_gallery_cycle_page(1) end
989 if is_pressed('ui_gallery_font') then ui_font_body_toggle() end
990 if is_pressed('ui_edition_prev') then ui_override_step(-1) end
991 if is_pressed('ui_edition_next') then ui_override_step(1) end
992 if is_pressed('ui_dither_cycle') then ui_dither = next_dither(ui_dither) end
993 if is_pressed('ui_fs_down') then
994 ui_field_scale = math.max(0.05, ui_field_scale - 0.05)
995 end
996 if is_pressed('ui_fs_up') then
997 ui_field_scale = ui_field_scale + 0.05
998 end
999 end
1000
1001 ui_state_begin_frame()
1002 ui_juice_update(dt)
1003
1004 -- The full-screen bg fill goes to gallery_bg_layer (kept off
... [25 more lines]
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now refactor ui_gallery_draw → ui_gallery_bg_draw (bg only):
Read (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
1028 pg.draw(ui_layer)
1029 end
1030
1031 --[[
1032 ui_gallery_draw()
1033
1034 Flush ui_layer to the screen with the SNKRX-style drop shadow:
1035 render ui_layer's commands, derive ui_shadow_layer from its canvas
1036 via ui_shadow_shader, composite the shadow beneath at an offset,
1037 then composite ui_layer on top.
1038 ]]
1039 function ui_gallery_draw()
1040 if not ui_gallery_active then return end
1041 -- Render the bg fill + the ui commands queued in update.
1042 layer_render(gallery_bg_layer)
1043 layer_render(ui_layer)
1044 -- Derive the shadow from ui_layer's canvas.
1045 layer_clear(ui_shadow_layer)
1046 layer_draw_from(ui_shadow_layer, ui_layer, ui_shadow_shader)
1047 -- Composite bottom-to-top: bg, shadow at offset, ui chrome.
1048 layer_draw(gallery_bg_layer)
1049 layer_draw(ui_shadow_layer, ui_shadow_offset_x, ui_shadow_offset_y)
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now update the file header to reflect the new responsibilities:
Bash (sed -n '1,30p' E:/a327ex/attack-template/snkrx/ui/gallery.lua)
--[[
ui/gallery.lua — the UI kit gallery / test scene.
A paged, full-screen overlay that renders every UI element the toolkit
ships — the in-engine equivalent of reference/mockup_ui_kit_*.html.
F4 toggle the gallery
[ / ] previous / next page
B toggle the body font (LanaPixel <-> Ark Pixel)
O / P preview the whole UI under prev / next edition
(per-color / dynamic / palette-cycle / polychrome)
K / L field_scale down / up (UI shimmer density)
U cycle the dither mode (32 modes)
Each element chunk appends its showcase to a gallery page.
WHY PAGE DRAWS RUN FROM update(), NOT draw():
Interactive widgets hit-test with mouse_is_pressed / key_is_pressed,
whose edge events are only true during update() (see MEMORY.md →
"Anchor 2 input edge events are update-only"). Widgets also queue
their layer commands in the same call. So the gallery queues ALL
ui_layer commands from ui_gallery_update(); ui_gallery_draw() is
only the layer_render + layer_draw flush.
]]
ui_gallery_active = false
ui_gallery_page = 1
-- The gallery's full-screen background lives on its OWN layer (not on
-- ui_layer) so ui_layer stays transparent except where chrome / text
-- is drawn — that lets the shadow shader derive discrete drop shadows
-- only behind real UI elements, not as a full-screen dark tint.
Edit (E:/a327ex/attack-template/snkrx/ui/gallery.lua)
The file E:/a327ex/attack-template/snkrx/ui/gallery.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in snkrx/ui/state.lua snkrx/ui/gallery.lua...)
snkrx/ui/state.lua OK
snkrx/ui/gallery.lua OK
Now main.lua — top docblock + UI plumbing + commented gallery section:
Edit (E:/a327ex/attack-template/main.lua)
The file E:/a327ex/attack-template/main.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Strip the gallery binds out of INPUT (they'll move to the commented gallery section):
Edit (E:/a327ex/attack-template/main.lua)
The file E:/a327ex/attack-template/main.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Update the update() UI plumbing — typed_text capture (already there), add begin_frame + juice_update, drop ui_gallery_update:
Edit (E:/a327ex/attack-template/main.lua)
The file E:/a327ex/attack-template/main.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now draw() — drop ui_gallery_draw(), add the explicit UI render pipeline:
Edit (E:/a327ex/attack-template/main.lua)
The file E:/a327ex/attack-template/main.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && E:/a327ex/Anchor/reference/love-compare/tools/lu...)
main.lua OK
Now docblock cleanup for primitives.lua and juice.lua:
Edit (E:/a327ex/attack-template/snkrx/ui/primitives.lua)
The file E:/a327ex/attack-template/snkrx/ui/primitives.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/snkrx/ui/juice.lua)
The file E:/a327ex/attack-template/snkrx/ui/juice.lua has been updated successfully. (file state is current in your context — no need to Read it back)
Now the CLAUDE.md UI section overhaul:
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Now the element-set + the new sections (shadow / font rule / selection patterns / no-thin-borders):
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (grep -n 'ui_typed_text|gallery_bg|ui_gallery_draw' E:/a327ex/attack-template/....)
435:ui_typed_text = engine_get_typed_text() -- drain + capture for ui_text_input
576:ui_typed_text = engine_get_typed_text() -- drain SDL + capture
591:`ui_gallery_bg_draw()` composites the gallery's full-screen bg layer
617: `ui_typed_text` (from main.lua), wires the toolkit modules.
668: `ui_typed_text` each frame; backspace (UTF-8 aware), enter →
742:`gallery_bg_layer` for its bg fill; a real game's game-world layers
807:- **`engine_get_typed_text()` must be drained** each frame even if nothing consumes typed input — otherwise SDL's text-input queue fills up after ~32 keypresses and warns per-press forever. main.lua does this at the top of `update()` as `ui_typed_text = engine_get_typed_text()` — draining it AND capturing the frame's typed string into the global the focused `ui_text_input` reads. A game using the UI toolkit must keep this line.
Bash (grep -n 'gallery_bg_layer|ui/ ' E:/a327ex/attack-template/.claude/C...)
742:`gallery_bg_layer` for its bg fill; a real game's game-world layers
864: └── ui/ # the UI toolkit — require('snkrx') loads it
---
864: └── ui/ # the UI toolkit — require('snkrx') loads it
Read (E:/a327ex/attack-template/.claude/CLAUDE.md)
863 ├── symbols.lua # from edition-template (present, currently unrequired)
864 └── ui/ # the UI toolkit — require('snkrx') loads it
865 ├── init.lua # UI aggregator: fonts, ui_layer, requires
866 ├── rect.lua # RectCut layout primitive
867 ├── state.lua # ui_state — frame-local hot/active/focus
868 ├── juice.lua # per-widget spring / sound / bar juice registry
869 ├── paint.lua # edition-backed coloring (draw wrappers)
870 ├── primitives.lua # panel / text / divider / item_icon / rich_text / label / tooltip / bracket_tag / stat_chip / pips
871 ├── widgets.lua # interactive: slot / button / bar / tabs / checkbox / radio / slider / list_row / card / text_input / modal / icon_button
872 └── gallery.lua # F4 gallery / test scene
873 ```
874
Edit (E:/a327ex/attack-template/.claude/CLAUDE.md)
The file E:/a327ex/attack-template/.claude/CLAUDE.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash (cd E:/a327ex/attack-template && for f in main.lua snkrx/ui/state.lua snkrx/ui/ga...)
main.lua OK
snkrx/ui/state.lua OK
snkrx/ui/gallery.lua OK
snkrx/ui/primitives.lua OK
snkrx/ui/juice.lua OK
snkrx/ui/widgets.lua OK
snkrx/ui/init.lua OK
snkrx/ui/paint.lua OK
Bash (sed -n '110,165p' E:/a327ex/attack-template/main.lua)
wall_layer = layer_new('wall') -- wall bodies
game_layer = layer_new('game') -- player + seekers + every carrier
effects_layer = layer_new('effects') -- fxs (hit circles, particles, ...)
debug_layer = layer_new('debug') -- F2 collider overlay
main_camera = camera_new(width, height)
main_camera.x = width/2
main_camera.y = height/2
debug_draw_enabled = false
-- ============================================================
-- SCENE
-- ============================================================
-- The player — moved by the WASD / arrow binds, aims at the mouse.
p = player(width/2, height/2)
p.edition = edition_cycle[math.random(#edition_cycle)]
-- To add test targets, spawn seekers / a wall — e.g.:
-- for i = 1, 5 do
-- spawn_seeker(width/2 + random_float(-100, 100),
-- height/2 + random_float(-100, 100))
-- end
-- local wx, wy = width/2 + 80, height/2
-- spawn_wall({ wx-8,wy-40, wx+8,wy-40, wx+8,wy+40, wx-8,wy+40 },
-- { edition = 0 })
function update(dt)
sync_engine_globals()
... [26 more lines]
All clean — every file syntax-checks, docs are synced. Invoking the end-session skill.
Skill
Launching skill: end-session
Base directory for this skill: E:\a327ex.claude\skills\end-session
End Session Workflow
This skill is invoked from the same conversation where the work was done. You already have the full session context in memory — you do NOT need to read the transcript.
Step 1: Get Session Info
Ask the user for the session title (max 30 characters). Examples: "Anchor Phase 10 Part 5", "Physics Arena Setup", "Timer System Fix", "Thalien Lune Design".
Determine the project yourself from your session context — you know which repo(s) were worked on, which files were created/modified, and where they live. No need to ask. See Step 5 for the list of known project roots; if the session touched something outside the list, infer the root from the paths you actually edited.
Step 2: Write Summary
Write the summary from your conversation memory. You have the full session context — no need to read any files.
The summary should be thorough and detailed. Each major topic deserves its own section with multiple specific bullet points. Don't compress — expand.
Purpose: These summaries serve as searchable records. Future Claude instances will grep through past logs to find how specific topics were handled. The more detail you include, the more useful the summary becomes for finding relevant context later.
Format (this is just an example structure — adapt sections to match what actually happened):
# [Title] ## Summary [1-2 sentence overview of the session's main focus] **[Topic 1 - e.g., "Spring Module Implementation"]:** - First specific detail about what was done - Second detail - include file names, function names - User correction or feedback (quote if notable) - Technical decisions and why **[Topic 2 - e.g., "Camera Research"]:** - What was researched - Key findings - How it influenced implementation **[Topic 3 - e.g., "Errors and Fixes"]:** - Specific error message encountered - Root cause identified - How it was fixed [Continue for each major topic...] --- [Rest of transcript follows]Rules: - Be thorough — If in doubt, include more detail, not less. Each topic should be as detailed as possible while still being a summary. - Think searchability — Future instances will search these logs. Include keywords, function names, error messages that someone might grep for. - One section per major topic — Don't combine unrelated work into one section - Chronological order — Sections should match conversation flow - Specific details — Error messages, file names, function names, parameter values - Include user quotes — When user gave notable feedback, quote it (e.g., "k/d variables are not intuitive at all") - Weight planning equally — Research, proposals, alternatives considered, user feedback on approach are as important as implementation - Weight problems solved — Errors, root causes, fixes, user corrections all matter - Technical specifics — Include formulas, API signatures, parameter changes when relevant
Step 3: Proceed Without Approval
Do NOT show the summary to the user for approval. Write it directly. The user can review the committed log after the fact and request a follow-up edit if anything is off.
Step 4: Convert Transcript and Write the Log File
# Find recent sessions (Claude + Cursor + Codex). Same script lives in Anchor2: python E:/a327ex/Anchor2/scripts/find-recent-session.py --limit 5 # or: python E:/a327ex/Anchor/scripts/find-recent-session.py --limit 5The script shows sessions sorted by when they ended. The first result is the current conversation (since end-session was invoked here). Use it.
Use a lowercase hyphenated slug derived from the title (e.g., "anchor-primitives-hitstop-animation").
Get the end timestamp for the Date frontmatter — this is the wall-clock time when end-session was invoked, NOT the time the JSONL started. Sessions often span multiple days, and the log should be filed under the day the work was wrapped up:
date "+%Y-%m-%d %H:%M:%S"Use this output verbatim. Do not substitute the JSONL start timestamp; the log appears in the sidebar sorted by Date, and a multi-day session with a Date pinned to day 1 will sort below sessions that ended later but started later, hiding the most recent work.
Convert the transcript to markdown:
python E:/a327ex/Anchor2/scripts/jsonl-to-markdown.py [SESSION_PATH] /tmp/session-log.md # or: python E:/a327ex/Anchor/scripts/jsonl-to-markdown.py ...The same script auto-detects Claude Code JSONL vs Cursor/Composer agent JSONL (
~/.cursor/projects/.../agent-transcripts/...) vs Codex rollouts (~/.codex/sessions/...). For Composer sessions, usefind-recent-session.py(it merges all sources) and pick the[cursor]line for the current chat.Replace the default header (
# Session YYYY-MM-DD...) at the top of/tmp/session-log.mdwith the approved title and summary, AND prepend frontmatter. The final file shape:Title: [Title] Date: YYYY-MM-DD HH:MM:SS # [Title] ## Summary [approved summary text from step 2] --- [transcript content from jsonl-to-markdown script]Frontmatter is non-negotiable. Every log file MUST start with
Title:andDate:lines. Without them, the site's sidebar shows the slug as the title and 0 (epoch) as the sort date. The backfill script ina327ex-site/deploy/backfill_metadata.pyis a safety net, not a substitute — write it correctly the first time.Then copy the final file to the log destination:
cp /tmp/session-log.md E:/a327ex/a327ex-site/logs/[slug].mdStep 5: Commit Project Repo
Identify the project repo(s) worked on this session from your own context — you already know which repos were touched and which files changed. For the common projects:
Project Root Stage command Anchor E:/a327ex/Anchorgit add docs/ framework/ engine/ scripts/ reference/Anchor2 E:/a327ex/Anchor2git add framework/ engine/ arena/ reference/ scripts/ docs/ .claude/emoji-ball-battles E:/a327ex/emoji-ball-battlesgit add -Ainvoker E:/a327ex/Invokergit add -Athalien-lune E:/a327ex/thalien-lunegit add -Aa327ex-site E:/a327ex/a327ex-sitegit add -A(this IS one of the web repos — the log file added in Step 4 is staged here automatically)For a project not listed, infer the root from the files you actually created or modified this session and stage those. If multiple candidate roots look valid, ask the user which files to stage.
cdinto the project root, stage, rungit statusto verify before committing.IMPORTANT — FULL SUMMARY IN COMMIT: The commit message MUST include the FULL summary from the log file. Read the summary back from the log file to ensure nothing is missing.
IMPORTANT — COMMIT METHOD: The summary contains backticks, special characters, and markdown that WILL break heredocs and
git commit -m. ALWAYS use the file-based method below. NEVER try a heredoc first — it will fail and produce a malformed commit that needs amending.# Skip until we hit the line "## Summary", then take everything after the next # blank line until the --- separator that precedes the transcript. awk '/^## Summary$/{found=1; next} found && NR>1 && /^---$/{exit} found' \ E:/a327ex/a327ex-site/logs/[slug].md > /tmp/commit_msg.txt # Prepend the title (plain text, no #) and append attribution sed -i "1i [Title]\n" /tmp/commit_msg.txt printf "\nGenerated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n" >> /tmp/commit_msg.txt git commit -F /tmp/commit_msg.txtStep 6: Push the Repos
Two pushes — project (to GitHub) and a327ex-site (to the VPS):
# Project repo to GitHub. Skip this push if the project IS a327ex-site # (handled by the second push below — don't duplicate). git push origin main # a327ex-site to the VPS (post-receive hook restarts the Lua server). cd E:/a327ex/a327ex-site git add -A git commit -m "[Title]" git push prod main 2>&1 | tail -3Failure handling: if either push fails, the other still happens. Local commits stay intact, so the user can re-push manually once they've fixed whatever blocked it. Don't roll back; the committed state on disk is the source of truth.
Step 7: Confirm
Tell the user: - Project commit hash + GitHub push result - a327ex-site commit hash + VPS push result
Format:
Logged — "[Title]". project (Anchor2): abc1234 pushed to GitHub a327ex-site: ghi9012 pushed to a327ex.com (post-receive deployed)If a push failed, surface that explicitly with the error.
Notes
- Frontmatter is non-negotiable. Every log file MUST have
Title:andDate:at the top. Enforced at write time in step 4. The backfill script is a safety net, not a substitute.- If the project IS
a327ex-site(e.g., you spent the session writing the renderer or fixing the theme), there's no separate "project repo to GitHub" push — the a327ex-site push at the end IS the project push. Don't duplicate.- Legacy note: this skill used to also dual-write to
anchor.blot.im/logs/andanchor.blot.im/context/. Post-cutover (May 2026),anchor.blot.imis a JS redirect toa327ex.comand no longer receives content. Drop those steps if you find any older docs that still reference them.ARGUMENTS: UI Generalization 2
Bash (cd E:/a327ex/attack-template && git status --short 2>&1 | head -20; echo "---"; ...)
M .claude/CLAUDE.md
M anchor.exe
M assets/draw_shader.frag
M main.lua
M snkrx/palette.lua
M snkrx/ui/gallery.lua
M snkrx/ui/init.lua
M snkrx/ui/juice.lua
M snkrx/ui/paint.lua
M snkrx/ui/primitives.lua
M snkrx/ui/state.lua
M snkrx/ui/widgets.lua
?? assets/BoldPixels.ttf
?? "assets/More 15.ttf"
?? assets/pirkkala.ttf
?? assets/shadow.frag
---
total 47
drwxr-xr-x 1 adn 197121 0 May 25 01:35 ./
drwxr-xr-x 1 adn 197121 0 May 25 01:30 ../
---Anchor2---
M docs/BLOT_MIGRATION.md
M engine/src/anchor.c
?? reference/blot_migration_plan.md
---timestamp---
2026-05-25 01:35:43
Bash (python E:/a327ex/Anchor2/scripts/find-recent-session.py --limit 3 2>&1 | head -1...)
2026-05-25T04:35:48.972Z d05459cb-bc41-4b7b-a8d2-1ebeba063203 [claude] <-- MOST RECENT
C:\Users\adn\.claude\projects\E--a327ex\d05459cb-bc41-4b7b-a8d2-1ebeba063203.jsonl
2026-05-25T04:33:20.794Z 928a6664-ad51-4697-a25f-b60224a1210a [claude]
C:\Users\adn\.claude\projects\E--a327ex\928a6664-ad51-4697-a25f-b60224a1210a.jsonl
2026-05-25T03:55:37.223Z 233a9a79-40c9-4093-bb25-a9cd908f4538 [claude]
C:\Users\adn\.claude\projects\E--a327ex\233a9a79-40c9-4093-bb25-a9cd908f4538.jsonl