From a4b2dbaf13a02f9c1e910cdd5d2a239393355e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 12:11:45 -0400 Subject: [PATCH 1/9] WIP feedback --- alert.go | 124 +++++++++ alert_test.go | 113 ++++++++ empty_state.go | 88 ++++++ empty_state_test.go | 81 ++++++ loading_overlay.go | 94 +++++++ messages_feedback.go | 44 +++ notification_center.go | 189 +++++++++++++ progress.go | 271 +++++++++++++++++++ progress_test.go | 127 +++++++++ result.go | 97 +++++++ result_test.go | 66 +++++ skeleton.go | 87 ++++++ skeleton_test.go | 83 ++++++ spinner.go | 6 +- spinner_test.go | 77 ++++++ status_indicator.go | 77 ++++++ status_indicator_test.go | 69 +++++ testdata/snapshots/darwin/alert-dark.png | Bin 0 -> 26555 bytes testdata/snapshots/darwin/alert-light.png | Bin 0 -> 25586 bytes testdata/snapshots/darwin/progress-dark.png | Bin 0 -> 23304 bytes testdata/snapshots/darwin/progress-light.png | Bin 0 -> 22394 bytes testdata/snapshots/darwin/toast-dark.png | Bin 0 -> 15914 bytes testdata/snapshots/darwin/toast-light.png | Bin 0 -> 17918 bytes toast.go | 257 ++++++++++++++++++ toast_test.go | 193 +++++++++++++ 25 files changed, 2141 insertions(+), 2 deletions(-) create mode 100644 alert.go create mode 100644 alert_test.go create mode 100644 empty_state.go create mode 100644 empty_state_test.go create mode 100644 loading_overlay.go create mode 100644 notification_center.go create mode 100644 progress.go create mode 100644 progress_test.go create mode 100644 result.go create mode 100644 result_test.go create mode 100644 skeleton.go create mode 100644 skeleton_test.go create mode 100644 spinner_test.go create mode 100644 status_indicator.go create mode 100644 status_indicator_test.go create mode 100644 testdata/snapshots/darwin/alert-dark.png create mode 100644 testdata/snapshots/darwin/alert-light.png create mode 100644 testdata/snapshots/darwin/progress-dark.png create mode 100644 testdata/snapshots/darwin/progress-light.png create mode 100644 testdata/snapshots/darwin/toast-dark.png create mode 100644 testdata/snapshots/darwin/toast-light.png create mode 100644 toast.go create mode 100644 toast_test.go diff --git a/alert.go b/alert.go new file mode 100644 index 0000000..2b5f116 --- /dev/null +++ b/alert.go @@ -0,0 +1,124 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// Severity is the meaning of a message. The zero value is SeverityInfo. +type Severity int + +const ( + SeverityInfo Severity = iota + SeveritySuccess + SeverityWarning + SeverityError +) + +func (s Severity) String() string { + switch s { + case SeverityInfo: + return "info" + case SeveritySuccess: + return "success" + case SeverityWarning: + return "warning" + case SeverityError: + return "error" + } + panic(fmt.Sprintf("mujica: unknown Severity %d", int(s))) +} + +// severityLook returns the color and icon that, with text, mark s. +func severityLook(k theme.Tokens, s Severity) (ui.Color, *ui.SVG) { + switch s { + case SeveritySuccess: + return k.Success, icons.Must("circle-check") + case SeverityWarning: + return k.Warning, icons.Must("triangle-alert") + case SeverityError: + return k.Danger, icons.Must("circle-x") + } + return k.Info, icons.Must("info") +} + +// AlertOptions configure an Alert. +type AlertOptions struct { + Severity Severity + // Title goes above the message in bold; empty shows none. + Title string + // Action labels a button at the end; empty shows none. + Action string +} + +// AlertResult is what an Alert built and reported this frame. +type AlertResult struct { + // Element is nil while the alert is closed. + Element *ui.Element + // Action reports a click on the action button. + Action bool + // Closed reports the user dismissing the alert. + Closed bool +} + +// Alert shows an inline message marked by color, icon and accessible name. +// A non-nil open adds a dismiss button that sets *open to false; nothing +// shows while *open is false. +func Alert(c *ui.Context, open *bool, message string, opts AlertOptions) AlertResult { + if message == "" { + panic("mujica: Alert needs a message") + } + if open != nil && !*open { + return AlertResult{} + } + k := Tokens(c) + u := Density(c).Unit() + tone, icon := severityLook(k, opts.Severity) + name := msg(c, "alert."+opts.Severity.String()) + var res AlertResult + box := ui.Row(c).FillWidth().AlignItems(ui.Start).Gap(u*3).Padding(u*3, u*3, u*3, u*4). + Radius(theme.CardRadius).Background(k.Surface).Border(theme.BorderWidth, k.Border). + Role(ui.RoleGroup).Label(name).Clip() + // A bar in the severity color along the leading edge. + box.Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y, W: 3, H: r.H}, tone, 0) + }) + // Warnings and errors are read out when they appear or change. + said := ui.Local(box, "alert.said", func() string { return "" }) + if news := name + ": " + message; opts.Severity >= SeverityWarning && *said != news { + *said = news + c.Announce(news) + } + box.Children(func() { + ui.Icon(c, icon).Size(20, 20).TextColor(tone).Margin(1, 0, 0, 0) + ui.Column(c).Grow(1).Shrink(1).Gap(u).Children(func() { + if opts.Title != "" { + ui.Text(c, opts.Title).Bold().TextColor(k.Text) + } + ui.Text(c, message).TextColor(k.Text).LineHeight(theme.LineHeight) + if opts.Action != "" { + ui.Row(c).Margin(u, 0, 0, 0).Children(func() { + if Button(c, opts.Action, ButtonOptions{Variant: Outline}).Clicked() { + slog.Debug("mujica: alert action", "severity", opts.Severity, "action", opts.Action) + res.Action = true + } + }) + } + }) + if open != nil { + dismiss := Button(c, "", ButtonOptions{Variant: Ghost, Icon: icons.Must("x"), Label: msg(c, "alert.close")}) + dismiss.TextColor(k.TextMuted).Padding(0).MinHeight(theme.MinHitSize).Margin(-u, -u, -u, 0) + if dismiss.Clicked() { + slog.Debug("mujica: alert closed", "severity", opts.Severity) + *open, res.Closed = false, true + } + } + }) + res.Element = box + return res +} diff --git a/alert_test.go b/alert_test.go new file mode 100644 index 0000000..af93006 --- /dev/null +++ b/alert_test.go @@ -0,0 +1,113 @@ +package mujica + +import ( + "slices" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestAlertActionAndClose(t *testing.T) { + open := true + actions, closes := 0, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := Alert(c, &open, "Disk almost full", AlertOptions{Severity: SeverityWarning, Title: "Storage", Action: "Free space"}) + if r.Action { + actions++ + } + if r.Closed { + closes++ + } + }, 500, 300) + if err := tt.Click("Free space"); err != nil { + t.Fatal(err) + } + if actions != 1 || !open { + t.Fatalf("actions %d open %v", actions, open) + } + if err := tt.Click("Dismiss"); err != nil { + t.Fatal(err) + } + if open || closes != 1 { + t.Fatalf("after dismiss open %v closes %d", open, closes) + } + if tt.HasText("Disk almost full") { + t.Fatal("closed alert still shows") + } +} + +func TestAlertKeyboard(t *testing.T) { + open := true + actions := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if Alert(c, &open, "Sync failed", AlertOptions{Severity: SeverityError, Action: "Retry"}).Action { + actions++ + } + }, 500, 300) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if actions != 1 { + t.Fatalf("Enter on action: %d", actions) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeySpace) + if open { + t.Fatal("Space on dismiss left it open") + } +} + +func TestAlertWithoutOpenHasNoDismiss(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Alert(c, nil, "Read only", AlertOptions{}) + }, 500, 300) + if _, ok := tt.Find("Dismiss"); ok { + t.Fatal("dismiss button without open") + } + if _, ok := tt.Find("Information"); !ok { + t.Fatal("alert lacks its severity name") + } +} + +func TestAlertAnnouncesWarningsOnce(t *testing.T) { + sev := SeverityInfo + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + Alert(c, nil, "磁盘已满", AlertOptions{Severity: sev}) + }, 500, 300) + if a := tt.Announcements(); len(a) != 0 { + t.Fatalf("info announced %q", a) + } + sev = SeverityError + tt.Frame() + tt.Frame() + if a := tt.Announcements(); !slices.Equal(a, []string{"错误: 磁盘已满"}) { + t.Fatalf("error announcements %q", a) + } +} + +func TestAlertPanicsWithoutMessage(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Alert(c, nil, "", AlertOptions{}) + }, 300, 200) +} + +func TestAlertSnapshot(t *testing.T) { + open := true + snapshot(t, "alert", 560, 400, func(c *ui.Context) { + ui.Column(c).Padding(20).Gap(12).Children(func() { + Alert(c, nil, "A new version is ready to install.", AlertOptions{}) + Alert(c, &open, "Your changes were saved.", AlertOptions{Severity: SeveritySuccess}) + Alert(c, nil, "The certificate expires in 3 days.", AlertOptions{Severity: SeverityWarning, Title: "Certificate"}) + Alert(c, &open, "The archive could not be read.", AlertOptions{Severity: SeverityError, Title: "Import failed", Action: "Retry"}) + }) + }) +} diff --git a/empty_state.go b/empty_state.go new file mode 100644 index 0000000..67ca961 --- /dev/null +++ b/empty_state.go @@ -0,0 +1,88 @@ +package mujica + +import ( + "cmp" + "fmt" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// EmptyKind tells why there is nothing to show. The zero value is EmptyNoData. +type EmptyKind int + +const ( + // EmptyNoData: the collection itself is empty. + EmptyNoData EmptyKind = iota + // EmptyNoResults: a search or filter matched nothing. + EmptyNoResults +) + +// EmptyStateOptions configure an EmptyState. Empty texts use the kind's built-in copy. +type EmptyStateOptions struct { + Kind EmptyKind + Title string + Description string + // Query, for EmptyNoResults, is named in the default description. + Query string + // Icon replaces the kind's icon (inbox or search); NoIcon shows none. + Icon *ui.SVG + NoIcon bool + // Action labels a button, such as "Clear search"; empty shows none. + Action string +} + +// EmptyStateResult is what an EmptyState built and reported this frame. +type EmptyStateResult struct { + Element *ui.Element + Action bool +} + +// EmptyState explains an empty view and offers a next step. +func EmptyState(c *ui.Context, opts EmptyStateOptions) EmptyStateResult { + if opts.NoIcon && opts.Icon != nil { + panic("mujica: EmptyState with both Icon and NoIcon") + } + k := Tokens(c) + u := Density(c).Unit() + title, desc, icon := opts.Title, opts.Description, opts.Icon + switch opts.Kind { + case EmptyNoData: + if opts.Query != "" { + panic("mujica: EmptyState Query needs EmptyNoResults") + } + title = cmp.Or(title, msg(c, "empty_state.no_data.title")) + desc = cmp.Or(desc, msg(c, "empty_state.no_data.description")) + if icon == nil { + icon = icons.Must("inbox") + } + case EmptyNoResults: + title = cmp.Or(title, msg(c, "empty_state.no_results.title")) + if desc == "" && opts.Query != "" { + desc = fmt.Sprintf(msg(c, "empty_state.no_results.query"), opts.Query) + } + desc = cmp.Or(desc, msg(c, "empty_state.no_results.description")) + if icon == nil { + icon = icons.Must("search") + } + default: + panic(fmt.Sprintf("mujica: unknown EmptyKind %d", int(opts.Kind))) + } + var res EmptyStateResult + res.Element = ui.Column(c).FillWidth().AlignItems(ui.Center).Gap(u*2).Padding(u*8, u*4).Role(ui.RoleGroup).Label(title) + res.Element.Children(func() { + if !opts.NoIcon { + ui.Icon(c, icon).Size(32, 32).TextColor(k.TextMuted).Margin(0, 0, u*2, 0) + } + ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size).TextColor(k.Text).TextAlign(ui.Center) + ui.Text(c, desc).TextColor(k.TextMuted).TextAlign(ui.Center).MaxWidth(360).LineHeight(theme.LineHeight) + if opts.Action != "" { + ui.Box(c).Margin(u*2, 0, 0, 0).Children(func() { + res.Action = Button(c, opts.Action, ButtonOptions{Variant: Secondary}).Clicked() + }) + } + }) + return res +} diff --git a/empty_state_test.go b/empty_state_test.go new file mode 100644 index 0000000..246b611 --- /dev/null +++ b/empty_state_test.go @@ -0,0 +1,81 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" +) + +func TestEmptyStateKinds(t *testing.T) { + opts := EmptyStateOptions{} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + EmptyState(c, opts) + }, 500, 400) + if !tt.HasText("Nothing here yet") || !tt.HasText("Items you add will appear here.") { + t.Fatalf("no data: %q", tt.Texts()) + } + opts = EmptyStateOptions{Kind: EmptyNoResults, Query: "invoice"} + tt.Frame() + if !tt.HasText("No results") || !tt.HasText("Nothing matches “invoice”.") { + t.Fatalf("no results: %q", tt.Texts()) + } + opts = EmptyStateOptions{Kind: EmptyNoResults} + tt.Frame() + if !tt.HasText("Try other words or clear the filters.") { + t.Fatalf("no results without query: %q", tt.Texts()) + } +} + +func TestEmptyStateActionKeyboard(t *testing.T) { + n := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + if EmptyState(c, EmptyStateOptions{Kind: EmptyNoResults, Query: "发票", Action: "清除搜索"}).Action { + n++ + } + }, 500, 400) + if !tt.HasText("没有与“发票”匹配的内容。") { + t.Fatalf("texts %q", tt.Texts()) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if err := tt.Click("清除搜索"); err != nil { + t.Fatal(err) + } + if n != 2 { + t.Fatalf("actions %d", n) + } +} + +func TestEmptyStatePanics(t *testing.T) { + for name, o := range map[string]EmptyStateOptions{ + "icon and no icon": {Icon: icons.Must("inbox"), NoIcon: true}, + "query without kind": {Query: "x"}, + "unknown kind": {Kind: 9}, + } { + func() { + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); EmptyState(c, o) }, 300, 200) + }() + } +} + +func TestEmptyStateSnapshot(t *testing.T) { + snapshot(t, "empty_state", 640, 280, func(c *ui.Context) { + ui.Row(c).Padding(12).Gap(12).Children(func() { + ui.Column(c).Grow(1).Basis(0).Children(func() { + EmptyState(c, EmptyStateOptions{Action: "New project"}) + }) + ui.Column(c).Grow(1).Basis(0).Children(func() { + EmptyState(c, EmptyStateOptions{Kind: EmptyNoResults, Query: "quarterly", Action: "Clear search"}) + }) + }) + }) +} diff --git a/loading_overlay.go b/loading_overlay.go new file mode 100644 index 0000000..6f8ba0d --- /dev/null +++ b/loading_overlay.go @@ -0,0 +1,94 @@ +package mujica + +import ( + "cmp" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// LoadingOverlayOptions configure a LoadingOverlay. +type LoadingOverlayOptions struct { + // Label explains the wait; empty uses "Loading…". + Label string + // Cancel labels a button that reports Canceled; empty shows none. + Cancel string +} + +// LoadingOverlayResult is what a LoadingOverlay built and reported this frame. +type LoadingOverlayResult struct { + Element *ui.Element + // Canceled reports the cancel button or Escape while loading. + Canceled bool +} + +// LoadingOverlay builds content and, while loading, covers it with a +// spinner and label. Covered content takes no pointer, keys or focus; +// the rest of the window stays usable. Focus inside moves to the overlay. +func LoadingOverlay(c *ui.Context, loading bool, opts LoadingOverlayOptions, content func()) LoadingOverlayResult { + if content == nil { + panic("mujica: LoadingOverlay needs content") + } + k := Tokens(c) + u := Density(c).Unit() + label := cmp.Or(opts.Label, msg(c, "loading_overlay.label")) + var res LoadingOverlayResult + box := ui.Box(c) + was := ui.Local(box, "loading_overlay.loading", func() bool { return false }) + if loading != *was { + slog.Debug("mujica: loading_overlay changed", "loading", loading) + if loading { + c.Announce(label) + } + *was = loading + } + box.Children(func() { + inner := ui.Column(c).FillWidth().Disabled(loading) + inner.Children(content) + if !loading { + return + } + held := inner.FocusWithin() + scrim := ui.Column(c).Absolute().Left(0).Top(0).Right(0).Bottom(0).Center().Padding(u * 4). + Background(k.Background.Alpha(0.5)).Radius(theme.CardRadius) + scrim.Transition(ui.ElementTransition{Duration: theme.StateDuration, Enter: &ui.Motion{}, Exit: &ui.Motion{}}) + scrim.Children(func() { + panel := ui.Column(c).AlignItems(ui.Center).Gap(u*3).Padding(u*4, u*6).Radius(theme.PopupRadius). + Background(k.Surface).Border(theme.BorderWidth, k.Border).Role(ui.RoleStatus).Label(label) + if opts.Cancel == "" { + // Without a button the panel keeps the focus in the region. + internal.Ring(panel.Focusable(), k.Focus, theme.PopupRadius) + if held { + panel.Focus() + } + } + panel.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + Spinner(c, SpinnerOptions{Size: 20, Label: label}) + ui.Text(c, label).TextColor(k.Text) + }) + if opts.Cancel == "" { + return + } + b := Button(c, opts.Cancel, ButtonOptions{Variant: Secondary}) + if held { + b.Focus() + } + if b.Clicked() { + res.Canceled = true + } + }) + if opts.Cancel != "" && panel.Shortcut(0, ui.KeyEscape) { + res.Canceled = true + } + }) + }) + if res.Canceled { + slog.Debug("mujica: loading_overlay canceled") + } + res.Element = box + return res +} diff --git a/messages_feedback.go b/messages_feedback.go index c7ec2d0..527754c 100644 --- a/messages_feedback.go +++ b/messages_feedback.go @@ -3,5 +3,49 @@ package mujica func init() { addMessages(map[string][2]string{ "loading": {"Loading", "加载中"}, + + "alert.close": {"Dismiss", "关闭"}, + "alert.info": {"Information", "信息"}, + "alert.success": {"Success", "成功"}, + "alert.warning": {"Warning", "警告"}, + "alert.error": {"Error", "错误"}, + + "toast.close": {"Dismiss notification", "关闭通知"}, + "toast.region": {"Notifications", "通知"}, + + "progress.indeterminate": {"In progress", "进行中"}, + "meter.normal": {"Normal", "正常"}, + "meter.warning": {"High", "偏高"}, + "meter.critical": {"Critical", "严重"}, + "meter.low_warning": {"Low", "偏低"}, + + "empty_state.no_data.title": {"Nothing here yet", "暂无内容"}, + "empty_state.no_data.description": {"Items you add will appear here.", "添加的内容会显示在这里。"}, + "empty_state.no_results.title": {"No results", "没有结果"}, + "empty_state.no_results.description": {"Try other words or clear the filters.", "请换个关键词,或清除筛选条件。"}, + "empty_state.no_results.query": {"Nothing matches “%s”.", "没有与“%s”匹配的内容。"}, + + "result.success.title": {"Done", "操作成功"}, + "result.failure.title": {"Something went wrong", "操作失败"}, + "result.forbidden.title": {"No access", "无访问权限"}, + + "status_indicator.success": {"Healthy", "正常"}, + "status_indicator.warning": {"Degraded", "警告"}, + "status_indicator.error": {"Failing", "错误"}, + "status_indicator.offline": {"Offline", "离线"}, + "status_indicator.busy": {"Working", "处理中"}, + + "notification_center.title": {"Notifications", "通知"}, + "notification_center.unread": {"%d unread", "%d 条未读"}, + "notification_center.unread_mark": {"Unread", "未读"}, + "notification_center.mark_read": {"Mark read", "标为已读"}, + "notification_center.mark_unread": {"Mark unread", "标为未读"}, + "notification_center.mark_all_read": {"Mark all read", "全部已读"}, + "notification_center.clear": {"Clear", "清除"}, + "notification_center.clear_all": {"Clear all", "全部清除"}, + "notification_center.empty": {"You're all caught up", "没有新通知"}, + "notification_center.empty_hint": {"New notifications will appear here.", "新的通知会显示在这里。"}, + + "loading_overlay.label": {"Loading…", "正在加载…"}, }) } diff --git a/notification_center.go b/notification_center.go new file mode 100644 index 0000000..7b2cc8c --- /dev/null +++ b/notification_center.go @@ -0,0 +1,189 @@ +package mujica + +import ( + "cmp" + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// Notification is one in-app message. The caller owns and persists the list. +type Notification struct { + // ID is required and unique within the list. + ID string + Title string + Body string + // Time shows as given, as "5 min ago". + Time string + Read bool + // Action labels a button; empty shows none. + Action string +} + +// NotificationCenterOptions configure a NotificationCenter. +type NotificationCenterOptions struct { + // Title uses the built-in "Notifications" when empty. + Title string +} + +// NotificationCenterResult reports the frame's events by notification ID. +type NotificationCenterResult struct { + Element *ui.Element + Action string + // Toggled changed its Read state; Opened was clicked and is now read. + Toggled string + Opened string + Removed string + // MarkedAllRead and ClearedAll report the header buttons. + MarkedAllRead bool + ClearedAll bool +} + +// NotificationCenter lists *items and edits them in place: read, unread, +// remove, clear. The list is one Tab stop; arrows move among its buttons +// and Delete removes the focused notification. +func NotificationCenter(c *ui.Context, items *[]Notification, opts NotificationCenterOptions) NotificationCenterResult { + if items == nil { + panic("mujica: NotificationCenter needs items") + } + seen := map[string]bool{} + unread := 0 + for _, n := range *items { + if n.ID == "" || seen[n.ID] { + panic(fmt.Sprintf("mujica: notification ID %q empty or repeated", n.ID)) + } + seen[n.ID] = true + if !n.Read { + unread++ + } + } + k := Tokens(c) + u := Density(c).Unit() + title := cmp.Or(opts.Title, msg(c, "notification_center.title")) + var res NotificationCenterResult + panel := ui.Column(c).FillWidth().Radius(theme.CardRadius).Background(k.Surface).Border(theme.BorderWidth, k.Border). + Role(ui.RoleGroup).Label(title).Clip() + panel.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u*2).Padding(u*3, u*3, u*3, u*4).Children(func() { + ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size).TextColor(k.Text) + if unread > 0 { + ui.Text(c, fmt.Sprintf(msg(c, "notification_center.unread"), unread)).FontSize(theme.CaptionSize).TextColor(k.AccentText) + } + ui.Spacer(c) + if Button(c, msg(c, "notification_center.mark_all_read"), ButtonOptions{Variant: Ghost, Disabled: unread == 0}).Clicked() { + for i := range *items { + (*items)[i].Read = true + } + res.MarkedAllRead = true + slog.Debug("mujica: notification_center mark all read", "count", unread) + } + if Button(c, msg(c, "notification_center.clear_all"), ButtonOptions{Variant: Ghost, Disabled: len(*items) == 0}).Clicked() { + slog.Debug("mujica: notification_center clear all", "count", len(*items)) + *items = (*items)[:0] + res.ClearedAll = true + } + }) + // Ornament hairline under the panel title. + ui.Box(c).FillWidth().Height(1).Background(k.Ornament).Role(ui.RoleNone) + if len(*items) == 0 && !res.ClearedAll { + EmptyState(c, EmptyStateOptions{ + Title: msg(c, "notification_center.empty"), + Description: msg(c, "notification_center.empty_hint"), + Icon: icons.Must("bell"), + }) + return + } + list := ui.Scroll(c).Grow(1).Shrink(1).FillWidth().Role(ui.RoleList).FocusGroup(ui.Vertical | ui.Horizontal) + list.Dividers(theme.BorderWidth, k.Border) + list.Children(func() { + for i := range *items { + notificationRow(c, k, u, &(*items)[i], &res) + } + }) + }) + if res.Removed != "" { + for i, n := range *items { + if n.ID == res.Removed { + *items = append((*items)[:i], (*items)[i+1:]...) + break + } + } + } + res.Element = panel + return res +} + +func notificationRow(c *ui.Context, k theme.Tokens, u float32, n *Notification, res *NotificationCenterResult) { + name := n.Title + if !n.Read { + name = msg(c, "notification_center.unread_mark") + ": " + n.Title + } + row := ui.Row(c).Key(n.ID).FillWidth().AlignItems(ui.Start).Gap(u*2).Padding(u*3, u*3, u*3, u*2). + Role(ui.RoleListItem).Label(name) + if row.Hovered() { + row.Background(k.SurfaceHover) + } + row.Children(func() { + // Unread mark: a diamond and bold title, not color alone. + ui.Box(c).Size(12, 20).Shrink(0).Role(ui.RoleNone).Draw(func(p *ui.Painter, r ui.Rect) { + if !n.Read { + p.FillPath(internal.Diamond(r.X+r.W/2, r.Y+r.H/2, 8), k.AccentText) + } + }) + open := ui.ButtonBase(c).Grow(1).Shrink(1).Column().AlignItems(ui.Start).Justify(ui.Start).Gap(u). + Radius(theme.ControlRadius).Label(name) + internal.Ring(open, k.Focus, theme.ControlRadius) + open.Children(func() { + ui.Row(c).FillWidth().Gap(u * 2).Children(func() { + t := ui.Text(c, n.Title).TextColor(k.Text).Grow(1).Shrink(1) + if !n.Read { + t.Bold() + } + if n.Time != "" { + ui.Text(c, n.Time).FontSize(theme.CaptionSize).TextColor(k.TextMuted).SingleLine() + } + }) + if n.Body != "" { + ui.Text(c, n.Body).TextColor(k.TextMuted).LineHeight(theme.LineHeight) + } + }) + if open.Clicked() && !n.Read { + n.Read, res.Opened = true, n.ID + slog.Debug("mujica: notification_center opened", "id", n.ID) + } + ui.Row(c).Gap(u).AlignItems(ui.Center).Children(func() { + if n.Action != "" && Button(c, n.Action, ButtonOptions{Variant: Outline}).Clicked() { + res.Action = n.ID + slog.Debug("mujica: notification_center action", "id", n.ID) + } + toggle, icon := "notification_center.mark_read", icons.Must("check") + if n.Read { + toggle, icon = "notification_center.mark_unread", icons.Must("circle") + } + if notificationIconButton(c, k, u, icon, msg(c, toggle)).Clicked() { + n.Read, res.Toggled = !n.Read, n.ID + slog.Debug("mujica: notification_center toggled", "id", n.ID, "read", n.Read) + } + if notificationIconButton(c, k, u, icons.Must("x"), msg(c, "notification_center.clear")).Clicked() { + res.Removed = n.ID + } + }) + }) + if row.Shortcut(0, ui.KeyDelete) || row.Shortcut(0, ui.KeyBackspace) { + res.Removed = n.ID + } + if res.Removed == n.ID { + slog.Debug("mujica: notification_center removed", "id", n.ID) + } +} + +func notificationIconButton(c *ui.Context, k theme.Tokens, u float32, icon *ui.SVG, label string) *ui.Element { + b := Button(c, "", ButtonOptions{Variant: Ghost, Icon: icon, Label: label}) + b.TextColor(k.TextMuted).Padding(0, u).Tooltip(label) + return b +} diff --git a/progress.go b/progress.go new file mode 100644 index 0000000..c0059af --- /dev/null +++ b/progress.go @@ -0,0 +1,271 @@ +package mujica + +import ( + "fmt" + "math" + "strconv" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// ProgressShape is how a progress indicator draws. The zero value is ProgressLinear. +type ProgressShape int + +const ( + ProgressLinear ProgressShape = iota + ProgressRing +) + +// ProgressOptions configure a Progress. +type ProgressOptions struct { + Shape ProgressShape + // Indeterminate shows work of unknown length; the value is ignored. + Indeterminate bool + // Label names the indicator and shows beside it; empty reads "Loading". + Label string + ShowValue bool + // Size is the ring diameter (48 DIP when zero) or the bar width (fills when zero). + Size float32 +} + +// Progress shows value, from 0 to 1, of work done. It panics outside that range. +// Indeterminate indicators move only while painted and hold still under reduced motion. +func Progress(c *ui.Context, value float64, opts ProgressOptions) *ui.Element { + if !opts.Indeterminate && (math.IsNaN(value) || value < 0 || value > 1) { + panic(fmt.Sprintf("mujica: Progress value %v outside 0..1", value)) + } + if opts.Size < 0 { + panic("mujica: negative Progress Size") + } + k := Tokens(c) + u := Density(c).Unit() + still := c.Preferences().ReduceMotion + name := opts.Label + if name == "" { + name = msg(c, "loading") + } + acc := value + if opts.Indeterminate { + acc = -1 + } + caption := "" + switch { + case opts.Indeterminate && still: + caption = msg(c, "progress.indeterminate") + case !opts.Indeterminate && opts.ShowValue: + caption = strconv.Itoa(int(math.Round(value*100))) + "%" + } + if opts.Shape == ProgressRing { + return progressRing(c, k, u, acc, name, caption, opts, still) + } + col := ui.Column(c).Gap(u * 1.5) + if opts.Size > 0 { + col.Width(opts.Size) + } else { + col.FillWidth() + } + col.Children(func() { + if opts.Label != "" || caption != "" { + ui.Row(c).Gap(u * 2).Children(func() { + ui.Text(c, opts.Label).TextColor(k.Text).Grow(1).Shrink(1) + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum").SingleLine() + }) + } + bar := ui.Progress(c, acc).Label(name).FillWidth().Height(u * 1.5).Radius(theme.ControlRadius).Background(k.Border) + shown := float32(value) + if !opts.Indeterminate { + shown = bar.Animate("progress.value", shown, theme.StateDuration) + } + bar.Draw(func(p *ui.Painter, r ui.Rect) { + switch { + case !opts.Indeterminate: + p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W * shown, H: r.H}, k.AccentText, theme.ControlRadius) + case still: + p.Fill(r, k.AccentText.Alpha(0.4), theme.ControlRadius) + default: + p.AnimationFrame() + phase := float32(p.Now().UnixMilli()%1400) / 1400 + w := r.W * 0.3 + x := r.X - w + (r.W+w)*phase + p.Clip(r, theme.ControlRadius, func() { + p.Fill(ui.Rect{X: x, Y: r.Y, W: w, H: r.H}, k.AccentText, theme.ControlRadius) + }) + } + }) + }) + return col +} + +func progressRing(c *ui.Context, k theme.Tokens, u float32, acc float64, name, caption string, opts ProgressOptions, still bool) *ui.Element { + d := opts.Size + if d == 0 { + d = 48 + } + row := ui.Row(c).AlignItems(ui.Center).Gap(u * 2) + row.Children(func() { + ring := ui.Progress(c, acc).Label(name).Size(d, d).Radius(0).Background(ui.Transparent) + shown := float32(acc) + if !opts.Indeterminate { + shown = ring.Animate("progress.value", shown, theme.StateDuration) + } + stroke := max(3, d/10) + ring.Draw(func(p *ui.Painter, r ui.Rect) { + cx, cy, rad := r.X+r.W/2, r.Y+r.H/2, (r.W-stroke)/2 + var track ui.Path + track.Circle(cx, cy, rad) + p.StrokePath(&track, stroke, k.Border) + switch { + case !opts.Indeterminate: + if shown > 0 { + p.StrokePath(progressArc(cx, cy, rad, 0, shown), stroke, k.AccentText) + } + case still: + p.StrokePath(&track, stroke, k.AccentText.Alpha(0.4)) + default: + p.AnimationFrame() + start := float32(p.Now().UnixMilli()%1200) / 1200 + p.StrokePath(progressArc(cx, cy, rad, start, start+0.25), stroke, k.AccentText) + } + }) + if caption != "" && d >= 44 && !opts.Indeterminate { + ring.Children(func() { + ui.Text(c, caption).FontSize(theme.CaptionSize).FontFeatures("tnum").TextColor(k.Text) + }) + ring.Center() + } + if opts.Label != "" || (caption != "" && (d < 44 || opts.Indeterminate)) { + ui.Column(c).Children(func() { + if opts.Label != "" { + ui.Text(c, opts.Label).TextColor(k.Text) + } + if caption != "" && (d < 44 || opts.Indeterminate) { + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize) + } + }) + } + }) + return row +} + +// progressArc is the arc from turn a to turn b, clockwise from twelve o'clock. +func progressArc(cx, cy, r float32, a, b float32) *ui.Path { + var p ui.Path + n := max(2, int(math.Ceil(float64((b-a)*64)))) + for i := 0; i <= n; i++ { + t := float64(a + (b-a)*float32(i)/float32(n)) + x := cx + r*float32(math.Sin(2*math.Pi*t)) + y := cy - r*float32(math.Cos(2*math.Pi*t)) + if i == 0 { + p.MoveTo(x, y) + } else { + p.LineTo(x, y) + } + } + return &p +} + +// MeterOptions configure a Meter. +type MeterOptions struct { + // Min and Max bound the value; both zero mean 0 to 1. + Min, Max float64 + // Levels mark the value High from Warning and Critical from Critical; + // Critical below Warning flags low values instead. Nil marks none. + Levels *ui.MeterLevels + Label string + ShowValue bool + // Width is the bar width; zero fills. + Width float32 +} + +// meterLevel is 0 normal, 1 warning, 2 critical. +func meterLevel(v float64, l *ui.MeterLevels) int { + if l == nil || l.Warning == l.Critical { + return 0 + } + low := l.Critical < l.Warning + switch { + case !low && v >= l.Critical, low && v <= l.Critical: + return 2 + case !low && v >= l.Warning, low && v <= l.Warning: + return 1 + } + return 0 +} + +// Meter shows a level within a range, as disk use. Thresholds show as +// ticks and the level as a word as well as a color. It panics on a value outside the range. +func Meter(c *ui.Context, value float64, opts MeterOptions) *ui.Element { + lo, hi := opts.Min, opts.Max + if lo == 0 && hi == 0 { + hi = 1 + } + if !(hi > lo) { + panic(fmt.Sprintf("mujica: Meter range %v..%v is empty", lo, hi)) + } + if math.IsNaN(value) || value < lo || value > hi { + panic(fmt.Sprintf("mujica: Meter value %v outside %v..%v", value, lo, hi)) + } + if l := opts.Levels; l != nil && (l.Warning < lo || l.Warning > hi || l.Critical < lo || l.Critical > hi) { + panic("mujica: Meter levels outside the range") + } + k := Tokens(c) + u := Density(c).Unit() + level := meterLevel(value, opts.Levels) + tone := []ui.Color{k.Success, k.Warning, k.Danger}[level] + var word string + if opts.Levels != nil { + low := opts.Levels.Critical < opts.Levels.Warning + word = msg(c, "meter.normal") + switch { + case level == 2: + word = msg(c, "meter.critical") + case level == 1 && low: + word = msg(c, "meter.low_warning") + case level == 1: + word = msg(c, "meter.warning") + } + } + frac := func(v float64) float32 { return float32((v - lo) / (hi - lo)) } + col := ui.Column(c).Gap(u * 1.5) + if opts.Width > 0 { + col.Width(opts.Width) + } else { + col.FillWidth() + } + col.Children(func() { + caption := word + if opts.ShowValue { + caption = strconv.FormatFloat(value, 'f', -1, 64) + " / " + strconv.FormatFloat(hi, 'f', -1, 64) + if word != "" { + caption += " · " + word + } + } + if opts.Label != "" || caption != "" { + ui.Row(c).Gap(u * 2).Children(func() { + ui.Text(c, opts.Label).TextColor(k.Text).Grow(1).Shrink(1) + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum").SingleLine() + }) + } + name := opts.Label + if word != "" { + name += " (" + word + ")" + } + bar := ui.Meter(c, value, lo, hi, opts.Levels).Label(name).FillWidth().Height(u * 2). + Radius(theme.ControlRadius).Background(k.Border) + bar.Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W * frac(value), H: r.H}, tone, theme.ControlRadius) + }) + if l := opts.Levels; l != nil { + // Ticks at the thresholds, over the fill. + bar.DrawOver(func(p *ui.Painter, r ui.Rect) { + for _, v := range []float64{l.Warning, l.Critical} { + x := float32(math.Round(float64(r.X + r.W*frac(v)))) + p.Fill(ui.Rect{X: x - 1, Y: r.Y, W: 2, H: r.H}, k.Text.Alpha(0.6), 0) + } + }) + } + }) + return col +} diff --git a/progress_test.go b/progress_test.go new file mode 100644 index 0000000..de54799 --- /dev/null +++ b/progress_test.go @@ -0,0 +1,127 @@ +package mujica + +import ( + "math" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestProgressValueText(t *testing.T) { + v := 0.424 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Progress(c, v, ProgressOptions{Label: "Uploading", ShowValue: true}) + Progress(c, 1, ProgressOptions{Shape: ProgressRing, Label: "Indexing", ShowValue: true}) + }, 400, 300) + if !tt.HasText("42%") || !tt.HasText("100%") { + t.Fatalf("texts %q", tt.Texts()) + } + if r, ok := tt.Find("Indexing"); !ok || r.H < 48 { + t.Fatalf("ring %v %v", r, ok) + } + v = 0 + tt.Frame() + if !tt.HasText("0%") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestProgressIndeterminateReducedMotion(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Progress(c, math.NaN(), ProgressOptions{Indeterminate: true, Label: "Connecting"}) + }, 400, 300) + if tt.HasText("In progress") { + t.Fatal("static note shown while moving") + } + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if !tt.HasText("In progress") { + t.Fatal("no static note under reduced motion") + } + a := encode(t, tt.Image()) + tt.Frame() + if string(a) != string(encode(t, tt.Image())) { + t.Fatal("indeterminate bar moved under reduced motion") + } +} + +func TestProgressRingSize(t *testing.T) { + var w float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Children(func() { + w = Progress(c, 0.5, ProgressOptions{Shape: ProgressRing, Size: 24}).Bounds().W + }) + }, 400, 300) + tt.Frame() + if w != 24 { + t.Fatalf("ring width %v", w) + } +} + +func TestMeterLevels(t *testing.T) { + disk := &ui.MeterLevels{Warning: 80, Critical: 95} + battery := &ui.MeterLevels{Warning: 20, Critical: 10} + for _, tc := range []struct { + v float64 + levels *ui.MeterLevels + want int + }{ + {50, disk, 0}, {80, disk, 1}, {94.9, disk, 1}, {95, disk, 2}, {100, disk, 2}, + {50, battery, 0}, {20, battery, 1}, {10, battery, 2}, {0, battery, 2}, {99, nil, 0}, + } { + if got := meterLevel(tc.v, tc.levels); got != tc.want { + t.Errorf("meterLevel(%v, %+v) = %d, want %d", tc.v, tc.levels, got, tc.want) + } + } +} + +func TestMeterWords(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + Meter(c, 90, MeterOptions{Max: 100, Levels: &ui.MeterLevels{Warning: 80, Critical: 95}, Label: "磁盘", ShowValue: true}) + Meter(c, 15, MeterOptions{Max: 100, Levels: &ui.MeterLevels{Warning: 20, Critical: 10}, Label: "电量"}) + }, 400, 300) + if !tt.HasText("90 / 100 · 偏高") || !tt.HasText("偏低") { + t.Fatalf("texts %q", tt.Texts()) + } + if _, ok := tt.Find("磁盘 (偏高)"); !ok { + t.Fatal("meter name lacks its level") + } +} + +func TestProgressAndMeterPanics(t *testing.T) { + for name, f := range map[string]func(c *ui.Context){ + "progress above 1": func(c *ui.Context) { Progress(c, 1.2, ProgressOptions{}) }, + "progress NaN": func(c *ui.Context) { Progress(c, math.NaN(), ProgressOptions{}) }, + "meter empty range": func(c *ui.Context) { Meter(c, 5, MeterOptions{Min: 10, Max: 10}) }, + "meter outside": func(c *ui.Context) { Meter(c, 2, MeterOptions{}) }, + "meter levels": func(c *ui.Context) { Meter(c, 5, MeterOptions{Max: 10, Levels: &ui.MeterLevels{Warning: 8, Critical: 12}}) }, + } { + func() { + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); f(c) }, 300, 200) + }() + } +} + +func TestProgressSnapshot(t *testing.T) { + snapshot(t, "progress", 520, 300, func(c *ui.Context) { + ui.Column(c).Padding(20).Gap(16).Children(func() { + Progress(c, 0.62, ProgressOptions{Label: "Uploading 3 files", ShowValue: true}) + Progress(c, 0, ProgressOptions{Indeterminate: true, Label: "Connecting"}) + ui.Row(c).Gap(24).AlignItems(ui.Center).Children(func() { + Progress(c, 0.35, ProgressOptions{Shape: ProgressRing, ShowValue: true}) + Progress(c, 0.8, ProgressOptions{Shape: ProgressRing, Size: 24, Label: "Indexing", ShowValue: true}) + Progress(c, 0, ProgressOptions{Shape: ProgressRing, Indeterminate: true, Label: "Waiting"}) + }) + Meter(c, 42, MeterOptions{Max: 100, Label: "Memory", ShowValue: true, Levels: &ui.MeterLevels{Warning: 70, Critical: 90}}) + Meter(c, 93, MeterOptions{Max: 100, Label: "Disk", ShowValue: true, Levels: &ui.MeterLevels{Warning: 70, Critical: 90}}) + }) + }) +} diff --git a/result.go b/result.go new file mode 100644 index 0000000..70814d0 --- /dev/null +++ b/result.go @@ -0,0 +1,97 @@ +package mujica + +import ( + "cmp" + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// ResultKind is the outcome a Result page reports. The zero value is ResultSuccess. +type ResultKind int + +const ( + ResultSuccess ResultKind = iota + ResultFailure + ResultForbidden +) + +// ResultOptions configure a Result. +type ResultOptions struct { + Kind ResultKind + // Title uses the kind's built-in copy when empty. + Title string + Description string + // Actions label the next steps; the first is the primary button. + Actions []string +} + +// ResultResult is what a Result built and reported this frame. +type ResultResult struct { + Element *ui.Element + // Action is the index of the clicked action, -1 for none. + Action int +} + +// Result reports the outcome of a finished task and offers next steps. +// It only reports the chosen step; the caller navigates. +func Result(c *ui.Context, opts ResultOptions) ResultResult { + k := Tokens(c) + u := Density(c).Unit() + var tone ui.Color + var icon *ui.SVG + var key string + switch opts.Kind { + case ResultSuccess: + tone, icon, key = k.Success, icons.Must("circle-check"), "result.success.title" + case ResultFailure: + tone, icon, key = k.Danger, icons.Must("circle-x"), "result.failure.title" + case ResultForbidden: + tone, icon, key = k.Warning, icons.Must("shield-off"), "result.forbidden.title" + default: + panic(fmt.Sprintf("mujica: unknown ResultKind %d", int(opts.Kind))) + } + title := cmp.Or(opts.Title, msg(c, key)) + res := ResultResult{Action: -1} + res.Element = ui.Column(c).FillWidth().AlignItems(ui.Center).Gap(u*3).Padding(u*10, u*6).Role(ui.RoleGroup).Label(title) + res.Element.Children(func() { + ui.Icon(c, icon).Size(48, 48).TextColor(tone) + ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H2Size).TextColor(k.Text).TextAlign(ui.Center) + if opts.Description != "" { + ui.Text(c, opts.Description).TextColor(k.TextMuted).TextAlign(ui.Center).MaxWidth(420).LineHeight(theme.LineHeight) + } + resultOrnament(c, k) + if len(opts.Actions) == 0 { + return + } + ui.Row(c).Gap(u * 3).Wrap().Justify(ui.Center).Children(func() { + for i, a := range opts.Actions { + v := Secondary + if i == 0 { + v = Primary + } + if Button(c, a, ButtonOptions{Variant: v}).Key(i).Clicked() { + slog.Debug("mujica: result action", "kind", opts.Kind, "index", i) + res.Action = i + } + } + }) + }) + return res +} + +// resultOrnament draws two hairlines meeting a diamond, in ornament gold. +func resultOrnament(c *ui.Context, k theme.Tokens) { + ui.Box(c).Size(160, 12).Role(ui.RoleNone).Draw(func(p *ui.Painter, r ui.Rect) { + cy := float32(int(r.Y+r.H/2)) + 0.5 + cx := r.X + r.W/2 + p.Line(r.X, cy, cx-9, cy, 1, k.Ornament) + p.Line(cx+9, cy, r.X+r.W, cy, 1, k.Ornament) + p.FillPath(internal.Diamond(cx, cy, 8), k.Ornament) + }) +} diff --git a/result_test.go b/result_test.go new file mode 100644 index 0000000..b7ec69f --- /dev/null +++ b/result_test.go @@ -0,0 +1,66 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestResultActions(t *testing.T) { + got := []int{} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if a := Result(c, ResultOptions{Kind: ResultFailure, Description: "The payment was declined.", Actions: []string{"Try again", "Back to cart"}}).Action; a >= 0 { + got = append(got, a) + } + }, 600, 500) + if !tt.HasText("Something went wrong") { + t.Fatalf("texts %q", tt.Texts()) + } + if err := tt.Click("Back to cart"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(got) != 2 || got[0] != 1 || got[1] != 0 { + t.Fatalf("actions %v", got) + } +} + +func TestResultTitles(t *testing.T) { + for kind, want := range map[ResultKind]string{ResultSuccess: "操作成功", ResultFailure: "操作失败", ResultForbidden: "无访问权限"} { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + Result(c, ResultOptions{Kind: kind}) + }, 500, 400) + if !tt.HasText(want) { + t.Errorf("%d: texts %q", kind, tt.Texts()) + } + } + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Result(c, ResultOptions{Title: "Order placed"}) + }, 500, 400) + if !tt.HasText("Order placed") || tt.HasText("Done") { + t.Fatalf("custom title: %q", tt.Texts()) + } +} + +func TestResultPanicsOnUnknownKind(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); Result(c, ResultOptions{Kind: 7}) }, 300, 200) +} + +func TestResultSnapshot(t *testing.T) { + snapshot(t, "result", 520, 340, func(c *ui.Context) { + Result(c, ResultOptions{ + Kind: ResultForbidden, + Description: "You need the Editor role to change billing settings.", + Actions: []string{"Request access", "Go back"}, + }) + }) +} diff --git a/skeleton.go b/skeleton.go new file mode 100644 index 0000000..eefa1b5 --- /dev/null +++ b/skeleton.go @@ -0,0 +1,87 @@ +package mujica + +import ( + "math" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// SkeletonShape is the placeholder's form. The zero value is SkeletonText. +type SkeletonShape int + +const ( + SkeletonText SkeletonShape = iota + SkeletonCircle + SkeletonRect +) + +// SkeletonOptions configure a Skeleton. Sizes are fixed so content does not shift. +type SkeletonOptions struct { + Shape SkeletonShape + // Width fills the parent when zero; a circle uses it as its diameter (40 DIP when zero). + Width float32 + // Height is the rect height (ControlHeight when zero); text derives it from Lines. + Height float32 + // Lines is the text line count, 1 when zero; the last of several is shorter. + Lines int +} + +// Skeleton stands in for content that is loading. It pulses while painted +// and shows a static fill under reduced motion. +func Skeleton(c *ui.Context, opts SkeletonOptions) *ui.Element { + if opts.Width < 0 || opts.Height < 0 || opts.Lines < 0 { + panic("mujica: negative Skeleton size") + } + k := Tokens(c) + still := c.Preferences().ReduceMotion + fill := k.SurfaceHover + if k.Dark { + fill = k.Border + } + paint := func(p *ui.Painter, r ui.Rect, radius float32) { + a := float32(1) + if !still { + p.AnimationFrame() + t := float64(p.Now().UnixMilli()%1600) / 1600 + a = 0.55 + 0.45*float32(0.5+0.5*math.Cos(2*math.Pi*t)) + } + p.Fill(r, fill.Alpha(a), radius) + } + e := ui.Box(c).Role(ui.RoleNone) + if opts.Width > 0 { + e.Width(opts.Width) + } else if opts.Shape != SkeletonCircle { + e.FillWidth() + } + switch opts.Shape { + case SkeletonCircle: + d := opts.Width + if d == 0 { + d = 40 + } + e.Size(d, d).Shrink(0).Draw(func(p *ui.Painter, r ui.Rect) { paint(p, r, r.W/2) }) + case SkeletonRect: + h := opts.Height + if h == 0 { + h = Density(c).ControlHeight() + } + e.Height(h).Draw(func(p *ui.Painter, r ui.Rect) { paint(p, r, theme.CardRadius) }) + default: + lines := max(opts.Lines, 1) + line := theme.BodySize * theme.LineHeight + e.Height(line * float32(lines)).Draw(func(p *ui.Painter, r ui.Rect) { + bar := theme.BodySize * 0.8 + for i := range lines { + w := r.W + if lines > 1 && i == lines-1 { + w *= 0.6 + } + y := r.Y + float32(i)*line + (line-bar)/2 + paint(p, ui.Rect{X: r.X, Y: y, W: w, H: bar}, theme.ControlRadius) + } + }) + } + return e +} diff --git a/skeleton_test.go b/skeleton_test.go new file mode 100644 index 0000000..a9b2661 --- /dev/null +++ b/skeleton_test.go @@ -0,0 +1,83 @@ +package mujica + +import ( + "bytes" + "testing" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +func TestSkeletonSizes(t *testing.T) { + var text, circle, rect, fixed ui.Rect + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Density: theme.Compact}) + ui.Column(c).Width(300).AlignItems(ui.Start).Children(func() { + text = Skeleton(c, SkeletonOptions{Lines: 3}).Bounds() + circle = Skeleton(c, SkeletonOptions{Shape: SkeletonCircle}).Bounds() + rect = Skeleton(c, SkeletonOptions{Shape: SkeletonRect}).Bounds() + fixed = Skeleton(c, SkeletonOptions{Shape: SkeletonRect, Width: 120, Height: 80}).Bounds() + }) + }, 400, 400) + tt.Frame() + if text.W != 300 || text.H != 63 { + t.Errorf("text %v", text) + } + if circle.W != 40 || circle.H != 40 { + t.Errorf("circle %v", circle) + } + if rect.W != 300 || rect.H != 28 { + t.Errorf("rect %v", rect) + } + if fixed.W != 120 || fixed.H != 80 { + t.Errorf("fixed %v", fixed) + } +} + +func TestSkeletonStaticUnderReducedMotion(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Skeleton(c, SkeletonOptions{Shape: SkeletonRect}) + }, 200, 100) + a := encode(t, tt.Image()) + time.Sleep(300 * time.Millisecond) + tt.Frame() + if bytes.Equal(a, encode(t, tt.Image())) { + t.Fatal("skeleton did not pulse") + } + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + a = encode(t, tt.Image()) + time.Sleep(300 * time.Millisecond) + tt.Frame() + if !bytes.Equal(a, encode(t, tt.Image())) { + t.Fatal("skeleton moved under reduced motion") + } +} + +func TestSkeletonPanicsOnNegativeSize(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Skeleton(c, SkeletonOptions{Lines: -1}) + }, 200, 100) +} + +func TestSkeletonSnapshot(t *testing.T) { + snapshot(t, "skeleton", 420, 200, func(c *ui.Context) { + ui.Column(c).Padding(20).Gap(16).Children(func() { + ui.Row(c).Gap(12).AlignItems(ui.Center).Children(func() { + Skeleton(c, SkeletonOptions{Shape: SkeletonCircle}) + ui.Column(c).Grow(1).Children(func() { + Skeleton(c, SkeletonOptions{Lines: 2}) + }) + }) + Skeleton(c, SkeletonOptions{Shape: SkeletonRect, Height: 72}) + }) + }) +} diff --git a/spinner.go b/spinner.go index b93ca02..bb4ef74 100644 --- a/spinner.go +++ b/spinner.go @@ -19,6 +19,7 @@ type SpinnerOptions struct { } // Spinner draws four diamonds turning around a center while it shows. +// It repaints only while painted: hidden, it stops. Reduced motion holds it still. func Spinner(c *ui.Context, opts SpinnerOptions) *ui.Element { k := Tokens(c) size := opts.Size @@ -34,9 +35,10 @@ func Spinner(c *ui.Context, opts SpinnerOptions) *ui.Element { color = k.AccentText } still := c.Preferences().ReduceMotion - row := ui.Row(c).Gap(Density(c).Unit() * 2).AlignItems(ui.Center).Role(ui.RoleProgress).Label(label) + row := ui.Row(c).Gap(Density(c).Unit() * 2).AlignItems(ui.Center) row.Children(func() { - ui.Box(c).Size(size, size).Shrink(0).Draw(func(p *ui.Painter, r ui.Rect) { + // MyGo's spinner carries the indeterminate progress role. + ui.Spinner(c).Label(label).Size(size, size).Draw(func(p *ui.Painter, r ui.Rect) { turn := 0.0 if !still { turn = float64(p.Now().UnixMilli()%1200) / 1200 diff --git a/spinner_test.go b/spinner_test.go new file mode 100644 index 0000000..47a7abb --- /dev/null +++ b/spinner_test.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "bytes" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func TestSpinnerLabelAndSize(t *testing.T) { + var mark ui.Rect + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + Spinner(c, SpinnerOptions{}) + Spinner(c, SpinnerOptions{Size: 32, Label: "Fetching mail", ShowLabel: true}) + }, 400, 300) + r, ok := tt.Find("加载中") + if !ok || r.W != 16 || r.H != 16 { + t.Fatalf("default mark %v %v", r, ok) + } + if tt.HasText("加载中") { + t.Fatal("hidden label painted") + } + mark, ok = tt.Find("Fetching mail") + if !ok || mark.W != 32 { + t.Fatalf("sized mark %v %v", mark, ok) + } + n := 0 + for _, s := range tt.Texts() { + if s == "Fetching mail" { + n++ + } + } + if n != 2 { + t.Fatalf("label as name and text: %d of %q", n, tt.Texts()) + } +} + +func TestSpinnerMotion(t *testing.T) { + show := true + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if show { + Spinner(c, SpinnerOptions{Size: 40}) + } + }, 100, 100) + a := encode(t, tt.Image()) + time.Sleep(150 * time.Millisecond) + tt.Frame() + if bytes.Equal(a, encode(t, tt.Image())) { + t.Fatal("spinner did not turn") + } + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + a = encode(t, tt.Image()) + time.Sleep(150 * time.Millisecond) + tt.Frame() + if !bytes.Equal(a, encode(t, tt.Image())) { + t.Fatal("spinner turned under reduced motion") + } + show = false + tt.Frame() + if _, ok := tt.Find("Loading"); ok { + t.Fatal("hidden spinner still built") + } +} + +func TestSpinnerSnapshot(t *testing.T) { + snapshot(t, "spinner", 360, 100, func(c *ui.Context) { + ui.Row(c).Padding(24).Gap(24).AlignItems(ui.Center).Children(func() { + Spinner(c, SpinnerOptions{}) + Spinner(c, SpinnerOptions{Size: 24}) + Spinner(c, SpinnerOptions{Size: 20, Label: "Syncing", ShowLabel: true}) + Button(c, "Saving", ButtonOptions{Loading: true}) + }) + }) +} diff --git a/status_indicator.go b/status_indicator.go new file mode 100644 index 0000000..045c642 --- /dev/null +++ b/status_indicator.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "fmt" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// Status is a system or item state. The zero value is StatusSuccess. +type Status int + +const ( + StatusSuccess Status = iota + StatusWarning + StatusError + StatusOffline + StatusBusy +) + +func (s Status) String() string { + switch s { + case StatusSuccess: + return "success" + case StatusWarning: + return "warning" + case StatusError: + return "error" + case StatusOffline: + return "offline" + case StatusBusy: + return "busy" + } + panic(fmt.Sprintf("mujica: unknown Status %d", int(s))) +} + +// StatusIndicatorOptions configure a StatusIndicator. +type StatusIndicatorOptions struct { + // Label replaces the status's built-in word, as "Database online". + Label string +} + +// StatusIndicator shows a status by its own shape and a word, never by color alone. +func StatusIndicator(c *ui.Context, status Status, opts StatusIndicatorOptions) *ui.Element { + k := Tokens(c) + u := Density(c).Unit() + label := opts.Label + if label == "" { + label = msg(c, "status_indicator."+status.String()) + } + var tone ui.Color + var icon *ui.SVG + switch status { + case StatusSuccess: + tone, icon = k.Success, icons.Must("circle-check") + case StatusWarning: + tone, icon = k.Warning, icons.Must("triangle-alert") + case StatusError: + tone, icon = k.Danger, icons.Must("circle-x") + case StatusOffline: + tone, icon = k.TextMuted, icons.Must("wifi-off") + case StatusBusy: + tone = k.Info + } + row := ui.Row(c).AlignItems(ui.Center).Gap(u * 1.5).Role(ui.RoleStatus).Label(label) + row.Children(func() { + if status == StatusBusy { + Spinner(c, SpinnerOptions{Size: 16, Color: tone, Label: label}) + } else { + ui.Icon(c, icon).Size(16, 16).TextColor(tone) + } + ui.Text(c, label).TextColor(k.Text).FontSize(theme.BodySize).SingleLine() + }) + return row +} diff --git a/status_indicator_test.go b/status_indicator_test.go new file mode 100644 index 0000000..b47df01 --- /dev/null +++ b/status_indicator_test.go @@ -0,0 +1,69 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestStatusIndicatorWords(t *testing.T) { + want := map[Status]string{ + StatusSuccess: "Healthy", StatusWarning: "Degraded", StatusError: "Failing", + StatusOffline: "Offline", StatusBusy: "Working", + } + for s, word := range want { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + StatusIndicator(c, s, StatusIndicatorOptions{}) + }, 300, 100) + if !tt.HasText(word) { + t.Errorf("%v: texts %q", s, tt.Texts()) + } + } + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + StatusIndicator(c, StatusOffline, StatusIndicatorOptions{}) + StatusIndicator(c, StatusSuccess, StatusIndicatorOptions{Label: "Database online"}) + }, 300, 100) + if !tt.HasText("离线") || !tt.HasText("Database online") || tt.HasText("正常") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestStatusIndicatorShapesDiffer(t *testing.T) { + // The same tone would still differ by shape: render each in one color. + var imgs [][]byte + for _, s := range []Status{StatusSuccess, StatusWarning, StatusError, StatusOffline} { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + StatusIndicator(c, s, StatusIndicatorOptions{Label: "Same"}) + }, 120, 40) + imgs = append(imgs, encode(t, tt.Image())) + } + for i := range imgs { + for j := i + 1; j < len(imgs); j++ { + if string(imgs[i]) == string(imgs[j]) { + t.Errorf("statuses %d and %d draw alike", i, j) + } + } + } +} + +func TestStatusIndicatorPanicsOnUnknown(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); StatusIndicator(c, 42, StatusIndicatorOptions{}) }, 300, 100) +} + +func TestStatusIndicatorSnapshot(t *testing.T) { + snapshot(t, "status_indicator", 560, 80, func(c *ui.Context) { + ui.Row(c).Padding(24).Gap(20).Children(func() { + for _, s := range []Status{StatusSuccess, StatusWarning, StatusError, StatusOffline, StatusBusy} { + StatusIndicator(c, s, StatusIndicatorOptions{}) + } + }) + }) +} diff --git a/testdata/snapshots/darwin/alert-dark.png b/testdata/snapshots/darwin/alert-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9faed551ad829824f188ca0cf1ef85a1f74664 GIT binary patch literal 26555 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 sZV+kr(nnv+ER_F%BmP4o`xr$CvJ*|-_2|KEGR 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/progress-dark.png b/testdata/snapshots/darwin/progress-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9d537d3bc7843c10b4802619e9dc1d7861b01fc3 GIT binary patch literal 23304 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 Wc4kVadF`-&!>Oz2C^tN{i~cY65n0>- literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/progress-light.png b/testdata/snapshots/darwin/progress-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9d380a6e83bf9583f1182d05b880191589156ece GIT binary patch literal 22394 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 X*V-kvU6}mOzrAUx>#CK)tit{Solq%v literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/toast-dark.png b/testdata/snapshots/darwin/toast-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b7888e80d5ce90c3b3e749a9428f72f3fe6780e8 GIT binary patch literal 15914 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 z 0: + return m.Duration + case m.Severity == SeverityError: + return 0 + } + return ToastDuration +} + +func (q *toastQueue) push(m ToastMessage, now time.Time) { + if m.Message == "" { + panic("mujica: toast needs a Message") + } + if m.ID == "" { + m.ID = m.Message + } + for i := range q.items { + it := &q.items[i] + if it.msg.ID != m.ID { + continue + } + it.msg, it.life, it.spent, it.announced = m, toastLife(m), 0, false + if it.visible && !it.runFrom.IsZero() { + it.runFrom = now + } + slog.Debug("mujica: toast replaced", "id", m.ID) + return + } + q.items = append(q.items, toastItem{msg: m, life: toastLife(m)}) + slog.Debug("mujica: toast queued", "id", m.ID) + q.promote(now) +} + +// promote shows queued toasts while fewer than ToastVisible show. +func (q *toastQueue) promote(now time.Time) { + n := 0 + for i := range q.items { + it := &q.items[i] + if !it.visible && n < ToastVisible { + it.visible, it.runFrom = true, now + slog.Debug("mujica: toast shown", "id", it.msg.ID) + } + if it.visible { + n++ + } + } +} + +func (it *toastItem) elapsed(now time.Time) time.Duration { + if it.runFrom.IsZero() { + return it.spent + } + return it.spent + now.Sub(it.runFrom) +} + +// expire drops toasts whose time ran out and returns the wait until the next does. +func (q *toastQueue) expire(now time.Time) (next time.Duration) { + live := q.items[:0] + for _, it := range q.items { + if it.visible && it.life > 0 && it.elapsed(now) >= it.life { + slog.Debug("mujica: toast expired", "id", it.msg.ID) + continue + } + live = append(live, it) + } + q.items = live + q.promote(now) + for _, it := range q.items { + if it.visible && it.life > 0 && !it.runFrom.IsZero() { + left := it.life - it.elapsed(now) + if next == 0 || left < next { + next = left + } + } + } + return next +} + +func (q *toastQueue) pause(id string, paused bool, now time.Time) { + for i := range q.items { + it := &q.items[i] + if it.msg.ID != id || !it.visible { + continue + } + switch { + case paused && !it.runFrom.IsZero(): + it.spent, it.runFrom = it.elapsed(now), time.Time{} + slog.Debug("mujica: toast paused", "id", id) + case !paused && it.runFrom.IsZero(): + it.runFrom = now + slog.Debug("mujica: toast resumed", "id", id) + } + } +} + +func (q *toastQueue) remove(id string, now time.Time) { + for i, it := range q.items { + if it.msg.ID == id { + q.items = append(q.items[:i], q.items[i+1:]...) + break + } + } + q.promote(now) +} + +func toasts(c *ui.Context) *toastQueue { + return ui.Local(c.Root(), toastKey{}, func() toastQueue { return toastQueue{} }) +} + +// ShowToast queues m in the window. Call it on the UI thread. +func ShowToast(c *ui.Context, m ToastMessage) { + toasts(c).push(m, c.Now()) + c.Invalidate() +} + +// DismissToast closes the toast with id, shown or queued. +func DismissToast(c *ui.Context, id string) { + toasts(c).remove(id, c.Now()) + c.Invalidate() +} + +// Toaster draws the window's toasts at its bottom right. Call it once per +// frame, last in the view. Toasts never take the focus; Tab reaches their +// buttons. Hover or focus inside a toast pauses its time. +func Toaster(c *ui.Context) ToasterResult { + q := toasts(c) + now := c.Now() + if next := q.expire(now); next > 0 { + c.After(next) + } + var res ToasterResult + if len(q.items) == 0 { + return res + } + k := Tokens(c) + u := Density(c).Unit() + w, _ := c.Size() + ui.Overlay(c, func() { + stack := ui.Column(c).Absolute().Right(u * 4).Bottom(u * 4).Gap(u * 2).AlignItems(ui.End). + PassThrough().Role(ui.RoleGroup).Label(msg(c, "toast.region")) + stack.Children(func() { + for i := range q.items { + it := q.items[i] + if !it.visible { + continue + } + if !it.announced { + q.items[i].announced = true + c.Announce(it.msg.Message) + } + action, closed, held := toastCard(c, k, u, min(360, w-u*8), it.msg) + q.pause(it.msg.ID, held, now) + switch { + case action: + res.Action = it.msg.ID + slog.Debug("mujica: toast action", "id", it.msg.ID) + case closed: + res.Closed = it.msg.ID + slog.Debug("mujica: toast closed", "id", it.msg.ID) + } + } + }) + }) + for _, id := range []string{res.Action, res.Closed} { + if id != "" { + q.remove(id, now) + c.Invalidate() + } + } + return res +} + +// toastCard builds one toast and reports its events and whether hover or focus holds it. +func toastCard(c *ui.Context, k theme.Tokens, u, width float32, m ToastMessage) (action, closed, held bool) { + tone, icon := severityLook(k, m.Severity) + card := ui.Row(c).Key(m.ID).Width(width).AlignItems(ui.Center).Gap(u*3).Padding(u*2, u*2, u*2, u*4). + Radius(theme.PopupRadius).Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder). + Role(ui.RoleStatus).Label(m.Message) + card.Shadow(0, 4, 12, 0, ui.RGBA(0, 0, 0, 0.14)) + card.Transition(ui.ElementTransition{ + Duration: theme.PopupDuration, + Enter: &ui.Motion{Y: 8}, + Exit: &ui.Motion{}, + }) + card.Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y + theme.PopupRadius, W: 3, H: r.H - 2*theme.PopupRadius}, tone, 0) + }) + card.Children(func() { + ui.Icon(c, icon).Size(20, 20).TextColor(tone) + ui.Text(c, m.Message).TextColor(k.Text).Grow(1).Shrink(1).LineHeight(theme.LineHeight) + if m.Action != "" && Button(c, m.Action, ButtonOptions{Variant: Ghost}).Clicked() { + action = true + } + x := Button(c, "", ButtonOptions{Variant: Ghost, Icon: icons.Must("x"), Label: msg(c, "toast.close")}) + x.TextColor(k.TextMuted).Padding(0, u) + if x.Clicked() { + closed = true + } + }) + if card.Shortcut(0, ui.KeyEscape) { + closed = true + } + return action, closed, card.Hovered() || card.FocusWithin() +} diff --git a/toast_test.go b/toast_test.go new file mode 100644 index 0000000..d4425ba --- /dev/null +++ b/toast_test.go @@ -0,0 +1,193 @@ +package mujica + +import ( + "slices" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func toastIDs(q *toastQueue, visible bool) []string { + var ids []string + for _, it := range q.items { + if it.visible == visible { + ids = append(ids, it.msg.ID) + } + } + return ids +} + +func TestToastQueueLimitsVisible(t *testing.T) { + var q toastQueue + t0 := time.Unix(0, 0) + for _, id := range []string{"a", "b", "c", "d", "e"} { + q.push(ToastMessage{ID: id, Message: id}, t0) + } + if v, w := toastIDs(&q, true), toastIDs(&q, false); !slices.Equal(v, []string{"a", "b", "c"}) || !slices.Equal(w, []string{"d", "e"}) { + t.Fatalf("visible %v waiting %v", v, w) + } + // d starts its 5 s only when it shows. + if next := q.expire(t0.Add(ToastDuration)); next != ToastDuration { + t.Fatalf("next wake %v", next) + } + if v := toastIDs(&q, true); !slices.Equal(v, []string{"d", "e"}) { + t.Fatalf("after expiry visible %v", v) + } + q.expire(t0.Add(2*ToastDuration - time.Millisecond)) + if len(q.items) != 2 { + t.Fatalf("expired early: %v", toastIDs(&q, true)) + } + q.expire(t0.Add(2 * ToastDuration)) + if len(q.items) != 0 { + t.Fatalf("left %v", toastIDs(&q, true)) + } +} + +func TestToastQueueDedupesByID(t *testing.T) { + var q toastQueue + t0 := time.Unix(0, 0) + q.push(ToastMessage{ID: "sync", Message: "Syncing 1 file"}, t0) + q.push(ToastMessage{Message: "Saved"}, t0) + q.push(ToastMessage{ID: "sync", Message: "Syncing 2 files"}, t0.Add(4*time.Second)) + q.push(ToastMessage{Message: "Saved"}, t0.Add(4*time.Second)) + if len(q.items) != 2 || q.items[0].msg.Message != "Syncing 2 files" || q.items[1].msg.ID != "Saved" { + t.Fatalf("items %+v", q.items) + } + // The replaced toast restarted its time. + q.expire(t0.Add(6 * time.Second)) + if len(q.items) != 2 { + t.Fatalf("replacement kept the old time: %d left", len(q.items)) + } +} + +func TestToastQueueErrorsStayAndPauseHolds(t *testing.T) { + var q toastQueue + t0 := time.Unix(0, 0) + q.push(ToastMessage{ID: "e", Severity: SeverityError, Message: "Failed"}, t0) + q.push(ToastMessage{ID: "w", Severity: SeverityWarning, Message: "Slow", Action: "Details"}, t0) + q.pause("w", true, t0.Add(4*time.Second)) + if next := q.expire(t0.Add(time.Hour)); next != 0 { + t.Fatalf("paused toast still counts down: %v", next) + } + if !slices.Equal(toastIDs(&q, true), []string{"e", "w"}) { + t.Fatalf("visible %v", toastIDs(&q, true)) + } + q.pause("w", false, t0.Add(time.Hour)) + if next := q.expire(t0.Add(time.Hour)); next != time.Second { + t.Fatalf("resumed toast left %v, want 1s", next) + } + q.expire(t0.Add(time.Hour + time.Second)) + if !slices.Equal(toastIDs(&q, true), []string{"e"}) { + t.Fatalf("visible %v", toastIDs(&q, true)) + } +} + +func TestToastQueuePanics(t *testing.T) { + for _, m := range []ToastMessage{{}, {Message: "x", Duration: -1}} { + func() { + defer func() { + if recover() == nil { + t.Errorf("%+v: no panic", m) + } + }() + var q toastQueue + q.push(m, time.Now()) + }() + } +} + +func toastTester(m ToastMessage, res *ToasterResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if Button(c, "Notify", ButtonOptions{}).Clicked() { + ShowToast(c, m) + } + if r := Toaster(c); r != (ToasterResult{}) { + *res = r + } + }, 600, 400) +} + +func TestToastActionAndClose(t *testing.T) { + var res ToasterResult + tt := toastTester(ToastMessage{ID: "del", Message: "Note deleted", Action: "Undo"}, &res) + if err := tt.Click("Notify"); err != nil { + t.Fatal(err) + } + if !tt.HasText("Note deleted") { + t.Fatal("toast not shown") + } + if err := tt.Click("Undo"); err != nil { + t.Fatal(err) + } + if res.Action != "del" || tt.HasText("Note deleted") { + t.Fatalf("after undo %+v, still shown %v", res, tt.HasText("Note deleted")) + } + res = ToasterResult{} + _ = tt.Click("Notify") + if err := tt.Click("Dismiss notification"); err != nil { + t.Fatal(err) + } + if res.Closed != "del" || tt.HasText("Note deleted") { + t.Fatalf("after close %+v", res) + } +} + +func TestToastKeepsFocusAndEscapeCloses(t *testing.T) { + var res ToasterResult + tt := toastTester(ToastMessage{ID: "s", Message: "Saved"}, &res) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if !tt.HasText("Saved") || !tt.Focused("Notify") { + t.Fatalf("shown %v, focus kept %v", tt.HasText("Saved"), tt.Focused("Notify")) + } + if a := tt.Announcements(); !slices.Contains(a, "Saved") { + t.Fatalf("announcements %q", a) + } + tt.Key(0, ui.KeyTab) + if !tt.Focused("Dismiss notification") { + t.Fatal("Tab does not reach the toast") + } + tt.Key(0, ui.KeyEscape) + if res.Closed != "s" || tt.HasText("Saved") { + t.Fatalf("Escape: %+v", res) + } +} + +func TestToastExpiresAndHoverPauses(t *testing.T) { + var res ToasterResult + tt := toastTester(ToastMessage{Message: "Copied", Duration: 40 * time.Millisecond}, &res) + _ = tt.Click("Notify") + time.Sleep(60 * time.Millisecond) + tt.Frame() + if tt.HasText("Copied") { + t.Fatal("toast outlived its duration") + } + _ = tt.Click("Notify") + r, _ := tt.Find("Copied") + tt.Move(r.X+r.W/2, r.Y+r.H/2) + time.Sleep(60 * time.Millisecond) + tt.Frame() + if !tt.HasText("Copied") { + t.Fatal("hovered toast expired") + } + tt.Move(5, 395) + time.Sleep(60 * time.Millisecond) + tt.Frame() + if tt.HasText("Copied") { + t.Fatal("toast stayed after the pointer left") + } +} + +func TestToastSnapshot(t *testing.T) { + snapshot(t, "toast", 480, 300, func(c *ui.Context) { + if len(toasts(c).items) == 0 { + ShowToast(c, ToastMessage{ID: "1", Message: "Settings saved", Severity: SeveritySuccess}) + ShowToast(c, ToastMessage{ID: "2", Message: "Note moved to trash", Action: "Undo"}) + ShowToast(c, ToastMessage{ID: "3", Message: "Upload failed: network lost", Severity: SeverityError}) + ShowToast(c, ToastMessage{ID: "4", Message: "Queued and not shown"}) + } + Toaster(c) + }) +} From aa73d174fa10451f1a8dbf244015e5b0fbb5a171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 12:14:31 -0400 Subject: [PATCH 2/9] WIP feedback 2 --- loading_overlay_test.go | 119 ++++++++++++++++ notification_center.go | 6 +- notification_center_test.go | 130 ++++++++++++++++++ spinner.go | 39 +++--- spinner_test.go | 5 +- testdata/snapshots/darwin/alert-dark.png | Bin 26555 -> 26510 bytes testdata/snapshots/darwin/alert-light.png | Bin 25586 -> 25511 bytes testdata/snapshots/darwin/button-dark.png | Bin 10318 -> 10182 bytes testdata/snapshots/darwin/button-light.png | Bin 9934 -> 9815 bytes .../snapshots/darwin/empty_state-dark.png | Bin 0 -> 18369 bytes .../snapshots/darwin/empty_state-light.png | Bin 0 -> 17682 bytes .../snapshots/darwin/loading_overlay-dark.png | Bin 0 -> 8649 bytes .../darwin/loading_overlay-light.png | Bin 0 -> 8381 bytes .../darwin/notification_center-dark.png | Bin 0 -> 26522 bytes .../darwin/notification_center-light.png | Bin 0 -> 25689 bytes testdata/snapshots/darwin/progress-dark.png | Bin 23304 -> 23221 bytes testdata/snapshots/darwin/progress-light.png | Bin 22394 -> 22353 bytes testdata/snapshots/darwin/result-dark.png | Bin 0 -> 15797 bytes testdata/snapshots/darwin/result-light.png | Bin 0 -> 15328 bytes testdata/snapshots/darwin/skeleton-dark.png | Bin 0 -> 2658 bytes testdata/snapshots/darwin/skeleton-light.png | Bin 0 -> 2390 bytes testdata/snapshots/darwin/spinner-dark.png | Bin 0 -> 4076 bytes testdata/snapshots/darwin/spinner-light.png | Bin 0 -> 3993 bytes .../darwin/status_indicator-dark.png | Bin 0 -> 8047 bytes .../darwin/status_indicator-light.png | Bin 0 -> 7786 bytes 25 files changed, 278 insertions(+), 21 deletions(-) create mode 100644 loading_overlay_test.go create mode 100644 notification_center_test.go create mode 100644 testdata/snapshots/darwin/empty_state-dark.png create mode 100644 testdata/snapshots/darwin/empty_state-light.png create mode 100644 testdata/snapshots/darwin/loading_overlay-dark.png create mode 100644 testdata/snapshots/darwin/loading_overlay-light.png create mode 100644 testdata/snapshots/darwin/notification_center-dark.png create mode 100644 testdata/snapshots/darwin/notification_center-light.png create mode 100644 testdata/snapshots/darwin/result-dark.png create mode 100644 testdata/snapshots/darwin/result-light.png create mode 100644 testdata/snapshots/darwin/skeleton-dark.png create mode 100644 testdata/snapshots/darwin/skeleton-light.png create mode 100644 testdata/snapshots/darwin/spinner-dark.png create mode 100644 testdata/snapshots/darwin/spinner-light.png create mode 100644 testdata/snapshots/darwin/status_indicator-dark.png create mode 100644 testdata/snapshots/darwin/status_indicator-light.png diff --git a/loading_overlay_test.go b/loading_overlay_test.go new file mode 100644 index 0000000..d3adc7b --- /dev/null +++ b/loading_overlay_test.go @@ -0,0 +1,119 @@ +package mujica + +import ( + "slices" + "testing" + + "github.com/egoist/mygo/ui" +) + +type overlayProbe struct { + loading bool + saves, outside int + cancels int + cancel, label string +} + +func overlayTester(p *overlayProbe) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Gap(12).Children(func() { + r := LoadingOverlay(c, p.loading, LoadingOverlayOptions{Cancel: p.cancel, Label: p.label}, func() { + ui.Column(c).Padding(24).Children(func() { + if Button(c, "Save", ButtonOptions{}).Clicked() { + p.saves++ + } + }) + }) + if r.Canceled { + p.cancels++ + } + if Button(c, "Outside", ButtonOptions{}).Clicked() { + p.outside++ + } + }) + }, 500, 400) +} + +func TestLoadingOverlayBlocksOnlyItsRegion(t *testing.T) { + p := &overlayProbe{} + tt := overlayTester(p) + _ = tt.Click("Save") + p.loading = true + tt.Frame() + r, _ := tt.Find("Save") + tt.ClickAt(r.X+r.W/2, r.Y+r.H/2) + tt.Key(0, ui.KeyEnter) + if err := tt.Click("Outside"); err != nil { + t.Fatal(err) + } + if p.saves != 1 || p.outside != 1 { + t.Fatalf("saves %d outside %d", p.saves, p.outside) + } + if !tt.HasText("Loading…") { + t.Fatalf("texts %q", tt.Texts()) + } + if a := tt.Announcements(); !slices.Contains(a, "Loading…") { + t.Fatalf("announcements %q", a) + } + p.loading = false + tt.Frame() + _ = tt.Click("Save") + if p.saves != 2 || tt.HasText("Loading…") { + t.Fatalf("after loading saves %d", p.saves) + } +} + +func TestLoadingOverlayCancelAndFocus(t *testing.T) { + p := &overlayProbe{cancel: "Stop", label: "Importing"} + tt := overlayTester(p) + tt.Key(0, ui.KeyTab) + if !tt.Focused("Save") { + t.Fatal("Save not focused") + } + p.loading = true + tt.Frame() + if !tt.Focused("Stop") { + t.Fatal("focus left the region instead of moving to cancel") + } + tt.Key(0, ui.KeyEscape) + if p.cancels != 1 { + t.Fatalf("Escape cancels %d", p.cancels) + } + if err := tt.Click("Stop"); err != nil { + t.Fatal(err) + } + if p.cancels != 2 || p.saves != 0 { + t.Fatalf("cancels %d saves %d", p.cancels, p.saves) + } +} + +func TestLoadingOverlayFocusWithoutCancel(t *testing.T) { + p := &overlayProbe{} + tt := overlayTester(p) + tt.Key(0, ui.KeyTab) + p.loading = true + tt.Frame() + tt.Frame() + if !tt.Focused("Loading…") { + t.Fatal("focus not kept in the region") + } + tt.Key(0, ui.KeyEscape) + if p.cancels != 0 { + t.Fatal("Escape canceled without a cancel action") + } +} + +func TestLoadingOverlaySnapshot(t *testing.T) { + snapshot(t, "loading_overlay", 420, 220, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + LoadingOverlay(c, true, LoadingOverlayOptions{Cancel: "Cancel"}, func() { + ui.Column(c).Padding(16).Gap(8).Background(Tokens(c).Surface).Radius(4).Children(func() { + ui.Text(c, "Quarterly report") + ui.Text(c, "Revenue, churn and pipeline for Q3.") + Button(c, "Export", ButtonOptions{}) + }) + }) + }) + }) +} diff --git a/notification_center.go b/notification_center.go index 7b2cc8c..19a4f93 100644 --- a/notification_center.go +++ b/notification_center.go @@ -66,7 +66,7 @@ func NotificationCenter(c *ui.Context, items *[]Notification, opts NotificationC u := Density(c).Unit() title := cmp.Or(opts.Title, msg(c, "notification_center.title")) var res NotificationCenterResult - panel := ui.Column(c).FillWidth().Radius(theme.CardRadius).Background(k.Surface).Border(theme.BorderWidth, k.Border). + panel := ui.Column(c).FillWidth().Shrink(1).MinHeight(0).Radius(theme.CardRadius).Background(k.Surface).Border(theme.BorderWidth, k.Border). Role(ui.RoleGroup).Label(title).Clip() panel.Children(func() { ui.Row(c).AlignItems(ui.Center).Gap(u*2).Padding(u*3, u*3, u*3, u*4).Children(func() { @@ -98,7 +98,7 @@ func NotificationCenter(c *ui.Context, items *[]Notification, opts NotificationC }) return } - list := ui.Scroll(c).Grow(1).Shrink(1).FillWidth().Role(ui.RoleList).FocusGroup(ui.Vertical | ui.Horizontal) + list := ui.Scroll(c).Shrink(1).FillWidth().Role(ui.RoleList).FocusGroup(ui.Vertical | ui.Horizontal) list.Dividers(theme.BorderWidth, k.Border) list.Children(func() { for i := range *items { @@ -124,7 +124,7 @@ func notificationRow(c *ui.Context, k theme.Tokens, u float32, n *Notification, name = msg(c, "notification_center.unread_mark") + ": " + n.Title } row := ui.Row(c).Key(n.ID).FillWidth().AlignItems(ui.Start).Gap(u*2).Padding(u*3, u*3, u*3, u*2). - Role(ui.RoleListItem).Label(name) + Role(ui.RoleListItem) if row.Hovered() { row.Background(k.SurfaceHover) } diff --git a/notification_center_test.go b/notification_center_test.go new file mode 100644 index 0000000..20fef80 --- /dev/null +++ b/notification_center_test.go @@ -0,0 +1,130 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func sampleNotifications() []Notification { + return []Notification{ + {ID: "a", Title: "Build failed", Body: "main · 3 tests failing", Time: "2 min ago", Action: "View log"}, + {ID: "b", Title: "Invite accepted", Body: "Mira joined the workspace", Time: "1 h ago"}, + {ID: "c", Title: "Backup complete", Time: "Yesterday", Read: true}, + } +} + +func notificationTester(items *[]Notification, last *NotificationCenterResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Height(560).Children(func() { + r := NotificationCenter(c, items, NotificationCenterOptions{}) + r.Element = nil + if r != (NotificationCenterResult{}) { + *last = r + } + }) + }, 640, 600) +} + +func TestNotificationCenterReadAndAction(t *testing.T) { + items := sampleNotifications() + var last NotificationCenterResult + tt := notificationTester(&items, &last) + if !tt.HasText("2 unread") { + t.Fatalf("texts %q", tt.Texts()) + } + if err := tt.Click("Unread: Invite accepted"); err != nil { + t.Fatal(err) + } + if !items[1].Read || last.Opened != "b" || !tt.HasText("1 unread") { + t.Fatalf("open: %+v %+v", items[1], last) + } + if err := tt.Click("View log"); err != nil { + t.Fatal(err) + } + if last.Action != "a" || items[0].Read { + t.Fatalf("action: %+v %+v", last, items[0]) + } + if err := tt.Click("Mark unread"); err != nil { + t.Fatal(err) + } + if items[1].Read || last.Toggled != "b" { + t.Fatalf("toggle: %+v %+v", items[1], last) + } + if err := tt.Click("Mark all read"); err != nil { + t.Fatal(err) + } + for _, n := range items { + if !n.Read { + t.Fatalf("mark all: %+v", n) + } + } + if !last.MarkedAllRead || tt.HasText("1 unread") || tt.HasText("2 unread") { + t.Fatalf("mark all: %+v %q", last, tt.Texts()) + } +} + +func TestNotificationCenterRemoveAndClear(t *testing.T) { + items := sampleNotifications() + var last NotificationCenterResult + tt := notificationTester(&items, &last) + if err := tt.Click("Clear"); err != nil { + t.Fatal(err) + } + if len(items) != 2 || items[0].ID != "b" || last.Removed != "a" { + t.Fatalf("remove: %+v %+v", items, last) + } + if err := tt.Click("Clear all"); err != nil { + t.Fatal(err) + } + if len(items) != 0 || !last.ClearedAll || !tt.HasText("You're all caught up") { + t.Fatalf("clear all: %+v %q", items, tt.Texts()) + } +} + +func TestNotificationCenterKeyboard(t *testing.T) { + items := sampleNotifications() + var last NotificationCenterResult + tt := notificationTester(&items, &last) + tt.Key(0, ui.KeyTab) // Mark all read + tt.Key(0, ui.KeyTab) // Clear all + tt.Key(0, ui.KeyTab) // first notification + if !tt.Focused("Unread: Build failed") { + t.Fatal("Tab did not enter the list") + } + tt.Key(0, ui.KeyEnter) + if !items[0].Read || last.Opened != "a" { + t.Fatalf("Enter: %+v", items[0]) + } + tt.Key(0, ui.KeyDelete) + if len(items) != 2 || items[0].ID != "b" { + t.Fatalf("Delete: %+v", items) + } + tt.Key(0, ui.KeyTab) + if tt.Focused("Unread: Invite accepted") { + t.Fatal("the list takes more than one Tab stop") + } +} + +func TestNotificationCenterPanicsOnRepeatedID(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + items := []Notification{{ID: "x"}, {ID: "x"}} + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + NotificationCenter(c, &items, NotificationCenterOptions{}) + }, 300, 200) +} + +func TestNotificationCenterSnapshot(t *testing.T) { + items := sampleNotifications() + snapshot(t, "notification_center", 520, 400, func(c *ui.Context) { + ui.Column(c).Padding(16).Height(400).Children(func() { + NotificationCenter(c, &items, NotificationCenterOptions{}) + }) + }) +} diff --git a/spinner.go b/spinner.go index a14baac..1957ba7 100644 --- a/spinner.go +++ b/spinner.go @@ -37,25 +37,32 @@ func Spinner(c *ui.Context, opts SpinnerOptions) *ui.Element { still := c.Preferences().ReduceMotion row := ui.Row(c).Gap(Density(c).Unit() * 2).AlignItems(ui.Center) row.Children(func() { - // MyGo's spinner carries the indeterminate progress role. - ui.Spinner(c).Key(still).Label(label).Size(size, size).Draw(func(p *ui.Painter, r ui.Rect) { - turn := 0.0 - if !still { - turn = float64(p.Now().UnixMilli()%1200) / 1200 - p.AnimationFrame() - } - cx, cy, rad := r.X+r.W/2, r.Y+r.H/2, r.W*0.32 - for i := range 4 { - a := 2 * math.Pi * (turn + float64(i)/4) - x := cx + rad*float32(math.Cos(a)) - y := cy + rad*float32(math.Sin(a)) - alpha := 1 - float32(i)*0.22 - p.FillPath(internal.Diamond(x, y, r.W*0.3), color.Alpha(alpha)) - } - }) + // Keyed by motion so a flip repaints; MyGo's spinner carries the progress role. + ui.Box(c).Key(still).Shrink(0).Children(func() { spinnerMark(c, label, size, color, still) }) if opts.ShowLabel { ui.Text(c, label).TextColor(k.TextMuted).SingleLine() } }) return row } + +func spinnerMark(c *ui.Context, label string, size float32, color ui.Color, still bool) { + ui.Spinner(c).Label(label).Size(size, size).Draw(func(p *ui.Painter, r ui.Rect) { + turn := 0.0 + if !still { + turn = float64(p.Now().UnixMilli()%1200) / 1200 + p.AnimationFrame() + } + cx, cy, rad := r.X+r.W/2, r.Y+r.H/2, r.W*0.32 + for i := range 4 { + a := 2 * math.Pi * (turn + float64(i)/4) + x := cx + rad*float32(math.Cos(a)) + y := cy + rad*float32(math.Sin(a)) + // Device-pixel centers keep cached shapes rendering alike. + s := p.Scale() + x, y = float32(math.Round(float64(x*s)))/s, float32(math.Round(float64(y*s)))/s + alpha := 1 - float32(i)*0.22 + p.FillPath(internal.Diamond(x, y, r.W*0.3), color.Alpha(alpha)) + } + }) +} diff --git a/spinner_test.go b/spinner_test.go index 47a7abb..436ad18 100644 --- a/spinner_test.go +++ b/spinner_test.go @@ -2,6 +2,7 @@ package mujica import ( "bytes" + "slices" "testing" "time" @@ -19,8 +20,8 @@ func TestSpinnerLabelAndSize(t *testing.T) { if !ok || r.W != 16 || r.H != 16 { t.Fatalf("default mark %v %v", r, ok) } - if tt.HasText("加载中") { - t.Fatal("hidden label painted") + if n := len(slices.DeleteFunc(tt.Texts(), func(s string) bool { return s != "加载中" })); n != 1 { + t.Fatalf("hidden label painted: %d", n) } mark, ok = tt.Find("Fetching mail") if !ok || mark.W != 32 { diff --git a/testdata/snapshots/darwin/alert-dark.png b/testdata/snapshots/darwin/alert-dark.png index ff9faed551ad829824f188ca0cf1ef85a1f74664..f1af51dc907145cab0599094c2de97361fe69838 100644 GIT binary patch delta 16127 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 diff --git a/testdata/snapshots/darwin/alert-light.png b/testdata/snapshots/darwin/alert-light.png index c34f4dfdbb268afd0765cf044d03771b7c23de8f..7db185fc99d7533f65b643ce8d2f3d69006bec21 100644 GIT binary patch delta 15142 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 EAEu;tL;wH) delta 15838 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 diff --git a/testdata/snapshots/darwin/button-dark.png b/testdata/snapshots/darwin/button-dark.png index fd0d7f4753177f12747f9b50e811587c477c87f2..1629bd717e47d16623c37bf051d29c3bb265d9fb 100644 GIT binary patch delta 8986 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 M5{lyGqQ>9;3)mK(z5oCK diff --git a/testdata/snapshots/darwin/button-light.png b/testdata/snapshots/darwin/button-light.png index 5629ae476c1a1defefc061c1ba25fe1855ad012e..30db2539b844ef45ca15e6adc6f7dec9bc941f80 100644 GIT binary patch delta 8622 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 diff --git a/testdata/snapshots/darwin/empty_state-dark.png b/testdata/snapshots/darwin/empty_state-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..44beced35a6f694d705d9038e97efc0279589464 GIT binary patch literal 18369 zcmeIaWl&_n5-!-lU^BS8%P_b*4DRmk?(Q|?>OH9006v%xUeDs0PYU}fMLOagWeHxoEZTC#KI(m z1(e;h&KDWs0SqvJzLN3~sCQhGesF`f+^xRucLy?wIqO#FzW^u(e=s(;Zt>6tgG5E*SEz^w*P1fu>Z{o- ztO^+^7U{x8GiOj(W(t&XNM*=}3c^Uiiwmln>1c3J@r6y}u+zt-osJwsh7?j5CX&4Q zk7CC^@DD%T?%KDVra3XeL;Q*LVX*$+_ps6j?rP!(f~7sy7T$;hGcWH3Jk&sMwtHfih4BMfVi)wrjTFrhG*OL%GW`{!e$d*6#^iQ{5_b*Mkj*FH8?WzN9F3y zVKui$ut@a`tmh6OI4O2>XJoWlY1-M~LSTy6bG|8Cn6T|J&& zwYV*?vt~+DrVW9qJU$rX~6*>ZlC(!vFWPm|@fIZeI<*a{NY(3;Zjs zYU^__8(3cbQb-@LqY1qmYAZW49{_-J@x0#c93AdWv!66(Nj@ZBk}fuWU;o&9kQ)b- zEz0AOod(%^D8Kvi=;`)x{nwPPIACVhTWLwxek89C{l#5Mr5YY+OmpnyRKQ@povy z#{hs%q@AP6DD<4<@MCe;%e#RoHmXi%4Y-~yJW2!&f&WWPL-h5p#<90bMYde1j4ml>EQzrp#X{0hJQN&n9SRUsx3i zAk8=X0~5x|+v`EC!b-zN`q-HlJz1sS7r(KsZU#y9zuvLp0FJR|cYX^yvK>#%;mRq< z0BUvFf_3a8;hi=cHdk1{ox2&=?tBRjq{-Nfam)Y0l3Vug(zDm&hVWi3>$hCqP^2hO zv))FUa9|D&GxnAdB)a<+1*Vt}KUi~Sd7U+#Q;BUQV6=9%N!HZ2|&$?4W3J^zvh!V3ko9HQIV z#i%9l_qeT@93rA>;D0=PMF4!Oo^^gvC2eMRm(S>JNm`X)C%)tk_>s%cKPz;3__$h= z-NUy9lAxxRim%1|MDU)04ge$u{@IK|eH#nVz8oeU(S5SqaX7)H8Jf)}7hi!eAE zxOuqQYOvtt#x))#jK*`T z{u^KF0>8Z{EX`~SHA?kg<=Nxa><{Ql@@1g4i*XI?LWV1Qf4VpSxX<3U0 z_@xw-36m@H>N;9nA5f>B+c<~^wMQn}W6~Y3TY_v;Z?y)RDYM7XMKlhyiG%*`95bj( zU@<>VJ(WN;nQn0NHaV)n?3Pzm)RZTaZp!wnSNddKOs^*$o*#GBgd@$JG2%oc(x#;{ z`su#^YeNvqM;E(9Eq&ZS46b>b$_1()Xy^Zos5v9_>G=^@_*Wl5FbJTIxb1J8mX?r6 ziPrsh(l}(-omqWG18GXdAoa(~kIH`KXGDUroOBM0gYm{!h!zbkZ4Xp!YgO0Y`O6P{ zRXhXxBy709fmk~`tllzOxAwzT=@v$!(Wj#}9WFYxm9_L-kMmpH9pwxn3Li?XI9@_1e0|4UxZ{2<$fQQOFVa+yLeaufsT;$i! zN$_&S0YHTNi+Yt|e{R0jJ|9fE0nJ|JrQ2c`Sy7SMuw-htZ75YYrt627ip1oe$n;|C zrr>*wH@)$kU=30rqM(1SZujlJgW7Sum)cYu@o=V%fmB_NJ)t!rm&Zo4yF$pu$u_XO z%+q#~E4EaTt>0ME@)j7&+pzPw+Gtult}8d63`7xRk#WL2XwBV>#NhiWHh6}sYkif= zb2;{Ls>F$c-0t0eexTM^QDGH?6jAVxEqoA*hOz#Z6E?A;BIAsf*1|$5G<{O_%si6( zQG7R65N11iY4464Xl?YxZ_w3Re-h2!>f^U?akm-w7ChQeEY-lIHw(9xo*N1A=eLQ8 zi?_G7=UUU=9VQ|^T~h5Ub+pVR@q!cI^SR`Q%Ic*;hvP=rShZcoIr7}mtV{R)UU3nb z*W9yk;Vj2`d`|0E-10hE&`(<0+TPbnU=K^<>b*?P*@c^<z zXp9MD!KUVBA2s>=wbx0(FnYJE%~Y?v{N0QVDsL22o5V!Q)eE*&BpVyw7Z&M^%vv)V z?ZdRrXKjb@^9R|_mp0_&DLWkE4_JFbb-=H@h*} zZ@s*DFyGirZFzkTvo@##=GNAJ+VS~XBRtQNXi+B6@tJi`#`ut>MU}N<1VQ5+r1KK!kWQK^Ts>7eD20UXA~bmB7_I z!RNoE32B5Q&h7N03C>!lyu6+~-TGD5=~Lkt{wZ<4oBpd=l$n{8g~cIH_G4C>ZNd)J z_)#)E1TmtW@}yYo#=+gXy**<9AX*gvwJx78We1sX4*3X%s?Bw?V?8Wr-EwkiEYk*lb{6sh%9zxg-UPxi|ZBU-e0zKq&%nVp3vR_h~? zELyZw36X%0uWxa7VnLh;sc7q;c8j5n8#~kbkYT+-e52{N7jfnyPfw0uM9GfM_{xEB zCCnP#H{1`Z+C{rwaWFtdh2(hZRBJsGDH04KHNnM(%kk;MJ)s{=Bd(o9sZwR7)%X~7 zAb5!bM^+eNin21#Wh>trqG9IOM`aWo#LKt8C(M{iQ#u-Nw>bj zzP->kdDyUM3#CY*lVcDhg}sObiV>99i8jK zHR{DhG~x$#n_8K3*;(Hph2Oo5vi7hbsU%)sBA0!?oW6#iRg8vz&YU!rlpNNDiJ04U ze^1{%+q0&BhxuH=0I7XSr_Ga>6}a4HVvCwJI2aZ^ooQTzt#FrOW_*~Z7eKAw22Q|8 ztv|c%SNrjiTUZJPz&IQRDe6s71^f@-<=b!V^8^*fS#1P%5+=`s3U^wW2MDiLcWKuH zdyZlgbbM(t(ao(X8rsUA)Rjmu&jnb`nU#gr%|k=u<@os0F09FZ!O#$Z(^Fij@m~)Q zO(RhXM2X_~6I1>DC_X-9*o}s>KWwe6){ zQBQ|=oXHb-vtF7X(7?i9UmWV!XTW8zN--5DX0+@9+K0nQB zwO$n~QW-PB0^+=mav~ZMA|g<-Wg!6X+41B^Ff6RfCMG6Zr-+;X6km>EZ(;o-B1S-Z zlaZkXoA2f+?YQDk!((;RaB-nU2t{p%1A_zO5d?z+h>LIND&ESoB(k#OhMJPHO^Nd} z{M8~tdgu5$sygpHqSxMRa>0ZO)WAob1m3XOZ6@dH!2sISA3S}JfU1an3|v`tQrly<#oU@#F}FJV zT_YSkM214eXRuy8UjEUt!#rse7YGHvcGQ%y_L{bc3joZ)m4j{q_zgxw-+c5OQ3(4D zxR6jnYlS2k>-Y>@Y`pWneL7uVJK$loBl_H4)GZ}{m0V!5t=AS8n|*v9eQu#&PX$V3 zx@}EOwzf8c1B^|!C8VZNWax!yg#bc;SZ%=5y*&o4#v;hpyLA%bR^}|fG{LK?Cm67# zH9SmYY`PgBKq2HCVCIAc-bJNJmA}GUd2xOK46rdt{ku#e9_ix2-K{mr{7$*v9tr^X zhuSZpn6UKLJ4k{FsbZj=DlUAvdHdoG_VqyK^Yg>7UfqhC8Q@=2v-H|by;Q4XU}^~i zkXI#`XZL>%IhvfT27&430g;}%60hhp({*=majC_Xhky`k2Oe;Jm)-Aq17e5Nfln}y ztb)!DYujQ8@qn~V_sZ)!A{MWe9)23i3OjeY)0^Su#BtvYuM5u(J$+$2ZoBQsT?8k) zMsvEi<-YBwOG!{{dAR=G?#K#H8w3ae5X1wZ06dlDsFT452gbnV>Tk!&>KYQrfSI+m zrA(+isWv~wreKswTFdQvu~N37eHPQTjiAqlRGc~m04}rV=P>^9*RU& zXrO$1&#s3TcVl;UdhVD0RS)Ut$aI0q*4)e)NZ|>w#bJjJ!X(5TGn6mtl5TF(_Fh2& zuZnAR4qg&eOdmR340HeF5&dI*bVw*)JZK+Q+~z>lf>(Gxv#QgA|Tv;OclFX1=_2T zF{vddBnUJ6_o;980GKkKU|o(bKf1hvONK+HWPy=VgcM|-IfpaJ-|v6t=4X*ar9+JmU^)J)hKLlNJkzlu@ejk+fpqv`jZ6V1L3UR#h z?(COmiK}XDGLjF`g;!ukWn^G>wTY+bV?|pKJ~v`YvKqMmN$sBg-pz9XlAC=TBF4Ix zXIm#H;fIx2ubdcMrLUA#rny_w+c!!DVb3sH?~XtyNY=I@Y(>ckqb+!UAO9;vV~`>K z!EFx)aZohg&FliVdKyL6`HYQ=-Y`}*Gc5a0{fP(pG2RGLG20W0$Y>3Gs+JeRHCEk> zfNVh_lR`C)Oi{i)fbAg2?VtzHj|fRP=ZXex8m4UNyt6Y4ZZ12oo#mmU2M+=Nk!w!u zlQH-od(sP24UdDy3@%huA#@WF8`|jm32T!B#!6K>io{Xa@bw>rM6supR%L7J8dTKL zySMI8P@eeGC7`oiSkZY1a+7^hCr!Cmv^r(%!2wC6)r*xCKPM3$Fi}y@P7OEde=6cJ zd#aiP;>C~84bjoi;{TEP@ypTDJ}5jZq^EOAo0cXe?X%QMXlkDR0o%$ao*y`x2unki zE}geEIVk9bVw8~3l=px7{h`WVSy^j$pK)4K#4@a3Rr8z3-lbme<*vUfiyM^MyGlAT zv2eqXVLe_T@h4>IFxxK{R#q15K73OfX=!bI`IG%}n-78k{A732ia+OxX)2adj zK9=Q`<-$RsE1=;~#T+`egTjNfDJ5WM7WgY9sVF~RR}J%QMvqdswHWH@gD*TXG4w## z+O@SXa8lhTyQ>QvO32bQESDoasmTI5@*!XZ_#%5JFCTYydCA7gsNG>qM-W>oPiAR( znx38Q+oQy~paSduK3T;L5)wNCpT0{;A*!sPkbp!f#f*iznO$8yVQGbngOjO6K0P5S_Wgk~NFgp+j9=)1R17+EllwEe1Syl#Yb(3+DP9gBopIbiZgFv&d^VNS zNwUV@%;h?|KxOOAM;JNO0R zJhS|Qj1?m}icG2MxZPe}r$!)Lu{E*alJCtoxO2MNaB^~q0B$TOtoP{0H#&Jwt3VdRa>bR#)2y5G$Au>(jmi^MXZaykDE3K2XpWC>P3s zUhwd`+sEBbPoER3cdvVMBe9nyia)p8-(Z=yfNwr6Tx_1|vQ74%PoKUyAf5~kMvnyZ z{d?pSzIe~po2$e|$sjALHogM~UgX2xRa8|ufo-jBJ;)r<(UZeK&sthq+G-#^Z~WQc zfUAK4QzRI7g4n0!c%?=m2%KE@(ecrU0_SpeCU!DgvwGb;p}_xyaxj2zE$A;TEzM3G zcq|YOA|OOhP1R7UEM5tU%gDSOjH`jThmRbhA6jBUL8%UR^hj((MyobjX+Q8r0v8Cf z?$afALfeU4(;fqhXA@7hsE_)MIZ=}DZy#3H1F54J8g;z+t5^3t48B=`K&XpA8SN|@ zQ8JLgUJZt}D?fi!SUro-zTG+y539Dh00}c6(j6U>WG*7hRb8%I-Q>WtyCz;o(`Aug>A&@7;N}ZcvYw-ZNHKhfa@vT3DC{l!TDk$UFq|3o{gvfdQBy-lgH-0f0v~)p;I@0u|Ako)iZ`c)IT*hD}{~ z8K=orQ7qAt0!mk@d*;D)I{=*I2-AC~kgwY8iI$W@GDb!of-8Ni=)-8D2OaxYR#=A{ ze~X-mLUfizWuH=63{=tra-_ecaDR0ZHVa!zyS93gthrK-vJCW^Y!&CVwF+aKD59f9Bt6&pezk?tgjbf zhgIu#xOXh0u`Kq!ca^ATWxuUH@;NdwnOllG);F>)EQ=_SKEV-=aqxF!U5rrX@{JtbJ-9Tr zoNq*$`mw5Q_V3MkAx3cEO^r5Us?+Nl)?qd6<1YNXA6Tybw@Pd}Ecy+c&q7CARCVfw zdO1v3FfO(=zlRPXl-ft#<6imu+0YLsqe7xyi&jU+3+pOzLqm2a#~+bWW>C*eMPz5V zxmTRtO*K7WfSujLQ++FPiBeY9)+{c+^1QNd7tr<1)Tyc}%jf)#a1sC{R>~yV!XdjY zI#DvH7mqV5t9Wt4y%aIZT**;tcYoKrGxirh=_ImU3qT(YMV!@fJ?l?1}lJdpo z>Rs>fQ%=Kt0|)qLL^LduvE$Q5r!2LsdpyzWNTI_&5X!W3tgLEj{ror1TT{{F&e~j6 zfMSDn+88kcyn%c#+i`A{(gmj&wYpO))*SNO7X2C3ZYM*M{Qe3qoL3O*v|I)*8-f z?aFz<+%0LTA_$*Eluo^7_P7@MTENnho>+~)kMfBG$D_4Zq>)Xh&pMyLBy=io&Dv7u9J(%CY!-*pl|cNpTm15S7a1+{*>2%TM@EJh0%3h)OTQuG zc8i@aDfNz5@KCc0JP*N_=LUMX|ScwyJ#KYG81 z2^WB#iWB8U6N~-@`enQYW<^O`dYT?2{_?_=;+I1N_*W)&=PskMW%}^)D(T9$T+z`( z1*T&%t`GO03rJ|#Zuua(sf}^pv>v9Y!mFSw1g$z}}HLf=#<2&HDWP+`Mp|vd&9qF5^i%fN8p^tf9 z?sXawG$+fv@n%hhZwNxE+HC_9 zlqXmEYP$|iN@ips(0yMwHHpk;bVJ-lCAn#$iVlN%W@LVG^mDVsns#!)^x4VdeIZKg z*0CY7fMnk!v=#i#@8oNR6Sa<_ra3k@=$iyM$rwrJIT2CV`A>DUqKG!FhhNp2t+p+# z7xU|0>su|`-D~Sst+mbL51Lxl)tb$!BGp8yXmKi!GAX|WVYCF*NyySCo}?+51;rJW z&zI+(zW8EgO{XTZnD2Uy+*-icLTt*ESK@)CJR91nw7S9<^JAWC%C|PU?)-qAC z>nR-q<%+ta9r^My|P%$CImg-R%Aq+YVzAnQz|W^`igsSB#zcK*Xw2^ z&5$PQOpi8ZS=T#EN*dnBj(YnZE&ZE`OSm1|2q+kW{Q(jtCdV(=oPmPFGd{I+c)Lgw zlfL?+vxRbKx;G_z{jXh2I7}vgDi-i#J|o$QbU<>Py3x^=i*u#-`95a$r74H&q1epT zy`$6QU~9h>24iq?vul@;bjtdl6ro^2Sc37{jtmz|x7%*9b? z3{g;3i8L(2wHVB#y@M#sN1SW9%0h~o`}p*_Qn8}K6EO{UEdvFKbxN! zW&sp_dQmdl?Yllo$>Q7F#VWVYPc;%oLDv>GW}hzlA~RpNQ#ir0p8At?o6K@63l&|J zK&0CnGOmEno-GJRkH6B}N=J0h?w)W62#f4&(LN56W@=BLU%o2Znl@d)}-MV^tdNQys`?LN=Cdp^N_(Ypl$pScMyu2RJ5O|(Cpw+ZCjT6698MT3JiWn0`I zF1iI3a1%$pKMsz7M?=Q%-a1E$rg{LuRPMT6DkIk$$c65-p;%5BIrwKyRNR_p&r%<-|+1}np6a;SeI%V%V2WN}K zcUrN!gak4WPTY9%FLX{8$)Mt<&>U4ihE{ZrAE`7USdPj$lC2E6D1+>YI&=~ zM(LhX_~G0kA#8>?;($ph2B&o9Lq+27cD#pbMnYz7GcTogyJXz(`R7l|BLYEaA-13E z@Pegh^>fl_Vs%wXT(|eDA_WD-6aqrS*48F>i(+BkDfX1C=Ox%{v-9)Q)My0j3iEjx-&GgV58 zvDuTV1?TE2ZDp0}&tx|_tdb?Ro1Gmb!7{O>NF+<-h_F7VW=)DSa_Z=gkl~fGu(Ytc zQ4EY0wk6@Hv<5M4!TE;NF=H|xWI^Mz)i`F{o4JIDu_DM=@202fxrmB_gxmTB20Gc8 zIRfm>HsX3Q`~`YaawZlE>#n6mFI8Dx0c~gFyj(jK9UahbO-~A$ZT>JBX+WlBmmbAg z@&hudvSPY45sHgc(LTGB$4yTgZWjX-lcW++^tSKlu-%Kw7f&|=_EwHz zoCw(MORn0bP6nM87H)qPx70=fIYJDqTOMziu-06@N&EcxUb4RWIbBK5j1^VU(eW5V z=eUtJ%3{EjE_oUNLrlJiY!=&HDS-| zc?u+`$C!Zy6Ar6*tO7k`-YsP5SD-u#hb zW(SUsl_P^*v9g2-(K2Fyr0-0-zjI+Eeo)kc0IDBW1&bCM%IQfukyef5!!=(=03 zhb&T;`GgIb!uyTyx8zHpu5Bx0m3T>K{w@d78V_U?T6Dxu33=7V?Dj6``2BsmHG7i%KF*Ew@S)O%3Vuj(f1Cb z&<(5S=kJ0+@{NZvzI?jIu`{c)e?|^&wSvAwB0th)+|UKh9M=*c3pT!gOiWOG7;TF+ zKfuF50XJK9NkgR3BOa&d_z6Kg?GLbxD)Zu?249`j>*Bt`461Ahuvz`1o*sZ2A8R{`j1 zIAVT?*dS!c*7epRYG8YKxu-Ft(+bAtr=sBEb9OvGQG&t;8pGXvdt`%dL7%aekxd`) z#Muh%yNH&Tn4aHPe&I+nwafdTO%Xcsn*feTeVpByIodAFw5* zQdbEwVS5j+**_)amog992fBmHL2{Ccf;K*Zn$^1T??0mpyqKt^r0fu%#?zN$vN%L) z{K%HIj`tI{Nz!0ij3R63{xED8U|510CSX#brJko*+ zJWH%w@_Ra4hRx9-puuj4&twdqRBMTk&Z zmBjAN1&0p@!Rp!y6Ni{I8hJRWDQjgmwn(gXdM&XtCr{5)Xe6|EE>CaAGQW!EaOM*R zA%6f5vpJkDU4;r;OSu`L)+tI5EQgk#$GXa{Ux!O#rsznb+qyM~$kY%Y9uSMj$U!+P zSylNF5l-Bsp{$M*UuW}sFv)?!W-`V8F*_p=7k2>YSlE9g-P&w{ffPpjlTITesqW*3 zA9T`WG+Zv*V#I!g_{P>61;rJ4uant};fLN0s?a3X;l93{Y;lr`YOPj#Ri&2T@Yf1? z{G)q&Cv8;b^73}?FO$*h0cnc6X*rwTxEu@q&CB@qS+bLG2$*V(oC#y5uyb08gz+oo z#RZU$cGC~Z-&_fakeiH#|IqbyJqo^;rVDNKTuq3nxnzHQ&*Z9Eob2CA9*wn?+LYH; z-Mu=?X5fEZIcc;=Wkvx43AEyGKR@a35gY?}t=|p@%hR`X?~%k6EHrKlg8h6wz19w> zmz1g#FlnpWH-E>7gmZI!`1tG@7TiWels8^!pjb?=My4te$h@C-cYhB~Fk&0!7=|m? zqf`5t494s;AQWI@Q$?tQC5Mk4Ki!W~z%hNb=K5I*S4ovpsh9#%f&%P=cx|fg#6Rzo zbbL!z-~DH*U`58wsgg#m+sIWqI`X}}V4d|jI=%YVMwztQ5Bq=e7sf@xK;1LbBXlx) zO)Mtr>*J@=avx6?1*5wsc>QJ^waR8EC{W-KG=rv%$elK=2Yo?oz5-6W*-Gei@&pet z#g7@kA^Or@9^WrGlbo2MF*-}ha3ZZ|NM%dBjV`Tux{RSvBytj^`hhqg?Y_}?H@+9|qr(N(@dO!Z>7arZM1KC?1(&^{y_+wCCDB%D70MNR4H2N+p6#kF z;b8(IH^%1T&hF-sbe5yd9%;@2Dh>;)>znhGMaK86_11LY9U*D@qO zcjK!zy5jxtwAm zwwImB4r05Gx8Wv5gJ2NNiTNnAu}K}*9}67=)OZaD$W0M=7o|rSSXNRp3oFJe>#~IP zKsP$a8^{k=nbjbueaF*h^&!(n%Jhr`z4FsVkm~Xq16{uk;Immutl1Jri?{=tG}7)a z;Seg|q`{FXGcp=9s%AAz>eUmaWgam4tWj>n)F7qzLA;j; zp?q=w7y90`qlg&DdF$R5**)K0-L-3~)ZX%8Y&`WM^7poL+wf#kqWG|(0u5}Z5)uD} z(o2v+&zI@tZ3l6fno1@+I-l2x%GzvIQphm*xUOU5i#wm+Yd{4e}3 zINGRs{J{RP`@@qr_v`cXOaATN3KW!ut>kB9^RoBle~la;bCoQFy|M~U#UOC!tQ?=7 zJAal&%?7bKa|=~^SWvMP_--aklAbQZd~h8v)~GYSv*zR@J}CdPX7PdVMiUz9RObWFimSIU>|O}i?I20xQLG_8H_!CWL5!;AbPEW`cpbot~b{#f4rYWUU(8(tHtb!<8S8-uAy`&U@%tVcY_!Mc(cY zk%MNB;^YNBBy%3fd@j2D?_k_9U_Su9@_$M!n&cB@mEpC0JK7Yl&$6oyb6=VG8Soy&IKeNjxFU0fL3in-G z#vFePXfE4syxSrliFQq5ElDxaSi)eAR+5#>l)@AVdmJl1iJZ1yIO;mF$N-5sp*)0X zEqQKB#!ItlE2Z;O_i0O3n#ssw*tjS6ivNh`Xv1#0^6i!H>ds@zV+s-)4gm{~fkWT^ z?~Z>TSRe${|C~2?vJl+I&|Fl|$-QGS4GjxCJ=gZWV$?dLv1##rN&GF%0@?k4f9b%& z!k(O1bat$0O=M8f(uT8>Vw#;U(Vks*BbOj=dVnDO+zr5UegCa&oYv97wB_&Y(nKN) zjg5V}3s0yB93I8NJ_YqXcst^CxoYo6>%OPodGWMB?AKm$?QjnKCX+@n@wn*=t@s}{ zha^2ExYCVTHW9fT{VWCCh#=SK#q>uOBtx0qcI&KTfVF$ZEYGVOG>xx}wPV=2#+X~4 z*X^?B>wyN3)-Nxof`&R5#d6)5VXPR)nAGyl;kA0a+bpRp49*4bg@*fYf8X^*e9m56 zUM?*u>H4I8+955yZt)F|RATe;HL$k+P4?ZylotV(bMdxo(P}n&`)KUB%6X1fO)S39jLArW43n8Mj8^Y)5`NMH&Dm3@41(U@UZ z4-%0CeUj2BlbMlQtKF<1C%3*iDPgv@-|`p}6}7QLy4&6DQ&2#%O9@d>Py_4OK~uW6 zGNGWDmG)KiEV!Q>TCM?+on=r&NheE1l@A#ll$td6_;$g-&Q6R}w_HN@2>xF6iCwi=nR0e2YvaC@7MJGu z8X5^hY+*5K*R>>*%O@kP+?1t?jpf{sR~IBmET;3!_olG5KWdqnw4a@|tfI2KXAu`4 zzZFueMomrK(&|P=QG$oaJ+99Xiid~9DHpWEuPfT3AtiD`CNk~OR1DTk`tR=mxE9-@l0(^vu zo?cDu3r_Cu56<@b!`z89_7NV&69G`IS9kX0rA{WYpke~b?X6?XIN#(reMGO9T|$Dl z`L(VNes$1bQpZ|IF+wE5vmbTaNpTs2f@c$&;J=)X>r7g!aN&GCTgtLK_&*t^WZ+;w z;I2#7R%gsrMyXDeN-c9Z@j-J+5;Eg8<>f%fb_chF93HCSP6+U5aSO`|KEExByjr4P zzbfFOt9$SG!q~3`b#*Vr!)jw{ma?C>v3#Oj2&mQCIZ1+gHhcPp*O=H_i5O4*gmjG6 z%k#qxh?6A*^aqi*{8+Jme86>ETj#!J2@}NNb{&*cb)9IxOQoi^;&XCQKdpOqfdCH{ z%VzO2ka3p&!% z6$BL}_2`Yt2S_NzwEl-B&Joha4=x`$@tmkOmdz>)?=-uxWfT?DIOnew?;i#PD3Js~ zQ~Xw{+?AEorMEt%fBKrnD%MWsU9jK|rBMUprHs_pYAUJhoM8xSbJj|j> zGjV?Dj~`Nz5#tPSk=?GUVrJiSP7qn?h>3gpoR$N(nUMs&y1JE<&|$wt`C+_zeoQ%P z9<(_$wAzWBN@qG!y>jIMKrG<142-6%*#B=`w^z?Qmj$1M< zIr$%?jH+_i4^eF;rO2KfwrEumipXqUw^h){qbAHDJ}lbXUV!l`sjouCqZER)gU{WI>Yt{_HU5ou;TPwIi?b@mw}G)=rwzjC7ph zVw3F{sb4>7G@9%$;~)eT6f_JBPQa;uY?(9#wIwByB@PWUcbDBzDJ^hwcYeDUfw|ax z+Utv1T5|0>7-}?=0io|JfgB4&oUZx5=?Be#R%g+gPBzuI7&Bl6U?3wS2gy4*Nf{~q z5G>2juP-aBYH1-LzGt8vA6&@;EncfHf9W5pw57%eX<>Orp7ZfTgJ=5(W16%#DkD~x z4NCdfndxruFB)mX2HmV-Tg`;ZXPu7Ml5TvgQYE@kV-$N=a+e0<4h zskpdjsNupGk-@F`5|X#~mpK%^9*@gaWekx+1ZDA`@O12Zq53N5#R-a<78Z~p2B`bP z@ZS3eK@g`WCpx<=vs+Wc6AR|6b8`5ptFMF{V+W3)&`M!dksZkqfb^s=l~^iQITD*V zH28@l}|4~l1?c=7C2*473`ob>VYYhqO@ zfV^E(iB(e4oCm-^(V$~((z$Z_6q;^ha{&oCbZIO54cuVI^63DJT~$=ZMN#8LDJbql zS|~`~!XmgK0o*qWQ)I|wnE8HjFppRj~ zxx_$7h&24``jOIf7(1P(wyLsFq%#Ht($~QJvoCY%T z;;#RM7WEGxd^lfV^1p{5^cs(uVV&gix@lZkX~0vF^L zJGoez2?;1;iD;ySzTf%r%L}To(6LQfxA%_g2}AIZQn+X^FeqRTQ-XtnY_}tXeT05D zm6c5luKf0@Fy;G7hf6(J2uB@(hRPj`4dg2V{3Rs#3(`lAZyzXBzS4I{S%9wCidQvm z)X?Q&T06U3Qu0=o?re>lYkrQz*Y9BxGcGg9V4>1l;!goU~4` z@Y;^HK9o_70$=V-gL6CV53QX+>aUFC4aqM##8AWZvY;vldXws^=tLT<#9W*i8QNl? zrR-RM7***H%-X5?_rb*>T~JmSSf~m|9rims{cG9?*{TLTSWDUo6#FQo-^OB%Xc(KU zFKIDI?xc(yVq#``zMP=G(&_6mk-WD1esysghS~QJ;qTIv#5nXob z`si3py)J{6sHrn%x0k(Wkgtrmt3wF^-#$LNkIja<#?gT*b~-1x8a#-&eTjihnAWG$ zPYRHi7U_MQm_fgZfQoKMjjNyDZMU~TN?@SuK~>8ow4H7j8^(;|gO)wPJFjzQc1Y3u^8<$Ukj&j4 z9>H5)2(=ID^+V$j19e?p{hNG$K+XJt@e3=5!0tyY=`98#;xYqYQ52q;0I+JhL6^?05UB*bkz6+i{Tp`Xxvb z4=Vk?4r!e^xgOZtLo-{hB_kVLwMNL^`ZyxYiyKO#N!d|lwDZZoTnHl!fC!Wo6?xJ- zL4`>R3KCYs^qJ|V1_jOnq(57mf$aB@zjvzby&f17`BRrqi{D~$2SDU~ci}CmqOPv4 zpg$<(sJgoPLMZpoGP2)!$@f7UKlhSJBUF4ZDA1oz0#w_$M@4o4-A20Rw^tMbHCf|-F(Bh1Mg$x#@>eL?qq;78aOpj=Y4OjCJ0f)uTcyRz^@5_ z1oYDTuXA;v?Hh-306cLGuu6Wiw^SFNRrAAw-I#(EbI}xkhvbfe{Bh>L?S^j;TB4?{ z1R>$juyYWZ=Z2a&U~zUl1}Y+3KmdnN%~K97R?gQCt=HexnYntSGe-gyBK_GC`1UM@ zFwKwhfAtoFFDBqCx0?$Kw4K9mqC>k)(kR>^!2jAiI2iF=pTIrf%{he^R-r zq;6f!)WXr(Gd(@s&(pKrXCqXVWspAOe+B>mNOH20UjTql-v9szT)0o*BNDE&qX2;9 zs+^?QSMRLzB{n1gD;%J|q#PKo(HHiKnh`bZu%0MQr#iQ5N&Vf_a2 zUoZb7^k4|-T<_Jxrj&(32#hs6l+8Ehx-M-NNk@yMRd`abEP(kzi2w!XkwzAQpFlNE z5U?+>-LA!7Vk zf;|3*vUndVD-ecKce2*)^Vpk1@H4(l&}l12vBeYTaqpt6E63j zaBDwwo%`85P8k!k`E?s+Fu_eU=(Rd9(K7!|Y!0^seA5^>bZzErb@%d6QBhg2C;sA9 zl43J)uztw-?H~1cU%>x1=lp~3;qC)p55J zdk(xp2t=>f_TSxuwrNP31^~!^cr5Ayi{IZ~9{Pp8cofJdS3cjyUj1D+=~foGwUlk! z*Sq!@{w@J~Liul3mF`n|$mGv;M;AvX=F_fWDs{mn-UOQan^J}xkc_b`q|D(0Q0erU zSDHy`;5T`MD7uf_l>~8AXpZv-XY+x1C{=hdQI$gKoeTju+5PO4j1mLvMO<}=WBme( z2GruRuJW#OKJYPv>R${KvJw>G*gVn+yMjjm-(=_JH_#id%AHgKwt7N-N8KUL%d77E*vg6VE~d)nM=!? zOGF!#T%~r{?X$9pwP=wnPRB7SF|<8r-H+mZ^%Og+cRVVIGW){`rDGEC(%@#8jc$L+ z2|pvKm0k9EJ-{mNG;!%Wig>h2Oki*B$iJ*a1`J=^gEyyFrBuIXE%Vp_#)p4^b1Z_O zs&S1udo@{fs`eLGc(Qx1`}kfN>wj65^DWf*4$%Ns_2JSsA5~jtB>@#KxbccprL}?v z*0~QpKasNt&k&Dqj`zWmLDs@r!~A26;Exej^hym&O_cTKqw9aw4?&LxH^Mpe$@Qll z8o3$S(p7ZTbJa;cW7KFNX&VabSuprT!-z-4z1uZKBbl!1#=`B-!A& zw5&8je~y!fsSUY3blwQbJ$HVk?20)H3zT?iquYQS$G`l! zka8z%9cciPNV&9e*Ap^Egmj%!z-xD-6vfwjBj-%3CN3^!VTYomw3NV+XED3B5CULq z0hb*;(e}=m)$SG>tT5XK6{9e#)(Lgt+J15*7#$bGBVu3T$H6ILZ}_VxijNUs>?2!D zV#v+I%PQMQh3d;;k-!;YY2EivQ?u>Udv6_nj?>Uqm2K>E?%aF`?3RK1R;~SKD@SA6pH@1-DyUX#hz<`Mj0HDogo@qfi+P-t_-AGh^rTDDiZ0G=|NC33+Q{TOt6@)dXu@om zRpC}Gc#42;zv8n~H($C^Q43c7%;X3t?Eekf>WwcRM~@oj91$|!fE*Fpq1}Xhf2FOa zO?F6_>&7$BG%v;~c1Ho!`I?(s7F{Z0)zEn1@>>(afPU!IF2H`qm>_;TrHz^U_D@?e zhr}jMt`acfv1*U66NFa*OQfEJd*+yAGjUqG>{r_L4C`C3T{VURQr|d211(+E!tluT z&wXM69uYMF3{`9UYa;?NA*h=M21ZUscVo741tHTjJD?}9 zH;6wV`TJSozFK=lzghD@5l(!90aS^(F7gq_mHr7#oH_P;J3dpuVL7~<(74p3_oPKn zL>F?51FO%MWAV9->$VdCaq#gi(4a8Z1otkGO9=g63o?iLxA%P0Nl|Z!Wc1pNAW$?A zlhvLyD1%YQ*_401flYQXNf$D$pV~C#$83moBMQH$e+*K8*HA zTVO(g4!aY#x>D!x=uRmJu&Mg!)jnb_nTyAMi)6eJUntL1(Q&< z4KOije*YeKyYMTBGPV%uHd}3-a(ez+BD~&J3obrD!t>}Z-In_F*5HJ|;K-;k-}1GC zTKrd&mAUtj-^Q8H<;6#%(cQbUscFHmtxIxy^jVL?cC*h0Fc1R9)I5;&B}prT&!esI}{7gU;la+^n`#Yw5_ z;wyKZgvrv|wk$dt`kozy>KE>Jlr%IvKKPYaMnuGLKEqk^q^R~A7miQQzvD#S3VhY4 zfPBnk2!hfT6+E~s&U)WL2V)BrOrF3!;!cpbPcFoKvPzz#$%8@q*8B{qoUaihuLM5Z}COQ$fSg zgalIs8Drw5DR=3j$omQ8QZjd?)LjWpA_-3k`@0;4xu>i1$7pTueN~A~M@?_t#gr)N zjo9LI_zKa}sd3;tQ$`8brLWiMJxsGq)sQ(mR!vj68f9~4j<CMPE-EceSAVaSjz8(B z;V%4ja=flyWgRCx=2G~kJ|`UL?{0vz$8tX{P!mz~v7ZQlmqHdlp@RFd2PuQWAS*y8 z-v~Heow*132zFWxx|R}0hBgXrMO@HwCm{#PqVb|7(UTI1vykP70O09*SJ1f&K7F$4 z_d5c;(QpU|G2D{`pf>J$D28 zFE>n=;? z)OGt22_~UfzA6&Zt+EesN@^-qqFvXt{^_~-?4RsZW?%FOc0VBh@|;-dfKP8| z9BoV=i_s*Ek(eH`@H=W5#s zC#9*?qe`c7ajySA$BMzW$&rfTC zkAqqN79J_;^7NEC{%b}CEkvN!;?mM=_6{6w?6=V=IBnJ|_q|65L>RXRL)md7n;`%1 zo1G*L4x?fQ2H9=D!^!%4ICanF4++4-0{|QP*-wocFfhK3HO$Jfo+rwEBBXWg=?#9z z*c1}olT{nDbus_|7S=GAU5bXr($}w=_1cVTYOfY!O{M!m9 zj}{J^;u*RaNbZ|Q#~lNt0O z05Y*TC3CuS_CsZh%Lq6D<`L{77n_lz`xfSKFZT}M;emIzFaT}s$#g*-1VCPOwTXiT zx7D<}yU5Oo@tKQtYIXI}_cwu`$0rBJ000_Vd^$&TO!V_$Eh}#H_nynvXW74tEFxD% z&GS=JOFmgc7zk2GKX&b#;oaNO!x zn4N91EzXRMZ7C}|`SK7-hBzhgeHTt2*AkqT zP!KdKcF-?KK_MfFo9-3=EZq<)F64Pm!^gM!?}|r?8qT>9WTfLGd(i0DAQ9p8lk5?h zl|GX^JUn=P6^HiW6GZ0mI6c_xY=J`{ThOKC!eXdwx32yr&;SiO&M)_pA}`kk%la_3 zHa@vFt|%u*Mt=%V9G94yiiLx-UKe=CX$Fa$8GH#*nzxI2+m;bTY`os;F#cj&bg8Z+}Ea7C>(&XAz>^+RRfTnV9UR zVAFR%8`u5zy8QH`G5@gi)EW{%Ywd$a4gpX#FtD?)nlWc@*JmbIB}Qb+@%u z<>$i#RJB(6YO#F`&!WzMrlt-WvzEA7rcI}_`9FQn;FKF28e*lOprN9g8ZcGX)eQ>@ z+Aw#hj$Z*Ft>JJ|Nrjrp0N1*Yf6Q?8t~M&oo~ymQmu1PSp^05h>3Q8CL}q25+aKwq zrB6$ejL+eZQc_Vt!xY->7A#FqgR-;iownM(IevfkA3#ok<*JgDl_+7zSX?AW3;XhAI}cAbttlh~DsI%y(NPQ}Y?4>Fj!q*b^(5dG%+Br_*trv|_*$bA z=13U&*r+X85bd4Y)ZBc3x!N&n0nrg~ewfOl7u_|Bga{3Q5{A?3@gMuG8xr(Pp7D^~ zeuhqSP+25FBYGWQVf3IPs*I$;roLI1KaKEm!_2J6Y^ewLSHGK>DITOWF zS8rWcw+t6iTG{ch+)f;WhetEgnU>+*^~>Psil`9}!@38GEj&vFV1&8=R)*R*ef zm4r=w7!=f@q1zXaS&VunnVIQCyq4|lnZ(5cxbGTPyCJdNUu~|ItIoS3Ki>drH&8j39!5%c08VXv+PeIg>F4^~=1 zI=Z`&sdW*@&2Nt36vn)thjb#?ILB8HKy zPPA&({%o#ycW;9Jd8wCoH$|gJqNSn1MWdXv-EIc*Ah{xGb;KnIh{u>)5K93>DM@mO zA|xLj14)!(y1RbH0B_A%HLdF%JM73=9sM0RTLXTPBUG*4(`A&ZQX@ z>=~aZ6Dl$*-2wv4WUVnj&N^oQTE7dJ^(){2MD_jI)1#p{+}icupV2?5ShC{kGp8zB z-QM29^`QW)?ax{I;=Jwc?Jre4N#$%2s)5T0QCR5c{N5);p~+Ff3lEnHD_0wb@u^xr zh<6B(wl7DJDnmj;KiW;H&>9EDLRZarL~>i<<^@MCl~oPiFKhXIa-#i`PV9A zDqj9>b@@{Q508V+u=D^UjG! zq@|_R?e;utt~`#3xqB+>aesQ=^y`1#eyE{T!Svc=b;TBF&h?!%;3{_JK0Ev|R7z4ZmT1%OY^D>;o&W%$ z@BttM(l!K1}L2>uT#RO8-0MA?@1-(d0) zzYsh8HMscgV?7W8PZLWb$`Mw%n;nI{13bJ^=@Ao)k(2@6e@43a;Eww!p8*GtvzWiz zCkhkiJT6Xs`puqMdsyn`_|=?clWMoSQ?N5CD%ev8snFpwxoeKL9RPsRZf0m`8TNEV z^7y}l9avV=hABT$X~t3Q?HS)7KRta|PJxNzd-%J;$Nf61Cv zZ7v*$bagRcw*^aX^qIYO_qeQP2=_-t;_AXwyyo)qMyRQymWEHrQH$oHQC{A0vwnO` zvBiy2B-)u+(6d6k5>xYD~4ipP!7hbSzjQJ3q_l5}RR)uUNVK3!-3<*3yvT26tWB)Skc+ z%A(R-zpIxU)9FJbi|_^x?_US?vF-NETo)G?gVnS}2Lpi!@wx=?&PuDONN8&MD!ylg zeKgi+sdRREIW{?Y2SUlRwEz45A@%gy5xC!y`w@VFF*rU>58P(3=ElUtT>Pln!Mxqh z4k8w*sHnI`@K#k-U0hycre-cFqqTD2T3KCve>=XNsXagM;;>=?d3Oc8v~)Kraze5G zd;7bBWDNEx+Ok?%ZSQhv-*VD#WdDhq2+TJhLE`X1G4&5;4Gm3;o?nvcPIMGPg%u5- zm11N$>6y6cQ-;kU0P{J;OG}FofN_Nhw?@}F@_j9%2^VpsTCum(!CmKeea<@*k0vil z8cLAgjjGTqu$p6KWf|lx2mox?j%GsfWQoNL?wa@fGH1ngsCH=AX)ioQMD5GP>VvO` zF9q^#K45%JtmK&Im}UA9#p-2NmX{R=3qmJcUQ`AJ7Q}+e0$v53b_x?9`nvxZdGi?{ z+Fu!DH8wN*?~;W4hKds+PCiVwhB3wIVjhwl$t&+qzGIKl7lR2X_);D>K;q%$RY(B) zXV+*PhWJ?Z`6Ro&sf=?+6Hu6lhJ}wsLJ(&OM31?sVQAY$wDsWfK)Do@^-oBC^!%-4CZp%-moOF=7ANHAQ-mL*`_Nm+=J%{~(P(tn za;9R25E=NrLjIJaPjkr$NqY@L(BXp?MOOa3&wiXQmF;I0<&{dgTton4M+asG8U*i; ztj^09>ge~!4y=1tMjDRrF>_y{2lhtROf%u|!CmmAFtNZ6On5=JhKxYu%&V^>r}OvC z*iP@P)J3JUvvZ1Zs)@!f94bszuS|Yi{*qx6o*fDx>TBz3>uT$#*O}F|5fqBR$;mbA ziP{->*b$jA?qB*8RPx9DdEA46k5JiN(p^qXPQ@!OEF~;EI2%zdY;!^wc>20m97Us) z0|n+=>)X!DR+}?wn;=eI64NQAsa>(%JCD19f&%ptWf%PeT1rYNfUJ_-lBj~OmKacRfJ`)+86&XIyS4%A9``TV`qDHd3DX1%i|2cz(jww zu;qzxPDx2cyb)LzaOK%WOT1|#YtcO^uPp26;6Q~QfxWGRi%S5`L`hJj3xR|DF&rC~ zzusLnJ(u9=fTJW}JP{7xh~$X-yg)Ox&8omEhDF5dSn`eZAb{#aXDTjc!bPw~d=3+6{z>8}z2r4?C|S+|R~ zMo)CD&e*RQ_uk?q9 zkD!`JSzKPE9;R_=*B1&9!qLJ(gc&rgFBmM0GQ?p^SG2%799F==Fo(M$q)|(ewJ8{q z9@R|Iij0grJw03F`)yMH+k_vK*PS$M8VVblikbY^TM&r}349$e+ua(Y6>_Q-P!w!x zbv)eO4hh9JdNsiU7QZfmzp&6qtUSa#n5>>82^G<8^&$E$ihFu_`;Iq;YVla(VB!#; zl~$EkL`p@)b<nNx5AG#du>j}5I-+AD)F@lXZ`g7DLz)yx>WZ%g;o;wt@n6NN#KzG*{7Iy^~ zq$ToSru^f_fWrg3&J7$5a;LK386(Q6DDh-jT07Vo80mc+gLB@B)N!MQYBoVQYUhUB zG4g)L-8gZhpzfmyV^%_a!f3_ldG!T#baep0r`-qa95<0Su?R#0c-enu=I4a^2K`Xn z8eA>Yr^Guv#9bMxu{P&fps7L|_SoOM^ykjV@sl-m^*;m3YAZ`Q)sns@`KEVs(mPOI zY1!J@LOQ`#l$EzJy2MkPYa2V-r(;y%qBX^L^{zC3W`vkDtIc_0Yl69UQCq`seQB zJPTg+t5(m))iRSpaN8`ytf~~Vdvnz7%feOO zWzG(-Qh&OwUf1@#o=%o?=#i1JW}BX?w4G@7(5D|77{No!XrhniZy+Gl@+}D|Hv5uXtL+2g&NC9qpe{ zBu?MYfB-P1{g(mZ~k)m*f|r%sYHJqu;gw;#Nr`_b)0r= zV71fzp|c*cRDY*_wk-Ud8j1lmw>)1G`PBe?J#@GnU3t`-kSnmgsZ3hQODIs0L!Ij>oK;J(1MQlF5XT}BZnaQ!NTz-;4 zR=GNJP-&)KhF(x{e^uz-;o)#b0OFu`VApoGY%Hb zQ)Rxr^L;791gRgBYYHvn6mQQQ z%}7tj4uCCZ_Od!(uWF&jE#W8+xv90)>pI62s&N7-RZF-R9nZXtQSc+!pZ{5C@98?{ z<6{N`YS%g**dB24-28**uK6yTM_?a)AN`1$l8WXU+8=R{Hj-b}z0b71tq3H37pf=G zy7j!EXPw4mEG=5vvJlLcE9{c7B;QP=EB6yBMm#huJl27&h)LeIy14 zKD*fw;%y)+q8ZUTB;W%d;+*_Kse03KrHsou02~YruvUSN%G#rb$Yqd}Q4O~YWBFj# zMyoVsSd{X=fVVllJr65oX=Ojke*8+4#R0%ce#)2CHqv83N?fiy8#FgrfGpwJwr*L! z_?&Fo%6D++v}U^2Z2t| zeMw3W+X;>;*fjQ&NA`q<35-@{Nd}vUbbG$d;HHTe^ZFiGduj397~!y)QHqg?fo(;s zzYr}*BIv^NWp);|0Wai>`Q-GYSBfg7q}i~raI6jK;Y8RV^BRlH*O*i$fB7_fqv`1ihZkY@|MZcyuD?VE+*GHd|3&NgF0Inaj@8jcV zf_pRpGN?2E&N738)IwU+uAWEwcM1q>Jk{6OKOCuW(;$yHS>iD~bZwu$o|Uzkz9Ed! z1w-pF>)7fcZKSEF#ppRR!L(TI3h;gI7&}U;{0qz^oM<;sIEr31rbp{HRHs?lx!+cE znO;;{W3@bnxm$H$8r9$tQeKd7!!_j zA(aWc%7GKyno&yz`E`~gZ-Pll9BJ^b?$j3M<{=Y@&o|PgLs^;llhx;*FF!1X)<-iV zxUa^1syz5ZfVw-b?UgGv?|UGY=`4N;l0imngyHtlNZkDgV-!lUj+{;q1>O9xZdVs! za`38P$NPk1E5|x>e=t#j5g7H?6q>;f#BwmxFlB3JW2Vg3Z`=HZ^3ZoNhRv^TzA4m( zyuR$nRLMi*4vfB09M~dvx9Yb`=MB2miuVTo3kDYlWHOgqBT%-RqGEZJvR{m}oa(is zr3*nnN6g5_7sh0mSluegBMOCMB0bzq=5Vk6UYO*NIMo6F<{p762Q6+9mb#@Js{?16}27{k%2n2<4D5E_KQeqNp3abyG+}$Q+pN{N7q4LP~17 z1kxW{mxhxrxMoUyU{a6>mT-Fe!?bw4Io|=T)2>Qs@8nQwW)h78H!R*nkh#}0nf}B?y~E3l9%VV16`zV{_idHgg2%t46k#^`cC-mW7o#-&86;M=a2BKz#q%~TUs=6+5Qi`Tipfi1q90; z9(*u<>1b-yP?K}bm~$Svt^hwaWv|`kV$y`HQbuJo4cK5@>}Ct_33Eff>?Hp zDmvURPMepHG?%GftjXjIl)xoE+t*id9Jx{>)I-Y}E7`(<9U#l&_}Vzu+?p4a2NZZD zvC2HXOg#iI%!U@`VDTW@1Y1=eS_-0SSc{N`Bhwg4*&uYmz^A8|yN3rJ1E=||#mn_> zlxks#errzb3&vCHtFp=(fxugDMSaA?1PNH=`~$2D`Ww(gVwl_}R%GY7iYOR&xHGG* zt>&igGnG~{KMT|UZnYu_xT)DY9y021F5feka`L)*YCPV4xq6tD|5=$)nd|>|jOFF< zWWQ?ie6p`kbVNl%jh=Ay;c{(#Zfh>jkyhv{J|0HIUqJz9Zdclp`&`i-<^7|BqpWJ) zm(}pxfa_J9;&A!&%OgnW$bzn}?u;5P4=)d+IeotS%}o`j>;*hDEU_=zvnlXggALQIe9U0ab=BmH7jV7ryR}nlgmRlmXwKIIsY^} z`kVR#jetu}6(L1X&$v+~6;8_8VL)@mB7M4Tqc$KoPK_?c^C195dSYL^jw(kDgBdm2 zqgU^^?8K!tl|$YrX=`DrasNudo;$O)mPHq+lG{}o(hd*a$iur`;VW&0brl#$#bWhp zR%(+Qe(d>*07Vc7a}3_jYaBXT9Jj^~U5|zMoT`w(q)%N+Nx~rDdHZYb=j=}~;VwEU z=%sQ07SVn;c#3z5g$jqFp`u~S-swW}30+5M1-5TGww5x>a^Xjt;VGhqD3aOr%tc#9 zB%#S?PI-EL#rAq$x&Am={{6zJ-H=yZ?4Zz(9Yi{hQ`*Yi%pQLz&!@ZtO@gJ0S*%J2 zmWMF_Ev1Fk;h|-df`S6PP2U{x`0)%5&-Tv-GXjq2s`{z2t-Y4db1=IwvK;ejp%PDluOX>_Vnl< zg^nfqn$hc)bW{?@1Goso5F9c7!6;?h;L7%g z0D>nFjzYYZ)EhwxXA$DM$}yquc+zz?Ew9yGSJ76-`|;*aI691eUC~^bhOikb8n^=v zrodYqhkhAoLqo%IgfHnXjLU0d4zYjbDm~I$PenFGz|sEl8a5GuQm*;j*E^+G&nqNf zKl)#mjk{h$ihMEoUo|9K3FkkQP{`ROh_hW=)+c-tIZuuYYiD<5wvV6H6RG|_>UqtoOg?Cy$IPZzir}u=-}caAQx9T_=ETycA%ClPi~<;Bh8Lu z;L3WtCIGyXp_FUkZiNYjDlhoD-~GPzZU0f*%~a`_H)bI?+1Hx}qb<2}ZA>Co&~NI| z&LBqD?Rn_Wd(V6G*~N2vy_i#^$P!h(`}794aoK7MThYVJfBb~x-3=zE&ve#0|1xb_5CM)8(0LPI7g5NFJD+w zEo|iDXFY5A5+MxZYaCCB#p-6ckwsImxA(`4bk_W{zQ-4REJ9CoB5c5G9iT?oC_TB8 zo>Ebn1fV48+1XwF#t+P{+xL2`Lmv~YK*a?SbMYIxnb;jYMwlynvf>VLH&Bo=@V5#;~xF+}fxpvdYUq`D3kN^kVo#UGZ}p&QAPVgn8v&;@I*rbv3QGr zA3wa#O?H8lw~lVo{VvntAz%@aaS2&@jh*{;zV$-{L&E&uIUtyX+}7BbID@m3kQ5t> zoUi&rVK73J^hazg9V6oa7T|AdNpf^0=-dQ5`S(}?Z7z|dHdukB)+IY^CPutyGa(|66dAc7tpSoZG zaCu4l2C4fpbQcnsKPWgj5VYJER#$yaREGr5ps|lywxKQ(aSz+toK|XFuF&}q+}7vk z*+WosXIj%+S-H3%x0xb?$xH+wA0(xvIZlo=Q#|v-KS2&e zc*Rsfet2)2%s~QTq6lY_8NV;^78T+5ga=wr^<>7aVy*` zK@UZPx5lO>uX&{e8R4zUZ$R&KuDB!mP6O3Taf$dZ!p+&u0kI=z5ma6(Ls z^b8ES!Uh;%HFxk&FIBEMZFcPMH?FR&-JGvpQPw0)9BOE2yo@!k}ph8!Zf*GjWJnR{b)xAkcx2|)e!`PFr+g^ASK zuI|^OF%1nOEFb@8_v*er2X=P$HUdh_&nwj+(u5x}v4ky+jWKW{8R;&ay%1vH!d~qw z9iwg3x4hrn1KZtlQ~mU3{N=DOd4pk3wTBM5C*X80=X29zr}IR(1e z;x!8cZxZPxUJX%!mOpoc2{TY!MbYX8A1*hIK6#zT#t6io&4Obs7DGjT)Q0e3SIk-% zh8J(A^@Z88+FAulbP}OS4mOLeDR3o}neY8(R&9@K`^V1iPz1)}BK0nE5h@%lbF5I{ z>xXQtSGGv*$wi}_KXhnlDDM0nnz)?YM_F}sr!$+Ol!c)95ApoE)za6u)}OMJ8%WRh z=U&o^BmEM7XyR_ix)~YTR^}V7&S|+>w`M!a9~zbVsN&Dh9is(i;Ouelt7}VGm~UWU zzrO&%1_U7bYYtATzpxt&^PPgPuceZb(q8dbDyj_YXFWYHvfYH3DgAJ0P_}l|;!-JT zNExQQ>g?9?a*JA_WaNY?AI#NesKC#G-Nlu~uKU|tRyK=_H1;Vb#pERGHzc^5n?ea> z7&~jl*If#(aG3v$K%Q%y#G)iS8c9vNW42x$vO_lhNxBmqMa&%}rfc zQ$xAfY`9@Y{%mLO!TK>a>Xr1BD!F|1J`0+{xgR@$HE4;ko#)bK8DWwEXyRaWJ)Wj| zz1NFr3$dKap?gLV4-J(%JyoYXjY4HNou{BERESjIYA)GzlypcMrE}V5CSsJO+*=s1 z0-qEjo?i~%Xvdd56+7ew=#vTRdOayQIx_&Isuu-0v zYm(VG>&S{rlI}mZn^U=SQF;5OQF# z{M4o#PfBVAf4hs0jxO`H9RIRhCRW6!qDEM%pa(7=i=m^tv*Q_4XH^Z3j6J;yTon2D z63^)$ERWOwh9=J6VN_%Avef^x?#B;_1bk+#rv1vIDoPfXIMjkU>$43_hB-+NI|^!{ z7su&?G26!8G^tX8pJNAIU9TG(GMz!6oPnFaRLdW!3L=eKo10DC7&m>b?Hm&0|2R^& z7h~}xRz+NUSDRsCTJOP%!ZGQb78P?SO2!w>tK8Hemf=HF@ z-@h@pknuQ#8~ml(F@%Nc{k&iD}$P`9NRpXA?R(UFF>;mSW0#38f?IvLfmNNS;~! zPr3)JCXNKW-rKEaAY9<(Jl(3RCZ{G9hpeignwy))$K?x#EOB$9`KpT~Ik+uRBP79E zxHd%(SD!htYrT5{nG(m*Ffc@+j!*b8G6>kt7ex#Y7lVt|yB#-V_g&k;IJKuy^$9(q ztbEl02oDvs>^>ENL1Vw&(`@IZBQ0H0SO`g$l=&jd-Uw#J+V?9iKiGAb{Si6ME*Dq; zYfw6$y1=f#DY*EtxmjbS7pQ=shZ1*pN$l8$l~Gfj9`9l|kusH#ehEgCc6~!TyY=QI zf~_qAp0+4m>MWHm-#h-ELMMI!0X;pv>@4hh?by3JBm^8rIpv-Pi%P3pNO4`;kxH!( zIfdT)^52g~hll%)TVi^8XKT#_VAKYCC7L+Or3fP(ok2@hXf5O*{PhE~_$!@Q@t45? zl;stkomv3h+1c6UYQWBM?iDsp>LnapLqn6Dy+4JnX2u;~vb-D)i%JAe3LYKZO0$(B z35O-(WmRTLiKWpt5%iNvU`HTmD1z6{uJVCqv&3>llDuDKgOTD*)7rWyw7A_oq6)!J zAd^As%ijJ>YI3qs&uuWZR1_gD;$Zf7KXi2FZra*k)6+Vw%aCLP^A^f&5wwa*F;D*AY2!YB z{&>6ciz3QyeYr}A&!?yTb$qbFz|1@~{+vD~9Gdx{pkveiy+=;+aV{fcg^H?JpZQ^7 zhWderlr~OX8gBEE4s2<|V`&S$@4h5nAY{uU>aX+`6WAZGqtNN;I+vG*?I9J*$l2BU*R^;FKK!M2of?vJdB{2rggxK002zX#$hUNkC~K1%etK2_kY^;0@W zGn%*}b?^)hE?d!=L3hwJD=At;6pp~l%T>X`-NPk9LXQ&)m>lX?)ijn^va>WFpP=z^ zPeQ}PccQ-NYw?5YB8G=^n$ugIKi(ybYKgz(G-{# z{-XIlU{ep0U-77@pbwXLK!Xbr>hJvgIp_D3*9O|(n88n-HTT`~bqpmowop)yhHcKP zX*SJ{)#1g-?UiRY?=VnA*?beJED^D>^(~%l0WYz|#X7m!DrtG+!f1CLB`L$M*Bf0L zGRIM1+7==){G9&~g9;Q!&9GH?DT8@uJ+Ffd>_=6NY;*y z5itT=^Yh~5@stR2y%KJ2QCV5`E4#-jDcC{=mgZm6z_hgiwY20i5=*2&-pyfic5 za&0KL8%!H4FP$3+RAqMNy^D-A^9{ty2SZYIbBXl9k^O z5Nrj(iqsFUwxYl;5ezC+xB%+utMCN$i?=mlSSUQUwp)`K7(@ZmKA-^vF(NX;Q7ia9 zl$tlQU*qF7hM?s1^lO@2|DZGQ&D-C|V4xoNF^$K*kA2TCVDC9jg@ynh{eT(zz5xaC zuRpdn00hkcK^yr5t}>(&$v{Fx&sUWt@2`K218EBvosK3|{H&8mt|RRW#xj<|uWsmq zO8o{wj`^8kA`;6+9qz4=GiHy4fE0xu{oJ~`l0QvAR=&_lbQ067Nt9y{*cV{YpBD|MzO z><)kho;2X@sz8$?K858$J-Sr$%Q`i_Xns5pzr3{23kB5pr!oRUZ|b5{+%Z6wIOq?+ zdMt3?Q~0C*TMrP#cXdVgKsm8d5@k*%*1H1Y4CxPyfTO$=C$fNk!-1lckNf)b9%;qV z-iIo(5{fumjL7rMy%dqOffjvJ&mea+pakY!R9IMuv@Je?*x+ox0+wUFKUV`58bI8D zken_+a~OE?=>oD1Y>@~IW&FYN6J`?y#6>GwDqw<0ed<{}5X6OzuWh47pQZ!3AkN(X zYoYHAe^YP2)NF>hrf}#tr=+Ad6|n+jkK|0o+!3;nupw%jL!XKUM!>U)JVdE95R#uM z{q*m)U)!PaVis!W!US@&kM9i6`x);I(sV!!)Y$jtrhMR#YA=6Q|u3j=y3yz%6_JeA|#HizO@Q9!d4QUb8lF zWYXSZ31s0(supo1MNJy`-=z0E06J)2P5XCmTGK-sZzc1OL0Fa$$uk#5Z<&=Lc^!Cxci6+6;o0pSDz;d3n8zA{psTF>8ueSUD61k(C55#Vm?*a4+3>~m z_(frw_1fv4sClnITth%X#h1naj&!psz4M^^eFK~x6q)QZM2qWn*=@Icu^sg>5?Lb< zhu?jnDI0vb!EVNI?jIzp*kn|vH&(>anJ-HH=l1Rcs-sNf95p1#k7_d7GOJrE*TZF^ zqjQGZ-44bYjF7izbK0_v2-le32a3GZm%lwkEycblUe7GMF16*i2(q`=A%8J)%(}Y` z?<49&f(yTBD-+rT2L^6m|I=Y=y3_pRb+>*EAXK0rr)+;*^@X{^nqP1?LSHWe=xiht z3e6%JPIY89o8I&qYjialAB5>C7ID~3D=3O^+X@MOEAecA%q39M5xiI4@^34qBvPWIMi!kKxp;I{C% zR~++5WVJrGQb^$!$$5m*VjXL=@jvP5Hx815o0|^8c5%M>b%{eg_jmSk?=}vQ=Hh{2 zkq^yiW;$=n|2(U8_bV_Kp20gTN8CHz8@JQ0;GUpRtVA8zC>eZpOeUA%${kE^BYnTK zA3|v%tD)3kN*h0f3yznEdLXGnx?{dO2u$AZZv~fVOMvLA6O>>48kSSzro``*=F1S4 zEw8okiWv5E;me%Gi@3XFG}`wv>qR=Pd(IC=0AAnz`IAL#ojo^nWvs=WRjQ{sYkTi) zhjw$%P#z4Hk!F*JAEWrYV=b^|MyjXE=QD!*{WE%aLK)jK_7lv6Zk3hG##XTNNhsyD z78+>B8k>wN5U#OBSy?|kVwVb<=5yO({X8Uh1RuTYw}pQgJgxSauI7~B`K9DOzPZ|XLyh- zWa&KBr~~Dn;n-1|IW{y1w84k4wE9|%9F7IcQ?u;Dn(Cz3{vIjF;(-LYpRIYGN_0-! z-cH^U(4tbc=Q>K{IQ(F#SCAX^{CBaUnry08^BLd&uGvVt(ZIdB#dRfQenVb3=1RyoIVM~mt|E1PjVl0d^ z2?+fyyH}J@uXu*K~{%Hn*-K2DxGcZlP7LS!VEJHB-rdU8e;fx1Y~=O>ytF3R#S z^{JV064`c7)VR8pgAN{=nv$7u+WSf`4uAUoC(K+{+G~TC4U<3Is=a7rcp;S?fvp#G zhA8N{FJaJK7EAEl*JwAdbE~eqJsZZKIDVYpdnI|ehgV{8E6;a#eLfR%8+;(t9VOX* z(|NltGf_}-o&-{+j)2L$OPqn*;`dLst{sEKw@$Ca1Oh{98FZG91PjJ-UI~!$@Rwe{ zeaqGh>E?{Fz7IUum}XOnU+>hhBRMX1&S#I2=HTr;iMND4bp{(Y1-x+v8_?OHKbm@y zL?lboLTWS78NbC26*$!wYfK4l+85^J;zN9cpZq=JAurMN>MjUz@vR!~MaI_MK(N;u zQ(KL{S5*%jJJjc3ufgx!;%xk}WQ-7W%|dU3JItnf*=bxu>-Oin&-oRfR*)Cy;fh6^U_)mfxIIKy3o`TC?EBWwrZeQe*gj`D$rMf>aPn~nHO|2eYH`0W z{GIy~nloojP08>zfSF&^3zm6}bekvwxo`Sglj@h136c$P;`#Y^dTgymEHT^`Hdfk= zu6xApwc|4BY9=)WBeNe80_ugM>Om?7JZc)EDW>$i2k5>gtO++^e=yHh`*}zAr4Nus zRP3H_M)L1ug!HxbZWA4eY*a6(^TEMqn0dGDPAfln7je3A7j#X;6mIG^fmCsS@HU@S9K)ZSWz(8bH+<9QOxJ_Ppdt+Gk4 z8-cyHBZqT|Ri!mR5 zso~z8n=W2j+1c9J`Lw@Ym!-+;HREy=$fXrOifqdOV!}ba=b12pV*jfBOheWB$6KMS zfe%V?d#TjR^YIcBdq1{D#Wwxf9;$uBpt0dzU&|E|O^vLOp*(r7Mj=b^V> z?QIk0?=CZac#JRCb@*9#I`s@-6?&r&NxvZJ+#cmL)j-XS=%iaWI1C<@h$U>DEq&vI0U#N=L0g3DOy2 zVHJ2dlvyy}_#VNXbLV_qYX8uN>lq0B`WGGlY1@JCwGe25;rH*g`1@BjF0{4cO=Zx} zQoNsM?GW~${gCCumWdlg5s2zwjZ;139zB%3;2%C2OJ{x$!^xDn+b6mTyz31*4$-OW zkfe>L2Z2{RP@;8)J-(-v+66N8HYkH*6!h(}w_LF*AWoCn)j(*+pzE{W{^`{oZ_wMT zW^R0ZPuiU7-Q7iY`jAg*mxJW2(F((YF)>4fU5SHP-sZxDBOoR}lqTE$V?y=Ud0kB` zTZVALG@l?vR?-!*IW{(egf-8O>TV=L%EGEEA*wDQfFWDTdD~3I{q`*)VWM?kyF%MM z@NNW`ECw}h;^ORT<5~JV1(%sVaTpvcs4Ogdq^`K=C!Ok}jEieR9CfMik{17Q*eCjT z?ERwvSto%%w6wes1+~ zE0>TG^tXoGmDIHGMt2OjCt^9Y1zr#j$x;X8e}{Md=8@hXrhBOBh0d$Rm~m5b(&%t5 z+nAO?5h2UrD~}OD$nl>!Giom}Q+#&|X`k`9X5nHPVlltQqny`N^9307bWHU&WS1f$ zFKwt(MijfvbMjoJgKr*_PtrZ4n{87xTw!WJhzR!_-jJ4xN1prSu{Mxa_D{F1L zUR9|gU{&fgbxUE5lLso1uDl!A@;2h(^%NHe$5j+gt$GVtC1`T|m>6?&Z4wnlocPxm z*O14)kuK=%7~J$|dlAhJrNMk8LmSVzE<`(}UIyvuNgg3db4?hu9!V!09J~ZWQhCo7 zY-GA=5{F-W*4_|G8Ae^+evEvAZ-Ph3^i`|sr_GCS%#TY9c-7+&r{yTHB0Q<0NN_hWD5eFCVtb_1&;N6E;9GX?> zrWI)NWX1JkoChWs$w}BR0O{vUj`3>ziPq*!RxD2%Q_|jk*U1qx=lGIUsXn<>lVf== zdcZpQRbNtfTd+T6WMk8?)64Bw0)IROT}CG+HV;X4gpF$!hJWyA2j4Swwij`v~ zPzkKU{P>EMlFcAs%bT_iw*O8-kbo-ojX%)j^&BrbU?^)^Vu||D*VhePYRKc%R8Z_D zN=FKAf zy)H&nW=+0^C&x^$5#XT}EI`gxS6*tZ>s-}cE}&7P@43P9CnjcQ<=q=*3M#5i?sUAl zShSXZck6j@r!q6;m~Ep7Bl z&j>MBAT1uRZhK1(k_5aSVD2cFk#&3{8wZo@IWLOLh=uNBn%R z#9l~75D9lxdK4lcKWI47ps>=_bG5|>h6XkIw)U@h4uq+tb438zV??ujxKMw(uFQ>F&;<~1|${(tey#Jt<9fUqo6|JUj(+c3MZ@y z$ET2Gqv^6ezAO|^l`B_#axWP`gW1Q$)To7qKlnbmY;;f81mC(k8xb_h7Q&{3W@GC+PoGJSu z7h>{8HLcCM#oxZP7#iQ)eK39AWawHb=Jr(^w_w7)$`%1skC$g7$HV%F0b(M48f8PS zXRy?lqEMK0YUY?i)2w^f8b(O!64w(uaDjKXET9OkGL>fq2UkSTcKMMKz`>(Vr~kvwM0WviSzNDDa0 zR+1zJq&!Ye7oS^mv{#`yK_==~=~t!Oj|)EriTQtgHOT;=Ud>csCh0b3Up}VmP}t_{ zEtqGwRMwz~-evtqabQ(Zc;WQxU9{R(A>r9vFStIP@GpF{(e6h09`3025KaaA%{vB&zXDJ_P z^w9o+&5vg?Z|~kDmLcaBN@vT5v!?r#>zDTJ6;??#en_!GM^$Q9~x zk$Z|C`CI`A2waFoc+Q4aCGBdS(DmiNrd~b1XfUj1S-v73?-z`tL9fyJ@0OJdh{|hG zP?UANkcghQj<&k>mkk$qwzhKNXCwrbz90C#%7moDKO-YN8~VNoA6SHY8Otzz@A~s* zJGNlKt1bAAwU$>?JZQV}f^sZ)CEZUxCgJHpNdJcdhKB`wh`e|4q1XSOH0$IgmMazb z_{jqv#>vFxZ`hN^^JHXrg%PBE=3{Iv3b_xj}V}6vteN82UX7rEv zLs4Y#$sF>gP6me~k{yI6Z{8H^YA2!Fxd1URhf6C_QbJ=tk$rWSp}_;?{jZoro9oE{7j<1H z-ofT)!v$#g-6da4>3+xcnZ?h7jl<^NlOwv{MvRjOq<`_!68->78d;iM4@_x7>ORUB z%m1XozOCziTTOKQw!g|AAo2B?<)LbyYihzWv&mQA|VuYdHPTTw@@!BzMr{f^aOu(|wOgs4JH%+X@7 z7nTy~*49vbout=R`*(hy5a81YgN(%%^d6!e@>c~su;t}>GvWz8c0?R;Wkn5&mehJj zdk!XgcQ+p&a7KUP9|ZE*yB-V3;qU%he|16=K6%)f%Do>FSGtv6GPiNg$Hz5_|0I-6 z=Xu~A40(Te@+5pxG%DeD6Z)*{clAi>Fz0%s1@ijfVU}#+GXK7t`Ma4epT*lx5Q>K+ z{0rAo=q_`HCK65gc2l?7T?IWoST>ZVir&~w;14;T9a*|2hoz_%Q0fW`e_+j)okZ3+ zK86)He6rT;daa=NLGPd!y)c-(VJQ*9YMHf$qs`1|DMgbGx{n{>iYWwOsy}qZUg-DQ z#+VWJ{G8PJNz0XmB>7@y+^x@7L(>~7$_6|w59%l(&%w2YigMkv?29D_`8_{g1Ziq( zp!6|*++b(MJVkWGl*3OaHQgh%t}P2&?|-`trye9z57IM_C+-Z{XzX7Co?c@Cm>LXE z77IjiBffVWQ%z)fqz|uk2j8VQ2ut`)mx$hYKJ_sp;;OUk?7XTRySodb0daa9Lt(ww zi}$*^b7`ud4^TeRl8DK0;?XgvHW!6-$d{edFC=yM_WS162o6kvgaGiZ!wsW4bB-ZJ zI&Jh~`@8jNtO%Abc%*577A~zZY(4TvROUsiZw3pM@ntmu?B-PJlB`@$e;1B2k-C!7 z6Bd3`CmW9L9!Eb_p2k%J#Ji$T_pa`tw&30L9p%g2@i8p0B}^V|XBT|!aMQFl{A4L) z|F?mKMJv~A;Wve=>n5rtV5ass6e;Gt-#0Rq{QWz0imd;t2)`|emXhoba?~ESz`#H$BW?WdJ%lE{Bf!b_W61fvCkmkX}Hk323M}A+1$31 zTWC!?nxEk>2wEF_SRqUDLHy+nK7Sq*MRjx;VPGDx^I1njDr7T_*xK6qXcjhc>s6R` z#UQI#L(<{WTMHwf5qO`zbm_FQABfCA_w@~&Ok9?tFx0gho!Y;xRJ*>b4JZFL1|Ex%T8M`HHI!%SGDk>;R6u<@qgaT zjvJbQ3ZFi>KVlEB2P!c9ooc3F-KNWfOdb1Ej3E#3V9Ye*$vDBC8)_8EXlVd;h@1_N zRNyeQ_kw6d<1801U51T#GJ>;nSI65>c|_aqR@tD=B>m~i@{$pPhH#(*~{;01gY?oq(o%Hp`UVW&tH2L%bSGX)G`a~LO>P1P=5 z(Kg#VPE6;QNI{CFxZRWtnyV1w*B<%EMpKgv=c`Y`DFoLg{sFzZCA!_$?8N6b?I+^v zA#WmNKU(x`FENKNo3C#Lkiai-K_z|TGjLAqza^vAr>;yRXaq-1MFf$&_$l4m10SYD z2YxUsaoUX?Iw3jKKa;abuY4aR`gc#wYT)Uk+!em23?%Ms6p5Lm-0`Nkf8BuUxp|Pn zYA;gvX4yX(q$r(dml_!w|6>2-V^d11WLC!+*{9GJ)a)9dHrfN}Of~apIJ~bj%$hEZ z;FJaQ3lyy=Hge}HoevaEb==%I`RVnl|BlrjH91Br>S*)un&?&4LCQeMU63|@m&m~( z4Bp~qw}k1+cp3hZw6sR;7Uhlf@6$zcQF#m!=s9=Y|6Y#7vI~@mhW9OUL10Ox_H)*M z0GElsh)96%+oulMqG5iNHCl2g@U>asEOxCiF^%2aA<;S*vmb zE!ji*XpXa@w{`bSJTW{6-<<@kaGj(cas;B$cJ^iaWF`DWxNr>o)u&}U5R9-1+ zV_{(zV)_e&_b|_DZlE6)7HhbQqJpkZHVP7GGG|ENrvZHQ6U==;-I)PZhe2j%o9yH| zf=+I*VAI1B<<{k)v2GF99Mx@|08Vse9VFX5#q_p^y=)5inj*&A`VFK zLAS=pM&m9=o=i2`VYseAx0cvLAf=IL|sEVxjXcqYnn%-E(Mc71aA^@&8&KMi2(E zrEfjO8|+QZ1cuVk@iSi+7m$AukPgk@ zS;g~HJZTAXpCR%6>)(iK}ae5i`b2d;w5@0=Q-z4#> z!MTtK+)-ih8?HdYGhxR(`NIqWO^3O!W^UWf3eg&4KloHkOg4O^nIY}% zjPM=L=F$oJ!5{@8Ej|B8%R=qa5^J7`ea}aSjT|akaNPtMyG8<^iWRtEcQ2DaV;%YI zO&vSn%{VDp;<~%5+d-6h(8W7@|H0#yurTj}F>ZQ~;Mw{LZu|Aavp-c8zCn3qttDu) zwu8lWq|!?7m;4f2!|$v$Cb2&&#~cP~PP)kesnjap*2>HKr?1@j1x&!;Z>gy|kuhni z44sld(xtY+LY-M>F>Ws}siDnpqRd=thiG&FZS>wjd%q3BvC5u)^Yk=5f8svd%a>FN z`I>Xw>c+oMbfGTx-rjztt0N0< zWAl+{<*Mnk0J)|bZGN{=k&1W56-A#18SK#?;Ptjf{Asb4+q+k{vql9~?<&`S*0ewm z`A`O*n~_rCNoG~%{2BD|$A>-(j&(4{gWkjuIYR$H7T9a*_QBr?L`(F`@bWtsvzsSz zsDN(4l>W35x-U83ZAiKaUkJ~G@`Y`j+n@yJ#hxI_Q) zS3D(9LGp$#^9WadLaC4J7;>@32AsLxNFxyRd4n}1?KS7!*%fm2J#8N#^R=DRhh{SN z%(s#N_Ws|o-1te3W^XxDdFSU%!jtOiCYSGK3?|L^Gaz759Vv*Tm_XzU(-e+342_i; zsufCH%T8j`#|!1<823u1_LBn*(<^k#hBqmvde>_IG%0FHNcf1;K2XwfZUA5aR2^)q zw6uIzyUg;vq5^-MZnHPhfAx`Q@+%Sgtr*3%DdLZo=e#%D)z)8D;$Yntd(DjSn-kgB z>9#KOu3`ep=^Ik~hhf`15(?2Afu7yXd0@W5?AQ4f7BLFZmS1we^lB8A$*830>ZRGn ztT%4|_8;2ZZB~h{D!b{lpqd2w#r?2I&*FwaFKS zwbUK>c2+5mPhY;9J8L0hp$h%_a=PFpC{+|P<5+im!8hoE?(>CB@??mMxM=cKMzIPG zy)&9RZV~LIo}$Ce2}bX3a0vbw84<{bU+E$g$IHDM9DGF^9@E`^sH)!0{|zh^EyC7aDH zPPz%n$=?RVUrM>SrW59olJP>+#lb2Ru@jEPKuwdMQRjjWgumxbISxE9;T!zK=Ojo= z8>v;16NGYlESXTiT{gKJ&R~StsRP0MeSJmg~vzik!Bfn?CmuGx{z*Tfo|xb-tsYC$nyL=34FQbYk+JyHyV?KURSh|rYdY82o#;7lwYhq&3noysp#YzoBQVpkx z+K){Y%P=R7?2^>Y^HNVAs5gK8AwTxu!=O)WzH16Us<>o67%n-KOd7dL@ch`en`O9R z|Iaz+rXk4R|9IVL1`xA#q5aO9v{7Tw;ALkJWZ}4?Dd?Y4sf`GvW|iP?-h4wJ;jfuL zH9kJ6RpBMQm`%78;;j+yeP@5LunsP(k!jONsaH`M7kj5_exgz;ua&Hw^LXU}4&hU> ztuDfK2=7ldd3kKAKWl_%+SilQ#=N$2s3* z)%W+S3`-tMN=g><1ddW0=NYx5qqd;6<7>ssBgRe#t@;_2tX4!v(J?V!?x`3UX!SPx zU;#cdb&y(2FIy1Y!wbU#DUbs2LD0<7fzI1eJxPf=0?Y64^`-`Y92c>xWOf#4adBKM zKP6>AXDjv$HVO-b1!;Q6G;_0@U0SA!^)8nV(!QED-O>0!O zO`!EYv^D%wkpGpsD}51%qKgZp>T|kUl{jkN|NYon#PQ}xljqJ+zW{OO;CPPZc=zT_^$iMyY??PC%=4;b8QDtq9Vhc7ca#U zU?aJA^?7-DD?QL~+#>3P434{V%d4ct+tc*Jb+}OR_ES+MC7Pf!xAvP&u$wz$@ZHZ~ zc#j|nmlAL_1ShI-b!9fho*>7x+7A?1fIxU;6>+_0Obk#}Q+x9&+MrbRA<)R^#Y9?G zi|GY}x&LubjKD0#_=atRkPyNM!4{5zaL14*tfn@KJ(oF%W8S9BE}>|Nk3ond^$8Pj z`!GR{xEcq8x==h2U1B1$^mDj*o2`{P%#{fVmw`G$@BAj$_M5$&C4-hbQ_^3AV0MD) z9s)PC9S!sy9hr=cXaH19 z5^J3Gsf1VXm55r7sT8PEr0|-AG=8w!-lpGSq=G!et6Yhlgj*XWIOfYwLMf zXY_sJf#)b6`wabZx$E1Yg0UX~7g>|#85-czxb7&q>-z1kF>96uxk>JSm8ruVe*R9SE>53$%BkL;GdY5Aq^It@r zQBj$4^Ydp)p<`BOyQ#0^SjMxSx}+(qrBIH~7!-(3Pt@Rj6QzHqK#m3b8fuzLeSnM1 zM1u~8pLjA=$5GB4Do0N!RZ<=i!49c3TPR|^L8U(SE2aGe&1(#9%w(2z zb5_>Y&Dy>aKdIIzytil~Ew9&hT&BY6oBDbB{{~ZOmoPhvziyRq$z+yZd3sE*Wr$hc z$g=ZAt{0gKfhAu!^qJ*%RlR`*ZAzkuhYt}G6QApYvB;9%XOALDJbXPJ9D+Y$FnlNp z^WUCA$7AN32kO1QoS3Fc+l4F3NrHjjDqK)|4J%3QPOaOmuI?@x#WJR{r?4BCv6^web&) z_9F3Ly0|c-(4h6EW6&4W@d19-n*t2&-<<2>%eFG>-b*tHCm@~j7aoW1hc<~oU z%<7|T-|7KFv z_LDZ<__hOL_r!S)yq7+d8*U#=dz$pIU$;QFucuF_!wa_P*E;rc4>vad#P5#n0;?c% zc?`MXOM;IN5}$gR0~w4k`L3^6P*lX})cQNrtJUviV4=Z}H(^z>z=2xa8~1VTGd!F?ir?GborIP?YgBU?K=3tDO>Ca*m| z=;Bg`tee54=w`y^JKhuyrPJo1Zo-@ zB+iLU6zm$RuPu(gJkC?DK%;}4`>hcon1r4DisNzePs>QD9ZjxQmMN8k-0BY^VnXrz z5A%6c`7?@(g?~A^f-Er{OVm~Q!AnY_rheT$PpK!5ViuPK9W)=OqMSex;n5=Wceyf~ zYIhg>T8)Zb{6`oK8J^!al~eMAv=3J1@!e2;RCS(UhuP|98^6EnXhh0C@65eZR$aHbEKd5Tj^i0W^?$`ZPt^)7Ca^e8<_@S+{gx!ZFyhRP(1P|AM0n zTO9DA3v>cJR40)zJ!#}hneiu%cF)+Sv1i8BytAip-*|a zlc$snCwUK?ME9xn9DWilO+P6kE%LpHzTOUbJ{1vOyLn-OFFlGxpSPB}bLjWw?c&efaOSMZy zGRrV|?lGg6EG_Q6MXj^mS;G{L=MRt^*$+gP%f4+VRIl7KOer#fQ0zM7#Hxx$R)6{= zvLDDhCh|s0mrK_4E2fiT28y}hR~n~O(QZCkGm~K;24&#eTeC#hLPK3Y?TOxx=;BXF zC|{g;f_UDZBR}&n&lODIy$a#O!!U9s1T^g6{!V~S9pB1F`LD3#71>LpAblQ64_O<0 z92{gYzFF9^lLhf^sQlO4r`Xs2KQ7O(Mo9lHhmp%UrlY%kX@dp==AJVyluApdWx=nw zDV6%E*x|1OJWtN`1^zv$H9PlrH{!-~g7_s}1kb*<#}vJT6y|;T*e>PEZ1P%?SzyC5Lxp?B6>Ap7bndw_9-=`YYkDPX zx*VE+W=U`_ME)!UqX`Tax~L(icj>r%mYg|M_c9>>ckfAFs}0$l+C2>WkO^T@((;8J zaeWFtD$V>*bmKAgWkJO}_=aZRRzS5%{P*5~w*-9?K{Xn;K4(GPM5E*Ko6F+S>1^%t zcf%&nqu(l&D%8|Dv(-TqDk-)0Bfld%WC1hwG&WbLj>}xS_@dBIfukdkG{9c$L*l3t z83`ND?n2WsA4)w(+Uxhvmz>t