From c72de0c55db2569a923c11cefca450aaceb685ac Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Mon, 21 Sep 2026 16:24:25 +1000 Subject: [PATCH 1/5] Open viewer entries at their first change and add a changes only view Every entry opened at line 1, so a snapshot failing on line 200 was shown as the 200 lines above it, and each path that brought an entry on screen reset to row 0 on its own. They all go through ViewerSession.Open now, which scrolls to the first change with three rows of context above it: selecting, stepping, a re-run that rewrote the text, a variant cycled to, and the entry on screen going. Moving between changes was n and p, which nothing on screen mentioned. Prev change and Next change sit in the footer of both modes, each disabled when no change is left in its direction. Navigation lands a change three rows under the top rather than on it, and is defined over those landing places (DiffView.Next and Previous) rather than over the top row, which is what makes previous undo next and stops a change already in place being taken for the next one. Changes only (m) switches to a minimal view: each change with three rows either side, and every longer unchanged run folded into one RowKind.Folded row saying how many lines it stands for. It is a second DiffView built with each entry, so switching costs nothing, and it keeps the row being read on the same line of the screen. Scrolling, the scrollbar and navigation count rows of the view on screen. A selection stays in rows of the entry, unfolded from the head's rows in ViewerSession.Drag, so it survives switching and a fold inside it copies the lines it stands for. The status line names lines of the file rather than rows of the view: "lines 1-1 of 1" beside a fold of forty lines said nothing true. Pictures never fold, since their rows are their properties. RowKind.Folded and the m key are additive ABI values, so DEVIEW_VERSION stays 8, as it did for DEVIEW_QUEUE_HEADER: a stale library draws a fold as a plain row. The native sources draw it dimmed on a band of its own, and the Swift head no longer prints -1 in the gutter of a row with no number. DeviewStructTests now holds the row kind and key enums against the header too, because a row kind crosses as a cast and a mismatch would fail nowhere. The ASCII test grid goes from 96 to 136 columns, because the new buttons left no room for the status line that half the screen snapshots are about. Those change in footer and width only, apart from NextChange, which now lands with context. The Linux and macOS pixel baselines need re-accepting from CI, and build-native has to run for the committed binaries. --- claude.md | 10 + docs/mdsource/viewer.source.md | 12 +- docs/viewer.md | 12 +- native/include/deview.h | 14 +- native/src/deview.cpp | 8 + native/swift/Sources/Deview/MainMenu.swift | 1 + native/swift/Sources/Deview/Palette.swift | 9 + native/swift/Sources/Deview/Renderer.swift | 3 +- native/swift/Sources/Deview/ViewerView.swift | 2 + .../DeviewStructTests.cs | 52 +++ src/DiffEngineViewer.Tests/DiffViewTests.cs | 80 ++++ .../FileScreenTests.AtEnd.verified.txt | 48 +-- .../FileScreenTests.Initial.verified.txt | 48 +-- .../FileScreenTests.LeftEmpty.verified.txt | 48 +-- .../FileScreenTests.LongLines.verified.txt | 48 +-- .../FileScreenTests.Minimal.verified.txt | 24 ++ .../FileScreenTests.MinimalAtEnd.verified.txt | 24 ++ ...eenTests.MinimalNoDifferences.verified.txt | 24 ++ .../FileScreenTests.NextChange.verified.txt | 48 +-- ...FileScreenTests.NoDifferences.verified.txt | 48 +-- ...enTests.OpensAtTheFirstChange.verified.txt | 24 ++ .../FileScreenTests.RightEmpty.verified.txt | 48 +-- .../FileScreenTests.Scrolled.verified.txt | 48 +-- ...ileScreenTests.WhitespaceOnly.verified.txt | 48 +-- src/DiffEngineViewer.Tests/FileScreenTests.cs | 42 +- src/DiffEngineViewer.Tests/Fixtures.cs | 44 +- .../FsharpEntryTests.Screen.verified.txt | 48 +-- ...mageScreenTests.DeleteInQueue.verified.txt | 48 +-- .../ImageScreenTests.Differs.verified.txt | 48 +-- ...mageScreenTests.FormatChanged.verified.txt | 48 +-- .../ImageScreenTests.Identical.verified.txt | 48 +-- .../ImageScreenTests.MoveInQueue.verified.txt | 48 +-- .../ImageScreenTests.NewImage.verified.txt | 48 +-- ...mageScreenTests.NotRecognized.verified.txt | 48 +-- .../ImageScreenTests.Unreadable.verified.txt | 48 +-- ...InlineScreenTests.AfterAccept.verified.txt | 48 +-- ...ineScreenTests.AfterAcceptAll.verified.txt | 48 +-- ....AfterAcceptAllSkipsConflicts.verified.txt | 48 +-- ...nlineScreenTests.AfterDiscard.verified.txt | 48 +-- ...ScreenTests.CollapsedSolution.verified.txt | 48 +-- ...creenTests.CollapsedTestGroup.verified.txt | 48 +-- ...ineScreenTests.CollidingNames.verified.txt | 48 +-- ...neScreenTests.ConflictedEntry.verified.txt | 48 +-- ...Tests.ConflictedSecondVariant.verified.txt | 48 +-- ...InlineScreenTests.DeleteEntry.verified.txt | 48 +-- .../InlineScreenTests.EmptyQueue.verified.txt | 48 +-- ...InlineScreenTests.FailedApply.verified.txt | 48 +-- ...ests.FailedApplyThenAcceptAll.verified.txt | 48 +-- ...lineScreenTests.GroupedByTest.verified.txt | 48 +-- ...s.LongQueueScrollsToSelection.verified.txt | 48 +-- ...ScreenTests.LongSolutionNames.verified.txt | 48 +-- ...enTests.MenuOnConflictedEntry.verified.txt | 48 +-- ...InlineScreenTests.MenuOnEntry.verified.txt | 48 +-- .../InlineScreenTests.MenuOnMove.verified.txt | 48 +-- ...eenTests.MenuOnSolutionHeader.verified.txt | 48 +-- ...creenTests.MergedOriginLabels.verified.txt | 48 +-- ...ScreenTests.MixedKindsGrouped.verified.txt | 48 +-- .../InlineScreenTests.MoveEntry.verified.txt | 48 +-- ...InlineScreenTests.NewSnapshot.verified.txt | 48 +-- .../InlineScreenTests.Queue.verified.txt | 48 +-- ...creenTests.SecondItemSelected.verified.txt | 48 +-- .../InlineScreenTests.Single.verified.txt | 48 +-- ...eenTests.SolutionAndUngrouped.verified.txt | 48 +-- .../InlineScreenTests.StalePatch.verified.txt | 48 +-- ...ineScreenTests.TestNameLabels.verified.txt | 48 +-- ...nlineScreenTests.TwoSolutions.verified.txt | 48 +-- ...creenTests.UnparsedExpression.verified.txt | 48 +-- .../MinimalViewTests.cs | 259 ++++++++++++ src/DiffEngineViewer.Tests/OpeningTests.cs | 120 ++++++ src/DiffEngineViewer.Tests/PixelTests.cs | 10 + .../PreviousChangeTests.cs | 38 +- .../QueueRemovalTests.cs | 19 +- src/DiffEngineViewer.Tests/ReEnqueueTests.cs | 21 +- src/DiffEngineViewer.Tests/ReselectTests.cs | 20 +- ...lectionSurvivesSwitchingViews.verified.txt | 50 +++ ...lectionTests.AcrossAFoldedRow.verified.txt | 50 +++ ...ctionTests.EndingOnAFoldedRow.verified.txt | 50 +++ ...s.StartingOnAFoldedRowGoingUp.verified.txt | 50 +++ src/DiffEngineViewer.Tests/SelectionTests.cs | 61 +++ .../ViewerLaunchTests.cs | 2 +- .../ViewerSessionTests.cs | 13 +- .../WindowsPixelTests.FileDiff.verified.png | Bin 18250 -> 19728 bytes ...lTests.GroupedConflictedQueue.verified.png | Bin 24978 -> 26485 bytes .../WindowsPixelTests.Images.verified.png | Bin 23472 -> 24780 bytes ...dowsPixelTests.InlineAccepted.verified.png | Bin 16836 -> 18300 bytes ...WindowsPixelTests.InlineQueue.verified.png | Bin 21497 -> 22974 bytes ...indowsPixelTests.InlineSingle.verified.png | Bin 19534 -> 21005 bytes .../WindowsPixelTests.LongPane.verified.png | Bin 36485 -> 37913 bytes ...dowsPixelTests.LongQueueLabel.verified.png | Bin 22716 -> 24191 bytes .../WindowsPixelTests.Minimal.verified.png | Bin 0 -> 35908 bytes .../WindowsPixelTests.Selection.verified.png | Bin 19952 -> 21439 bytes .../WindowsPixelTests.cs | 8 + src/DiffEngineViewer.Windows/Palette.cs | 9 + src/DiffEngineViewer.Windows/ViewerForm.cs | 1 + src/DiffEngineViewer/CommandKind.cs | 7 + src/DiffEngineViewer/DiffView.cs | 394 ++++++++++++++++++ src/DiffEngineViewer/Model/RowKind.cs | 9 +- src/DiffEngineViewer/Native/DeviewStructs.cs | 10 +- .../Native/NativeViewerWindow.cs | 1 + src/DiffEngineViewer/QueueEntry.cs | 25 +- src/DiffEngineViewer/ScreenBuilder.cs | 69 ++- src/DiffEngineViewer/SelectionText.cs | 26 ++ src/DiffEngineViewer/SessionState.cs | 15 + src/DiffEngineViewer/TextSelection.cs | 6 +- src/DiffEngineViewer/ViewerSession.cs | 217 +++++----- 105 files changed, 2972 insertions(+), 1373 deletions(-) create mode 100644 src/DiffEngineViewer.Tests/DiffViewTests.cs create mode 100644 src/DiffEngineViewer.Tests/FileScreenTests.Minimal.verified.txt create mode 100644 src/DiffEngineViewer.Tests/FileScreenTests.MinimalAtEnd.verified.txt create mode 100644 src/DiffEngineViewer.Tests/FileScreenTests.MinimalNoDifferences.verified.txt create mode 100644 src/DiffEngineViewer.Tests/FileScreenTests.OpensAtTheFirstChange.verified.txt create mode 100644 src/DiffEngineViewer.Tests/MinimalViewTests.cs create mode 100644 src/DiffEngineViewer.Tests/OpeningTests.cs create mode 100644 src/DiffEngineViewer.Tests/SelectionTests.ASelectionSurvivesSwitchingViews.verified.txt create mode 100644 src/DiffEngineViewer.Tests/SelectionTests.AcrossAFoldedRow.verified.txt create mode 100644 src/DiffEngineViewer.Tests/SelectionTests.EndingOnAFoldedRow.verified.txt create mode 100644 src/DiffEngineViewer.Tests/SelectionTests.StartingOnAFoldedRowGoingUp.verified.txt create mode 100644 src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.Minimal.verified.png create mode 100644 src/DiffEngineViewer/DiffView.cs diff --git a/claude.md b/claude.md index e7659518..56c18b20 100644 --- a/claude.md +++ b/claude.md @@ -178,6 +178,16 @@ apart. enrichment on top. Copying is `IViewerWindow.SetClipboard` rather than a `ViewerActions` member, because a clipboard belongs to a toolkit the way a window does, and it is answered before the owner link: the text is already in this process. +- An entry opens at its first change, not line 1: every path that changes what is being read goes + through `ViewerSession.Open`, so none resets to row 0 on its own. The minimal view ("Changes + only", `SessionState.Minimal`) is a second `DiffView` built with each entry - changes plus + `DiffView.Context` rows either side, longer unchanged runs folded into one `RowKind.Folded` row. + Scrolling, the scrollbar and navigation count rows of the view on screen; a selection stays in + rows of the entry (`ViewerSession.Drag` unfolds the head's rows), so it survives switching views + and a fold inside it copies what it stands for. Navigation is defined over where it lands a + change - `Context` rows under the top - which is what makes previous undo next. The fold kind and + the `m` key are additive ABI values with no `DEVIEW_VERSION` bump, as `DEVIEW_QUEUE_HEADER` was: + a stale library draws a fold as a plain row. - Queue tooltips are composed once in `QueueProjection`, not per head, and are **null when they would only repeat the row**. Labels are already the shortest distinguishing form, so the tip is what the label left off — path, test, frameworks, failure text. `QueueTooltipTests` snapshots the diff --git a/docs/mdsource/viewer.source.md b/docs/mdsource/viewer.source.md index 45b35c2d..f4fd185e 100644 --- a/docs/mdsource/viewer.source.md +++ b/docs/mdsource/viewer.source.md @@ -70,7 +70,8 @@ Nothing is written to disk for inline review. The patch travels over stdin, or o | Key | Action | | --- | --- | | `Up` `Down` `PgUp` `PgDn` `Home` `End` | Scroll | -| `n` `p` | Next and previous change | +| `n` `p` | Next and previous change (also the **Next change** and **Prev change** buttons) | +| `m` | Show only the changes, or every line (also the **Changes only** button) | | `Tab` `Shift+Tab` | Next and previous pending item | | `a` | Accept | | `Shift+A` | Accept all | @@ -81,6 +82,15 @@ Nothing is written to disk for inline review. The patch travels over stdin, or o | `q` `Esc` | Close | +## Moving between changes + +A comparison opens scrolled to its first change, with three lines of context above it, rather than at line 1. **Next change** and **Prev change** move from one change to the next, putting each in the same place under the top of the pane, and each is disabled when no change is left in its direction. + +**Changes only** switches to a minimal view: each change with the three lines either side of it, and every longer run of unchanged lines folded into one row saying how many lines it stands for. The button then reads **All lines**, which switches back. Switching keeps the line being read where it is on screen, and the choice holds while moving through the queue. Images are never folded, because their rows are their properties and each is worth reading. + +A fold is only a view. A selection that spans one copies the lines it stands for, since those are what lies between the selection's two ends, and the status line names the stretch of the file on screen rather than a count of rows: sixteen rows in the minimal view can read `lines 1-30 of 40`. + + ## Selecting and copying Drag across either pane to select text, and `Ctrl+C` to copy it. `Ctrl+A` selects one whole pane: the one something is already selected in, or the received side when nothing is. On macOS the Edit menu carries both, so `Cmd+C` and `Cmd+A` work there too. diff --git a/docs/viewer.md b/docs/viewer.md index 485cad47..a5fd1422 100644 --- a/docs/viewer.md +++ b/docs/viewer.md @@ -77,7 +77,8 @@ Nothing is written to disk for inline review. The patch travels over stdin, or o | Key | Action | | --- | --- | | `Up` `Down` `PgUp` `PgDn` `Home` `End` | Scroll | -| `n` `p` | Next and previous change | +| `n` `p` | Next and previous change (also the **Next change** and **Prev change** buttons) | +| `m` | Show only the changes, or every line (also the **Changes only** button) | | `Tab` `Shift+Tab` | Next and previous pending item | | `a` | Accept | | `Shift+A` | Accept all | @@ -88,6 +89,15 @@ Nothing is written to disk for inline review. The patch travels over stdin, or o | `q` `Esc` | Close | +## Moving between changes + +A comparison opens scrolled to its first change, with three lines of context above it, rather than at line 1. **Next change** and **Prev change** move from one change to the next, putting each in the same place under the top of the pane, and each is disabled when no change is left in its direction. + +**Changes only** switches to a minimal view: each change with the three lines either side of it, and every longer run of unchanged lines folded into one row saying how many lines it stands for. The button then reads **All lines**, which switches back. Switching keeps the line being read where it is on screen, and the choice holds while moving through the queue. Images are never folded, because their rows are their properties and each is worth reading. + +A fold is only a view. A selection that spans one copies the lines it stands for, since those are what lies between the selection's two ends, and the status line names the stretch of the file on screen rather than a count of rows: sixteen rows in the minimal view can read `lines 1-30 of 40`. + + ## Selecting and copying Drag across either pane to select text, and `Ctrl+C` to copy it. `Ctrl+A` selects one whole pane: the one something is already selected in, or the received side when nothing is. On macOS the Edit menu carries both, so `Cmd+C` and `Cmd+A` work there too. diff --git a/native/include/deview.h b/native/include/deview.h index 4fa0963c..884625c4 100644 --- a/native/include/deview.h +++ b/native/include/deview.h @@ -31,7 +31,13 @@ enum DeviewRowKind { DEVIEW_ROW_ADDED = 1, DEVIEW_ROW_REMOVED = 2, DEVIEW_ROW_MODIFIED = 3, - DEVIEW_ROW_FILLER = 4 + DEVIEW_ROW_FILLER = 4, + /* + * A run of unchanged lines the minimal view left out, as one row: its text says how many, and + * it has no line number. Drawn dimmed on a band of its own. A library built before this kind + * existed draws it as a plain unchanged row, which still reads. + */ + DEVIEW_ROW_FOLDED = 5 }; enum DeviewButtonFlags { @@ -47,7 +53,7 @@ enum DeviewQueueFlags { typedef struct DeviewRow { int32_t kind; - /* -1 when the row is filler and has no line number. */ + /* -1 when the row is filler or folded and has no line number. */ int32_t lineNumber; int32_t textOffset; int32_t textLength; @@ -184,7 +190,9 @@ enum DeviewKey { /* Ctrl+C, and Cmd+C on macOS. */ DEVIEW_KEY_COPY = 16, /* Ctrl+A, which is why plain A must be reported as accept only when no modifier is held. */ - DEVIEW_KEY_SELECT_ALL = 17 + DEVIEW_KEY_SELECT_ALL = 17, + /* M: every line, or only the changes and the lines around them. */ + DEVIEW_KEY_TOGGLE_MINIMAL = 18 }; typedef struct DeviewInput { diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 2db13fbe..2b9b1734 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -241,6 +241,9 @@ ImU32 RowColour(int kind) return IM_COL32(233, 129, 129, 255); case DEVIEW_ROW_MODIFIED: return IM_COL32(231, 197, 113, 255); + /* Dimmed like the gutter, since what it says is about the file rather than from it. */ + case DEVIEW_ROW_FOLDED: + return IM_COL32(130, 130, 130, 255); default: return IM_COL32(212, 212, 212, 255); } @@ -256,6 +259,10 @@ ImU32 RowBackground(int kind) return IM_COL32(84, 40, 40, 255); case DEVIEW_ROW_MODIFIED: return IM_COL32(74, 64, 32, 255); + /* A shade lighter than filler, so a fold reads as a break in the file rather than as a + * line of it or as padding. */ + case DEVIEW_ROW_FOLDED: + return IM_COL32(34, 34, 34, 255); default: return 0; } @@ -540,6 +547,7 @@ int ReadKey() if (IsKeyPressed(KEY_END)) return DEVIEW_KEY_END; if (IsKeyPressed(KEY_N)) return DEVIEW_KEY_NEXT_CHANGE; if (IsKeyPressed(KEY_P)) return DEVIEW_KEY_PREVIOUS_CHANGE; + if (IsKeyPressed(KEY_M)) return DEVIEW_KEY_TOGGLE_MINIMAL; if (IsKeyPressed(KEY_TAB)) return IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT) ? DEVIEW_KEY_PREVIOUS_ITEM : DEVIEW_KEY_NEXT_ITEM; diff --git a/native/swift/Sources/Deview/MainMenu.swift b/native/swift/Sources/Deview/MainMenu.swift index 89826f11..11044945 100644 --- a/native/swift/Sources/Deview/MainMenu.swift +++ b/native/swift/Sources/Deview/MainMenu.swift @@ -105,6 +105,7 @@ enum MainMenu { .separator(), command("Next Change (n)", DEVIEW_KEY_NEXT_CHANGE, target), command("Previous Change (p)", DEVIEW_KEY_PREVIOUS_CHANGE, target), + command("Toggle Changes Only (m)", DEVIEW_KEY_TOGGLE_MINIMAL, target), .separator(), command("Next Pending (⇥)", DEVIEW_KEY_NEXT_ITEM, target), command("Previous Pending (⇧⇥)", DEVIEW_KEY_PREVIOUS_ITEM, target) diff --git a/native/swift/Sources/Deview/Palette.swift b/native/swift/Sources/Deview/Palette.swift index 410ed5d2..bfa6f954 100644 --- a/native/swift/Sources/Deview/Palette.swift +++ b/native/swift/Sources/Deview/Palette.swift @@ -33,6 +33,10 @@ enum Palette { static let rule = grey(70) + /// Behind a folded row, a shade lighter than filler, so the runs the minimal view leaves out + /// read as breaks in the file rather than as a line of it or as padding. + static let folded = grey(34) + /// ImGui draws a selected item as its accent at 31% over the window background. This is that /// composite, so the queue highlight matches without carrying an alpha channel around. static let selected = rgb(38, 64, 90) @@ -60,6 +64,9 @@ enum Palette { return rgb(233, 129, 129) case DEVIEW_ROW_MODIFIED.value: return rgb(231, 197, 113) + // Dimmed like the gutter, since what it says is about the file rather than from it. + case DEVIEW_ROW_FOLDED.value: + return dim default: return text } @@ -76,6 +83,8 @@ enum Palette { return rgb(74, 64, 32) case DEVIEW_ROW_FILLER.value: return filler + case DEVIEW_ROW_FOLDED.value: + return folded default: return nil } diff --git a/native/swift/Sources/Deview/Renderer.swift b/native/swift/Sources/Deview/Renderer.swift index 9aa7e3d5..3546d3f1 100644 --- a/native/swift/Sources/Deview/Renderer.swift +++ b/native/swift/Sources/Deview/Renderer.swift @@ -323,7 +323,8 @@ final class Renderer { return } - let number = String(row.lineNumber) + // A folded row has no number, and printing the -1 standing in for one put it in the gutter. + let number = row.lineNumber < 0 ? "" : String(row.lineNumber) let gutter = "\(Palette.marker(row.kind)) \(String(repeating: " ", count: max(0, 4 - number.count)))\(number)" let width = Renderer.gutterCells * cell.width diff --git a/native/swift/Sources/Deview/ViewerView.swift b/native/swift/Sources/Deview/ViewerView.swift index 96ab3a80..72b4208f 100644 --- a/native/swift/Sources/Deview/ViewerView.swift +++ b/native/swift/Sources/Deview/ViewerView.swift @@ -315,6 +315,8 @@ final class ViewerView: NSView, NSViewToolTipOwner { return DEVIEW_KEY_NEXT_CHANGE.value case "p": return DEVIEW_KEY_PREVIOUS_CHANGE.value + case "m": + return DEVIEW_KEY_TOGGLE_MINIMAL.value case "a": return shift ? DEVIEW_KEY_ACCEPT_ALL.value : DEVIEW_KEY_ACCEPT.value case "d": diff --git a/src/DiffEngineViewer.Tests/DeviewStructTests.cs b/src/DiffEngineViewer.Tests/DeviewStructTests.cs index 309d05da..aaf0172e 100644 --- a/src/DiffEngineViewer.Tests/DeviewStructTests.cs +++ b/src/DiffEngineViewer.Tests/DeviewStructTests.cs @@ -39,6 +39,23 @@ public async Task FieldsMatchTheHeader(string name, Type managed) await Assert.That(string.Join(", ", Camel(mirrored))).IsEqualTo(string.Join(", ", declared)); } + /// + /// A row kind crosses the ABI as a cast rather than through a mapping, so the two enums have to + /// agree value for value. A kind added to one side only is drawn as whatever the other side has + /// at that number, and nothing fails anywhere. + /// + [Test] + public async Task RowKindsMatchTheHeader() => + await Assert.That(Managed()).IsEqualTo(Declared("DeviewRowKind", "DEVIEW_ROW_")); + + /// + /// Keys are mapped rather than cast, because the shim reports only the ones a window can + /// produce, but the numbers are still the wire format and both sides have to use the same. + /// + [Test] + public async Task KeysMatchTheHeader() => + await Assert.That(Managed()).IsEqualTo(Declared("DeviewKey", "DEVIEW_KEY_")); + public static IEnumerable<(string, Type)> Structs() { yield return ("DeviewRow", typeof(DeviewRow)); @@ -83,6 +100,41 @@ static List Fields(string name) .ToList(); } + /// + /// An enum as name and value pairs in value order, the names lower cased and run together so + /// ScrollUp and DEVIEW_KEY_SCROLL_UP compare as the same member. + /// + static string Managed() + where T : struct, Enum => + string.Join( + ", ", + Enum.GetValues() + .OrderBy(_ => Convert.ToInt32(_)) + .Select(_ => $"{_.ToString().ToLowerInvariant()}={Convert.ToInt32(_)}")); + + static string Declared(string name, string prefix) + { + var block = Regex.Match( + Header(), + $@"enum {name} \{{(?.*?)\}};", + RegexOptions.Singleline); + if (!block.Success) + { + throw new($"{name} is not declared in deview.h."); + } + + var body = Regex.Replace(block.Groups["body"].Value, @"/\*.*?\*/", "", RegexOptions.Singleline); + return string.Join( + ", ", + Regex + .Matches(body, @"(?\w+)\s*=\s*(?\d+)") + .Select(_ => ( + Member: _.Groups["member"].Value[prefix.Length..].Replace("_", "").ToLowerInvariant(), + Value: int.Parse(_.Groups["value"].Value))) + .OrderBy(_ => _.Value) + .Select(_ => $"{_.Member}={_.Value}")); + } + static string Header() { // bin/{configuration}/{tfm} under this test project, so four up is src and five is the diff --git a/src/DiffEngineViewer.Tests/DiffViewTests.cs b/src/DiffEngineViewer.Tests/DiffViewTests.cs new file mode 100644 index 00000000..0156b0b2 --- /dev/null +++ b/src/DiffEngineViewer.Tests/DiffViewTests.cs @@ -0,0 +1,80 @@ +/// +/// The mapping between a view's rows and the entry's, which scrolling, selection and switching +/// views all go through. Held as invariants over every row rather than as a few picked cases, +/// because an off by one here moves a selection by a line without anything looking wrong. +/// +public class DiffViewTests +{ + [Test] + public async Task Every_row_of_the_entry_finds_the_row_that_shows_it() + { + var entry = Entry(); + var view = entry.View(true); + + for (var line = 0; line < entry.TotalRows; line++) + { + var row = view.Find(line); + await Assert.That(view.First(row)).IsLessThanOrEqualTo(line); + await Assert.That(view.Last(row)).IsGreaterThanOrEqualTo(line); + } + } + + [Test] + public async Task A_shown_row_is_the_entrys_own() + { + var entry = Entry(); + var view = entry.View(true); + + for (var row = 0; row < view.Count; row++) + { + if (view.IsFolded(row)) + { + continue; + } + + await Assert.That(view.Left[row]).IsSameReferenceAs(entry.LeftRows[view.First(row)]); + await Assert.That(view.Right[row]).IsSameReferenceAs(entry.RightRows[view.First(row)]); + await Assert.That(view.Last(row)).IsEqualTo(view.First(row)); + } + } + + /// + /// Between them the rows cover the entry once each, the last one running to the end, so no + /// line is in two rows and none is in no row. + /// + [Test] + public async Task The_rows_cover_the_entry_exactly_once() + { + var entry = Entry(); + var view = entry.View(true); + + var next = 0; + for (var row = 0; row < view.Count; row++) + { + await Assert.That(view.First(row)).IsEqualTo(next); + next = view.Last(row) + 1; + } + + await Assert.That(next).IsEqualTo(entry.TotalRows); + } + + /// + /// Changes are never folded, so the minimal view has the same runs of them, only closer + /// together. + /// + [Test] + public async Task Both_views_have_the_same_changes() + { + var entry = Entry(); + var full = entry.View(false); + var minimal = entry.View(true); + + var mapped = minimal.Changes.Select(_ => minimal.First(_)); + + await Assert.That(string.Join(", ", mapped)).IsEqualTo(string.Join(", ", full.Changes)); + await Assert.That(string.Join(", ", full.Changes)).IsEqualTo("2, 16, 32"); + } + + static QueueEntry Entry() => + Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)).Current!; +} diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.AtEnd.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.AtEnd.verified.txt index dd174431..0042e37e 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.AtEnd.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.AtEnd.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| 25 line 25 | 25 line 25 | -| 26 line 26 | 26 line 26 | -| 27 line 27 | 27 line 27 | -| 28 line 28 | 28 line 28 | -| 29 line 29 | 29 line 29 | -| 30 line 30 | 30 line 30 | -| 31 line 31 | 31 line 31 | -| 32 line 32 | 32 line 32 | -| ~ 33 line 33 changed | ~ 33 line 33 | -| 34 line 34 | 34 line 34 | -| 35 line 35 | 35 line 35 | -| 36 line 36 | 36 line 36 | -| 37 line 37 | 37 line 37 | -| 38 line 38 | 38 line 38 | -| 39 line 39 | 39 line 39 | -| 40 line 40 | 40 line 40 | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 25-40 of 40 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 25 line 25 | 25 line 25 | +| 26 line 26 | 26 line 26 | +| 27 line 27 | 27 line 27 | +| 28 line 28 | 28 line 28 | +| 29 line 29 | 29 line 29 | +| 30 line 30 | 30 line 30 | +| 31 line 31 | 31 line 31 | +| 32 line 32 | 32 line 32 | +| ~ 33 line 33 changed | ~ 33 line 33 | +| 34 line 34 | 34 line 34 | +| 35 line 35 | 35 line 35 | +| 36 line 36 | 36 line 36 | +| 37 line 37 | 37 line 37 | +| 38 line 38 | 38 line 38 | +| 39 line 39 | 39 line 39 | +| 40 line 40 | 40 line 40 | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] [Prev change] (Next change) [Changes only] lines 25-40 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.Initial.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.Initial.verified.txt index 363d0f55..e3debf29 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.Initial.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.Initial.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| 1 the quick | 1 the quick | -| ~ 2 brown dog | ~ 2 brown fox | -| 3 jumps over | 3 jumps over | -| 4 the lazy | 4 the lazy | -| 5 dog | 5 dog | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 the quick | 1 the quick | +| ~ 2 brown dog | ~ 2 brown fox | +| 3 jumps over | 3 jumps over | +| 4 the lazy | 4 the lazy | +| 5 dog | 5 dog | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.LeftEmpty.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.LeftEmpty.verified.txt index 280b16bd..14a60136 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.LeftEmpty.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.LeftEmpty.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| | - 1 the quick | -| | - 2 brown fox | -| | - 3 jumps over | -| | - 4 the lazy | -| | - 5 dog | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| | - 1 the quick | +| | - 2 brown fox | +| | - 3 jumps over | +| | - 4 the lazy | +| | - 5 dog | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.LongLines.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.LongLines.verified.txt index a130c3a1..9e3bde8d 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.LongLines.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.LongLines.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| 1 start | 1 start | -| ~ 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> | ~ 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> | -| 3 end | 3 end | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-3 of 3 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 start | 1 start | +| ~ 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> | ~ 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> | +| 3 end | 3 end | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-3 of 3 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.Minimal.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.Minimal.verified.txt new file mode 100644 index 00000000..7be21e28 --- /dev/null +++ b/src/DiffEngineViewer.Tests/FileScreenTests.Minimal.verified.txt @@ -0,0 +1,24 @@ ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 line 01 | 1 line 01 | +| 2 line 02 | 2 line 02 | +| ~ 3 line 03 changed | ~ 3 line 03 | +| 4 line 04 | 4 line 04 | +| 5 line 05 | 5 line 05 | +| 6 line 06 | 6 line 06 | +| ... 7 unchanged lines ... | ... 7 unchanged lines ... | +| 14 line 14 | 14 line 14 | +| 15 line 15 | 15 line 15 | +| 16 line 16 | 16 line 16 | +| ~ 17 line 17 changed | ~ 17 line 17 | +| 18 line 18 | 18 line 18 | +| 19 line 19 | 19 line 19 | +| 20 line 20 | 20 line 20 | +| ... 9 unchanged lines ... | ... 9 unchanged lines ... | +| 30 line 30 | 30 line 30 | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) [Next change] [All lines] lines 1-30 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.MinimalAtEnd.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.MinimalAtEnd.verified.txt new file mode 100644 index 00000000..5a5b1aac --- /dev/null +++ b/src/DiffEngineViewer.Tests/FileScreenTests.MinimalAtEnd.verified.txt @@ -0,0 +1,24 @@ ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 14 line 14 | 14 line 14 | +| 15 line 15 | 15 line 15 | +| 16 line 16 | 16 line 16 | +| ~ 17 line 17 changed | ~ 17 line 17 | +| 18 line 18 | 18 line 18 | +| 19 line 19 | 19 line 19 | +| 20 line 20 | 20 line 20 | +| ... 9 unchanged lines ... | ... 9 unchanged lines ... | +| 30 line 30 | 30 line 30 | +| 31 line 31 | 31 line 31 | +| 32 line 32 | 32 line 32 | +| ~ 33 line 33 changed | ~ 33 line 33 | +| 34 line 34 | 34 line 34 | +| 35 line 35 | 35 line 35 | +| 36 line 36 | 36 line 36 | +| ... 4 unchanged lines ... | ... 4 unchanged lines ... | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] [Prev change] (Next change) [All lines] lines 14-40 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.MinimalNoDifferences.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.MinimalNoDifferences.verified.txt new file mode 100644 index 00000000..4e155635 --- /dev/null +++ b/src/DiffEngineViewer.Tests/FileScreenTests.MinimalNoDifferences.verified.txt @@ -0,0 +1,24 @@ ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| ... 40 unchanged lines ... | ... 40 unchanged lines ... | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [All lines] lines 1-40 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.NextChange.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.NextChange.verified.txt index 02b8032c..dac9f9f6 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.NextChange.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.NextChange.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| ~ 17 line 17 changed | ~ 17 line 17 | -| 18 line 18 | 18 line 18 | -| 19 line 19 | 19 line 19 | -| 20 line 20 | 20 line 20 | -| 21 line 21 | 21 line 21 | -| 22 line 22 | 22 line 22 | -| 23 line 23 | 23 line 23 | -| 24 line 24 | 24 line 24 | -| 25 line 25 | 25 line 25 | -| 26 line 26 | 26 line 26 | -| 27 line 27 | 27 line 27 | -| 28 line 28 | 28 line 28 | -| 29 line 29 | 29 line 29 | -| 30 line 30 | 30 line 30 | -| 31 line 31 | 31 line 31 | -| 32 line 32 | 32 line 32 | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 17-32 of 40 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 14 line 14 | 14 line 14 | +| 15 line 15 | 15 line 15 | +| 16 line 16 | 16 line 16 | +| ~ 17 line 17 changed | ~ 17 line 17 | +| 18 line 18 | 18 line 18 | +| 19 line 19 | 19 line 19 | +| 20 line 20 | 20 line 20 | +| 21 line 21 | 21 line 21 | +| 22 line 22 | 22 line 22 | +| 23 line 23 | 23 line 23 | +| 24 line 24 | 24 line 24 | +| 25 line 25 | 25 line 25 | +| 26 line 26 | 26 line 26 | +| 27 line 27 | 27 line 27 | +| 28 line 28 | 28 line 28 | +| 29 line 29 | 29 line 29 | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] [Prev change] [Next change] [Changes only] lines 14-29 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.NoDifferences.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.NoDifferences.verified.txt index 443facfe..f3a336cb 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.NoDifferences.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.NoDifferences.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| 1 the quick | 1 the quick | -| 2 brown fox | 2 brown fox | -| 3 jumps over | 3 jumps over | -| 4 the lazy | 4 the lazy | -| 5 dog | 5 dog | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 the quick | 1 the quick | +| 2 brown fox | 2 brown fox | +| 3 jumps over | 3 jumps over | +| 4 the lazy | 4 the lazy | +| 5 dog | 5 dog | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.OpensAtTheFirstChange.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.OpensAtTheFirstChange.verified.txt new file mode 100644 index 00000000..6e645a63 --- /dev/null +++ b/src/DiffEngineViewer.Tests/FileScreenTests.OpensAtTheFirstChange.verified.txt @@ -0,0 +1,24 @@ ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 27 line 27 | 27 line 27 | +| 28 line 28 | 28 line 28 | +| 29 line 29 | 29 line 29 | +| ~ 30 line 30 changed | ~ 30 line 30 | +| 31 line 31 | 31 line 31 | +| 32 line 32 | 32 line 32 | +| 33 line 33 | 33 line 33 | +| 34 line 34 | 34 line 34 | +| 35 line 35 | 35 line 35 | +| 36 line 36 | 36 line 36 | +| 37 line 37 | 37 line 37 | +| 38 line 38 | 38 line 38 | +| 39 line 39 | 39 line 39 | +| 40 line 40 | 40 line 40 | +| 41 line 41 | 41 line 41 | +| 42 line 42 | 42 line 42 | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) [Next change] [Changes only] lines 27-42 of 60 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.RightEmpty.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.RightEmpty.verified.txt index 69e30b8d..202e06b8 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.RightEmpty.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.RightEmpty.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| + 1 the quick | | -| + 2 brown dog | | -| + 3 jumps over | | -| + 4 the lazy | | -| + 5 dog | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| + 1 the quick | | +| + 2 brown dog | | +| + 3 jumps over | | +| + 4 the lazy | | +| + 5 dog | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.Scrolled.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.Scrolled.verified.txt index 02b8032c..e416d2d0 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.Scrolled.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.Scrolled.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| ~ 17 line 17 changed | ~ 17 line 17 | -| 18 line 18 | 18 line 18 | -| 19 line 19 | 19 line 19 | -| 20 line 20 | 20 line 20 | -| 21 line 21 | 21 line 21 | -| 22 line 22 | 22 line 22 | -| 23 line 23 | 23 line 23 | -| 24 line 24 | 24 line 24 | -| 25 line 25 | 25 line 25 | -| 26 line 26 | 26 line 26 | -| 27 line 27 | 27 line 27 | -| 28 line 28 | 28 line 28 | -| 29 line 29 | 29 line 29 | -| 30 line 30 | 30 line 30 | -| 31 line 31 | 31 line 31 | -| 32 line 32 | 32 line 32 | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 17-32 of 40 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| ~ 17 line 17 changed | ~ 17 line 17 | +| 18 line 18 | 18 line 18 | +| 19 line 19 | 19 line 19 | +| 20 line 20 | 20 line 20 | +| 21 line 21 | 21 line 21 | +| 22 line 22 | 22 line 22 | +| 23 line 23 | 23 line 23 | +| 24 line 24 | 24 line 24 | +| 25 line 25 | 25 line 25 | +| 26 line 26 | 26 line 26 | +| 27 line 27 | 27 line 27 | +| 28 line 28 | 28 line 28 | +| 29 line 29 | 29 line 29 | +| 30 line 30 | 30 line 30 | +| 31 line 31 | 31 line 31 | +| 32 line 32 | 32 line 32 | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] [Prev change] [Next change] [Changes only] lines 17-32 of 40 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.WhitespaceOnly.verified.txt b/src/DiffEngineViewer.Tests/FileScreenTests.WhitespaceOnly.verified.txt index 0f4ad098..2043601c 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.WhitespaceOnly.verified.txt +++ b/src/DiffEngineViewer.Tests/FileScreenTests.WhitespaceOnly.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.received.txt <> Sample.verified.txt diff | -+----------------------------------------------+-----------------------------------------------+ -| Sample.received.txt | Sample.verified.txt | -+----------------------------------------------+-----------------------------------------------+ -| 1 the quick | 1 the quick | -| ~ 2 brown fox | ~ 2 brown fox | -| ~ 3 dog | ~ 3 dog | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] lines 1-3 of 3 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.received.txt <> Sample.verified.txt diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| Sample.received.txt | Sample.verified.txt | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 the quick | 1 the quick | +| ~ 2 brown fox | ~ 2 brown fox | +| ~ 3 dog | ~ 3 dog | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) [Changes only] lines 1-3 of 3 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/FileScreenTests.cs b/src/DiffEngineViewer.Tests/FileScreenTests.cs index ce53bbef..8dea7793 100644 --- a/src/DiffEngineViewer.Tests/FileScreenTests.cs +++ b/src/DiffEngineViewer.Tests/FileScreenTests.cs @@ -49,11 +49,51 @@ public Task AtEnd() return Verify(Fixtures.Render(Apply(state, CommandKind.ScrollEnd))); } + /// + /// The second change, with the three rows leading into it above it. + /// [Test] public Task NextChange() { var state = Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); - return Verify(Fixtures.Render(Apply(state, CommandKind.NextChange, CommandKind.NextChange))); + return Verify(Fixtures.Render(Apply(state, CommandKind.NextChange))); + } + + /// + /// A comparison whose first change is far down the file opens on that change rather than on + /// line 1, which is the part of the file nothing is wrong with. + /// + [Test] + public Task OpensAtTheFirstChange() => + Verify(Fixtures.Render(Fixtures.File(Fixtures.Deep(true), Fixtures.Deep(false)))); + + /// + /// Only the changes and the three rows either side of each, with every longer run of unchanged + /// rows folded into one row saying how many it stands for. + /// + [Test] + public Task Minimal() + { + var state = Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); + return Verify(Fixtures.Render(Apply(state, CommandKind.ToggleMinimal))); + } + + [Test] + public Task MinimalAtEnd() + { + var state = Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); + return Verify(Fixtures.Render(Apply(state, CommandKind.ToggleMinimal, CommandKind.ScrollEnd))); + } + + /// + /// Nothing differs, so everything folds: one row saying so rather than an empty pane, which + /// would read as a comparison with nothing in it. + /// + [Test] + public Task MinimalNoDifferences() + { + var state = Fixtures.File(Fixtures.Long(false), Fixtures.Long(false)); + return Verify(Fixtures.Render(Apply(state, CommandKind.ToggleMinimal))); } static SessionState Apply(SessionState state, params CommandKind[] commands) diff --git a/src/DiffEngineViewer.Tests/Fixtures.cs b/src/DiffEngineViewer.Tests/Fixtures.cs index 9ac8479e..212e860d 100644 --- a/src/DiffEngineViewer.Tests/Fixtures.cs +++ b/src/DiffEngineViewer.Tests/Fixtures.cs @@ -2,8 +2,13 @@ static class Fixtures { /// /// Fixed so every screen snapshot has the same grid. 24 rows leaves 16 body rows. + /// + /// Wide enough for the fullest footer the snapshots carry - a conflicted entry's buttons beside + /// the accept-all summary - with its status whole. A footer that runs out of room loses the end + /// of its status line, and the status line is what half these snapshots are about. + /// /// - public const int Columns = 96; + public const int Columns = 136; public const int Rows = 24; @@ -50,6 +55,32 @@ public static string Long(bool changed) return builder.ToString(); } + /// + /// Sixty lines changed only at 30 and 50, so an entry holding it opens well below its first + /// line - on row 26, three above the first change - and the minimal view has a run to fold + /// before, between and after the two. + /// + public static string Deep(bool changed) + { + var builder = new StringBuilder(); + for (var index = 1; index <= 60; index++) + { + if (index > 1) + { + builder.Append('\n'); + } + + builder.Append($"line {index:D2}"); + if (changed && + index is 30 or 50) + { + builder.Append(" changed"); + } + } + + return builder.ToString(); + } + public static SessionState File(string left = Received, string right = Expected) => ViewerSession.EnqueueFile( SessionState.Start(ViewerMode.File, Columns, Rows), @@ -70,6 +101,17 @@ public static SessionState Inline(params InlinePatch[] patches) return state; } + /// + /// The source of a raw string literal holding a text, for a patch whose expected side has to be + /// that text. A patch with no expression is a new snapshot, every line of which is a change, so + /// where its first change is says nothing. + /// + public static string Literal(string text) + { + var lines = text.Split('\n').Select(_ => $" {_}"); + return $"\"\"\"\n{string.Join("\n", lines)}\n \"\"\""; + } + public static InlinePatch Patch( string source = "SampleTests.cs", int line = 42, diff --git a/src/DiffEngineViewer.Tests/FsharpEntryTests.Screen.verified.txt b/src/DiffEngineViewer.Tests/FsharpEntryTests.Screen.verified.txt index 5c5b3822..fc813847 100644 --- a/src/DiffEngineViewer.Tests/FsharpEntryTests.Screen.verified.txt +++ b/src/DiffEngineViewer.Tests/FsharpEntryTests.Screen.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.fs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.fs:42 | 1 the quick | 1 the quick | -| | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.fs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.fs:42 | 1 the quick | 1 the quick | +| | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.DeleteInQueue.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.DeleteInQueue.verified.txt index b22273e2..642c1be2 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.DeleteInQueue.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.DeleteInQueue.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| extra.verified.png inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | (deleted) | extra.verified.png | -+----------------------+-----------------------------------+-----------------------------------+ -| > extra.verified.png | | - 1 format PNG | -| | | - 2 dimensions 800 x 600 | -| | | - 3 bytes 12,384 | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept delete] [Discard] [Accept all] only extra.verified.png exists | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| extra.verified.png inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | (deleted) | extra.verified.png | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > extra.verified.png | | - 1 format PNG | +| | | - 2 dimensions 800 x 600 | +| | | - 3 bytes 12,384 | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept delete] [Discard] [Accept all] (Prev change) (Next change) (Changes only) only extra.verified.png exists | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.Differs.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.Differs.verified.txt index e0014aca..91d121fe 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.Differs.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.Differs.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| 1 format PNG | 1 format PNG | -| ~ 2 dimensions 800 x 600 | ~ 2 dimensions 640 x 480 | -| ~ 3 bytes 12,384 | ~ 3 bytes 9,120 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] images differ | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 format PNG | 1 format PNG | +| ~ 2 dimensions 800 x 600 | ~ 2 dimensions 640 x 480 | +| ~ 3 bytes 12,384 | ~ 3 bytes 9,120 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) images differ | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.FormatChanged.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.FormatChanged.verified.txt index 1b736a86..21aea71c 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.FormatChanged.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.FormatChanged.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| ~ 1 format PNG | ~ 1 format JPEG | -| 2 dimensions 800 x 600 | 2 dimensions 800 x 600 | -| ~ 3 bytes 12,384 | ~ 3 bytes 4,002 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] images differ | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| ~ 1 format PNG | ~ 1 format JPEG | +| 2 dimensions 800 x 600 | 2 dimensions 800 x 600 | +| ~ 3 bytes 12,384 | ~ 3 bytes 4,002 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) images differ | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.Identical.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.Identical.verified.txt index 026f9157..0472cf35 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.Identical.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.Identical.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| 1 format PNG | 1 format PNG | -| 2 dimensions 800 x 600 | 2 dimensions 800 x 600 | -| 3 bytes 12,384 | 3 bytes 12,384 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] images are identical | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| 1 format PNG | 1 format PNG | +| 2 dimensions 800 x 600 | 2 dimensions 800 x 600 | +| 3 bytes 12,384 | 3 bytes 12,384 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) images are identical | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.MoveInQueue.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.MoveInQueue.verified.txt index 07eb6aa7..87ae79cc 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.MoveInQueue.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.MoveInQueue.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.Test (png) inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | sample.received.png | sample.verified.png | -+----------------------+-----------------------------------+-----------------------------------+ -| > Sample.Test (png) | 1 format PNG | 1 format PNG | -| | ~ 2 dimensions 800 x 600 | ~ 2 dimensions 640 x 480 | -| | ~ 3 bytes 12,384 | ~ 3 bytes 9,120 | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept move] [Discard] [Accept all] images differ | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.Test (png) inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | sample.received.png | sample.verified.png | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > Sample.Test (png) | 1 format PNG | 1 format PNG | +| | ~ 2 dimensions 800 x 600 | ~ 2 dimensions 640 x 480 | +| | ~ 3 bytes 12,384 | ~ 3 bytes 9,120 | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept move] [Discard] [Accept all] (Prev change) (Next change) (Changes only) images differ | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.NewImage.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.NewImage.verified.txt index d4c764d1..6c2663a7 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.NewImage.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.NewImage.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| + 1 format PNG | | -| + 2 dimensions 800 x 600 | | -| + 3 bytes 12,384 | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] only sample.received.png exists | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| + 1 format PNG | | +| + 2 dimensions 800 x 600 | | +| + 3 bytes 12,384 | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) only sample.received.png exists | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.NotRecognized.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.NotRecognized.verified.txt index 4550f57a..19c889a9 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.NotRecognized.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.NotRecognized.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| ~ 1 format not recognized | ~ 1 format PNG | -| ~ 2 dimensions unknown | ~ 2 dimensions 800 x 600 | -| ~ 3 bytes 27 | ~ 3 bytes 12,384 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] images differ | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| ~ 1 format not recognized | ~ 1 format PNG | +| ~ 2 dimensions unknown | ~ 2 dimensions 800 x 600 | +| ~ 3 bytes 27 | ~ 3 bytes 12,384 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) images differ | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/ImageScreenTests.Unreadable.verified.txt b/src/DiffEngineViewer.Tests/ImageScreenTests.Unreadable.verified.txt index 4949702d..6aea74d6 100644 --- a/src/DiffEngineViewer.Tests/ImageScreenTests.Unreadable.verified.txt +++ b/src/DiffEngineViewer.Tests/ImageScreenTests.Unreadable.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| sample.received.png <> sample.verified.png diff | -+----------------------------------------------+-----------------------------------------------+ -| sample.received.png | sample.verified.png | -+----------------------------------------------+-----------------------------------------------+ -| ~ 1 format not recognized | ~ 1 format PNG | -| ~ 2 dimensions unknown | ~ 2 dimensions 800 x 600 | -| ~ 3 bytes unreadable | ~ 3 bytes 12,384 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| [Accept] [Close] images could not be compared | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| sample.received.png <> sample.verified.png diff | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| sample.received.png | sample.verified.png | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| ~ 1 format not recognized | ~ 1 format PNG | +| ~ 2 dimensions unknown | ~ 2 dimensions 800 x 600 | +| ~ 3 bytes unreadable | ~ 3 bytes 12,384 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| [Accept] [Close] (Prev change) (Next change) (Changes only) images could not be compared | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAccept.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAccept.verified.txt index 869dafc1..4efb8fa2 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAccept.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAccept.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:88 inline 1 of 4 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (4) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | -| OtherTests.cs:12 | | | -| OtherTests.cs:30 | | | -| WideNamedTests.cs> | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] Applied SampleTests.cs:42 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:88 inline 1 of 4 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (4) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | +| OtherTests.cs:12 | | | +| OtherTests.cs:30 | | | +| WideNamedTests.cs> | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] Applied SampleTests.cs:42 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAll.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAll.verified.txt index b251b0f5..513ef359 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAll.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAll.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| nothing pending inline | -+----------------------------------------------+-----------------------------------------------+ -| received | expected | -+----------------------------------------------+-----------------------------------------------+ -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| (Accept) (Discard) (Accept all) Accepted 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| nothing pending inline | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| received | expected | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| (Accept) (Discard) (Accept all) (Prev change) (Next change) (Changes only) Accepted 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAllSkipsConflicts.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAllSkipsConflicts.verified.txt index c0821159..3022e37a 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAllSkipsConflicts.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterAcceptAllSkipsConflicts.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received (net8.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > * SampleTests.cs:> | 1 the quick | 1 the quick | -| | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 1/2: net8.0] Accepted 1, 1 conflict needs review | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received (net8.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > * SampleTests.cs:> | 1 the quick | 1 the quick | +| | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 1/2: net8.0] Accepted 1, 1 conflict needs review | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterDiscard.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterDiscard.verified.txt index 7eddcbb0..71f2fc31 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.AfterDiscard.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.AfterDiscard.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:88 inline 1 of 4 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (4) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | -| OtherTests.cs:12 | | | -| OtherTests.cs:30 | | | -| WideNamedTests.cs> | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] Discarded SampleTests.cs:42 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:88 inline 1 of 4 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (4) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | +| OtherTests.cs:12 | | | +| OtherTests.cs:30 | | | +| WideNamedTests.cs> | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] Discarded SampleTests.cs:42 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedSolution.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedSolution.verified.txt index 48d8fb77..bee2c466 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedSolution.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedSolution.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| BTests.cs:42 inline 3 of 3 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (3) | received (net8.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| + SolutionA (2) | ~ 1 eight | ~ 1 the quick | -| - SolutionB (1) | | - 2 brown fox | -| > * BTests.cs:42 | | - 3 jumps over | -| | | - 4 the lazy | -| | | - 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 1/2: net8.0] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| BTests.cs:42 inline 3 of 3 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (3) | received (net8.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| + SolutionA (2) | ~ 1 eight | ~ 1 the quick | +| - SolutionB (1) | | - 2 brown fox | +| > * BTests.cs:42 | | - 3 jumps over | +| | | - 4 the lazy | +| | | - 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 1/2: net8.0] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedTestGroup.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedTestGroup.verified.txt index 3343592c..8f00e9aa 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedTestGroup.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.CollapsedTestGroup.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| BTests.cs:42 inline 3 of 3 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (3) | received (net8.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - SolutionA (2) | ~ 1 eight | ~ 1 the quick | -| + Compare handles> | | - 2 brown fox | -| - SolutionB (1) | | - 3 jumps over | -| > * BTests.cs:42 | | - 4 the lazy | -| | | - 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 1/2: net8.0] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| BTests.cs:42 inline 3 of 3 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (3) | received (net8.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - SolutionA (2) | ~ 1 eight | ~ 1 the quick | +| + Compare handles> | | - 2 brown fox | +| - SolutionB (1) | | - 3 jumps over | +| > * BTests.cs:42 | | - 4 the lazy | +| | | - 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 1/2: net8.0] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.CollidingNames.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.CollidingNames.verified.txt index 54135cd5..236fb9b3 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.CollidingNames.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.CollidingNames.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > ProjA/SampleTests> | 1 the quick | 1 the quick | -| ProjB/SampleTests> | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > ProjA/SampleTests> | 1 the quick | 1 the quick | +| ProjB/SampleTests> | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedEntry.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedEntry.verified.txt index 000a6050..3ccce537 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedEntry.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedEntry.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received (net8.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > * SampleTests.cs:> | 1 the quick | 1 the quick | -| OtherTests.cs:12 | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 1/2: net8.0] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received (net8.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > * SampleTests.cs:> | 1 the quick | 1 the quick | +| OtherTests.cs:12 | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 1/2: net8.0] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedSecondVariant.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedSecondVariant.verified.txt index f21ce68f..f650a981 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedSecondVariant.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.ConflictedSecondVariant.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received (net9.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > * SampleTests.cs:> | 1 the quick | 1 the quick | -| OtherTests.cs:12 | ~ 2 brown wolf | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 2/2: net9.0] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received (net9.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > * SampleTests.cs:> | 1 the quick | 1 the quick | +| OtherTests.cs:12 | ~ 2 brown wolf | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 2/2: net9.0] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.DeleteEntry.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.DeleteEntry.verified.txt index 42c71362..cdd2868d 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.DeleteEntry.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.DeleteEntry.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| extra.verified.txt inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | (deleted) | extra.verified.txt | -+----------------------+-----------------------------------+-----------------------------------+ -| > extra.verified.txt | | - 1 the quick | -| | | - 2 brown fox | -| | | - 3 jumps over | -| | | - 4 the lazy | -| | | - 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept delete] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| extra.verified.txt inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | (deleted) | extra.verified.txt | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > extra.verified.txt | | - 1 the quick | +| | | - 2 brown fox | +| | | - 3 jumps over | +| | | - 4 the lazy | +| | | - 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept delete] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.EmptyQueue.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.EmptyQueue.verified.txt index 1bf632de..6d676183 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.EmptyQueue.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.EmptyQueue.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| nothing pending inline | -+----------------------------------------------+-----------------------------------------------+ -| received | expected | -+----------------------------------------------+-----------------------------------------------+ -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -+----------------------------------------------+-----------------------------------------------+ -| (Accept) (Discard) (Accept all) nothing pending | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| nothing pending inline | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| received | expected | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | ++------------------------------------------------------------------+-------------------------------------------------------------------+ +| (Accept) (Discard) (Accept all) (Prev change) (Next change) (Changes only) nothing pending | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApply.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApply.verified.txt index 8e60f6ef..5e38877f 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApply.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApply.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 5 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (5) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42> | 1 the quick | 1 the quick | -| SampleTests.cs:88 | ~ 2 brown dog | ~ 2 brown fox | -| OtherTests.cs:12 | 3 jumps over | 3 jumps over | -| OtherTests.cs:30 | 4 the lazy | 4 the lazy | -| WideNamedTests.cs> | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] Failed to write: SampleTests.cs | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 5 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (5) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42> | 1 the quick | 1 the quick | +| SampleTests.cs:88 | ~ 2 brown dog | ~ 2 brown fox | +| OtherTests.cs:12 | 3 jumps over | 3 jumps over | +| OtherTests.cs:30 | 4 the lazy | 4 the lazy | +| WideNamedTests.cs> | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] Failed to write: SampleTests.cs | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApplyThenAcceptAll.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApplyThenAcceptAll.verified.txt index c35a6505..d9bc7886 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApplyThenAcceptAll.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.FailedApplyThenAcceptAll.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 5 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (5) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42> | 1 the quick | 1 the quick | -| SampleTests.cs:88> | ~ 2 brown dog | ~ 2 brown fox | -| OtherTests.cs:12 ! | 3 jumps over | 3 jumps over | -| OtherTests.cs:30 ! | 4 the lazy | 4 the lazy | -| WideNamedTests.cs> | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] Accepted 0, 5 failed | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 5 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (5) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42> | 1 the quick | 1 the quick | +| SampleTests.cs:88> | ~ 2 brown dog | ~ 2 brown fox | +| OtherTests.cs:12 ! | 3 jumps over | 3 jumps over | +| OtherTests.cs:30 ! | 4 the lazy | 4 the lazy | +| WideNamedTests.cs> | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] Accepted 0, 5 failed | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.GroupedByTest.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.GroupedByTest.verified.txt index 460331bd..00b1fa73 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.GroupedByTest.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.GroupedByTest.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:10 inline 1 of 3 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (3) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - Compare handles n> | 1 the quick | 1 the quick | -| > SampleTests.cs:> | ~ 2 brown dog | ~ 2 brown fox | -| SampleTests.cs:> | 3 jumps over | 3 jumps over | -| Order is stable | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:10 inline 1 of 3 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (3) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - Compare handles n> | 1 the quick | 1 the quick | +| > SampleTests.cs:> | ~ 2 brown dog | ~ 2 brown fox | +| SampleTests.cs:> | 3 jumps over | 3 jumps over | +| Order is stable | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.LongQueueScrollsToSelection.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.LongQueueScrollsToSelection.verified.txt index ab06ac22..77641862 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.LongQueueScrollsToSelection.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.LongQueueScrollsToSelection.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:18 inline 18 of 20 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (20) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| SampleTests.cs:4 | ~ 1 b | ~ 1 a | -| SampleTests.cs:5 | | | -| SampleTests.cs:6 | | | -| SampleTests.cs:7 | | | -| SampleTests.cs:8 | | | -| SampleTests.cs:9 | | | -| SampleTests.cs:10 | | | -| SampleTests.cs:11 | | | -| SampleTests.cs:12 | | | -| SampleTests.cs:13 | | | -| SampleTests.cs:14 | | | -| SampleTests.cs:15 | | | -| SampleTests.cs:16 | | | -| SampleTests.cs:17 | | | -| > SampleTests.cs:18 | | | -| SampleTests.cs:19 | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-1 of 1 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:18 inline 18 of 20 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (20) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| SampleTests.cs:4 | ~ 1 b | ~ 1 a | +| SampleTests.cs:5 | | | +| SampleTests.cs:6 | | | +| SampleTests.cs:7 | | | +| SampleTests.cs:8 | | | +| SampleTests.cs:9 | | | +| SampleTests.cs:10 | | | +| SampleTests.cs:11 | | | +| SampleTests.cs:12 | | | +| SampleTests.cs:13 | | | +| SampleTests.cs:14 | | | +| SampleTests.cs:15 | | | +| SampleTests.cs:16 | | | +| SampleTests.cs:17 | | | +| > SampleTests.cs:18 | | | +| SampleTests.cs:19 | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-1 of 1 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.LongSolutionNames.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.LongSolutionNames.verified.txt index 91d6bdef..cc6ebaad 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.LongSolutionNames.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.LongSolutionNames.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| ATests.cs:10 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - AVeryLongWindedSo> | 1 the quick | 1 the quick | -| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | -| - SolutionB (1) | 3 jumps over | 3 jumps over | -| BTests.cs:30 | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| ATests.cs:10 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - AVeryLongWindedSo> | 1 the quick | 1 the quick | +| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | +| - SolutionB (1) | 3 jumps over | 3 jumps over | +| BTests.cs:30 | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnConflictedEntry.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnConflictedEntry.verified.txt index 82726a00..b75c67ca 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnConflictedEntry.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnConflictedEntry.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received (net8.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > * SampleTests.cs:> | 1 the quick | 1 the quick | -| +------------------------+ 2 brown dog | ~ 2 brown fox | -| | Accept | 3 jumps over | 3 jumps over | -| | Show next variant | 4 the lazy | 4 the lazy | -| | Discard | 5 dog | 5 dog | -| | Open source file | | | -| | Copy received (net8.0) | | | -| | Copy expected | | | -| +------------------------+ | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] [Variant 1/2: net8.0] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received (net8.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > * SampleTests.cs:> | 1 the quick | 1 the quick | +| +------------------------+ 2 brown dog | ~ 2 brown fox | +| | Accept | 3 jumps over | 3 jumps over | +| | Show next variant | 4 the lazy | 4 the lazy | +| | Discard | 5 dog | 5 dog | +| | Open source file | | | +| | Copy received (net8.0) | | | +| | Copy expected | | | +| +------------------------+ | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] [Variant 1/2: net8.0] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnEntry.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnEntry.verified.txt index 8d98e16c..0dcb2759 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnEntry.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnEntry.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 5 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (5) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | 1 the quick | 1 the quick | -| +------------------+| ~ 2 brown dog | ~ 2 brown fox | -| | Accept || 3 jumps over | 3 jumps over | -| | Discard || 4 the lazy | 4 the lazy | -| | Open source file || 5 dog | 5 dog | -| | Copy received || | | -| | Copy expected || | | -| +------------------+| | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 5 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (5) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | 1 the quick | 1 the quick | +| +------------------+| ~ 2 brown dog | ~ 2 brown fox | +| | Accept || 3 jumps over | 3 jumps over | +| | Discard || 4 the lazy | 4 the lazy | +| | Open source file || 5 dog | 5 dog | +| | Copy received || | | +| | Copy expected || | | +| +------------------+| | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnMove.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnMove.verified.txt index 23e21f96..7bf2994e 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnMove.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnMove.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.Test (txt) inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | sample.received.txt | sample.verified.txt | -+----------------------+-----------------------------------+-----------------------------------+ -| > Sample.Test (txt) | 1 the quick | 1 the quick | -| +--------------------------+ brown dog | ~ 2 brown fox | -| | Accept move | jumps over | 3 jumps over | -| | Discard | the lazy | 4 the lazy | -| | Open target directory | dog | 5 dog | -| | Copy sample.received.txt | | | -| | Copy sample.verified.txt | | | -| +--------------------------+ | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept move] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.Test (txt) inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | sample.received.txt | sample.verified.txt | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > Sample.Test (txt) | 1 the quick | 1 the quick | +| +--------------------------+ brown dog | ~ 2 brown fox | +| | Accept move | jumps over | 3 jumps over | +| | Discard | the lazy | 4 the lazy | +| | Open target directory | dog | 5 dog | +| | Copy sample.received.txt | | | +| | Copy sample.verified.txt | | | +| +--------------------------+ | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept move] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnSolutionHeader.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnSolutionHeader.verified.txt index 0ec0667b..005b7320 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnSolutionHeader.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MenuOnSolutionHeader.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| ATests.cs:10 inline 1 of 3 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (3) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - SolutionA (2) | 1 the quick | 1 the quick | -| >+--------------------------+ brown dog | ~ 2 brown fox | -| | Collapse | jumps over | 3 jumps over | -| -| Accept all in SolutionA | the lazy | 4 the lazy | -| | Discard all in SolutionA | dog | 5 dog | -| +--------------------------+ | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| ATests.cs:10 inline 1 of 3 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (3) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - SolutionA (2) | 1 the quick | 1 the quick | +| >+--------------------------+ brown dog | ~ 2 brown fox | +| | Collapse | jumps over | 3 jumps over | +| -| Accept all in SolutionA | the lazy | 4 the lazy | +| | Discard all in SolutionA | dog | 5 dog | +| +--------------------------+ | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MergedOriginLabels.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MergedOriginLabels.verified.txt index 94d68690..e1509f22 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MergedOriginLabels.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MergedOriginLabels.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received (net8.0, net9.0) | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | 1 the quick | 1 the quick | -| | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received (net8.0, net9.0) | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | 1 the quick | 1 the quick | +| | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MixedKindsGrouped.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MixedKindsGrouped.verified.txt index 483998aa..3eee98e1 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MixedKindsGrouped.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MixedKindsGrouped.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| ATests.cs:10 inline 1 of 4 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (4) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - SolutionA (2) | 1 the quick | 1 the quick | -| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | -| OtherTests.cs:20 | 3 jumps over | 3 jumps over | -| - SolutionB (2) | 4 the lazy | 4 the lazy | -| Sample.Test (tx> | 5 dog | 5 dog | -| extra.verified.> | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| ATests.cs:10 inline 1 of 4 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (4) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - SolutionA (2) | 1 the quick | 1 the quick | +| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | +| OtherTests.cs:20 | 3 jumps over | 3 jumps over | +| - SolutionB (2) | 4 the lazy | 4 the lazy | +| Sample.Test (tx> | 5 dog | 5 dog | +| extra.verified.> | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.MoveEntry.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.MoveEntry.verified.txt index 6848b68c..094abc3f 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.MoveEntry.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.MoveEntry.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| Sample.Test (txt) inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | sample.received.txt | sample.verified.txt | -+----------------------+-----------------------------------+-----------------------------------+ -| > Sample.Test (txt) | 1 the quick | 1 the quick | -| | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept move] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| Sample.Test (txt) inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | sample.received.txt | sample.verified.txt | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > Sample.Test (txt) | 1 the quick | 1 the quick | +| | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept move] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.NewSnapshot.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.NewSnapshot.verified.txt index e389e11c..1e2fb584 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.NewSnapshot.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.NewSnapshot.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received | expected (new snapshot) | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | + 1 the quick | | -| | + 2 brown dog | | -| | + 3 jumps over | | -| | + 4 the lazy | | -| | + 5 dog | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received | expected (new snapshot) | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | + 1 the quick | | +| | + 2 brown dog | | +| | + 3 jumps over | | +| | + 4 the lazy | | +| | + 5 dog | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.Queue.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.Queue.verified.txt index c806f6b8..4e06e083 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.Queue.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.Queue.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 5 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (5) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | 1 the quick | 1 the quick | -| SampleTests.cs:88 | ~ 2 brown dog | ~ 2 brown fox | -| OtherTests.cs:12 | 3 jumps over | 3 jumps over | -| OtherTests.cs:30 | 4 the lazy | 4 the lazy | -| WideNamedTests.cs> | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 5 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (5) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | 1 the quick | 1 the quick | +| SampleTests.cs:88 | ~ 2 brown dog | ~ 2 brown fox | +| OtherTests.cs:12 | 3 jumps over | 3 jumps over | +| OtherTests.cs:30 | 4 the lazy | 4 the lazy | +| WideNamedTests.cs> | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.SecondItemSelected.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.SecondItemSelected.verified.txt index 51e78be4..a4eb6cfa 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.SecondItemSelected.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.SecondItemSelected.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:88 inline 2 of 5 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (5) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| SampleTests.cs:42 | ~ 1 two | ~ 1 one | -| > SampleTests.cs:88 | | | -| OtherTests.cs:12 | | | -| OtherTests.cs:30 | | | -| WideNamedTests.cs> | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-1 of 1 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:88 inline 2 of 5 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (5) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| SampleTests.cs:42 | ~ 1 two | ~ 1 one | +| > SampleTests.cs:88 | | | +| OtherTests.cs:12 | | | +| OtherTests.cs:30 | | | +| WideNamedTests.cs> | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-1 of 1 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.Single.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.Single.verified.txt index 41519ebf..1947d79e 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.Single.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.Single.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | 1 the quick | 1 the quick | -| | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | 1 the quick | 1 the quick | +| | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.SolutionAndUngrouped.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.SolutionAndUngrouped.verified.txt index 430a15ca..300f4338 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.SolutionAndUngrouped.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.SolutionAndUngrouped.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 2 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - SolutionA (1) | 1 the quick | 1 the quick | -| ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | -| > SampleTests.cs:42 | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 2 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - SolutionA (1) | 1 the quick | 1 the quick | +| ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | +| > SampleTests.cs:42 | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.StalePatch.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.StalePatch.verified.txt index aac0ab39..f0864ec9 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.StalePatch.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.StalePatch.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:88 inline 1 of 4 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (4) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | -| OtherTests.cs:12 | | | -| OtherTests.cs:30 | | | -| WideNamedTests.cs> | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] SampleTests.cs:42 not written. Could not locate the VerifyI> | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:88 inline 1 of 4 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (4) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:88 | ~ 1 two | ~ 1 one | +| OtherTests.cs:12 | | | +| OtherTests.cs:30 | | | +| WideNamedTests.cs> | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] SampleTests.cs:42 not written. Could not locate the Veri> | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.TestNameLabels.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.TestNameLabels.verified.txt index 6bb9a404..9e04a0c4 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.TestNameLabels.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.TestNameLabels.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 2 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (2) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| > Compare handles n> | 1 the quick | 1 the quick | -| OtherTests.cs:12 | ~ 2 brown dog | ~ 2 brown fox | -| | 3 jumps over | 3 jumps over | -| | 4 the lazy | 4 the lazy | -| | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 2 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (2) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > Compare handles n> | 1 the quick | 1 the quick | +| OtherTests.cs:12 | ~ 2 brown dog | ~ 2 brown fox | +| | 3 jumps over | 3 jumps over | +| | 4 the lazy | 4 the lazy | +| | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.TwoSolutions.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.TwoSolutions.verified.txt index c49e58a7..05fc4d7b 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.TwoSolutions.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.TwoSolutions.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| ATests.cs:10 inline 1 of 3 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (3) | received | expected | -+----------------------+-----------------------------------+-----------------------------------+ -| - SolutionA (2) | 1 the quick | 1 the quick | -| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | -| OtherTests.cs:20 | 3 jumps over | 3 jumps over | -| - SolutionB (1) | 4 the lazy | 4 the lazy | -| BTests.cs:30 | 5 dog | 5 dog | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] lines 1-5 of 5 | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| ATests.cs:10 inline 1 of 3 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (3) | received | expected | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| - SolutionA (2) | 1 the quick | 1 the quick | +| > ATests.cs:10 | ~ 2 brown dog | ~ 2 brown fox | +| OtherTests.cs:20 | 3 jumps over | 3 jumps over | +| - SolutionB (1) | 4 the lazy | 4 the lazy | +| BTests.cs:30 | 5 dog | 5 dog | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] lines 1-5 of 5 | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/InlineScreenTests.UnparsedExpression.verified.txt b/src/DiffEngineViewer.Tests/InlineScreenTests.UnparsedExpression.verified.txt index ddc1bc7d..51d49255 100644 --- a/src/DiffEngineViewer.Tests/InlineScreenTests.UnparsedExpression.verified.txt +++ b/src/DiffEngineViewer.Tests/InlineScreenTests.UnparsedExpression.verified.txt @@ -1,24 +1,24 @@ -+----------------------------------------------------------------------------------------------+ -| SampleTests.cs:42 inline 1 of 1 | -+----------------------+-----------------------------------+-----------------------------------+ -| Pending (1) | received | expected (literal not parsed) | -+----------------------+-----------------------------------+-----------------------------------+ -| > SampleTests.cs:42 | ~ 1 the quick | ~ 1 $"the {value} fox" | -| | + 2 brown dog | | -| | + 3 jumps over | | -| | + 4 the lazy | | -| | + 5 dog | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -| | | | -+----------------------+-----------------------------------+-----------------------------------+ -| [Accept] [Discard] [Accept all] Existing expected argument is not a plain string literal. S> | -+----------------------------------------------------------------------------------------------+ \ No newline at end of file ++--------------------------------------------------------------------------------------------------------------------------------------+ +| SampleTests.cs:42 inline 1 of 1 | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| Pending (1) | received | expected (literal not parsed) | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| > SampleTests.cs:42 | ~ 1 the quick | ~ 1 $"the {value} fox" | +| | + 2 brown dog | | +| | + 3 jumps over | | +| | + 4 the lazy | | +| | + 5 dog | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | ++----------------------+-------------------------------------------------------+-------------------------------------------------------+ +| [Accept] [Discard] [Accept all] (Prev change) (Next change) [Changes only] Existing expected argument is not a plain string literal> | ++--------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/MinimalViewTests.cs b/src/DiffEngineViewer.Tests/MinimalViewTests.cs new file mode 100644 index 00000000..d4585cd8 --- /dev/null +++ b/src/DiffEngineViewer.Tests/MinimalViewTests.cs @@ -0,0 +1,259 @@ +/// +/// The minimal view: only the changes, each with three rows either side, and every longer run of +/// unchanged rows folded into one row. changes rows 2, 16 and 32 of 40, +/// which folds to 23 rows: lines 1-6, a fold of 7, lines 14-20, a fold of 9, lines 30-36 and a fold +/// of 4. +/// +public class MinimalViewTests +{ + [Test] + public async Task Folds_every_unchanged_run_longer_than_one_row() + { + var view = Minimal(Long()).View!; + + await Assert.That(view.Count).IsEqualTo(23); + await Assert.That(Folds(view)).IsEqualTo( + "... 7 unchanged lines ... | ... 9 unchanged lines ... | ... 4 unchanged lines ..."); + } + + /// + /// One unchanged row between two changes' context would fold into a row of its own, taking the + /// same space as the line and saying less, so it is shown. Nothing else folds here either, and + /// then the minimal view is the full one rather than a copy of it. + /// + [Test] + public async Task A_single_row_between_two_contexts_is_shown() + { + var state = Fixtures.File(Lines(12, 1, 9), Lines(12)); + + var entry = state.Current!; + + await Assert.That(entry.View(true)).IsSameReferenceAs(entry.View(false)); + } + + [Test] + public async Task Everything_folds_when_nothing_changed() + { + var view = Minimal(Fixtures.File(Fixtures.Long(false), Fixtures.Long(false))).View!; + + await Assert.That(view.Count).IsEqualTo(1); + await Assert.That(Folds(view)).IsEqualTo("... 40 unchanged lines ..."); + } + + /// + /// A picture's rows are its properties, each worth reading, so there is nothing to fold and the + /// button that would is disabled rather than doing nothing. + /// + [Test] + public async Task A_picture_is_never_folded() + { + var state = Fixtures.Images(); + + var entry = state.Current!; + + await Assert.That(entry.View(true)).IsSameReferenceAs(entry.View(false)); + await Assert.That(Button(state, CommandKind.ToggleMinimal).Enabled).IsFalse(); + } + + /// + /// Switching views keeps the reader's place: the change on screen stays on the same line of + /// the screen while what is around it folds away, and comes back to where it was. + /// + [Test] + public async Task Switching_keeps_the_change_being_read_where_it_is_on_screen() + { + var full = ViewerSession.Apply(Long(), CommandKind.NextChange); + await Assert.That(ScreenLineOf(full, 17)).IsEqualTo(3); + + var minimal = ViewerSession.Apply(full, CommandKind.ToggleMinimal); + var back = ViewerSession.Apply(minimal, CommandKind.ToggleMinimal); + + await Assert.That(ScreenLineOf(minimal, 17)).IsEqualTo(3); + await Assert.That(back.Minimal).IsFalse(); + await Assert.That(back.ScrollTop).IsEqualTo(full.ScrollTop); + } + + /// + /// Nothing on screen survives folding when the reader was inside a run the minimal view folds, + /// so the fold standing for where they were is what goes at the top. + /// + [Test] + public async Task Folding_from_inside_a_folded_run_puts_that_fold_at_the_top() + { + var state = ViewerSession.Apply( + Fixtures.File(Fixtures.Deep(true), Fixtures.Deep(false)), + Command.Scroll(5)); + + var minimal = Minimal(state); + + await Assert.That(minimal.ScrollTop).IsEqualTo(0); + await Assert.That(ScreenBuilder.Build(minimal).Left.Rows[0].Kind).IsEqualTo(RowKind.Folded); + } + + /// + /// Navigation counts rows of the view on screen: the second change is row 10 of the minimal + /// view, brought in from row 7 with the three rows of its context above it, which is also the + /// last page of 23 rows in 16. + /// + [Test] + public async Task Change_navigation_counts_rows_of_the_minimal_view() + { + var minimal = Minimal(Long()); + + var next = ViewerSession.Apply(minimal, CommandKind.NextChange); + var past = ViewerSession.Apply(next, CommandKind.NextChange); + var back = ViewerSession.Apply(past, CommandKind.PreviousChange); + + await Assert.That(next.ScrollTop).IsEqualTo(7); + await Assert.That(ScreenLineOf(next, 17)).IsEqualTo(3); + await Assert.That(past.ScrollTop).IsEqualTo(7); + await Assert.That(back.ScrollTop).IsEqualTo(0); + } + + /// + /// The status line names the stretch of the file on screen, folds and all, rather than a + /// position in the list of rows the view happens to have: sixteen rows here run from line 1 to + /// line 30 of 40. + /// + [Test] + public async Task The_status_line_counts_lines_of_the_file() + { + var minimal = Minimal(Long()); + + await Assert.That(ScreenBuilder.Build(minimal).Status).IsEqualTo("lines 1-30 of 40"); + } + + /// + /// A view setting rather than something one entry has, so it holds for whatever is selected + /// next. + /// + [Test] + public async Task The_view_holds_across_entries() + { + var state = Fixtures.Inline( + Fixtures.Patch("A.cs", 1, Fixtures.Literal(Fixtures.Long(false)), Fixtures.Long(true)), + Fixtures.Patch("B.cs", 2, Fixtures.Literal(Fixtures.Long(false)), Fixtures.Long(true))); + + var stepped = ViewerSession.Apply(Minimal(state), CommandKind.NextItem); + + await Assert.That(stepped.Minimal).IsTrue(); + await Assert.That(stepped.Current!.Name).IsEqualTo("B.cs:2"); + await Assert.That(stepped.View!.Count).IsEqualTo(23); + } + + [Test] + public async Task The_fold_button_says_what_it_switches_to() + { + var state = Long(); + + await Assert.That(Button(state, CommandKind.ToggleMinimal).Label).IsEqualTo("Changes only"); + await Assert.That(Button(Minimal(state), CommandKind.ToggleMinimal).Label).IsEqualTo("All lines"); + } + + /// + /// The change buttons say whether there is a change left to go to, which is otherwise only + /// found out by scrolling. + /// + [Test] + public async Task The_change_buttons_are_enabled_only_with_somewhere_to_go() + { + var first = Long(); + var second = ViewerSession.Apply(first, CommandKind.NextChange); + var last = ViewerSession.Apply(second, CommandKind.NextChange); + + await Assert.That(Enabled(first)).IsEqualTo("previous: False, next: True"); + await Assert.That(Enabled(second)).IsEqualTo("previous: True, next: True"); + await Assert.That(Enabled(last)).IsEqualTo("previous: True, next: False"); + } + + /// + /// What is on screen is this window's to lay out however it likes, so switching is never + /// forwarded to the queue's owner the way accepting is. + /// + [Test] + public async Task Switching_is_local_when_displaying_someone_elses_queue() + { + var state = Fixtures.Attached(InlineQueue.Empty, Fixtures.Move()); + var link = new OwnerLink(new(state), port: 1); + + var switched = ViewerProgram.Apply( + state, + new(CommandKind.ToggleMinimal, -1, -1, 0, false, Fixtures.Columns, Fixtures.Rows), + link, + new NoWindow()); + + await Assert.That(switched.Minimal).IsTrue(); + await Assert.That(switched.Message).IsNull(); + } + + static SessionState Long() => + Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); + + static SessionState Minimal(SessionState state) => + ViewerSession.Apply(state, CommandKind.ToggleMinimal); + + /// + /// A text of numbered lines with some of them changed. + /// + static string Lines(int count, params int[] changed) => + string.Join( + "\n", + Enumerable + .Range(1, count) + .Select(_ => changed.Contains(_) ? $"line {_:D2} changed" : $"line {_:D2}")); + + static string Folds(DiffView view) => + string.Join( + " | ", + view.Left + .Where(_ => _.Kind == RowKind.Folded) + .Select(_ => _.Text)); + + static int ScreenLineOf(SessionState state, int line) + { + var rows = ScreenBuilder.Build(state).Left.Rows; + for (var index = 0; index < rows.Count; index++) + { + if (rows[index].LineNumber == line) + { + return index; + } + } + + throw new($"Line {line} is not on screen."); + } + + static Button Button(SessionState state, CommandKind command) => + ScreenBuilder.Build(state).Buttons.Single(_ => _.Command == command); + + static string Enabled(SessionState state) => + $"previous: {Button(state, CommandKind.PreviousChange).Enabled}, next: {Button(state, CommandKind.NextChange).Enabled}"; + + sealed class NoWindow : IViewerWindow + { + public bool Present(Screen screen) => + true; + + public ViewerInput Poll() => + default; + + public void SetHidden(bool hidden) + { + } + + public void Focus() + { + } + + public void SetClipboard(string text) + { + } + + public bool Capture(Screen screen, int width, int height, string pngPath) => + false; + + public void Dispose() + { + } + } +} diff --git a/src/DiffEngineViewer.Tests/OpeningTests.cs b/src/DiffEngineViewer.Tests/OpeningTests.cs new file mode 100644 index 00000000..a5747d0f --- /dev/null +++ b/src/DiffEngineViewer.Tests/OpeningTests.cs @@ -0,0 +1,120 @@ +/// +/// Where an entry is scrolled to when it comes on screen: its first change, with three rows above +/// it, rather than its first line. changes line 30 of 60, row 29, so +/// that is row 26 - well past the sixteen body rows a top of zero would show. +/// +/// Every way an entry arrives is here, because each used to reset the scroll on its own and one +/// left out would be the one entry a reader still has to go looking through. +/// +/// +public class OpeningTests +{ + [Test] + public async Task A_file_comparison() + { + var state = Fixtures.File(Fixtures.Deep(true), Fixtures.Deep(false)); + + await Assert.That(state.ScrollTop).IsEqualTo(26); + } + + [Test] + public async Task An_inline_snapshot() + { + var state = Fixtures.Inline(Patch("A.cs", 1)); + + await Assert.That(state.ScrollTop).IsEqualTo(26); + } + + /// + /// A pair arriving in an empty owning viewer, which is how a failing file snapshot reaches one. + /// + [Test] + public async Task A_tracked_pair() + { + var state = ViewerSession.EnqueueTracked( + SessionState.Start(ViewerMode.Inline, Fixtures.Columns, Fixtures.Rows), + Fixtures.Move(left: Fixtures.Deep(true), right: Fixtures.Deep(false))); + + await Assert.That(state.ScrollTop).IsEqualTo(26); + } + + /// + /// An attached viewer's first listing from the owner. + /// + [Test] + public async Task A_queue_read_from_its_owner() + { + var state = Fixtures.Attached(Fixtures.Pending(Patch("A.cs", 1))); + + await Assert.That(state.ScrollTop).IsEqualTo(26); + } + + [Test] + public async Task Stepping_to_the_next_entry() + { + var state = Fixtures.Inline(Fixtures.Patch(), Patch("B.cs", 2)); + + var stepped = ViewerSession.Apply(state, CommandKind.NextItem); + + await Assert.That(stepped.Current!.Name).IsEqualTo("B.cs:2"); + await Assert.That(stepped.ScrollTop).IsEqualTo(26); + } + + /// + /// A variant is different text, so it is met the way a different entry is. + /// + [Test] + public async Task Cycling_to_another_variant() + { + var shifted = Fixtures.Deep(true).Replace("line 50 changed", "line 50"); + var state = Fixtures.Inline( + Patch("A.cs", 1, Fixtures.Deep(true), "net8.0"), + Patch("A.cs", 1, $"line 01 changed{shifted[7..]}", "net9.0")); + var scrolled = ViewerSession.Apply(state, CommandKind.PageDown); + + var cycled = ViewerSession.Apply(scrolled, CommandKind.NextVariant); + + await Assert.That(cycled.Current!.SelectedVariant).IsEqualTo(1); + // That variant's first change is line 1, which has no rows above it to show. + await Assert.That(cycled.ScrollTop).IsEqualTo(0); + } + + [Test] + public async Task Nothing_changed_opens_at_the_top() + { + var state = Fixtures.File(Fixtures.Deep(false), Fixtures.Deep(false)); + + await Assert.That(state.ScrollTop).IsEqualTo(0); + } + + /// + /// A first change already on the first page, with fewer than three rows above it, leaves the + /// view where it was: there is nothing above it to scroll off. + /// + [Test] + public async Task A_change_near_the_top_opens_at_the_top() + { + var state = Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); + + await Assert.That(state.ScrollTop).IsEqualTo(0); + } + + /// + /// A first change on the last line opens on the last page, like any scroll that far. + /// + [Test] + public async Task A_change_on_the_last_line_opens_on_the_last_page() + { + var state = Fixtures.File($"{Fixtures.Deep(false)}!", Fixtures.Deep(false)); + + await Assert.That(state.ScrollTop).IsEqualTo(60 - ScreenBuilder.BodyRows(state)); + } + + static InlinePatch Patch(string source, int line, string? content = null, string? framework = null) => + Fixtures.Patch( + source, + line, + Fixtures.Literal(Fixtures.Deep(false)), + content ?? Fixtures.Deep(true), + framework: framework); +} diff --git a/src/DiffEngineViewer.Tests/PixelTests.cs b/src/DiffEngineViewer.Tests/PixelTests.cs index f8676859..e520c5a4 100644 --- a/src/DiffEngineViewer.Tests/PixelTests.cs +++ b/src/DiffEngineViewer.Tests/PixelTests.cs @@ -173,6 +173,16 @@ public Task InlineAccepted() return Capture(ViewerSession.Apply(state, CommandKind.Accept, Fixtures.Applied)); } + /// + /// The minimal view, whose folded rows are drawn dimmed on a band of their own and with no + /// line number. Mirrored in WindowsPixelTests over the same fixture. + /// + [Test] + [PixelTest] + [NotInParallel(nameof(PixelTests), Order = 10)] + public Task Minimal() => + Capture(ViewerSession.Apply(Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)), CommandKind.ToggleMinimal)); + static async Task Capture(SessionState state) { var screen = ScreenBuilder.Build(ViewerSession.Resize(state, columns, rows)); diff --git a/src/DiffEngineViewer.Tests/PreviousChangeTests.cs b/src/DiffEngineViewer.Tests/PreviousChangeTests.cs index f8c5ef43..ca29237f 100644 --- a/src/DiffEngineViewer.Tests/PreviousChangeTests.cs +++ b/src/DiffEngineViewer.Tests/PreviousChangeTests.cs @@ -1,6 +1,8 @@ /// /// Stepping back through the changed blocks of the entry on screen. Forty rows with changes at 3, -/// 17 and 33 - so rows 2, 16 and 32 - and sixteen body rows to show them in. +/// 17 and 33 - so rows 2, 16 and 32 - and sixteen body rows to show them in. A change is brought in +/// with three rows above it, so the places the three are shown from are rows 0, 13 and 24, the last +/// clamped to the final page. /// public class PreviousChangeTests { @@ -15,7 +17,7 @@ public async Task Lands_on_a_block_ending_just_above_the_viewport() var moved = ViewerSession.Apply(state, CommandKind.PreviousChange); - await Assert.That(moved.ScrollTop).IsEqualTo(16); + await Assert.That(moved.ScrollTop).IsEqualTo(13); } /// @@ -29,31 +31,49 @@ public async Task Reaches_the_first_block_from_the_row_below_it() var moved = ViewerSession.Apply(state, CommandKind.PreviousChange); - await Assert.That(moved.ScrollTop).IsEqualTo(2); + await Assert.That(moved.ScrollTop).IsEqualTo(0); } /// - /// A viewport that really is inside a block still steps off it, or previous would never leave - /// the block it is in. + /// A viewport showing a block from where navigation puts it still steps off it, or previous + /// would never leave the block it is in. /// [Test] public async Task Steps_off_the_block_the_viewport_is_in() { - var state = At(16); + var state = At(13); var moved = ViewerSession.Apply(state, CommandKind.PreviousChange); - await Assert.That(moved.ScrollTop).IsEqualTo(2); + await Assert.That(moved.ScrollTop).IsEqualTo(0); } [Test] public async Task Stays_at_the_first_block() { - var state = At(2); + var state = At(0); var moved = ViewerSession.Apply(state, CommandKind.PreviousChange); - await Assert.That(moved.ScrollTop).IsEqualTo(2); + await Assert.That(moved.ScrollTop).IsEqualTo(0); + } + + /// + /// Previous undoes next, from every place next can land. A change is put the same distance + /// under the top whichever way it was reached, or the two would drift apart a few rows a trip. + /// + [Test] + public async Task Undoes_next() + { + var start = At(0); + var second = ViewerSession.Apply(start, CommandKind.NextChange); + var third = ViewerSession.Apply(second, CommandKind.NextChange); + + var back = ViewerSession.Apply(third, CommandKind.PreviousChange); + var home = ViewerSession.Apply(back, CommandKind.PreviousChange); + + await Assert.That(back.ScrollTop).IsEqualTo(second.ScrollTop); + await Assert.That(home.ScrollTop).IsEqualTo(start.ScrollTop); } static SessionState At(int scrollTop) => diff --git a/src/DiffEngineViewer.Tests/QueueRemovalTests.cs b/src/DiffEngineViewer.Tests/QueueRemovalTests.cs index 024b3576..884ce0cb 100644 --- a/src/DiffEngineViewer.Tests/QueueRemovalTests.cs +++ b/src/DiffEngineViewer.Tests/QueueRemovalTests.cs @@ -17,8 +17,8 @@ public async Task Settling_another_entry_leaves_the_one_being_read_where_it_was( } /// - /// The entry on screen going is the one case where the reader has to be moved, and the top of - /// the next entry is where they go. + /// The entry on screen going is the one case where the reader has to be moved, and the first + /// change of the next entry is where they go. /// [Test] public async Task Settling_the_entry_being_read_moves_on_to_the_next() @@ -28,27 +28,28 @@ public async Task Settling_the_entry_being_read_moves_on_to_the_next() var settled = ViewerSession.Settle(state, reading); await Assert.That(settled.Current!.Key).IsNotEqualTo(reading); - await Assert.That(settled.ScrollTop).IsEqualTo(0); + await Assert.That(settled.ScrollTop).IsEqualTo(26); } /// /// Three entries, the middle one selected and scrolled into - so that a removal above it moves - /// every index below, which is the thing being asserted about. + /// every index below, which is the thing being asserted about. Scrolled past where it opened, + /// so staying put and moving on cannot be mistaken for each other. /// static SessionState Scrolled(out string reading) { - var state = Fixtures.Inline( - Fixtures.Patch("A.cs", 1, null, Fixtures.Long(true)), - Fixtures.Patch("B.cs", 2, null, Fixtures.Long(true)), - Fixtures.Patch("C.cs", 3, null, Fixtures.Long(true))); + var state = Fixtures.Inline(Patch("A.cs", 1), Patch("B.cs", 2), Patch("C.cs", 3)); reading = state.Queue[1].Key; state = ViewerSession.SelectKey(state, reading); state = ViewerSession.Apply(state, CommandKind.PageDown); - if (state.ScrollTop == 0) + if (state.ScrollTop == 26) { throw new("The entry did not scroll, so nothing below asserts anything."); } return state; } + + static InlinePatch Patch(string source, int line) => + Fixtures.Patch(source, line, Fixtures.Literal(Fixtures.Deep(false)), Fixtures.Deep(true)); } diff --git a/src/DiffEngineViewer.Tests/ReEnqueueTests.cs b/src/DiffEngineViewer.Tests/ReEnqueueTests.cs index edb45887..4f09894c 100644 --- a/src/DiffEngineViewer.Tests/ReEnqueueTests.cs +++ b/src/DiffEngineViewer.Tests/ReEnqueueTests.cs @@ -10,29 +10,34 @@ public async Task An_identical_re_send_leaves_the_scroll_alone() { var state = Scrolled(); - var again = ViewerSession.EnqueueInline(state, Patch(Fixtures.Long(true))); + var again = ViewerSession.EnqueueInline(state, Patch(Fixtures.Deep(true))); await Assert.That(again.Queue[0]).IsSameReferenceAs(state.Queue[0]); await Assert.That(again.ScrollTop).IsEqualTo(state.ScrollTop); } /// - /// A re-send that says something else is a new comparison, and that one does start at the top. + /// A re-send that says something else is a new comparison, and that one does start again, at + /// its first change. /// [Test] - public async Task A_re_send_of_different_content_starts_at_the_top() + public async Task A_re_send_of_different_content_starts_at_its_first_change() { var state = Scrolled(); - var again = ViewerSession.EnqueueInline(state, Patch($"{Fixtures.Long(true)}\nand one more line")); + var again = ViewerSession.EnqueueInline(state, Patch($"{Fixtures.Deep(true)}\nand one more line")); - await Assert.That(again.ScrollTop).IsEqualTo(0); + await Assert.That(again.ScrollTop).IsEqualTo(26); } + /// + /// Scrolled away from where the entry opened, so neither staying put nor starting again can + /// pass by coincidence. + /// static SessionState Scrolled() { - var state = ViewerSession.Apply(Fixtures.Inline(Patch(Fixtures.Long(true))), CommandKind.PageDown); - if (state.ScrollTop == 0) + var state = ViewerSession.Apply(Fixtures.Inline(Patch(Fixtures.Deep(true))), CommandKind.PageDown); + if (state.ScrollTop == 26) { throw new("The entry did not scroll, so nothing below asserts anything."); } @@ -41,5 +46,5 @@ static SessionState Scrolled() } static InlinePatch Patch(string content) => - Fixtures.Patch("A.cs", 1, null, content); + Fixtures.Patch("A.cs", 1, Fixtures.Literal(Fixtures.Deep(false)), content); } diff --git a/src/DiffEngineViewer.Tests/ReselectTests.cs b/src/DiffEngineViewer.Tests/ReselectTests.cs index 1556a4cc..36b73d26 100644 --- a/src/DiffEngineViewer.Tests/ReselectTests.cs +++ b/src/DiffEngineViewer.Tests/ReselectTests.cs @@ -28,27 +28,30 @@ public async Task Focusing_the_entry_being_read_keeps_the_scroll() } /// - /// A different entry is a different comparison, so that one does start at the top. + /// A different entry is a different comparison, so that one does start again, at its first + /// change. /// [Test] - public async Task Selecting_another_entry_starts_at_its_top() + public async Task Selecting_another_entry_starts_at_its_first_change() { var state = Scrolled(); var selected = ViewerSession.SelectKey(state, state.Queue[0].Key); await Assert.That(selected.Current!.Key).IsEqualTo(state.Queue[0].Key); - await Assert.That(selected.ScrollTop).IsEqualTo(0); + await Assert.That(selected.ScrollTop).IsEqualTo(26); } + /// + /// Scrolled past where the entry opened, so keeping the scroll and starting again cannot be + /// mistaken for each other. + /// static SessionState Scrolled() { - var state = Fixtures.Inline( - Fixtures.Patch("A.cs", 1, null, Fixtures.Long(true)), - Fixtures.Patch("B.cs", 2, null, Fixtures.Long(true))); + var state = Fixtures.Inline(Patch("A.cs", 1), Patch("B.cs", 2)); state = ViewerSession.SelectKey(state, state.Queue[1].Key); state = ViewerSession.Apply(state, CommandKind.PageDown); - if (state.ScrollTop == 0) + if (state.ScrollTop == 26) { throw new("The entry did not scroll, so nothing below asserts anything."); } @@ -56,6 +59,9 @@ static SessionState Scrolled() return state; } + static InlinePatch Patch(string source, int line) => + Fixtures.Patch(source, line, Fixtures.Literal(Fixtures.Deep(false)), Fixtures.Deep(true)); + static int VisibleRowOf(SessionState state, int entry) { var visible = QueueProjection.Visible(state, ScreenBuilder.BodyRows(state), out _); diff --git a/src/DiffEngineViewer.Tests/SelectionTests.ASelectionSurvivesSwitchingViews.verified.txt b/src/DiffEngineViewer.Tests/SelectionTests.ASelectionSurvivesSwitchingViews.verified.txt new file mode 100644 index 00000000..730e618c --- /dev/null +++ b/src/DiffEngineViewer.Tests/SelectionTests.ASelectionSurvivesSwitchingViews.verified.txt @@ -0,0 +1,50 @@ +status: selected 11 lines, 84 characters + +Sample.received.txt + 1 line 01 + 2 line 02 + 3 line 03 changed + 4 line 04 + 5 [line 05] + 6 [line 06] + [... 7 unchanged lines ...] + 14 [line 14] + 15 [line] 15 + 16 line 16 + 17 line 17 changed + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +Sample.verified.txt + 1 line 01 + 2 line 02 + 3 line 03 + 4 line 04 + 5 line 05 + 6 line 06 + ... 7 unchanged lines ... + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +copied: +line 05 +line 06 +line 07 +line 08 +line 09 +line 10 +line 11 +line 12 +line 13 +line 14 +line \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/SelectionTests.AcrossAFoldedRow.verified.txt b/src/DiffEngineViewer.Tests/SelectionTests.AcrossAFoldedRow.verified.txt new file mode 100644 index 00000000..730e618c --- /dev/null +++ b/src/DiffEngineViewer.Tests/SelectionTests.AcrossAFoldedRow.verified.txt @@ -0,0 +1,50 @@ +status: selected 11 lines, 84 characters + +Sample.received.txt + 1 line 01 + 2 line 02 + 3 line 03 changed + 4 line 04 + 5 [line 05] + 6 [line 06] + [... 7 unchanged lines ...] + 14 [line 14] + 15 [line] 15 + 16 line 16 + 17 line 17 changed + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +Sample.verified.txt + 1 line 01 + 2 line 02 + 3 line 03 + 4 line 04 + 5 line 05 + 6 line 06 + ... 7 unchanged lines ... + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +copied: +line 05 +line 06 +line 07 +line 08 +line 09 +line 10 +line 11 +line 12 +line 13 +line 14 +line \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/SelectionTests.EndingOnAFoldedRow.verified.txt b/src/DiffEngineViewer.Tests/SelectionTests.EndingOnAFoldedRow.verified.txt new file mode 100644 index 00000000..c1bd4afe --- /dev/null +++ b/src/DiffEngineViewer.Tests/SelectionTests.EndingOnAFoldedRow.verified.txt @@ -0,0 +1,50 @@ +status: selected 11 lines, 95 characters + +Sample.received.txt + 1 line 01 + 2 line 02 + 3 [line 03 changed] + 4 [line 04] + 5 [line 05] + 6 [line 06] + [... 7 unchanged lines ...] + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 changed + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +Sample.verified.txt + 1 line 01 + 2 line 02 + 3 line 03 + 4 line 04 + 5 line 05 + 6 line 06 + ... 7 unchanged lines ... + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +copied: +line 03 changed +line 04 +line 05 +line 06 +line 07 +line 08 +line 09 +line 10 +line 11 +line 12 +line 13 \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/SelectionTests.StartingOnAFoldedRowGoingUp.verified.txt b/src/DiffEngineViewer.Tests/SelectionTests.StartingOnAFoldedRowGoingUp.verified.txt new file mode 100644 index 00000000..c1bd4afe --- /dev/null +++ b/src/DiffEngineViewer.Tests/SelectionTests.StartingOnAFoldedRowGoingUp.verified.txt @@ -0,0 +1,50 @@ +status: selected 11 lines, 95 characters + +Sample.received.txt + 1 line 01 + 2 line 02 + 3 [line 03 changed] + 4 [line 04] + 5 [line 05] + 6 [line 06] + [... 7 unchanged lines ...] + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 changed + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +Sample.verified.txt + 1 line 01 + 2 line 02 + 3 line 03 + 4 line 04 + 5 line 05 + 6 line 06 + ... 7 unchanged lines ... + 14 line 14 + 15 line 15 + 16 line 16 + 17 line 17 + 18 line 18 + 19 line 19 + 20 line 20 + ... 9 unchanged lines ... + 30 line 30 + +copied: +line 03 changed +line 04 +line 05 +line 06 +line 07 +line 08 +line 09 +line 10 +line 11 +line 12 +line 13 \ No newline at end of file diff --git a/src/DiffEngineViewer.Tests/SelectionTests.cs b/src/DiffEngineViewer.Tests/SelectionTests.cs index bebd99ea..1a9cf3de 100644 --- a/src/DiffEngineViewer.Tests/SelectionTests.cs +++ b/src/DiffEngineViewer.Tests/SelectionTests.cs @@ -56,6 +56,60 @@ public Task OverAFillerRow() => 3, 4))); + /// + /// A drag from one change's context into the next, across the fold between them. A fold stands + /// for the lines it leaves out, so it is highlighted whole and they are copied: what lies + /// between a selection's two ends is what a selection is, on screen or not. + /// + [Test] + public Task AcrossAFoldedRow() => + Verify(Report(Drag(Minimal(), PaneSide.Left, 4, 0, 8, 4))); + + /// + /// A drag finishing on a fold takes in every line it stands for, since part of a label is not + /// part of anything. + /// + [Test] + public Task EndingOnAFoldedRow() => + Verify(Report(Drag(Minimal(), PaneSide.Left, 2, 0, 6, 3))); + + /// + /// The same fold with the drag going up from it. It is still the end the selection finishes + /// at, so it still takes in all of its lines, rather than stopping at the first of them because + /// that is where the press landed. + /// + [Test] + public Task StartingOnAFoldedRowGoingUp() => + Verify(Report(Drag(Minimal(), PaneSide.Left, 6, 3, 2, 0))); + + /// + /// A selection is held in the entry's rows rather than the view's, so switching views leaves it + /// selecting the same text: the middle of this one folds away and is still copied. + /// + [Test] + public Task ASelectionSurvivesSwitchingViews() + { + var full = Files(Fixtures.Long(true), Fixtures.Long(false)); + var selected = Drag(full, PaneSide.Left, 4, 0, 14, 4); + return Verify(Report(Key(selected, CommandKind.ToggleMinimal))); + } + + /// + /// A press with no drag behind it is a click whatever it lands on, and a click clears. On a + /// fold, taking it for a selection of everything the fold stands for would select seven lines + /// with a tap. + /// + [Test] + public async Task AClickOnAFoldedRowClearsTheSelection() + { + var selected = Drag(Minimal(), PaneSide.Left, 1, 0, 3, 4); + await Assert.That(selected.LiveSelection).IsNotNull(); + + var clicked = Drag(selected, PaneSide.Left, 6, 3, 6, 3); + + await Assert.That(clicked.LiveSelection!.IsEmpty).IsTrue(); + } + [Test] public Task SelectAll() => Verify(Report(Key(Files(), CommandKind.SelectAll))); @@ -183,6 +237,13 @@ public async Task SelectAllThenCopyTakesTheWholeSide() static SessionState Files(string left = Fixtures.Received, string right = Fixtures.Expected) => Fixtures.File(left, right); + /// + /// Forty lines in the minimal view: lines 1-6 on rows 0-5, a fold of lines 7-13 on row 6, and + /// lines 14-20 from row 7. + /// + static SessionState Minimal() => + Key(Files(Fixtures.Long(true), Fixtures.Long(false)), CommandKind.ToggleMinimal); + static SessionState Drag( SessionState state, PaneSide side, diff --git a/src/DiffEngineViewer.Tests/ViewerLaunchTests.cs b/src/DiffEngineViewer.Tests/ViewerLaunchTests.cs index d20cd7e0..a1b6212a 100644 --- a/src/DiffEngineViewer.Tests/ViewerLaunchTests.cs +++ b/src/DiffEngineViewer.Tests/ViewerLaunchTests.cs @@ -88,7 +88,7 @@ public async Task FileDiff() "Two panes, headers Sample.received.txt and Sample.verified.txt", "Line 2 highlighted on both sides, dog on the left and fox on the right", "No pending queue column", - "Buttons are Accept and Close"); + "Buttons are Accept, Close, Prev change, Next change and Changes only"); var result = await EngineRunner.LaunchAsync(EngineTool.DiffEngineViewer, temp, target); diff --git a/src/DiffEngineViewer.Tests/ViewerSessionTests.cs b/src/DiffEngineViewer.Tests/ViewerSessionTests.cs index a5f44795..b6e70524 100644 --- a/src/DiffEngineViewer.Tests/ViewerSessionTests.cs +++ b/src/DiffEngineViewer.Tests/ViewerSessionTests.cs @@ -290,15 +290,16 @@ public async Task NextChangeWalksBlocksThenStops() { var state = Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)); - var first = ViewerSession.Apply(state, CommandKind.NextChange); - var second = ViewerSession.Apply(first, CommandKind.NextChange); + var second = ViewerSession.Apply(state, CommandKind.NextChange); var third = ViewerSession.Apply(second, CommandKind.NextChange); var past = ViewerSession.Apply(third, CommandKind.NextChange); - // Changes sit on lines 3, 17 and 33, so rows 2, 16 and 32 zero based. Row 32 is past the - // last full page of 40 rows in a 16 row viewport, so it clamps to 24 and stays there. - await Assert.That(first.ScrollTop).IsEqualTo(2); - await Assert.That(second.ScrollTop).IsEqualTo(16); + // Changes sit on lines 3, 17 and 33, so rows 2, 16 and 32 zero based, and each is brought + // in with three rows above it. The first is already there when the entry opens, so the + // walk starts at the second. Row 32 is past the last full page of 40 rows in a 16 row + // viewport, so it clamps to 24 and stays there. + await Assert.That(state.ScrollTop).IsEqualTo(0); + await Assert.That(second.ScrollTop).IsEqualTo(13); await Assert.That(third.ScrollTop).IsEqualTo(24); await Assert.That(past.ScrollTop).IsEqualTo(24); } diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.FileDiff.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.FileDiff.verified.png index b1656a8dbb18aa3e52b9463847f8113eba6de58a..b6eb6961930157a2aaba3130e1d5fbfffab10b66 100644 GIT binary patch literal 19728 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 literal 18250 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 diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.GroupedConflictedQueue.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.GroupedConflictedQueue.verified.png index 41d9c2528405a96bda7dd9f05f6ae84e8b303eb7..7b33bff7935a611b03996f5e5dbbe2f7357a5d7a 100644 GIT binary patch literal 26485 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 HB{Ts5N>2Y% literal 24978 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 K50z&;@BUvypYTrr diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.Images.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.Images.verified.png index be334206558177d018174b661df33f71778afe9f..6b9372bdd345f167690005215ab11c4fa308e4f5 100644 GIT binary patch literal 24780 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

xBh0YyGcxq12U93SL2{wt}+ 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 literal 23472 zcmeHv2~<Y%Nt86h&l45s@Kb2mu0wpj0iQpfV2u zDw4<;k&pm^AQeFf5H&y~fdm;6NeGdIfFy*xgZ6*l|GsyJ_3pjvy?58r6_&|4XYaH3 zx4+@{{q}cG>M3Ujjjy+V4FZ8Qj{o|zD+sj45d`|8<*T*85!p}s@`3-<5UvhKLACum zrhy-8g6y5_L7=*f^~)E&1b(lJ_|*de0%<;5{Zs1-e{=~1@;Y|>XZy2pzM@gDOhb3n zm~v_JL5ocnt~JF4Y}J1_J6bbZ1DAb$BrL@ezJATduO7bIf9LV(uOe-~CfzkUlJjlR z7aC=cBR2dN_Qk~MytkLMC*p!?`PWRI4kq5_-x++pu_7qQ&0TN7lS0AV`fw~ZaP=S3 zz*HKTmO&A1jxR0Q6&_(U`jeC2&y!|0O zx49_u)>R}b2c^hBRCs>@oCO;tDU$KU9-52~yd7{WtAAj{i;HNVgO9szS&F@EN3yK%B-&g$Gd$zuv|OG%N@jmOB#)y?#;resq+IAk)CV zfosAOidpTG_H0NfT{IubM|#Pc`h{j>bovA1G9x_4f%A*Q;1C(cZJHWVz}S1*as;GM zutc;VTAa29!?>$=bX%e3RtW7D>vEc@hzywA+nL}sB^z3S7Y1U$wEi9W#$`QB3)&F5 zz&1m+m_m{jEm*SAQ*HSq9|3*ggEXc_0AtBus5DQ#Se{@5 zqxPNAG8atA>y7bPGrL%S;>=E}?vF%8l|X#cChn2YH{6{WDbK^vD!>LPv~X%#&Bf*} z))?uOg40%qZ*iYII)5ZQn;-wG*$}e9 z_n1%8iXu$th3VJXN(hl#8^_nOxo!!LOS=w=VqjR-LO#6BjTB!0PFx;>DP$nK3BnX& zmo@sfY!L#JTUaYGzj|?lCq1TQ<{J87rH&zmYE(ArK&3*ipoQF5^Gg+WQbf}&((Q#t zp&3r)62>m?Kd4mwlvKlH6J;=!pUq4&V5S!a>uo}IR@ha6^%5g4m{!!4_0X=IOZ~p8 zH*;0VX7TE3MrO*Sjj);B%4F%daM#D^-*{B4Wr&km7SyC76cuZ)ao>a zVw(v_!E8WHDb`yYr7BE;+Ys6KVAqQUa&|7+k?ORPke8sGQrQtjHa^@yIuryd%G&OL z3%WCqSNCq0l~I8s-YMmTj*7hVbv1-;wrae8`oGp(qnWTFU+YI4SPk~LMC&|n?Gl2) zGUI8Ev(5ONxqk3@+9a}yb@e>Oo4LP@;br2&jD_0>)m&_MdLq$y@W2_Em8jG}FV4-u zhuaiPn-m?gfX$-%7`#~vJ6y^DtjRFzl2y^9Ft-A{C@YPhz5OUqfNoHiPfNWp;lfk+ z2CkIkeW+&CIGjJNfhK*31K!F7Rc28GfbIT4}mVFYXrAG)0nH87%!r9fnm;wJM zJ@S4Svnd#yuYeXhhYBsx)hO0TOeI5;Vhq^T)};xHG~D4Jv%Is&F(2@xlg*F4;-fBh z=C9WZ8TQN3$y^*?J*P=My(t*BZRtorbMJIBQTE zZl;QCCG#mOYNH93hg@8D01BeKw0o)&(XIs5AqN(|esldDprJ_UVy5 z0*ej1GRn?xcN9?OWuQmcJEy>W1Q-fvxw&6q5aek%L#jp_QR@Oax}8{hz=t>QkGJZD zs!*dmB9gXv5N(n0DxRn4rky8Jk@As+M>z2eKf~+nr$rq=Nl7#Yub62K%omSwsLCt8 z;EL&oF)Es87RZI-gzt=Q35CwLa)1<>~(4Q>dSe`E&)9;=Gp2}db;J7h|79bMcl+c>_R!m zyLHQ*ury0>=*>0W}4X4wq)HGn+F1! z{^`9Vzi`N#&^`&}F7*QuyxiX`_AZli8ve&0%BpV|?7?70%Drhb)_mgA*P7??;Hos+ zA53FQ546JLhkk}`?FV;@%GMyjPQWtuqEkZ>x~M+3J-Jk4Pj1L?ySG=2!t%K7JHJ4* z@CpBiW1Jz8_(4y5g-(l$>M|~2BJE)*ncQMqGR#%rLVzpm@9`XHFQ-FkFao|dk-@Qj*xRLH; z2L5c9hQ4fPFdU6n`$H$O0d|J$)7m%xbh%VkBYdqJ(3&xgxTp2C*P{a65uM9u#KSAJ zLO6GNqK8aiAsD)d_1`ko=i<3b$#A%*PmIqm=vtP2a8j?sX%&veb!*L-`0YN zprF8ng}W|bbHXhKhuUmbNE{f&(MS%h$Y>qK)c`KtrzB;FeErUJXz=NW=Sd=#nM9?> zk|825!9CIatgd#J%7ixr*uAssO3?Mtmw9V5<@IQ*(AHYrTq4b?vU=lB=koW`=5|42 zOe=7HXRQ`ZoE^1(7O0)kCX$6hvFJ#RQ#d(TN>t~Wx9a-$KEL0DEHDm&qb0Dycs&FY z07Jkqlvc5iJ@A7H52C0tPzcq~_ptpjOv;-+17N50Z_{#OUphqLGN5+2crMDT*NG;% zIxf2`_ihm7^1IoXX0(t_(h!JY@z|jxzd(htCq6`8P+%M|+Y}~{@HIc+SrX|yuBK~5 z7@y5#&mXvikn$9H9D30*nH+{@KVgxo+DzmMACk!PaqwccUnUHVU$nC@s$#C!2Z81v zQ>j$F1A=^gksqr%FC0#5Z4gG~ zKEEm*^Mv`yL)&+|*wx0L>mBj948#b|*pCl%CU@cbjwZ`yIaAgbL6@EnIqKOZY5orUuiFu{X(;? zRR@9i$J6zOE7k#n1%dYN>B?|4RRg~DV|Un@wXXrbS;j^!zgV*g_%=4uJ-2HUkTQXi z5qtmf!Y2V=W?Hl@^#Nx<%$gCi=8u;rGk*NXi~gP7W_s6T(sE6@)U~YN-x?hqt>Re; zjeVMlCN6C`{X){(u^Ff^AZ`5?;|`zLQRLu!1+#S)Nnov&MHS>YxJtMxsF+_}l|kuY5Xz;^HENcMe)*g6;h>UHjCb1j&v$mo2|!}x z8tFjb6kBi5V`K>AT>{Lw-_bN5LV&U$kE=dqAfcfC-1^40s=Bgb9Z3PRg;y!8l*jo2 z=|>gLWsp4-Xn4!mA#yYMFo=oYVfSRyI(=EdP7(IzF}-!c(gAEpQtSg~0zQfqYbFv;bEKfPcMov4Xnf0}oJl*{8NDry=Ru+_ogHqu-Mmaf z^WnMRZ0dgeRyt?G}oh9KRYP^d?xopr-g4m-Z$4p z6^2hBEeWh;i_?_t$eTVU%n}&bH{61}$%|B01Es}a+?427nu+&f_}NQR z`4Ej^?=ouOl6!_gm+l}^8EU6nGn%eC{WG+#&RAG>E=f7Yj(1jQceCM;t-e!DzC>f% z+AvU&COJ2F5lb(4whLk;e{e=!;Mo_ z#CbsByEOGt4z8GzS#K}zyxF^g^eYe-uU`_}|5ynlhf0aqq3FGoE8x~J2QNaQ=0(=d zy>zmp7kPT3Hl<*CXEpWU0iDUSKrX>CX6hsi8k4*1uzXVhPWfkoz1@76(@(>)Wi_;7 z&GYP-^TZlH(Y`O5J=J#8tytK+f)HLjr5+)lQk9h4tb2Z3RK-q;k>^RG3R-M%v?~F( zNHzscc>_QETukkeZ}$S3x&kIwckQ_LZv)uAXmIphh$P6U#|u>iDFqeT1_y zL|8rp3CnnE3VqfBcVl~yX~A|Jd%B}d2HK~6=*CBuyN=) z(+WX4Zq~6NzVqjmk$3X}yI^4J(Nw3{UtsZ^R6dsV0KlNAn-)I2XdjlQ?9=$rw^64U zYd0{u&@aR6P;`h$^47Lc>idu!X?g(n#w;_>)Q%T8W8A z=yq-v*``wna0ZTC#WoIa+ZUb@2KPX)Abn1DS3Y5^K-Pkh4g-aQmYLg#JEYFAR{(-+c~)qQXr6%cI0rm- z6WB#f_D2uf1jha^2ojGQy2_u=VhBDB7ZT2i0YJL60N)3IWARtX454+pQDx>EcQWi= zuFYOxkb{8@$b!P8m!H5r4S<~!Fa8cY?-+slNq{p50B2T<650Lbv+t#v`@|jbS|O78 zV*-ECkKz|+)7EO8K?toD?-eCdj^${Cv9{zlFn*J^Sw;-V00cHT#aBF%AnZP6D2e@B z$Ch8HGVIa<(geE~25FsN4BHE-f+w46m=C7Utb%XPz%aF^$5+GZIn!WO4=vi^wJn0Z zR((l(noTVGCWN)~ffLPd=&%oGWIkqe9(yO=4mrH!QyQ}`jH5eM%t_>ZvU?Z0@ma@O2pIpt3MuagnraDLKTwq!nR~W!4=- zZd3>Y1Fjl=6we@vN9x-r3#CW4t?#Du*s*Ox^@{E25>dxbf#(R2GINH`e00zN zj*pF__^=Jg*z>x#&%(Nfhk~0KFs`>Bco*!*eHT*fjC+!pJbb-IT!W` zNse9_@`G(>&JG64k~YIAApq3_h8 z_T>7BmODlT6SGx95s&14(1&iwg%3ZGkn(!i5ySFxotr_o?*m5gL;J&nBz%qGWkR`6Bcdk;;nI=~HP$S;{xneC_Kw2U5Wmfb>@Y6wOgef5Kyt?ak zUp|!quxQ5n%gpIy9CiIb=&3VcQ)G}k_xl%2pN#&A(#sIb3W@oZlmdvQPc#LRT%leN z(?kt88$L0*GdTr21Pr{cpvBKdDB1c)5BuqxFZ^2o4}rjSkf3FbA)Zh)ElIJY|4Hf&C=`gr3DVF&hR{B2*r`edOC5WH|tG7Ggx1Kj&jL9FZj8_}f9QkZzq<2_0*miD}{l`NG|p;ln#;s(~5p3r{h3 z(RoP}6^91_F*+K!jpH`pK8H}ZPffu94L9{o*UR@ei#v4&Q=;iy84nRg-z)&{6~!=u z8STdlZDT3bz9lZgUYe~?@bpr)$>l26k;g0E=8y6dYSqp=ntI%+dp-^H^HG!5=`$lv zF$}f62e7_L;2-EEChns84w0lXrNI1U2o5^VYtag+Oe}aG4PrQBeF9H0atg(plHE5s zY6ijexLdt$2mMn|_~=uaHD-_U*(mJ+Z?s%kG;J*!7>*B-KCthbk3nq*t+v`Lp1|KW z>I4v-rOv87WeWXIA+i{k>r>Vq7D;nSR+J$D8#Ep9B!YC z$ho8O&lLf^JRcIRyd!K37 zrSWudP3AKXb8}PDR+9{E-Xsd}HuBZb{J;)99 zJ$B06a0}$iQXH^k=D!Dv{d+Y+Smd{4OvvM&5{k`9NphfbF}@h$MSd0SslA&d$^qMe z3}ZY~QUMEkUSti=%j6#*f!>(_mNc?9bH)=;{N$ZlJD$jA9kKXXLn-KDHroZP3*$7g z8-NwF6ONUyaMu2WSVZXpit4pv-r1=b4=YKeG&>0q=Lv<>iM3Cog1*nY)VZ19TU_^C z@(&YP18TGdwEqiGkuMOwfL#^SBH+h-&V++Lz=u2oGN&Wq|JDg0;DsAu)_@|y4(Ck< z14-8R{R_=j(Cy0$=! zG^`5?d*#(CZdMBAlfv8D$qYk4K9_z$ci}ZJa-<7(-_AiwD;S)WPF2L(3w&^ zv}KIAc2huFCXzK2drxc|AB<^(V$Yc{r*G!t$&lI#%t^$n&PFxMz9`xT$IAnZK)Z!k zDoJH9LLHlVE_S!*EY12+F#eS}BIP$oE86>Ezh5{zi7s^poC9-kT1FBrq&X{rU4|*_ z*gm0`PV}u{?F|i6gX&97T@2mD2UA7AZ9mGIIRCAqU~G@w(2mo*wN)aYvX+)(Jm(Y` z+kdbNn4@G_cA#ip{zXw1W4q&RquWNj-aC6G#3nSnwJ4n2JF@kU6<_?IP_j%jgi;=^ zu4Db`I(|3U-rKNaU?63nIR)5X@Z@g+U{X3Un5<%lQx(|^J)s!s0V{6K1RzF#a}lJK zL+U@1d)Vg}x7^YGqDKOlgt87?Bi<)`jdS8xEFRW*GhpwSFoP_HV0`^ z8~2Q)qvA_gAJcg}06Q%%Gv2GUplL>iBh)K1J^hk1O*H_!pl$Q&CD3GtNRMc+ zpa-O`v%n@njgLFt3Da-05-8XPl|?eUUUK5PgXVTTv#Y`_Sp=yFqF^g4Z! zP8Q@*g&lWsHaCVN8yJ8X5hi80;$PT9c7CxNSx!S*t{&} zz-Mn?YdHh3|0y^UqqyH9=#{+oiLq=kk!@W=ojAj->w(UM8W5iS03>>))iy53$EPs_ zAv){o&uQ8sZ1FP=HAGz6aMi`fSN8~Z08o?PHUnCcQ>g6#@amgIRdb(a`bwNL|udR|j--vjI<5DiF-5Q($2)ZWR<89Owf^Zr4s&*mEONdG~4 zArl7oZ0(Eo5g>1(yCxq?AicrDY-YKQ%ig*ElL_P>ONJ7+iV%Gw!|dh$k>j-{Pa_*v zLCnaA=3-l4^om>&Z3QbPxf~){wrn=VF$7Z(bbM1SJ(6x(!P@r2;OUE}bapv1 zYkKrv{iXBGYce4b`78A(1pcKjLEsNypV}#lH*^hu9`0~j%zX!)fwPP=F;dWFxaX(` z6YHPA#EBB65Vy3USU5kQ->05;jDZuAi1oWSYdmrOa|GhpaQB{`-{HlUeps5@0GkMF z>w!kmh_SVj$KAG`C34D;%0sh6jX2!n!si^BJPE4a!JhyC=ZYEn#-E zQfJ2{c+tyFYX(a4gs-a(;63tfgUFI zBT@=dV$P#L^;cK}r-#VS&{QCXPY1UyHD^8v(_!(i;koK&hsoG;DBmXw#;0}8H)H_O zRk|F844C7#4U!N+$Q8| zmIvr5433sYIeYrv#A!ZaSxobV1?K001c^jbznkL7yf9oE^&Kq2JXZ11)IPfW>vhLS zJq}SJ@ADHJt-jHDXrn?_M-70^GDBx~Suuh;HJ%2qj>>GpCwFCHe~D2oe$m;d>I|Bl zdu6bMappAp=^rcA&<67(kDxs zM;a=Zmz}U3|LAxJ@?Prl=Odlk{4Qm8Mc>_Qglos6V}~zLX%9JkdtvA&SMZhoK|!g$ z*5z6mfM%vzXU_}TBSz;2xNOZUkY8W0c3yyBl&vdawC=@0%@rZN=XPK6vl9nd5YB&H|&G!MGCmE<-TBju+#krm`VcBu^$A?`4$?-8X_ zsGz-5hrpTEI8#z%JPW1mbr$g4l~O~-il$^9B6_TlxeYxBJZ{Zu7y~7rnE;|5XiT09 zh#0^y+W`O*Q8StIJ%C;Ct4F-|HwAvB4|-a$dW3lbzHRk_kkum%_y5f%2RX=TyUtd< zIAOK5`1m8$IkYlX0F+PYF!8kTB+&{YhF-FacXv{aU`AOb#Wr#LJMKmS_ZAjS_tL!v zk&l>z$O31(RHRxXr)V{+X*YxU`7VwwHCN6~u#;L>dKJqlJ1&RK)g>6uxU@;$&(0`! z#QK10gI33Tkhk`*d#!h>i?syr-j}dZpf;mY`sqRI)Q5rX3!R;N@o;W4R=V?hhg)q* z9%YeVm6FkN`xwv)xlJW6qYw(n@)DIO9jIkFUcLUQjA!`erhxU8&26=8asj)9nJ2-l zbSV|gL4N5~pafx-$h(!qemkhv z2Luivon2(q66}Byj?!|`4k3C7#cC&A?GuRKH1H#4tM9rs9Q4?X{qA)!P<-=6M60E! zz2nWFZ!U&3hx>l3D~O>*PCRO#EUh~>RIHeuTDD-={+SuRK4SY+&MTw57QSf9f*rvN zL&|OvE_nGOm*USbYcxYD>1f_2<}yI1^y_a?HviNIZe2Rmt#1-qNi94?E-OrGd8iS` znt}jTIy)lTqH&$kg-p?*#cksd7qqTqY~GZ`J?2(Y)}j;=n{8!HRl<9OaOaDF@@-+P zhORsy<*WZOZvc&6`OsGxM7a#UWAr4ED?^21b{VA)()c!sYC#SkiE>A)URD>KZ#m&Bv*dto4NA1bj z3Gc5g>8vA&W*-S+U_k9xEQgbyU&!Bye1AIJoqMe34_s^g0B11Ruh)EWF=FGY1g`)B zyx7zf*)eh`AWhiy!2k81Lx)@kXsANM#o;$UgmMvP%7oxQLYs}V{l6&s?jxK*j=f&H zMuecik`Xp->kkbMQ8c3^$gaZ{$@zunVjV@Jzr{SYCZ|9E*BcY%#IYx<3vs{}!Iw4} z0@4foV;=vCGgJrSVt0EvktutGSz*gTew>HHcO0AYfxKae^(60g7Wj?TvtPPDUG+wCw#u^ca_N;~2EW96j9s1WhaiLxo*Yr~S6KW%*kaN8DQ8ariPx{K zjJGPWKh==J354RB)x)3zA@Rv09IGqhwSy%nFr*bIIY?W3n(r}c%_T13ba}+dsF$k{9Q+d3NZ$cknKj7Deq-0ySR*+$AJ8oB{w7S_C zgnu5ash_>dE(}B$UIvPJ=ob)0beIq}YOg zl#Ln55(>~B>3ad6IGNSWJ=s1z=$zKaSS5$7P@S8DZUUs=+-k%vGDGftS270Gw$26J z+?!WqtthL1hFBM2{cl9zUvhyM9kDUQw3`6})s}zSmEGzLP^j?$&$7ykz6E%MQu5~$ zpGERn89tlAXV382Cw`6wp9AD)Xz&>nf&P1$0i*(~UIbgR0-xg_Uh~%m+YzwlntogQ zfgKsl4WO4^t6Q~S=n&Pfs(gByq^j(VD$f(km%~j~DzZKx4d!UBo9G)$@e6!5*sji9}$jjvCAXjTndThQT{i3JW7uyvrlxrfqth zH@{OX%*Si*+=)|l{xSlrOJi0eC9AP2D-L52>0l6fe3s=o(n8w2 zCA{T;IlS@vq437`cHJGB|DY&e>0ev-xahy;fVZ9?^xi}_``gAOpd@CU{!4o{ikBCm z3+#gJYq{ZXO?Wm@ukkkeV~K33di&3&YB|#F*XCHl$BBy=zr_XW68lYpyksH=kNJ*l zy(Dd%O5GB`pDXE{byu19xMOxq)opo@xOB5_v0U%xrDeovTSZuw3&x^nZ`*flJ*8(D zdUEbf{Mi1;IjTvg(_)gjanidpkqoe2Y9CbZRup~jgT!}lf7DyPk_FYfEukvPS{6A! zk}*H_OlftQ za5B{|XQQ3To}_apT7YF%0*Wxo@ojlrzsZg@dZ&#uoXU@l8E?X3KdkgSCyIH66HqpL zF3ezV)ODO)-eGYv6%QDo;U22*iNu<$xaiRR)W(MIN+@v$Y!P!86D5EZO<0V6s}&CK zbg;0P$Sm*ZI+=PC_=FrW*rRK>XVzrTEMOoBZ;y^7y*=8JfVSb(0oLQ?mqD&2bd}3w zaSWDc3!oK%K6n|-<+zT!8bpQ~%yqhcb9XFnbu|F_UzO^wRu5g(T(hZt&H4V&uR1pY zW@Q=vvFzyG5!1gpCQtoez7*=z{xDJKS7t3Oe3QUqo-URLW)W0B&DhLc%xe2^d?sn? z`Ww{z%{u9Iet@E0WdmOsSRCiMBtl7c3yxtn^Ov$R>~y9ATz)~lOZ^eE5SL}wx^e2N z$+0Gt^z^L4F^n^J?@c0ISr@s)c@xJUjeHA>?d*ibc3ihx$vodC!=C0WQGXQ2xn!}8 z9Z)pr1Mg;|o8;IlLM>c&Y+6$Q@TmG`J z_!G4=4^;Jj`xk$0$o^CA|DQYXup@k7VZ7u-s$cF#Ad^n=J+WM!6<3$_K>;u`l-Aa` z3jiBKq-bMW>o?KGGaU$k-ckYyIj7H}D;A()hF!-g04Z}aH9TjdOYTOD$BD$&tPh?B zbMJ=EB}Rtsw~Yl7ao+gz50g$7&%45#4Rkppw=>}I&b=p7Gjca-0iVHS*Av#~PmK7T z7;!(*viRrqM&+N^;}+%dEdfA6P685gAHR%~0K0{2Xozz+m|JiiC%KLrm3Nf8jt{wx z-zm3zlM*2LuNKTFV&(rxxDPwpvNoz3$y?f3>@>d_(Q`VyX^-#7=$(?;*-jULAM6?g z7!D_cxiZ)Bo8=u^CsNz??J3^Bhw67CF%+P)hB@hYK&0IOyLB;i|4L%$eqA=})_&Qd z>v&apN4D!Yt-K@mM5;;F#*+PeY<<+bd6%slo3u4?S0H_WM@HvsXn7c7HYa=;#WA4dRi|U%^9Dv!Xt$E%T8X7s*sU0wJL;IrghW3t` z_5&ylHBjqc#FNd2u^Ad2`WW&*8N&Z&RPX2Eey-j4T(z?1vl)CggU@F0*$h5c@_nvh z1Re?fPi)sGEYEc?Vu(FfY!j)JMb3K;xA8Wg-O*+gbH>!yriYij2%(u zM*bcc#ysgz-av-4<^GGlqsBd+!?R&u0sXcjwe&Mq%zsEyymMo?l(}gx5T2VS zHb5tqxLtZH3Z*oXzcTMIL7r2@t@K-~WPyJ*lWFM3+Um8bl;IQPHoeH57>U}2>=flD z?u|3ZgxN*ByGufnO44n|3BB<58?ClbDLyEru~f-HKMV|;cmx=V>LK~9UQ6`l?y8I3 zRYl7at((sc-v9>o(yPngRqMTmj+h;jzD*7UbSyeOPz2WO3@( z_wV#-6AXF>rZZK}?{?W&?U*TEB2T|@g%)*b>Kgf-wuRD7ZliXa!ItRfEP68phXL1G_{V8KMVYPB zcXw*rxHxOnocN^q%gp5iMe$47>at@&Ck?U1D{Q}^!PArFx~DL0^5zLopxfQ#w^fEL zb3&dqCm-cEY-|!vbN}+*b+!e!YwoXUxa0tDZ8-JHyY~rdUM$CIP=XCTBvV~gTPw!EvRbj829aJ?u`KSzIk8r2oPH`6nUEZ}b zn5^<*?3|pI(K26`v)_IE9*uyRA|)(R55c&t37GS|m99&yY&EH&7<6vb8m{8S|Te zRd|fy_q8e588diQ<*{DhB%GPOl3mo4G3l-I^Gd|#mk&eIOU=Ya+W}rA76V z)fGi=?$P_<>9y&lfL)mxlgkU_Ou~L_$8WicKU2{ymjIQ`WZhUlC3=4%@5I%2Zqin{ z;`qvY?(PSZQ^haMX@8AlaPHc({Xu!eY1udF?&x;Gq&WdXnFu_b)nbjl@c2Bb_j()M z+c#Q;qJD>5r>`tp_Sj7W><%L*UGS?4`w39zbis!9x0N3bD1Ys%Y`--7O?ECZW5ru` zuPBh_{Xx+?b$ziUoV>k#a_c#(H+E?DV}cuL)$ARRzmJ)=dee=A|2E;KB8FpwhP#4t zijGSp%kF-dmuCDVzi8C#iZrq6Z;t7!2FM_5C_FzJf5h3F8k!=>WSXa5lf^77C~sg% zA9%kQ@RX(rW;f4GPm~W;zcg&7Rll-+76Ye#XQ-j?Vk0}72Ivqo?|}I>!)D>l z%GH|s-M+5mpGI|&fA85>^q9Q?@JYhwlVuQ^?M1{|poN=Fsq!h z_ti!>tzMEf{6s&lHUPy#Oh3BjB8z{)H~;Hi`(HmJQK{?y5$^b#i3Sen9(4Se^Ut+M H{jdEGFXX;h diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.InlineAccepted.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.InlineAccepted.verified.png index b7bbc80a5adb60d6f06d8a3d33529df777cfaaa9..d3368755859c403a295b195213be9a85b48966f5 100644 GIT binary patch literal 18300 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 V>fIWy0Ke-4;fA{c*;LL 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 jKsO1@k%@o> zkg9p7cjXboDy&q>A)h`pF3-iLAtGYb#SMhOW9A~-cn$v~ysb2_DZ_2C`f@E|^-V!srD=oCD4a5qWl#q;hutj&MOCIIgpe6>{b zIn-62sXJTc_Q3Nz2X;q`ep1XlB~IVI+_qwH=}OoWnbxxqjM+bhe4te&`upYBGxPSS3CtXI%mg|AUX-zlH|<@n|JkJe*XHpG(F~w74T#Ph zDrl-yxP1`WWWiS4OUu*;j8;!mDn*e#h3bJtk%GW z_r{#_lOfy$5F18c1qlC-YVqPueAH=RFBt6jL%y*YPE*vCq_crK$%KKd4hZ)7ldhBD z54}NiL}%54bzeANwhp;>MXyVMtE*VcFO~ zWzLwo|6F(qD=7*w;ntd?HV=W?6t%lqh})l)4-jDR9U~LoV*PAsDo~RLfTbtUVZEqW z&jEt2T~)f9L>hIhWA7anRVN@;y@*8)fyCZ*_`nfYtG($tv4J1kNAt0gw>D zzgve6TTPfc_=MF9|hu1HB2Z9ROCSWFXBF=qv0Du^wRd_E;qSK#q2fYf~s-={z9XELpm5+t@(# zLT_sSN%48TrDtBz$=fXNo>Bz?auq-#NV_!GK`s73~ZGe8Q^X6O|)l{(YrjdKSiuh$rm+rRIiJ=8}j6#8x>FG_X zrEYl&;WEHGN_R8e7(%+irIG3%vB+k&1m#=LOJ|$)XOj^XBB1Qu&%L9?VTByIG!qkE6cwc!iyHClZ+*YXHT)>;k zfvutpmrxUbwfVTQS0P8HANH;`mjiJ7wxNNW{YcJmL ze({E7_j~D~$;)?#nU0xxp(8t=$n-q{YPRhETbTSGn#%tyCVzSufP((n<9u4ie+6xy z6y%eF{FkWylY)FwkWUH%RJ;G%p!QRU`4nRQ%dF>c3rC{DeV1VUSN4 zfF z{SDx(olB=}RQ>qBalY68ufuKx01@zWWJ&aYeKDtF%8~bzBV9DgnS8Kj225MHNt?ep z(dX2g*4sE501MU=AIRXxzfr2E#OkSzMCwdoK3LfTd@=bkSiWoSNpjgjS#o>*P^%%f zbw8YdENI7SG2*sY>&JatfICoYKv5u+eQBE^mOZ%mxF{HGg;rghqjq*fsQr%J>?aFt_HMjrTX<4n1drJ^s_Ipa z6_~=)j3an~Dmyf2amw9m-KWl} zz<0kZ!?t-I%wR-?54LKMikl`>Urh^iNIAzN+tTLGyNCnAol5Q5t{v|~R4Cg{v5J?{ zp_~Fg&`fmr(A3fn0#q^9!9d<-6?hwI9--^mdD(L+_)uVn)CUYXr#=b)c$?mU1;J@m zNaaV~R$7yHP!uwWqC|pGo-9=$D{pB5jcu&)n-mtMXcQM;NsByg8qx zI&)?E(u%`b{3QJY8CzwVVebv@?1ICZkx*LWg47C?FawI^R&$|aalum66f-rvH%gt$RVB1Gah0~#Y+)ap;9`-WT~)-@by~FxYVxZ(G1$W zNOb>iDi9OP{OkGeU%ZRTS3-xKIPd0mn&09d)8C(w0|?Qh=Wb(yWx1M&ts^`JWsI0q zsUJ#Sn-68L#bp)#99)$625wBxtLH$#fq}lUX6E(Wf19$kHNJKB3_L-Rg@R5yRiWVD z&*tkSv`_np*HQiCd+n0?v|LcNQ)6qV%l91!j6&w^JJ^5dR_TKlTx-JRS-RAp7tub= z@;}2iZ-h5ORf0JLGY9VYMizyV+`KL^+t@_J-QJ};52nC1DRXw}1O5#pn^R)NZKUTVElqimu!f2&ns zV+~57OQt8s%zPLqwG|gebM&|74%zz}dHe(gXO+bAr|o`CQIVRzVs5YLKoI}Wb;Z($l zmZUuU00TwRG`Io7WSxC0xo19$`J5IP-zI{~3UjTTsLu9cF3kRKCML`n((qJGywbkJc3Ew% zSNC$6M|xiGr{>+XJ%75hW#n6a>a&YeiT!98SV$OSa4tTnR`6|&#br2_pxx^PXU2fU z#KMTc7k01SE8N-bwrIT{dz~%>bqjJMR%R=1MaYB=464aD*7%E;Cuouc^z{;H*VvAZ z_n2~Po1(-5kS;fj7kz#*krxD4wI^Cao919M@u3SCtr9Y;f0XZ{AIG*&`=H@e=4p%= z(DO^qj* z{wcC8S@3^M7a|l$x?#qM56V8k&krSBZ4_>~*34Cr2J1Qfa4D#|=# zyF?Kbs%op=AdGA&kfKgpJ^=*AqP*+3N2RiO#T!{*WFjAa^n)N%tQrp)KgpV%bF5tJ z9;?9Z`}PAV-x2$~Mr0o*N{9juT$!#RyfL+kL?`vlHc@p(JhnZ3swC}cto;zLJwM&@ zW3WP^El*(UQ`vbpB!}QhiF!6Izg_wO)!0&nb%)SaKc}-aQ-@v;T;L3gTi0x6x7hPP zPH0f%i|Vav3%#dHCeLsCSQMX}|5E609*Afj@AS6}EIKTMi_<=v_|P{0@ez)E{!QMd zc?$Xdq!t5z~I! zwKDr<`I)IQhT*_Fv1n#0Qp2k~9;;+oOr>T3r?wb(Uer$V0ODwSeoIEY5q$oshGXh4Ezt+y!;Ewq@vm2GpLy|{_ zi1Rxu*K_S`tOwr7^j2o4p6js=WE;9v2yo21Wp6@uWNP{~$h?eHjQ)bcvbD~66C!cgKX$gO~ z>>amXGe^)q+C{bF{bM7+{0p*5P}CeT0uhyM!fP1mv`e@p%SA+0AGBVW0dQ*D4wWc8 zFdP}%dDniZ)3As+xS(nQaA`hA(ZpdTxhVP?`<5YEN(3K(XidZ=hz6k2C8P^LQrIE4 zMwFu!2y7qPW*8Z&$A}Oqk$gu^{ld@S`JXfSwa^a#4rpiC0eUGpVX6<^4Qu%4&CH^ zv;;6G{Y_M1Qa?o+f77+_i)#N4?+#|(CIDIb(cd)5V+`oPMqP0u*)HWHxtU7`1Ae)5 h&al?i|M?50#s&r%jQPBVwU|5{|K8)fs&9j?{y*yY8@B)e literal 21497 zcmeIad010t_b!a0P$#gpDl(1p-6_6RF6;T8M5fB2{2q;rT2tyzVXq8%pC@3IP zKt)6#5h8>s36@GkhM)`~1QKX~KthN>LLec@*`RMv-*bNFT<5&!`~K7G;$la3_Fm80 z&vUPPt$Xd~))`l)ZJRYWD=8^$b3XBthmz6;7bT_j&0nYh|08nz@geYQU5tm*F(qub z_B8NeL+H`dN0pSS(OXt7Yy>`Ux^ludMoCGnb@gW*1^Vowl9FeJ^G`?5CIs+D0xKfC z8$ltcEf}q%TW-X@_}206H&e&BddG=7Kx%al{;W>I9C4?_m2GO9(_5#%o1Op~+Hha{ z%5TbVU-ek1eVdvB{p#p9JvWCrkH`*z6OhUe#?uelA7p7dclS10R)g3|rBjUjTzsN~y>kqwL?H2OPF| zwSQoLy?zI9IQsnJQuOB3O~Bz5uY)T`ZnSIw4(os1gDf}}v>rJ0f3VfwHQK}^Q6UpU zk;@%{%;&6_WysRX0+oz$TprJIo2|sZu1}BUntO}>dVM=T=RhEHk02Q4629CdASH!b z0{1INuCPI@WXW_{e4G06=ymldJLwEwfLNKM#1A;vVuk`U0-vkfuY6dnrB%NP=44Z> za|DO%ph9MnV8k~*2QZ=9!lbG&L!=?4$aJ-ZuTFoS!V} z_g2@;?K2OzSFh%mo!$Eei&76nE>Cn>u##h%W<)$1frk*jbBZ4TTy^C2?!e^eg~_h` z$8HkJjwLH{6@T2S0m2Rngn|>)9VNz0t8P<{7lcoh}pRfa_e{j~)jv&vjc1hJEY2ZhVt= z?d}k8`N5z`OYVy&*yo9NTApO^LGm#WbC3Pc;IZBqYOoY|9KRQ)I)iuK)t4fYT#J4{ z6N1Jgt<3@$&oQ-?bu_ZrN^}4xTnuGgPP>*-McA%00;zqqhgLXrc>A3)c>tyIUSMZnb7?zXV-(o6SO3<$n%2}kUvWz(_?JQ-{PI{?U zmM7RhcIqamY;aGmFmiX|`hpNb(47(o=wn(1j4Q^GE;&GA4}lu8`0s~zKt`q(7V#qgl_-eJO;01M7bH!7iXvL=}HSd#^dIH`k% zU^S*`57>ZXDN~~*xa?db+#Gq?LNV#b>)(XLHkp}}FTADSLb0CrN}r3kb@!qRNqLW5 z7d!TQI~R0lXpiWdOk1>5*w$N0yLaaHnHu3uxOZ1))*+Mqh+n|^BG{Sv4NXwXJ=fEl zH$Kj$!F5{tsK@|Z@49x4ld*U2#tg+D4D4u2xyb6@1{m)h*hivN!)=f)msR((twfE7 z3M^w!xf)lnVw%!~$rOk;;~6SmmcUEyAQ`xX(T{K>mW;M%*9xMIfgy}_I=Oee zf9+d-Yp6lrojVT4?@*|@NTLHbna)}(XR4jK>WAj{wLF2Q@4@|8&h{&Dm)QlJ?!|oB zi*}<2mdk1(txrF#jI2r0$wz!i$o+Hr49KWSQBZt>=@ysyUy?3G_C=+SS#f$);mrwx9U%o+Z+M-D zY7#uXf6>+o8y^m->yF2$*|(v@fOX8!n{KNPi*`(0g*nmyDb0dM`L z`;jx2XSi8lX;+GVR}sNY)i`Z^)|}%dK}^M$fPXu&Swi0<2ek~)J9Ebuimn59dd8V) z+86qgS0Cw)dEh~%s%KTnv==P(_8_02ByNi7Ds9%+xt*kQ^%TjUwq*WOit8p9?p%Yt zuy)atVK=!si=IYW+<91*u}#c2L}cn40sov zvAl>3q3DU^l4y`ZF1T=58V^LP7q6F6AHkUK^kt=vx7NIeSRW85W-z9+=7s{$6KOe% zR`{O1l#oD!n6Pfe@QLEDKC>RK*0oGYiE$&DS&VYg>>(BeYf?_j^cLQc4%PrGDaEm^<$IAc>c%&TnRZ$o z!I8Uip9GX4sp`gITx|(hB|7Z2Q=|p@bu~9(gfketbg%oX zT$`I}E?2dIDLU%22l@S4+BQDu&~Bib?Ym zmi`aiDHl!+x_5*V!PD}bKxCrUaogkDH`>^{xzpnMeUyqaS~iR(uUCQ*f`)lkjzmfHsw;7mU)nadQ!bt&+WGyXU7R~3y(|2Cf_Sj1S z_{{7bbeJ7XTU1yR9B&(N)$3MtU~)dlQGoTJ);mf!m7ds4U4gyV1)HymZRCO zQB4@CzP4>3-@i7B_O1#MforN@<_v|<#{A1Ley|4Ikzq5aNH-`Sm>!RT>2d1hMpdu- z(#898zu!Jjh;k~&utC?Vm*St9U_BYbJ99fH`xmM>XOFmt9R0bgl;h_eCme2r)lFG) zY&;@S9g!|(X;w%}wE}P23yFfvZJ9aO3fMHjR}h-AXU>OKhBsh<&)Kx4r2^j;_$88G zm|;upw5HYK4G6ygysiLofi_!>3;{KjGQ}hb)NL`%Pk9GmUlU*-T{$bN&pKW37v@H@ zTtmn<2KZvSu~1fz#8nSdv40gU{AkOHZjzG5u#Om-6(1(KRRmWYFb&_73z58C& z%#9i7HA2i}!voC{D?8|(grTVJ>TN?b|}gasth#!#*x}SJ3$247$frRnLg^+Ep5G z;EJ6{;cH$cQbdy>@nPUo#P0e+1eM|CCefir6X$f=Jvr7|%JsWO%F=7AJHsN=)b<>| z?_1SbZ6qRbG8t~R6m3B;*R~}Nh&lKTddp71hYg0SXb*QzYj;qZ+J+(m@XM3HEzc<2 zI}qBL4CXH^PzM6H`v^v&h@dIbCi)t);f2G;Rj85PwtMUkT#mC`EMF*0U*~@toa($M z{8D-KdBXUEmQRBv>0arJX`c&t%2bX3f(rb8%lMgfMgM*?OZ(O*ZvIzwiIsJh$S=Ih zMe&7({SvnAvzFFp3fiJsRoOu8^Noq8x=FGpV9}GlrXpBkeB=SvI@?dKwhhWCQ!A}N zimNQy^B>2G+?88!^^|M(zKP+u^mUcrw4#NhsqHf(-Hm5$?1g5xV>4jCFwyD=hyK+8 zceimbKJHzXCZBSBD4WyDNzdsL`_F^ZYk1emDGSzpgHh$-Wyq;;)?c|&L*I(y{VnlT zZ$pqB$>^$TC0a3eSmUC1dQ~HVmyY*k`E-QM45}l#;AD|wU?|9i(U+9M25?o^#$-Pp zXVDSwi$B5fDU%|;^|U|q=GojiUIwPhqaze>Vm~M&FVGg(mV{!j)NvceC-O@bqkQS_ zY$L`xAailaK&$oFN>H`ruWG_iR2>TN8sOc58PP1y(#~77FRxTBjCerSVY@1KS7<)$ zpfsKzYt=Y%M|8Dv0&=Oklo_vs?tI6H#?guN57OYk9IcYS%Q_ zD&g6EYZ~s`B0@=L8#ht3!VJasq7H{hmMvLyAFjQgCFy5HYNfqDKB!!NWKla*-%_+9 zS1zI`CuoQiLo*86OB^J!@O<|9Ey|DAA|?&&umW zB+k$Fm+3jMS=~&9xU{WNje`u0xzu3)3E6-+<8{^wg`ujI+an74YFjr)XNix}s%$cWrm=_S`NVN%;Ts?5aH}rP2)^uMamWz`Wq7oJeiVjqA zXmd`#Y1IU3?lo|1S>Q;+hhHkTmkE3GsX!V&Nfa}i@H3`}`F4E^AXpy|+zGt4`#`|( z+c_gH3?*OY#J8n#ekR(3MDp2#qcy8Dbl=~(I7)<8Q2azm=@W4E$gM76YNA6l`Y&5g zgjp+QFbcu{l#VOLsq*D6g$SkSU<8xp`ihx2B1SGE$A{Y1 zY)*{fU01iO$9Fe)UH4Z6PA-)MQ^8%*z6Kgk&aD8VrZV+5994iYL$GQ%u0++70G)GR zpSAS__xDuI4v}szc83U37;Y`~4-fJ2j z$bp)n00ooRcPnn1Pp#`!+oe(X24IcXg)R(H!eZ!=H*QuJFaGG-^&uWF=ZtVa84F zl?r{Hcu_7Du&}+`gsXLxh53mN1_cC^GYTWq8P>IzjcWNr$N3eDzGT|O``XIM!`+eQ z184@RL71Er$gc5K9?7ZTG`94*3kdFl{v@BHfUjNw**yPSx0K$QU3UPw9w~&^y2|8a z*=@zb|F=o|l|V4nxHc6lrBx(iSr|WM*+fntQ!bZ?2xhQm?`F-ntA&C%Ya$Vz9P!wf zQ5i|I3jNL8`73~!w8`%1tKd~6`A||rphC&Ncx^NB(SdyK7>p8Sc++AR@x@ zaREe$JlcXnIo$KucZWZm1i2o_^ZJg+Yd~mc*zQ--&4#12MFGUL@a(k+_{23&`s1xS zUcUSJ!U%L~Yr-`!nMMUtDt#fon%QPJH5HkmFVT75x&AhoQI44OG7}{foU+Bza@Tnb z?ambr$KBZB*OlR^vd52;bRuwXA3F4C=QI0-kVVNDX%$z{_|jCSMRq#0oPwW(VTM91 zI`GxLcpI&7`UV2s`krWI?&|DZL;qo#U54#mCEX%mtyQwpvL|xk>NcSOF>u=CavTOb z3N|`(Be?m|#g)#xcBxnxJW(dkO>IAtb8r^b5eFwP=e0EmN#|K=S&UV)NNxPS2O5-{ znwErzKqM+_MbEKhq?RY*hhsYcS036XjIP;h_tKEkxVLJ~JlsRQJkrifxscl+!d`?v zHs*B0Qp(DhAYeh11X}`pf$9s)Ro0@V4b1fn3*A{ip}N4W`xxh%dd0qfQ}_${L)A7Vna2j*cTm>FZpJ`77D1g1A~Ut zHm;+j#&=c)zIa*BVWop!=nT=6soU;Kgw8H({G<<>*LyXjKbFQahm; z>{2G9DzQ7mvcPlgu{@8iR5-;nUj$}IKH`fY)WXpyC??ED3>>#pEOXvrRV4S-*Udl< zhxetHJ!XQOh~9#+JRp#*QX0g(HS)Az>EYKp$$hutF*ahpF40v++Go;^o3EO{XU&qX z1vkGh$>{=;a~e&!XnwUBclS-hoxR6VelDu}5d|TyPLS)0c=fL7=s*L1a;TC!P^)C` z)Zyep1)*^f9s(RlJSR}-9>=3{u7Ez`4esH}44xY0)p~AQtgMovPCp^G4wHFh?jwg> z^|uGA1BZM&(2?c<3%fXdyiSwvK}HL{KG!>fE17(ky@_eOdmoqR>QID}57dKKdT8gFgec+s+{Ffp)RO307%P78jak6DSEL;?R;D1g zHgT6eh7q=GXz~WpN2T}gTE0MNnq*)+-}5HyD6|@Zc^;TBJ{}iFly-`94P3aj<2!BH zc6BrAuKl7JP0cCc-EFbuHygCNs#9lg#`?#bpL>3gl{tHfj0V67&QJs@&XM%W(iX|dzVL}vu4($%7ZSC9t*Hq)fD@f(2=+Fl6+@StL|i&92E@WpK}R7AQd0E_`Og;PBE(^M6o>u_}kfQA7{{5l}(a8OKO z9eRO)c;mF?1DQwzw=J^d*pKfhS9Z;Q6I9PLxH( zn90DRV4Ap}oG|xS+;T_G0n7|}&p`BaYCA{K9oW458l;%;Ly2Ao*5g<$fUR`+>WJli*h4?{r`~aym6oMlUkW z2P^JrYZxju z#}zHufUgG46Xb1yjfsH9(8XFt%imT>WD{iZbfKub`#_E1zr#2+dH= z5o7}Su-xWH?Q+_pJrTLrB=zTu0@f<+`zrUM!+ZVC1}3D@Eogo_gU-oYpB2wSh`Ukh zI?wuR;Qrp(eeAjCnVV0OzS3aO|?re6ndt{#JQ4cHYR<*AU`cw*8GJp#V}NDlLyik@_m5tad!FSs$`GFn2- zx||u0HCKvA1QBY5s(4j6R|h4Pa+7s$uLfhI(Zn}Q@<&{nHrUJ^xb1Il6}#p5C(UB+ z`SnJ#r@CUJgQ7#Yvl;|~!PJq-U5|hmODhD*=8%-03m&R_MR0C3>M3QQ z#Ig(lCk3157%k}ZFU<@_H2m>I`F`^sPckmds&-F!C}%wkD*!d7V&f;d9+U5L%+S1k zAG617EAlc_F(sYoPaZH2D~$5zMO&2i7snm)JAKKPoZqV{m~0d;kmc$qew?*JKwfIn zCx-h_%Q?W=exih}E^1u_;XWqYir6&_`VebuX7bQofX0b|>gm->q|$5m^4wId!HWK* z1k&FR_aw%L=8V|5J@FcGVnYLz@EgflKy2+U7(NLTw4N0linqnTesG|7yzmsYT0&$TU zxapqcQ-wd=;q`@gv6XCyrY7!!_@*{^AcMdCiMUq+Z7Er<%k#ToAxcu^H`tFZe|p?N z-m<2YOr#}0wQ|>0P6J5qhhKK(j&G7hR1!?LSi$qzw~%Rv@h!j5;=(YAUZ-t!0f~xd zrn`AP5NvD-;ITi?;n`=UTCI1h7Hpr?(Z_tDha7Ws1uf&+(i;dXlj(Tg^HeMb#l|6| z-RHn6V2E!rCcp7w69?1LU82RPK3bSQ!S*j>rE3$w=%zihFG`St_#I8AI{BiAzW8*$ zCvS3-LxxTs6qhCNS+u^-*7)$!3K*WaqmdYH2;x|!aXAp0)G@Uk7~%o>2udcEaZHtp zFf%g0kJ*oVAoz^_GJEGfcIZvvgRKya`N35(R%7sDu(ps1B|VKcCgKLX&yLptLn7j$ ztzlkos>hCXM~3i{#SalrPeTcuVbEq96$hE%8-gn5eX6rr5dxiHMui-b4YQ&v)nyfl z^4&N&-nyfEpVk-{vRtqE7kpT7r2E>hQNK_k&pHkXOa`b(r)YnD!XYh&e(OE@VD|E6 zm(hc<0OATPD){*7m=|SPj5; zXJvYO^vT1T?a`%mIo>So%`V)8ff&i=?DOKmD;H?dC;cXy+-xnNUO%#{Jk8K6TeGbe zr5WpnX$d#lmv*M(J8Cf%VFeYb$lsu+F5yEG&9l+H**9Mz1(9e*r=IoSMh+~8INB!Z zet6kt;L;}@38_V_o>{5Z4fwoInk@xIJ`~hPbzP|2nh@~!YWne;+``|``a`h!LSA3{ zf~N{l{OG{)V|_B&X`PcvKbSa62XGL(Cdow_^3bR=p2PpnWUQf4sE&~Jv*bKNR}A=3 zVMq7n0f6nzM?arD$hy~Ys)*;P45*8g>b!xu#8r#y+-`n{uQpn!qS&==C?cOy^mvQp zY5dN%y1|_(_l*{eWWGiSmwCUK6wbaR#cBfaq2*%Smg8vAtt2GlG`jGs+&*>;YAT#x zR)^@^sfSlb@C_~jO5YF9VQuQ?jii5EqtEe0hcu@Bz-QKoo64l8(P zWNA}+O3j6<^L|b)P3ub^8!VocY;Qqq6K1RT^KRCWBTHs4Q{&}VjhosQr)jY)b%e;s z^2#1St^+8Ow}3%vx!93>XgdxgN?6g;8BJ{e7Xt5>rQ+B$VFu{8A^lDuy6CsTJeY(e zp%vRX4ozL3welnDyxkTn$%bZRU4Xgt{8;l}7Yb;Gz*3gc{oA%bK6Zl{SJnFu0VzS% zu@p%SdOWkm1x_NOrQHPaA!~EQ427M~>z7m15mm7H{MgX~04tX(4#@uyi>qm+T1xFF;sBLvqiQ@_MgRISQTgW!yA2D3h&}<{uXH$3k{aw6dE3h`CCxIYiW2 zu}x`%UV$^Y)kjjND=`0K;aih+K5lCaE7mL3dBn9w5chQo7&xa@Be(CtzCXT7KmvLa z@8hJv{%Er9$b*&*LEF~vND+N>AD}S-yzt>_SJNeEyuQs6#!mQa!c`A++g*%qY$`1H^GLceUUZpZ#EtoVF@dbze=0 z$Qg1Vin2Ok|Ra_A^OtVk@M#Hf_jD3u38MT zU_loeSRRZ=M7~=X5#@=y;`Clzkgt2IPV8~&6^iQBeKm7Fl=a4|2Sg^ zUo)K-TSd1RFnhvtKLFyn_BT}r2%ewfJimu9xG-B*XHk)8iyLM&$W_*0K37T zlZRb*;tlT*sq|zke~sG-yA{#)%fshG7b#VBW~2=F-E^e?0=63Rdn7eJ*;Q_89YU%t zJg?}{UL<1ORgYMzp{L(#O{v>0jn<_aixhnj@S_n?vUZ2$pcaq3&a1akk5gCICyN<) zgD|trpU6a6cgrlkNYLQQF4r8-spR8LSF1}Lpd~EUJ=NK`qgrBn`;4tF?cqk{hC)Yn zZMx~s1F*|1pQWb3sQrJ5n!&G*@ymW+LKu&A*!!2V%%&)m&iD!hu0jODI`UpQHVIWE zh4IXW$Va^S8HrNM0n*Z6-B#**^O*-LEG^CD+otA*2P#!KgAHNhC3(yko~)0$VjcI% zZ*Ey;jTa*^>E&Yk$}HTb1o&zK2^4I0KFj8H{_b7)l6vi0@@##&E733D=^(D!D;g`h z>Q|aAI6r`jJ>ONfISJ73$6#{*!Ot$Z2mu45eDcU!!o9=*K?0*9e8)<%Tbl{yX1rG9s{_T;P_WbQOY@c@YktecEYE*3`frDcTEOJSSa~iYFTXgwpheqpjihyO%5P# zX#8vy@&~#w+xJX>D7aFeJRTO!mf%?*DWp`)TxE(&vt^zf3gjU^^_#j5HZN2VI zI4ZC5-Om7MxDeAi?yuEkF0N?4Ft))%1E>G;<(<8^=XSSY^PB1)Lmp_-e0G-)1*mLn zCN5Y(BsKv9yzkk$*5lhp8# zUR+6_r=n>JAyN$$g+93xBE3er3XGs!L4JM<+tz@>Nrz&HX?IUUwZdJ^9{J|CN#0Yb zkzTUgeqr^yk@MfFKkOI!8u4kFT`)^A>zmOF&%|Zznj?KlB3zGaVLDOP*p}XD<$!CDaTW23tvFN#fVP;2@v@XZoFLc;@weJM&%r^-1 zWWY{!M_A(=mFF%s`!*yXTJjq=)pu^y&RVhemmTz`4ARf zX(~#Rb^2|rcxPx!su+l>x|h}$PA6dAONYF1-J(zM(I;){OR7))SdvjH!k>Z`V@?vS z#b*S?Fy%tFlDLG4IZjl?y03MX6sIyHnomZsN;^5lsVchH;N*0;`l_}H^qTZIK+Vm2 zq{hK^X^w=S*B2aH#eCIsch^cqmx|YAmwc4EfOx;{aLd8IB&GA8uBqa4^J57KXhAvL zqttQcUxB}6r&$jOxir>QhC#wZSJsp)0_dw;Hs>5@`yl9qPZ+sD&A~%J1yoF9@Y>a` z?As=^7Bt7KwtudvVBIw_6*p^1zZ|5f8(EiCr($Kc$9vWM?f#_%ah@=h)%UH9pgt3j zX5OyGe)IPYGsBB!?b2-9ueTk3@!(%lR2tB*!T}~DQ2g>gsw`uJ6ibUEZD@P>5^x)C z{4!8Psu1K4{BQJ}3ZPV_0g%uk6!j3tV?j62iD%i*8x%L6FOn)39S|Y4fEBs`JQBM# z>eI6Ga8F?J-0LcBdjdpr>Hv9Veo?&2J?xNkf4vqn%AYRqaAeYmD-@@T8M-qYUR-et zHzA6OXorPvi=~ojVbG3~;#JOb42EAmq9aX#G-;z%J@?u{ho95O_hC22@(I5O)yUVxPB> z1_bdZoca$_>%4da3FPo0URT{Z8z@&6U4sOj&xUYqKNPI#rAoVp9cbPs2b$6afUGHo zsN&@%H(pU=9F)1(sS@O;Y@&#^ixtqu{4v1I2~=l zCU$|-%|A2)_2qU60;vC&i(6toR!{w}DBJd)j?KXIlGNXK0EwWvbbAY2|H{AyX!NsG zU2=K}rA-CSDy2V065dbHuQUJ#JQH(m{XY)EK^gH9=yxEWtQn`dWbinHGvRvS%S)#> zQl|J~|Hg;2i36mtO3hITBBHpd1S{>MaHyK|Kw@`3o@JfYvheiZpO*K4gMAy#B|9va z5`qWZzWj}g<%KK7GoUNXO$Xb!BpBBQ<}AIDD%Kjb>;rIeJDsqA)&$k{H^ z9RO?_pohSv^%!LbZ#MF)^6BK-v>+0lhav8i~|6<0ug^<{(ti}1?yTHi#< z7HF|20&>jkouGN4yD(V%pld#&@<2n8Ee;f3oLcsX3C#j3D}Z#D^U35Il}6)t$Y;`F zyl+wZ<>FM13z4O_#>)N%>{r`j&DvKnuCTf+s#qQTh+h;pTK-JT_(&mJO8;JKKnjFP zF7rjcIrZ|CS)*9C-GP;-WV2I*v<4n8(9Q&OO}1>b=qb&k%SXxb?JZ%CVu&&AxQCUK z7OWdKLbI&Wys6c+59>*8`bjHcD_0f=42}Qy&`uHAgRFuxf@72OF%_q<74)h}Vje5% zS}5;qRzXJypqN0;{PU^SUsI82_F3QWkKi0>u`Cz6xd9M!`=i{UEc>3DISWs#76vm# z7g8E@S5H8%o>1}k32iEk%*%Z?%IKp+R5E~c{vRKc=B1S2XJVz7pU&I%V(Z_E%YU{q z{*gbg%|&IyzuQohKHu#Bn2mgP;|2#n|NA@}|5tSN^91=kL4wu;iP7f?@;Su(M+xs| z1o@00pAqCUN&U~W;Liy189_cH$Y%ukj38^p?SGRKK4ar&Z2XLkpRw^XHh#v&&!zU& z*G~U0wD`}#^Pj;}BEq2%29%9!n{M^L{lD9EYwy~|99ZC;)-vEFW#FGT(0}m%zL(ek z%Vixt8nR(+JCJ|>a6}__Wy;CEarv*?2cqOcH-&JLDxaZdds9j>oOE(*&NUsm360q* z5Zs4+0c?5`m!zC!wMUv|znrz!M!6y^vnMWpXjRYo^aUgRii|OE#+XbeX)CZn$&qd* z@IK2cY*vkpFT0h&_MqsaeXnkf2d)U^nF4#3jUEB6*f_(omc+pPxl7}wr!vN(fUif| z-UM8y9SRNdz&yCCe`%#S!%Y`It})BeV6w8;Y>D2WCw?*UQ@`mj)wG#xMA;5()x!S5 zW%feHt>=(>3?u>Nm$4VP2qjV2GA@EbqoR;fN%zvep{tMJMUW-QQ#HmCRe)Mp0A(vy zEG)?6Wmy*#Swv0x!3?u7BPhuj3zo&3>r&Zh{-+!20-Krbkg^nulLWH;?5`heGVH&! zz1VS!o0xH-Th^pB(Y`*lfI6)^t`RVd3SHe^C51ETuAGHYOo|EK$AwgX`HTPlm9dMn z1n&nci<6>47^wB4oj&|GNJ65baBZuWqI{>VE=c4;K9ZtX+?>K1URmj$2Sr&f^Lff_ zLh38=W7bAhR$&B5et}NV?_`1R&B?f&hJ%nbYsO~2moV7#{5g#r!I1##HYgOleBnct zOtwf6{VK@dUui}u@>wpEF?kE1R*sBCC$WuIr>$`K&BDUi3&|@4kbhJ6B@vlb`@Idvw$}j_}BBPfy4&DmcZeaUmQ=&Wd#C# zxv$-3GoYThaPfiw&j(&Vn_v8mku_^q&4MMhGv}5#aenb`=HxDQuDGdVHvFTHB4!~P zCWeaH!C~2%!S-lFD0tq49$>GiGB68SuR+2%@Tw44-hGz6-QybaV z)b0rKo3r&eBmL(b%bS*BXdp)&L%!ER7Pa>8vd&;H2__bO_*R!uNhs=Kb^%AuqCaI5 zIm^}&mcY_$;p**e7n5oHL-xyYM1o!X_gLmq`vKB6ov^|H6wWBs8EfD4?e|eliM&HT zakl!AV1X*|zFTrqQLcVrbkm>l`X#Ku9UsnVnCzi4_TBW`N0PmG?}J)t>9WSmMdy7q z3JSX3bm8@tOxa@D?`qyoof&Mx(N}zXC}Nvn{0U-kHb&M%<0x44Y__fCqUtBR4u1bo zri*4j&+yxMKiLAg^n3ajE>FEHnyc($#=GO781bUSKH1#48%3C|6DI&0lFVtNY7#+y zu4fMjH0-b)HaF2y7Jcs;HoRyA?{!vD+mqXQJ^ek)A%^UCm1!=!JJ4?9y3J)aB1t{9 z-8RC~o!AUnsyANHu$x7NrhPIa?#B0fj*QpHyo1kPs!3YDm)hQqvzEu{LRp!3c3lZL zE-K05fBo%)Up$oAB^D4S`iv|In3x*HKpv>B7Mh650!>=Y4cIJpitk4XURanc_u9*P z^D%N^S-fk{(uc+RzPWZtwsz}?cB_;D{};rL-#$R9PZV+c3$qT}HQO4)lIL^xQLb1} zKFI5I9RUo?zyp_hhepOO=%eQK3HrgzF~vEZG%MY|LHB>a?7sFvkYWzRT6v5TqN7MF z^BoiY(a+e?ozBl8OXk3JT~}v`QbfGTTDbE`U)!SUo3$+~m9G8gA668opaXvzUy7z`quZCf4EH8JI`=G z_j6tMeck)nKc4eErMXjYCkO=6JpJ_vZxCqP84ze|+Xw2vUqtSQ9svJsfqS3&5`^tF zm<7IUi#UGvI0)2$-nD*tJMewSwXgl*Adpsv>faVx+|w%{(D}!wPaMCH8a&TBe>;ZP zVk%zS%e(#$zb{T){zUi2m2WS5*y>(65URy(%0Clcmw$TlRnE7s_B#}BGiiA_9m8~Y z`|O-zC@xyLipBwh16llTEPrjx8s)q!-3ojyY1$3W+i$f+b>*8|#xt}E>B<`~+>o$E;p&{eGV{C6A2K18+R&rNbscDsl?Fs-KnXGH@i4Eguq`0-?`VQR_9*VqP7l+5#P-t~h9Vh(8JWD@B<*mQcgR3@ z2Gg+ty7L-4m7BXyR>OhI5jFjfcyEV6k43PfHZ*3iPtQCoFaDBUZA3V->gLZw!#g~W8@je0o!<3 zw{Y+@9D3k20b%`3ZT|d`YdT)PIJNohJhSvYGSXiddT?e2k!LD395CCy7qB|*Rc#c1 z(H@f?ggc^E@%*sWYy)hUDLtU5diPO!UP?LT%csVc+mAd^yeh6_sCH})BCCrMHuXu? zX$#{5kq(WS$d~NC7<{v`0e8NytM;n210s;jZp}Xrft>T*HMrwl>Q`N>5B4Lry4>0? zF)YjpJ;?MNCeBx*i*b<#9>%qzd8-y2B_4g(wMu7ZzKZ1!k|sJ~_@_*k+|C=O0O z6XK2bl0U*Fm5fUE`xcrZW}>0T-=GU_JXVOy$>xqjifAKX(%er@@IhK=6 z!5YSmh#ui;-1Eoca^aD^zz|}i19ciUh9Ej#nW9^`!d-NSMvvjCaPqHLfS=?MdYDHx z+-mkx*6G=N&SG>rt*>Hc{E26qY_cUzG6U;8_prcnyUE%`3e&SywiC1XO?EJY^OJR6 z3X`!Sc1=iw?!OzV>z<<^6l!^=mtk()MZ#R@@x=kI$ogyYvMnb@_7vv$CYF5LhA63Q zIgMyTjxBSPE;$$l6-hj>4JznSn>YdD}NWuS=ZqhDw;S*-sye8Qn`A9vQ`z z`Kv*M75uNVg>B7;T@+<#DD&sczaB)w&slGCQ#b-^omx};v8 zjCA&2n39*UtAJsDb0;8p%M0wsb5d})vo6P`EHk!N-o7yk9O&o{W)s&qH_-p18J z&s)Z)LsW!+#$XOT|ZWgz1;%2=Pdg&i$-iR@uJi8H6D}P_SXvj&{}bJ&g)~u6!KGypV+h?e~(( zj<&n*e+t8R?u_!U7v$e^_MCr$OZ0ba(DAZQXSN!epnbRkk2Q}jyXP=TyNGP;C9k8N6!ka5_Hnt?l?3ex;J;@lKy?)K&rT=VJZ zs2EW!9>#c$N5sUD>e&UO5sZnks`9|37Fj2Zdr7#34lEPPBgEU+`@*$zU$x+#>EN25 z!UVQuQU`^*)n28PjLBsVx)QgWcyRfPboim)z7W}~<>~=^ik+Kj$Ys{O4(*M99a4>kVJ;5=tpbX-TY|ptN3M(&67Q?!lNjN#^J#9Ck<=;OZK2Fob2twz1he zK9HzsDEqY``BLetu#tVq^G1RQmx#Gg#-Pmgl9KsGc`N6|t7fHw_$Y_w4UD$?-DjoF zRkz;+vH>e#Y`HmN%7QXH^4x))flrEo&V@!gJ1&HSEu9c*yBJZ#|o9LFmX-^I95r zx%GjNmX^@?+{`#GkdE;*!)(m~PzHUjT9}rDNZ^nLled1Hs>2tWDUE2<*P()dp&JcH zaH6!EfiAr~JWNzUFvhvoa%c#Ep(?{b1&?LVkIc-x3#r57>!eJ|)&oj}-?RHIF=xrp z(G+>{-6T|vuOXvG0ulgQ0Pwa+ImYnuigchrLu~8um1Dsa7uFr12=)DI9OlgA5(qF3 zGx=u^lF7m2i5o)^0A_1&B48`o;bVPR9<0_>p2urut>#TOa3KNe*ABLN=|_k9Kf@b3 zUeP&^i3+m_^bs;vZdB3=yE97DwSNiTw1wiy(SSo^^+f+e11*~t=)@mmZx}%N1VbA( zm5{rOP@ku4b{xata2t}$MYb*I-DONd`cY)?z`)cnEiWZfx4m+BZ{g1kw=e;hn3%<% zer~*Q7(P;zPOaK!=7I@g3kEZ;ivUoOd{j7hxc#q*jt(?qI*YqK*K|z~Z|`ya8mEoB z^g2?t4_&k4$H6vwtB*R)zSktMkMwn^NpTS@EsR1bYUy*S1(+>CKP_y5r}59V@>4iP z)>!DDX6A24w;V8~-AjmJVz#{cv;&>U%jy~+l_u4sB4?ua&IVmlf((|nT=d`u=m`fJ z9Y+-D6JB?NLjVbG4=8jw7bO$jGMWsh(k#%GwoY&!rnS#Y*G=mCwx2phxi_J)-% zNPavcfA#4T3~@AhJ?4G@^%&qXBJESCq(E~aHY2u{%P^s@=BsQFaJpxwpX9R|+V>N9;)}mo zf9@A>sjrqNIRY)w*Os-mX+?V(YqnEr-}8~K$fA1C{#`vRPteLQ6AHOl5?nFV|s==$5_z1Nok0{veS z-G4=?KtR-`jaqdF=<~Y9;ijC74XOn7p8xOJ7N;0D1x3^gMz9(BTbd2{E+F#_Law5V z&ZucxX^4!jV*p+zwoh`_os_G5uq;j?ixy>IsoKWMwfuddUns?>)zr{pn@&VUsKlWb zEI*~38fxLSvL5l1=$X8UPZ_lxE}(wotCT^;9lXoK6*xw&?>bXK*5gHrO} zc!61dNG*VipF{)em(D^Pxs3X0Ih*n2vri?(g6qrofKe2*SKRmsM^#AqRB5%6iw9_A zDmewV`%Khsku}jjbobX$VCed?QtqjiKN?}kvk=P<0U7PQG8-jkDA)N)DOEWoYK6+1 zEU`q{3yyp_cYd7ET2=~IlaEH@Ao95gFezQSGK(j2kQt%HKDFvC3JdreB}p5SD;sWL z2oyl_Zii9RzMYOLgxDY$t=XPr4M3=v4c?l+`)mGBSpgU(s~Tp?&vqO_CbtX%1HQBK zt0n$jt>MloJZ!s9i*|E8Hi9?mhVFrrxlgkwrRlVH!zr3J{nv~JWgTU82Sn$161LGANc_U`6?QxPP7 z=5A}@!)SuT9@hF})m!yurE;wPOq2!bd>yq*N(Q2-Kn62WO)eGSposNF8UxKiNLaau zT$vLg(i|@wJ!M#%=TBu!4dAhz$MRs2{@_?r=Kyy;G*^Jpo1p}`5Vr>#ijan)U~;zZ zCe+L_Eta;~o3m~lxwVyyW@8C893>I8i25&bajlk{SD8qD63>snsPk#!)&ApOlgrY_ zh-Gz}XQbcc1~Zt`g~_vvn97DaUExzqTye4Ya{S9ZpUGPj9L6qf%uApUMU@F8*>pFQ zcqD>B1*a|5Rpm*3@^xPW^8a9AwZs>#4LcTHju$$foUhIs;XV@$wbQw=PYW=)nu)oe z6^{>a&AIWNAAeV=F0I8;T8#o1v{RD?Wl4h>BBSs-fO9VYnW6iF?wSrGy1R5@Ce3y5 z6oLR$g%mHR7i)dpdG7Id-y8VAh|k*?|2IM^{?g2c%aKNf2f12{mW0)-b=S!x{&~dA>5Qb0$KWNqUv9vObjIMn6MB-33lk#=b zCw?(ZFGFkGvl<%Lj~`F&+F2~oNOwL$wtezjj?_916AT7c z#9DLZGW}RT2@}Q*Xp$oRI@Ol_s91Nv$B0`SlRp!v3P35k!l&W|$ zL>-;jF-ZYbBSc+1IO#y=qemz6U|pk&3j-6hRizvlF#5s7$0grv46JcKn`lvxArQ%@BE+w_WDbyJO`-CYHa5@6*o{sSTUviuWt`Rm30 zt@#NrBOaM;H#rdJQo|iuQaEEqp}~kIORJi-I^N12GyJ^0Wpqq&_4DvH(jXj;BpQ;Y zNd!oMM)d%Ix`@J+ZP)dDUtSGe)UWao}t$5||`TG7vN^qiO7IeZ4=x`M|&oTYgjKaZ02HP_*u z`|WhYOcRNHAr*1iy1bYmqR<`6$Ro~4`x%3ePA?Dv#gKRH8%W=={_L902E|EuT32{l zcgNeOT z``SVzTlKtb!;1ji%B zUY#kqrsd2ixp&AN+S76m-@wUiR;+#;%JXzw0nGr~jb&c_ZzKeJ07N~mK70eQ?XT3E zjy*Wu^hgVAIqsc3lg6!~!T{J>0nolCE+ZT~@GhHz2bkN^%1bv$xd;yRRGIpI=aMv(tF$gK%V8f=!nk@CJeEHNlVHWcbRgQnXCduWE z8&pg4*e?LtIt*rv697ls2jt-}LsIOiEnlmAq9Am3AnJM*8>%HTYOV)X`m60Gplp76 zRhD|;cj?-0Kw|e-OKPu>#oCk|?b~b9%ez6%F(WeKhB)CCveilx z$geXSC2_h)AjoRpzRd)!D2;>2SNarUyfJFU&W>LGhnHd!N|Fi{UDPDGH3M?5Tt3NZ zMwYf1*rRwxg-<2buW>jCU$CvLi%kVO1(b>iqr&y?s1hQ!%oUL?LMxt7;q^%6Dn}L) zO7eO7>4Z{-QoNN$U`d}3IWq*WrrOt>cB_9^rAyD>$4A6@+!r4)=1w$85K_OeC45z+yL$eNh8(qR`{hof=hr4DKSsfIZH z)qr5C#Qa!GIli-Dg>uwt#D;w-G*enmMR7&Yw_WNbO>oUKgR(b+GB!iG2v!39GO>%8 zXUh)zM9ml;<$Cu13?%@XK$Ke&AJSN%$0Nl)6qL5K{@k(>*27K4*A=~vFXpThQA^(< zY|8QI(JFmL`qo2RT-mp%^Y6HY(Jq`+CUHK;NhOlJ2fWtNJ?^Flp3oZkZ6?dxKs zmXF|?BYu=LpA}l8HQF3`dWB}^h1xhtm~Tj9TwCRhyLw(4P7vi#Mr!k4_H^53GL%Zs zo}CKoOL={VeUpN7DJcKau0PbruV+rj;^(od;_+Df+L5~OluS>Tg%qCDUX)?iNv1{x z$qZ?+4>OEe&y5l;o-&SZLy^S}lqz5dNsp~!eQ-9sEvceTU?n&U9|;iiME5(co&uDb zIF~pye5kF4<8-x;yG8qySg{#*>uk+O60v$S(lv=m{h@Bq_A5tOo% zHJqo(A85=hVXlzwaw&p%yADI!L7_bMTf3^zrm|cqA&fLgNZWd+8|Z=9m0~6{{3Bjh zm5)4T3o%Iz*D- z*J_aLQ{=d`_18sqoZfI<7%6s+Y1 z1uq2|>)Bh>rWn*l8kQ3W%`DBC2RiOnhDCPw;bp{G!W!X&mpcv z;8#i}iPNC}zY}{P3}o*&1nP_)EFEB}2-;i5hTL##=g6^FWz4<&GI1u)lGX?tv5*(V z0tq&}vuV{6Jn^~ZlcoSr(KIoJyk`08tB%ie~ zzWCjU44{vRj^^^H5;#?4uP>?$ljVfg@Wc%SSkp1~0YHOF?RBu~a>TLYECQdD`EXxO z!5FCmNhMcYxQyST?f%z_*mK*z&o;N@st1z+)BxEB|8?QR!fXGOYlY4-)7zLIXy0z% z7UKGsDcnMS{V^x&G{pa(W?9*%0JJXu%WFTi+ERGy-*5d-EC8Y-Ucoj#Mb@y`%)763Y9>knRUOEwfVwg~lm&U0_t~}B zK^ga{r2W7K*?}x7vXH#e6l^h1`as}0^;hxQ4yf6Y&@#-BP^Be{`bHygI8H|KDYOwp z5PIo}D>jZ??#%=eVu3!h?!2j*2dzdfN~O(b1f{jLC1qcYFRwT_J#Q{3u2-qHC%>$C*zpyD?B#uh-)>Fbs&RiuNJ5M(sR~| z8XYti^3th!>B=PsARNPPuI+_{tiu6cG8!;=0`kq$R%C30@<1eP}$mr`>ElL2lv%H1q ze4ExQFlay(yH@h<&L;2f>vyAyN23{M6Cq^~W6)}sX?aWxd|%_N`3SJb1?sIR=%}yF zuVG_e7PZq&dMswp^q6pKUN=8sKHkiQ;OZ$ifV$VjhkX`=rY(v|Ib7SdqK%BnG&-?s zl=A!x8P#%@VlqCoNv#$Svy4RK`JoHER-f)F;uQeJ<}PR^3W-ClQAiqZu4!;^+V2|x zJGBK7SYgAEVss#N*-wTmvy+RKcwoYgshLRTLV0W!0A*%x-_JLe@4=k_N4Dmt8e1t){ zx?Zr0NMY~)>s;t5ilvAjR{{4aTVkXPyEx<<|AgA|B%`< z^YE9*7zphkqHd8jI4Bur^ci@##I?~3n^Ayu24!dYE+y2zo!vKVJ*3S?pzc_pHg@Y@ zvE;gXIvy#(&9(l#_Q|pScE~v)11LGEL=qrm)SDUVR8MDAzN$V~aFkS{Yj2|xQH%4#pICXUf9RYmfG4eYdy}dOwWrzm1?<&_ zS*l!SL+xVi5gFN6{%tAMqc>7kr-Ypm7s@&)B4w7N6l=Gu@c)AfRSOjLK9uRrI3m&3 zG;gjE^pxPpkYHHU7En%8GqOJfKS=qy?D8IIYWBiA2PlQdEyt!yJ##In+-Y2iW zdo~`c&v{+PA?A`3J6tFo!`+?pQEkk;9nL{~`DK;DWC2JXK*99dv}PiC*~az<(f;cx z@&#@Y;2n)oRncQyTTyCEqjp1WmgmqgLoC;teOfeKi5Mc_+c-A!^BD0K=NO==Mx-#X zpc}}g_Wzj&G-qLPKi8$`b5u{zboW+fEp#^pT6W9p8wOVhi)^6OlVgc64};p4b$gf# zyPwyN;9zk5@rnPGV^m`UXwIfvK6G#1bs?_rRw|&?5C+`}LczPQ1*$=M;Pv`we0|o! zk=TrV4VLp*1baFmVSLE@KlF@08)8viZTonGZk9G}v{Aa7CF?f3;3^uxzyxyb!G-WP zNlX1}bt7Am!pfhj(n|O)f5Cmkn49ISiDNCP9d%T~q{n7fa`mA$T}b(l938n{b;Er{kzvLH#R&-^H}?_zr!TJ=~l9hk2T-?HWpin2@|D>)wLok_Zd8}bB^)3u`5lO6Kt_5ZMJfO$k$-~8)rSD{ z&*x4_zEaaH`S@S2fizcMs7e5W?nXgrFHAErZW(wy&oY<->5hUx*(})~^B~XDDg$e) zbRFPX0yj0p9YEcL+PxArWdd5RzUE54sn_O{bkog9+(r%lwrI$T(bxx8uBR7EN0_`t zRU=R@AV7m`?y4=CE2&;Gh~1l^Rr;bd-i92i2FXou0rZ+W6Dbe|Wh^%938M;Sivk=K zDL2qOb`2=lihyl2@Mmhzc0(I0Bu|XxGp&!Xp{Y^)Sui$5 zr@Q$qRaQvbW`970EUlaOP;JDqzgwu5c77lAScS8>NyPiAIG!?@KAR@@Q`2la#Fsnz zGYc?);@I-HUtv9-3;C{+7)${s@?lo?88Xxqi0lDL&OT)mdUXMR`y92@WvbsDoTNq; zegu;|SHu03PW7aVD}gQZ7rXZupvo+Ew zdL`CSin2kMJ}zaJeuM0}VnbcCm;^}HZ0H0^RT*Fo3N2o%FMO9y1!9+=)=j*9r9a~> zv=`f%4wCM)C&&N;qwKF45yq*%Vn&#+N%wpprQZ>IJap`y&2zcV*pX%WRLYV z<3X9M8jy^ECoTYJ`S*zbe@&Ts|3~}geP>(#J@R;O#(xLa_YU&jLHixcaZlEqLKvum%7IL=<0oR^**|KA6;!!THY%>|EBrA z$Hw>A_#PYIW8-^l+&Jv|9vlDPWu6tld3Ik$Ld(WM;buQwq=Ea!N#UTM|8Kk+1b9FU zI33me#s9-*KiE9P3_P9&^!)E%GSu?pkjurs8}InQq2z*EszN|53+{36Io0FQJ7hck z&IF!H%zMCz%jD|&a-?)3mLeewA@Xqza0t4nx(HW9Ea`^5T8uQXmhfqj20noxQ13`@ zdqvS>==$4zzG!1GCH4Xbcv;Epkn>>XU|U_JUeAQ8QLR#r@sXt%%BNjC@-vNUK@va`2eG<^(iE z?~Nk|LQNm8Wr}OlYS+3Q&Q7nc(0j?!`1I)LU7+?BCh+!$DI)uB;H72n<$O5i)kO02 zyV&|tPV4V4E^5wh$x^q_-;4@Z`sVSDyKdn1q1QbK#iYK>Du z&%(BV>{GVp2l~CSD(YapnqUQ3Q$45SB6?1f94PwH)4}p){pcvwKt3)U`?cuSYlDSw zEg`*VE$JxADcW019$OQ_x1WB^HQMj)LfeknnhQj2YiF-Dh+{kGwn!?#FEo_Th9xqjLG&@4VVY%-< z6I|w|TrHrIrSdpbnuwb_zwk$gYZeqfKtbg(n;24Hu@(H=<#86^Os%{$_L06c8~Q6b zTN-a@@9RKrnX_Y{<0KNvFRTT8eT_K?#9Ihf%P(J_)@JygT`s<9bD8+h6-Kdda;~Ep+^}_WQqF$Ino~M zuULn?;CYm5X!Pl~n_4nloQ@-rUv=K@@q&kSZY);w;Ba29q8Ztp3G+uHYX9iIX_qG< zaUfKoG$uBCP0!#N=adV{J<7CgCVfcd+uNLAxk3UBlDE+T0Y)t26yk>Fr7h_gjotNitP z_O#3wjF7JKUo%meB3c}{HGPa47nAZOM>z|;HV90XA}zGz!0DMH;OPvWIF33YwfDl6 zxgrxq;vEtMDyu6ue`w-!@$cNLhf*xi`7ceWq_i8Ow3fvYBcjt{P-E3)=N*P*wxZ(?LUrC^!5BAcMU5-Rf7icJM}aa}b@ zPM&ip#qUi?Nn61szc5ZqdICMaDOuszD}+#^CNVzs+tTB`*SR^VL#|h_1_7+agf5^!F*6u2kJ;iKsR-}+|J^9@Qxt!@%X26Ee7j(Lo zt!oR)`+BCGigqpg#kPIb`U@4Q$j$$$a?yZ?<-L2MOd+NyB+e+b%`!=OMX}cP?(IcT z{I40@sI0|9-`oEPZEc;Dw#YnR?K6Uwmq-=~B|o6i0()j`%7~-F;LYaz7k>rLJl=j7 zIi*wH_j|Y1A>QR{Rm&~`))FTHjX)LcTN1`u4-U&E`skFQ0hlPPrb?Km$rSVvM!l)p z$N%X4aQ1->0N$xr7p$!!lU~_mb-_CEvLqHT%TEd~SQA#Li^=GlRigeW{hkR-t(9$A zO34PQT)RAHHyr|(H>FsVQ^m05q|h}CsEWv>Px4%~6N&KEb|op$M(I>W{k3R~g*sYp z+Tlcpx$HnChaHEw^n>AYF>iWt`Fm2ikMEh1x7(1ByP5S4ksL71oW>$r*Bfvl8YbEy zlvB~u$P~F>v*FaOb(y{qPAY?>_7VbG@f2tHlPa`eZ&^xeNWyA_iwcF>-L2Jk?V^Iy zk%8TBssU;v%a_s^MB${lc^~f6G)ksyk3sa-{9;*a{M_r@_?08&5J;oE<*!3%1buHD`oOKBr9H3?Wmh)Yy$dq=pj-&;rql$-%Mz?~TkL}vub(U*OGivLw~=m{%$1uey5nLu`=IgoJrnT|98^{F}L=-{*AiIS;cY(oLzURW0fgS z&i9(grjd58Pv7lbNYFA?pi-izQ4`ABYIP4da?|CsqiqoocKG7ky|;PBR;|mJ+YzSy z@-cnmFI!WOx@KOTP10$a-lmv_9Uy_fPvoRBN;mC-oDP5a%dt)<`vY)i--EQp{q?tT z-1X^<=iv*!L+Eu9@*mHqIh@th9**!=E(Cv!cHSm5`Ygv*VMt^91Y))E=c_TB4wApW zYe2YYkL5RCI^MNBCBqH>(0*kx>V7fb`jo9WL*7=*q^`%@Gf*bqma!**L))^Z5fHl) znDbiCguFG!p^c+l&}s-rGRj{;pJp_hUy(W(u@Y2%syNO--(*GxR~8VL=7^h^Lb&s} zTK4WUnD252IBsxKU_xxb`W^bscmw^yn7Is%tSW9)r4G;lJbMivXiW9 zU9?BX!}v?mKvBMUgqNDg+#rDLATSm;Gu#Y&w`XKE^FE6{xED13Xk_obE8}+r$a%`&i&j6H|moFv3EH(|_F$r)&LMU>BYVng0bKV2XoLY4XNAE)St6 zY|9|T;jvnyHR{%y)1l<5eLf zdlc~7YYWNhCL571@M=7}q66%fvVx-WlBO$KMCwoxv{$)a`;r{6z@TG54z62Tq Oo&L)61oq328~-0Tb^5jd literal 19534 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 diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.LongPane.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.LongPane.verified.png index 9b50d23c386b5f49a44efacbcd1ba9fee6bd785e..a6d8e8e93686feae35522dc145f768dfd9a7d844 100644 GIT binary patch literal 37913 zcmd432{@GP`#wG`%1foPMwwP2>zgfwvLrDG6J>oV*~Vl|7^H03Dy0c!--~45Q?MIOHeWk~I)gxDg)%PxMF+nA zc2SNBdODUki~Z-eFzUYw zxUVEocl@Hq$3p{KQ8S9W6!xh!(A1j|ZrV4Hff$%C^BzRJ> z*w5G{^$qZMlIjAHhMFR4Uu5@Jg$nWF*FJh_x?h={1w1zR^ZL2VbUY&i5B!D6#gfHl zIyz?f3z1_+%cI`jf52bhS%p0uv+_*r?d@N=ySodF=3$XBZ z-MGQ^O^o;M+b5WrnHd;eHu3rM^G_40t*x#7(-rxW6JaypW^?J7arBFei+Zwha_o+7 z?8t2`Os6?-d$>jywvMx5iAfnXl==DGPZOBYx8=_~b*ua&<~A6Z849pPd&U<{(DDQY z@g?Qu*yWQPkvyv_^Q)=(`T1Sm0U@f zVc&UV`R%NLc3Y=oJ&xTSFDhGz4_A!yY!lCG8-_X=dkz>zBf&2lRW+;_?C+2JG||`B z_t#A~H+?HCq2}gveBj^SD(<7IZ{6KZrkOY?UUAMi`e~-)Rvl&ix7F*slWB1rJE@Hm zN1s!7mXr7tN!A88?kYWZPvyUoKusCbmh5%Zw?*3B_4X9Wq{zJB!Y)7Se>+%YHenid zxo1DAGd`3&fwXXvQ@`(D&cwRE13?`EM;!xNHil!=TNvad-UTiET%S6^GTE{}^ZB8NV1L zMj8OyPw8sKVObIDfMTqwrL)W%S9ioYxtEo)anY2~yzqKuB(AdwM{Dz#(+;i0iTsU| z+D7hR7!d@0hrD!IZjg=qj(RGWQ z9#gQT^a*-wMb}6tzuzi_Yf|&fr#z9>2xAH}9KE?brA-YQX~2ot@`qr0Wc#Q1jY6aU zjL(yLq)6+(kx01UzV|QLUQLYGAB)z109f+h%D+aqPH_fQd+(5jCx29WSAYblQZ({O0IVq zc>5&Z%}!D5LymvTm6EO-lsnG(d685A$_DT=bKE*Kuw-5U_6 zzxOR~-Qp^;#gn~|n7!(zdXw0x%)-!rW9Nbco%ZUghQ*(~yqc9XsU7H=BK67KhCib5zvQn%HO4GKFvv`n~NXI&~%Ikk82{#5(S0IRD*=?16_4o9B zqi2{{NL#%Z@AV_~>~G0+uuK_tU=Ruv=QZ8YR1^6^p&X^jKW4G%_}8eb}4xk5J710FG$8x z?doz$tt%4VyExQ{cYII`E4QQVt6E8a7Hvzc*cf9A=3*mfz}&4>`m zXKx7ug>m;-)AzMZ7}i8uTfbR&%ACyZa^R@glE|f_+*3ZcoJp7ZWc5X&r{9A~NyS~qC}K+s;g=UA zvuuk8pJ_(~N!~DUz@WsIxI#CkB&-rqPB;(nI5B|+c85FI?CHXE!dfvAb9SJV#MxCS zy6^GWyfXLpv3Iej|6Qid&6D33>Sa3r>2vK{gZCo!)r0DzkJ7vh#MM2yiOTIR?axkf zKWO+&C9$5Mz+*VX@_Zw++1O0P)4PGBsWVhE(*VgK zv7Fe+9jZ!QB${Uka_c(T4B!*Y?&sA=8`eKO`BaHI*AZ1FVL3A;m^+Cz?Qu?ZZQvQG z-`4>)0SM4|4a4$`wf%ShSjb@48v#ZhipW#OK88urz`eCqtrL{%_dPgNZhPcVw}u;h zYRs*YZDA6rSSSoJQkaa`jv|M7_`i6-b#3zDUQYwoiDNfT9WHgg<3UNgn=w$I8$h0F zyq`wtNem4w5A1eHeDC+3XKq7T#`QRw_4Db=1f#c#o(irdtAeS5>a_u;-sRzQi%I3g zIR#fr@vNsl8Z%vxMm%FHfEFVcwSMV$J;CW0-JrD~$Ui z!ScL`T%6vHhM&krAw%kcHKUmze!1P4hOQuRv8vf4XW|59_YMnn?nypWNpnO(Ytz5U zn#hg|W_r7F;6&-U1y@9uZb-ZBIgFBZzhO9EAt%(7RzoGB3(-frG$!LR%ZU6dl%Apq zt@$Wabvp4(YhYQ%N$2sE>Q+y#l_?(dyd>Cw2%Fj@b{tBa&lj#LeJib=6b(8oR!8Li zqE{-De4({^s~NV2ZVI{1WiPwmI`6iyF^C@p8C%g$v|-Ta9+q>Y4kr`01L z-<_@*54EeYQ?YcLoKnn`;btE2r;=Pg1WVrCODa!X%pYnjoa|I-C%T-{pmZ*-hOc^x zE)dPA%ypr-K<34h}(Z&&fmh#{aq-? z5F6yW21J{ck(`IS<||&yu_P?_KXDqEuGu1^Y+D@qLOn=9&H*XWo-`65TV^;`9m%E^ z<;fdV*8A+TWbdM(bzPTHZn;zPpns?#22BkrlTDgi9O9Pbp~zJ0rH2F~SLeh@*Or4v zopaI!ZPUwTIg)FtR?W3mPM%vuB~nv3Gc8t~kc&rX`$j6I>{l})m)%s2Z`aPxkDQA> zTC<7)k4fy`9$**(1-QR+YEng4g!|MoI zZvBFaa_*aeKY(8QF7$T8L|$XJ5Pdt`HHoBr~CclO*XD~Xy#a;REQBhF>NFwv)nyAghunaN{D%hv1iSiG^UQ1OD-S$8*lI5R%>r+mkX?oyl3l5- zQ-6(~{y4A4Y=uCe-?6=Iq9%s`l>C=vyt=wNdToXyP?yVgucB9ViT-J5! zXx2Yla60p;T$#d;=5ZFQcJ2FO!IjUQmxJT*1tnc)0T?c+wtmoA6S6WvXb%^EnzlTX{5xbh~)ua(>yx8vSu>WRkYxMqip zj2G2Onj^)k=fo4K%~{jaV;-EY2U)7uku9fxn)yXXHQJ2?sulLQ5nZ5|V&zoKnBGXG zUWZS_+>P{T((Fzvgh?4$Tz_uf=!NrC{B%MU-lZ{UVAxEBI%MyYKo_gVQj@Y}?}4N84?L;|;xtNbC1GEou}x0c9B$Kt zgD&OLqIq-MbuwkP|K)0?t`IWnQFp~Z45bv%8_%|6(IR(ZoBKKW>`q# zBr5xEC~A&VrcKf7obf`@y?buYk_LiDzK~rq=p(ZP#Cv*SB;!sz!GP{6_j_?VWrNoe z;jzuG#w?PXQ%+*2cI<0il0TB^F+o>7h_9o}wxn<%0>*L*V817TkZ~2npQ}r&Y-w{D zP-&!VkNk+24<0mEOIz%;w?A;E z=O%KZJPjGU1wno*dxeoSP%0hbGj*~i)X%yolS4ZL*Ru{(+ou|+_XH7$inWc=`^6qB ze!2#o$|zxXA(#HCN8;i?z#SjW zO^Dg-%#ZREm&}aXjkZ0Vk(23G2Iz^@ZoB&2KfpRSNv=gpVdhF;9{r}mK&z^%?tYI} zP38j!yC?-Bk@rrh!$N;2 zNiKBXjGeAd-p`CJu@kbNQz7ExdWe++cGF3F57fN%uZ)cG@a<&N&CsYBS2ao$Y6I_o zZc7vwmcoO?uGrbI@Gp;(KLqQV1$3m0oD*&s#*%mOv>rr7PE&MOt5#YDBFlt4-T6ae zjlxz#ay&~zq;^nJsf9%CWka1(bHwX8kXq=$Zd5LolSt_B2pHJA&>GiRgiFPqQlDxT zJnm zeE4k#lG2lvkr6aDGGa(hPEM4?1xV7W zOtY2&;bmlG6i!KKQ!c@syK&=2700vaXvU%!c{!op>OoE&19XVGw+|V4t^~S5TR;!I z+zE8W;q77(bY0FVe=rrTs_vW10(N2=G`Gp*#tE2TRuy+_E`)-$eehbX>EQELmF^2o+vBl zw@gtH-mNR{{Pm|3-mzVUo*fTwtS9GErk$~^n5PSoVN!A$ zIMRkd6h$ahRNfaXI{;8XHNcqA4S{VQm2?>jl~w?-lq)tP5T9YpDk8QXHYOtwZ1sx$ z8r3J^4{fXeJysz6`nmxQeFgaaf@pV!1BxSpU9Q`RO)Vre^l?W=hfjQbd<(hkl&oxq z)QJ;(^C~^v-7F9I1d{ZOdfZwT&&XYGz=->?Zh!u`n&%23q9(1^gb>lxDT_wh~Gh z5YttSqsg?yinG~&_9`zBqBeCOZW|n3vJc&ah)GRlQ?q}^He~1O*50`Zy2fT`ZwTWn z3#)s3lZ!ON?uztJ>@scf+C8#VjjP|5Du|1kOz&CHJ+fV#q}2Z**sxD!gxl>Tc%u4L z@I;Hg-vV9;Z?Wga#^4N#DFUTUc`f>k8`7vN1=5x&7xv%1rz7d?lT8gV9UYzRHZ=?q%&pH{VW!(zAF*hEk?yI5 zc65P!sUrOhBFwrLHy`coxA9SEqWT?mAc=+;_*SRZ}(~9L0yc1FkW=QrZK(W4OAYq39hD1G@)-zzh9v zqn40jGUHZGlK~+goNCe!${7OpFv!5f*<)y=<3P{-sxlydG4*JrmNu$`zj?aCmLm0?kbCoesH2> z3xeZ~4piFAs~>=zO?__-e#4*kvBN_{SC_6e$_dR+D3tWAekQK2%&e|V$r(~BF5xN( zehJs(M3+aZP-pU6U-!rIP)3udthKu`0WF$*Wk==)gs(_4v<=(wP{xqE3El1{&l$gR z?K=_0o^!O8JXt<^u|LEan2MuNh18ySE&qUf@t9uY6{_d*?V(i))>Eqx$Lzo>QP(Gq zc)b(kN4qP5XtP?-$AThG9}iCm3!0CX8TsXBS*Z)c?KO^xQ5IvJe=H$xF8oLKjNcO7x1xRWL^+M;ln*NIO`K=~w18T^4@3Te5te0EN z9_#OE8Co9*$YcFWzRXuEAyyk#>T=^F0H^5j{!JH9+ zNP{y89j?bXifLc|fVVv%L2_l0!7$)cObj!IwACqK=immOj--2i01t^g@IYY!9%{)X zp%m0lX_SP!Je#wok4)(b^?dQt?^TYVyxwO8u$c&KYKjA)*0H0`dzF#cp6U5a){xBe zW-_d`kAOEzUK zYZC^4!*d0tLU>U61T!--&QIWOy1N_L+1qQ4g%uSR^0`o(8X6nrYMv9yWSl%bAwKSa5WqGOvT+-zyV)aO-slLj!|{c^C!5pZb`~X_s?1>(bK5 z+3G>91P8MYjy5Cl9iWW?ul$b9{qH!9O^utI8yFe{Q400rV76!2fKY=L33>A9^2vsNTiGgekWgfO}5-CD$2?v8* z-0tATVl3WUaq^2Di_e?0E6Q{x8b1_0 zN4K9a)JkK_#<-nL3Dq2!=uINHVl0t83pMR33c(vM+(~f!9C5RSHpfw27dFL&@JdQD z002h^N&wZs3<9?p5pwm2ef##|^6L586btkqxD|G3zoCEqwMeLu`3JztV$wgp@@D7A z-l^}PE5xvIm#Xt^;XXP<%nKNDe)M$jfCfJGP4(UK^+^?RDk%ZSh9DLf_j{)} zsQ7Z4EDKs>tW4XWP+gv$z-6D{0(l(VB&8Q0^g!NXK)fV^3j6+mzB|NwK_D75ZX4u- zM}v)xtJsep-L;p+F%E@mIg(1!YIlm|S!nlUIK-eM8!insNBIS&w4%g(KG7c z>uUlL_-@7`d-~H?6=M~Si#x?uC#s@l^ai`)WXQ&n4%*6Rc&nQZvyciu)L-9#(7dJ& zZS(Jl${0da#gYI-07SLre~YMKIpBLA1b0_29pF%ITJL6XI753oy9;9-el;~UtVfR? zO_WWAIeVsw<>h6Ex}vAHt=3;UjzCdH1G&BpAkt^Y*4ttZh!Oxc69AfS-nb!Yk#b3Z ztu{0?G#9%(cBohO@IJ2KzNMwY7=l&cgzI*zL!c9+hz&sn2oCIv(960cassduxmfMZ zx16xc3`~|@99^J?;j2`9*DTQ!+R+~hf{*#<2mt-FSCQsGt)@dP&l~l*QqWi#c&B@y zsh5)ZUnZDkj%`A`<^f9rt*VIw_$@4ITbjh$N+97Nvd2=F3SJN3TNa#67_pINEO0{j?RK*6|DU zH>{{6@sk-Owr<^;h{5dv;le3Z(kP8Gzh%#2lcU%Hb*ol?(=jXm*gpy5Ek1tEYn16l zr`(rdw@_6;S@m?zpDL``09G;z%5B&mL(9AN?OTOZj8N>^(1n`3=EH5HC0C7~LEzuU zD(zb%3}?bLI1@66C}&DH#n{xo3V?vqA8~ z4jSgGeK$sEne~r*P}<8m*)9 zLFTTNQ27lyE>!n{d=r59+({nJxhZ ztppO_R8m7-sP`r(C+~`$g4}KTm|hLQC^Gi$00iAHg|QZ3!Jv)7-oaSH7M~|Pv1j{Y z`A=^7LH&0&?-(8!^R`QGI*d|4p*1xL1cLtbaf+p<<;!M);Du&fbZKg< zSlg(91s2FRYm7&q zYZMIQmjYQ{M%xuX3gvO7b3&Soj*c zDL`UAfbp4%^z194Hr^|Xx~qH^Ii-KQ-{GjA^Y`1kG&7`1dShd!{wD%q2yXYcP#uWh ze~1u8Q{i*0)Ez>vF^KD>k~lAK2?#{rG)?fjCR|ZaVVVH^wkY5rzLLrSW#$7K2CxG{ zU{eD8N&2dQ|9i=U5$jX9F8Tse`hOPM5XMnfR;~p+>T^KmXsx1T{+UOda3p||NOGdX z%;G?%tz2Uo;7ki4&~)$jBob+6Xeg1zqK&NVIj5Ys5_wmWy3Wc|lQL!dClrc`i;q=* zSzb110$woZ(q|A&F2YQkoSIUl0@^L$7b52|U04q4xPld-T0m11Z@Jrwg}VhIn)CMU z+cl1%D03$u4vS_AMzd|h0ineY-dO_X=K`Q25Q!pWWMtgcbhv(9bBy@7NHc!_y@r%Q zdDNY!qv;>R(-5&xl|5Qbnjm$~w=U3t(5%(80TC1Y8%|ScXl>Odp^C65g<$V9LVLer zT=x%3*s(I){=7aG-~!%nxB$z@Sr8OSsTWtraJ;NYV)4|bErz=ko#IOI8ukm}VP4&)xCXvFt zZVHAsBe-i_UEM@7Mr*W54P}^Ox67)n zjM3 z{UQSpKyd753Ej|0O4hA%#J{e zt3lvx4X4}(ta>l28i!?8Ah4TITwH9rt+BC@ zuIHkD*9b6d*Mdu4%-oLflKzeD54(N)_Q6U}CEW8!d0jd6)CDE%BC2 zUb29aYY{nVO;%oLeS)Nm1dj5S6%Z)@0K;5eFK_0cJ+~g$H%z%8b?)(pVK`d#^L5Z) zd(qY`Yhv%w4#0tM{ZncW6K&X-7&{Dk+;MG5m)K}Q9~U-QX}{o0NS{@9KlMi!GJ zjqs>^NIXNS6+&xvcD;#%l#n@bPY-pwsB0zlnTWmoZT{q4YhYO{eek%JYlh3-wVL#G zrPuY748ScMKN2T_nI)I~AOnDoH1D12)C*?( zsN|8;OkSm5&6eJp|2}eMEns~@CC(_T{w3bvID8H;p|w{oNiZTheSb@!0Ty}62Y7_) zk_c-x*KU5n@hd$3qSo@{@p?nbi4n%L9XNa3tpC8#XD3TVA}N(8-UCHkwEcUjTxa^5 zgF?N7Y#hi(6Psf9JOmvS#5QdW{0@x)-H(nvci=2xJ|f5F0}$4mszDp_^(8^!0Gc8| z1QmcF0mM+!SCRY&+4`3l{4Xu&f3C*`r2_c9NTe{Jd?05T_1_h6i>NLSPtS6)(+0%L z29RCWyMnI`Dw*uO1OW1K5P?Cm_rL3Prc^L9F*85!w6wBPHq%wTvl?^)K>qltaYc)O z*D0?iJsV~{9{ENsOf&w=y)FK+d@o&KPQNJg5|S>W0EsEyVTSOs1Q_w~<3sis9F+aP z!ZM4z5fUl2Eh7(8zgY#4Ne^1TiQ-PG=At3j_9Ml-M_0FuRlCZ(7Y)h1lW19hflI1-GRhs>`z5|O$`w~I3f?RwCX zRbvxoj7MS0MvSxE4LM({;h#PTzJ1Yhh3y=RO~3mv zz4$uNwuea6o8JmMnC7SqYHDu2V5uMN%xaZ@>O7}_O0)eOvE6hFJ>q3*D!baopEbb? z_b$YI9H#sDMsvN#m1yG?L1O@(3O>OCgt2dG{{$%H=3aR>J?y09Se;_ zrv(QAi^NiKW*2 zo$~<4VgxkT@H|j??XnCV3Hb{{;BQs$->al*j13PbeVQn~4*Z`d&4aZG?U`v{2m=)i zRou?KkgO;H?lSurzPqOfHmooRmeGL3-sudrWSHEW<+6(Sb&hEWAna6)^N=X#=;Bh~ z?&e0_t7=>4Dg!m2nSi`1X@gkGYKWz@ffZ%QvT%u2?O>DQ^=TO3GKeVH9WB`mF;V4^M;J-{wUYbr##S>gPD%S`FvUAOCm^@j53M67KhdL@-M8gCDJqcm+e7dmI`i(b>^Q&lj-dxm~ z8gaC^Ib?Jph`<&kqjvmzaG!>tC4(6Eg{NjI_l4Lk!qP-Xs?UABUQjuN%1s_I&#Z90nJ zj>I*$v>2Se4&DQ|3DCV5vq^hDWt>UoZ|epoj|mcbZvIq}RoT=gh`hcGwuKl>$p?d~ z_MCx-LG;X-p}xM@f~Sn40BzARogl;^;v_wQ-JoeFW{g=kc=f#b@nszxNoFXCWFnv z?czd`TnWylNsedff!iPn@+LrTqFL~=CDUO#I4KLRz3%^8JIsHHb4h@jAxuZ1xZVWV zvWpFB2xURv3uwn*g&U!6BC#W6>C2ZdvrbEZQ0d}y15`-X35c4q0qEXbSER7GSRcqX zEG(DZsTCC!5LC?8F#PgSr-UTT7B~c0=NV|o6Y$QU=he~!gNkq*Lxvo}4H+ZE>r+7x zxa-^oZCNNUX7l3}V+soj-uXs|HCeD(5Mp_FIdtgmJggS(m3;_(i&t`(UTkb(c^TTf zbEdxs?|~sO?m3(1$N7UH?N!^i+RLyPU3&?xz83Bb#~38hW+9he6riAs{RLeNjvnK$ zw{qVgrTIh^gIJMFwI*cE0phrJXVaQrhR6JRi|j5{8dl?R|W2AH6JvZQIFs^ND7;Q~}|GGrk?Ee@*<$9IUg z3~j`;T&V+C_Ovk|(OU;`mqE%w=&Tvn;x*%IsAk1hf11M&0;1D$Mph647isXuT(hT* zZ}eU>x3uccIc=AQaPhq#33;%Hyp@~j!u|aG`pH#QN?C@+G1sO z$lj2vvox3da6gDq)}6 zcQc!9I2{DYhUVwz!F*;;4hneH0w?UDUcLA6FRIMc8yXEaffrZD=#~R&r^Ok>9LIl* zx%PH+)&!tGVhHT)?1>&Yf01lGfp9RZQ49WPML(qY=QF8n7y=5UgFvCE=hDp8HP8zr zSydqTSXkA4t9_7s3KgA=!Sd&Y+AOM-CrF<)=VYX$cqcN28MdG|97voF%x5|R9HKq% zgD(we!!`7qT@6l*YjF&@%%Ck0WuaozP1cOZ0KeTaOkqrGK46@#rhY4I(o$FhvFO@hlK`72bQ2|@f=xJq?)5B+f=RPH4In}9BuM+U zmz?R}i@1X176;6o80fI6jtLf2`AwXTurFTHwC2t&=`_iGVYJIzYG* z_ZGob8}da0LL{JfG*_nd9zo&-BR%*va4e^BIT&otnD8M&tt|vXO-t8)ruY-6^lQ#F zQ)sful8^^;Pj}Y1r@SiD<`bhpVwun-q?LK>1fDur6c&Tk)bDk*0vBPZt?&IbbBKG#m*7Tc^HD>{nJlCp01QZu4_}?lj=M5(( z^xR2VSs~1LnD=R+{Zhf6kF)szDi+WTgOWp{OAz-s0ZI$MRn^1WdB*`D{*V^xLCGs? z_u&*&HOyZY1Ntob)0d&=mPFt^jh|LJoyz6lzb7Uw3lfum&ev!Wm1_==sjbnoHqx{#nW>;gRh7VOj<5Q4%)*Vm%M$OP}Z4)+G*g9^9P` zW_5JeH~v6(=cVOWGipGR8Jo{h!RC38#v>wJq2K+^TG|{Yz@gAvpbOKJPmeBpA&lB2 zPmDcV^lWRlV_n?H1!L@1V7xuS3bNl#RE+@ii*|yF2iT^#%*}I0UhT4S%#t7~8%J!p z1L$|)O`S-ys*9MO9x8M-lB?N+@RC>qz`Ek*5Ria|DWIQae3>d!x-*ip80km^`9FI@ z1?H$eelP*-;v&JOn3yTGq8-_m>aq z0yd(&A_Iv;k(f0a>)dzK6d`j!RUugQ+U*=7>e*HVLedB7s%dVrP_kXGJD{jrf=dI# z6O{G;3m*QTX+*zL(%AxQzNgI0$I$czrgv&=EUoRI>w3IsI#I8B8v>t^#ST_B5*7-o zL8f=63j^%(P;IU1nTqOsKR_Pm;v`uAGXLEH1@TsJDR(makmm%*A`8=hsNeOVY3h0% zR|eQ>rGjY;&YCiuDH^a|xi3i$1MoTYSlD7&BX|vVn#WJ`wefbh1z$QirxOgiE{STW>w>!)KuChF zMrAW+Dx)~4{d8Djc#+pV-w2?CdoNsweB%q5OIbv3hmixk`l;!0G^N!d(e%(f(oJ_R zfYyS3ZJ>3~z;)P}BPi6B6is-xJ&ln*mHtpK_W_>myq8}^_%hW0owDva?@;W)=XOi& z3pJ0jhw;sGx-gcH-T(pP!7NZg=~pY1EaBNM=rVvM{lN?cb-DE{sWLLYqO*fkfUHyb zprxwU34Q{u0FPlpQ!3UgZ61z}a~~y=HJSTNd;aX^0my|hYsrQgYU3ftJop*(&p+dl z<9DFpL2s%#T0 z!emt~*W`i1x@QI2a)6X@bXJZ%`GAYM)8WJ6+5BRF&`MC%I;82c zZqbNUge)3IK+w`1l#%tmU|0arjuPU~-hp4OFnF~eLF3{SYwizh>;K*bX8=N@a4c^V z;2BwfiubM0F^9e8tzzJcz!?QD_g_HuuW|T4qovJ(E9vA(eQ5RyNb#zKwn-r&q4PA# zmtRJ(3=7K38$&KF(45|blKn5m+Wy9kd@wP>$NO^8IXAuWUhI0@ekhwxhuj&!*6|n` zn=+dg9WU#G*YKYT^o4UERti7HV(#vLIT>s`z>YV(1(n%aYRbPl!hU)Lpjd!Oq?}7@P4mXiD zZ-1-ep!nC{t2|MyusJHt>(f_f;_t;b&Z@5YS%U$({v6~-`h}U&6;Tm>2N8b&wM=y+ zg9`y@kna|0D<>zHIS0*OX`{`^SIg|03$qMvAwjza%WM&;oDi;l2@aTo#^3DhcIAV7 z35+#5ber=*#;SGr*tZFOBY z{{*Lf*5P!VwOvIn{aI1qUgo$qXFYogfhhQS)xiNVGfi=qVmgza93VDI@NTo%0%lGN z=y#8ek1&ov7RKm?HnBe4)W+bd=x_chhOd+eL@0u;?*GH;+6M-wMnQEl==$(aoinXV zG#Z=^hWlou`V959!+_oJ$^t}XB(O40PTE3Bk*3A;#2G@Ha$j}+{E;_xzp1^4=^g@- zuraGGcnLll4ASd|zZFWouifY{Ag_VK@U9Ir73p13bEw%hv;8WGD}l%1CdSlFGpFZ>*H0 z`BO&2Tp&{m{Z^jS_zNmqy3*6rO^b#4hjC!0Y^T=Oo){d$7Pw+(3>+t_$YiS30!{pa zr1^yIEk2>%B*vVZ03ddO-ug#04GNZ>M^-m9H& zmOZHj{`!$eioh)UKjK^}*RcPJa0dvrmvxDLF6yV%~H2g4w zkaxNBkpCK<_k=RF{~rwe00~uLo*M7PInuddRE6t?`>t`ZoOYbQ@s)&TKNa?!gl@8M zc(eqXBix#K6`nB& zJM(oMfm~!V*1lQYG^Xg#ug%!Uq+XNX8|cA*>kB8 zvUt$>JaUYbSIEPE3_%$)v48$)?6%Q&FVpvxxA9ON<0ncicTAn`Co6zs;H9AvwA}hz|faa#+WoV2A+FRL7-(e2;0Z(>ztZ z(7{f38|W6E(||>TDQw=D!RqHbXXRFF<%}&`@$DVgf+WQKOyBM`+Jx8!Q_xlB)!{%L zfacbKgZhG0Ayt{US~3yK1MNR};B1aYBQBjxq|Jj2&P$(ge0@p`pmRF<`Sh+vY0hXc zzKv?fI}sOX#MJ@hLvM9$XjV)HTO@dQyK93Bs#lqNWtzBp$^)3d18c_YvRFE){vp?j zbo3gBG7UfMBXX#ga5L~An(80~5I8@DbNV_t)>#XI`}Y7|%DJuBiMkC=K%w>k7@cn$ zNNKL&`)H?tJyAItn^}m)tP{eNj^GolN*kD@$17cw2GAlc9xbN6ljBYnkra!<3`#OJ z;3L0aPw-IjPXlDGJJc34b$t_bB!(<7&l9|+Jtzh1US=XwXg-tkI5i~!4rB~ zA{VZ!WFn&V<%^Gv%cBIIpc+xV;p@Dl_;s;84gyc+$^Utn%o+#@u1qrvQmL*}k@kS* zgyz83Cd;k>cf{vV^IIi2u87T>KZ>=@Emf4f$2)O5xYmbAxG%?zSZRB`^WjJ4Q(Tc) zYy0hCJT)CiZD`<)Yh1}#8w8-(o>?9c@?QMVT;nUAHjCnh<76_XNwWMoBmFB_-WM!; zQMJ%fS)|FF$w$k3A`xLU*IpBS44**t&y%1F;~_q19b6oWvu{R0lMepJ!b2*q3u8_H1Ti=$;skO!CM; zy-a347$_SE=-5eo!2Erl>|`0kebV^!^hU%CtVRwJsbilHf+Y3{hA;o?7%i_UGv<|s+fYF2Y%Jme`i=?tMZM3tDFGlHNasQ5>p+1^v8d<)PHN*-Ul!J z>QqOi*XG>@-hhd+J#`m&9B-0#670Tu?e@%W}hq+1y;Wa zQeCKbF!u;#?@fh~c_c&y!sAsyk@5-C+XANfFP}{(JD$J*cQ)W%`u2aF@W=LOq1W^J zn*b=U=VGH%{|1w!zp7$@Wo_Kk;1lta>F;H1baUf1Q`0R+Czv->E$Avy16P3T=^Rb> zcQ6-ZqxhA%;b*r}WXHI8Ox>gBf&(GX}sF+N7nCUJU5E zi5^fB^}$=^?wart2woF#S&EGVih6mE6*#MkwaXWq+t+B--wl8;Abe@V1{@vm5hW4dm_BHk@i8$oU%qH|s|%N~5&GZQ6n@Fx z&ai*Y{wJ>hO~-su`<_P5#Mjfcf-Iu5zh&SMM`9n(zH4*EV5)KgcE9|zY+&N{?@XP{ zJ<*+c^&g`j0>MNRwA6w7W6M0suEYLak{XH`NG7sez;*8opg_X{9po8>hQi;0Cg~>B zB%vW>rq&8dJ{XgMbk_fwPv{r%^S|&kkyk4QKYz9Xr@fS(0%Kwr*brU}4v3zD#%1n? zg@tKFx7F99DhN0FfLG7C4xHbSZj1&1IO0EB5hf-uStz*y=L}=y!8(E8j0n=;m}zhn z94@4)=J^D$A3|Qv^4c9+~HE1A=4|3I-=eB)V zXnya)c;hklkE6@~a(Z*DIytKd_r%W^T9fcHXg$p{Q<&pPRfMJnQeK!14AU zGJyd84t|%kv@|~k*pW}4o8M=ZVBHBs+xjh{z?9zE1`MLNY%aVY!4{=hh$6*QD4sDl zj4l(~P9N#Z3C+=~0O^*Y(f9*D>G2xnoxR zJ}CF#M3E^K5Zmz8DL(cliMgGUV6H2hI_|Sr+~7Js97J zZl8}V>Rns*)pJ@t2NNWTm^f#QMrK^*$n^hH-kHb6xc`5@}3Fnrp7>y}sVhcSkmwP5ZVA=dyk)H;!C~7w12Q^E&2EJozetG*hKj zo)$e|mk#~3mF;@#cXC4ZV3%LUCy!?k%V5eMj#M#) zb4jYh(u;JP8x|X^vBXNW#LJ;kGGNd}cb+{baEsvO6}~30aa(W9#By7hAy-ik99RhL ze$0n*6vhZr2ksX-0l}c#k|5eu8J#mqFna8_I>rjbhJIfahVZkQS0tfPI<51d`*Mvf zht&)A#h5m5={#+qR^cYK>jYn%t&8V1fXNi8`zGjRN`W2%b!0fih_d%C9X6(){fL-q z4^9c723VsNWCV)6NYHtBxuq9j->Vh&|6IY%Hp<-=49%df(t|UtH|%Bsl$K*4derN4 zOWtsLFufyjSZ!i&_<`_C@i>_&?h#MNvcS&RJFTQr8LMcEY-#t0ayN8|g z;`)Ls!O`Hu=OMW8L3hLdpz0U~YSX%H7>p!Jvq6DBXr$(J!2_j44#+TM4)EJI=cvy} zm}W=huAPfIMgKt0^E62hbPF$s7I3<%V2IJVp^oU^;@}u;;fi%K=AD6^_pcvc)#lR; z2nYyC39x5=n|a<`>%0~j%fiVprqXCCyg^`opl-acTEL}GBbO!M{Z+b%yXXZq ze3W9&$flqn6LYl$r#mc?BC~Q#{zXjHip)LUco@HR1GnCY$Kwd07uWbMT)IrX=2~Fj zfi@$Hvf(deqjX3-B>&E&zCPvXsv}npQ`5x#7Xoq;4f1wzn0vU5H8Vm8`?xrJrDW!z z{uArU+s|%iM8&XrLgL69y1uYy!i^avao4e}FaXOP>_Ygn*tkjd;u>zArF_vj&|+%k zs25`nuZC&7uzNpRDvm~VqFYn}+>Q1xocmxQx)0uQo^mrUf+%0-8c)y2(4T(vlld-r zuK|2}U%!~|<_OQeesrZ~yLK1Z5`e4-)(bw84$>3rO9|W5qb_{^Ra3rRF5nq}Xw_J? z)%^O7B?eMb?Kz*Iz+iY{?lXJ~a@f_}!AWVO2fC_9QA(3TT{1J&LsUbLKjEyG#g&E* z48u1&DuBnqRK_nh-L>-z1i0Et#5$jTcEoY=;hr?u)zp4@gsGHisng8zJPTM>zi>rbp0Kj__r3R#FmX{8%y zy`po812}x&MZ5BB!$?iRa}2{~>Z<`5Tgj5t=t^WV_k1f#!mLW?Q}OgJHHXBIy&#WpSu z`mo#feVO+1xmGnvhOIWAq5pUX8EmA+tK|La->Zv{L+zQ%IuslMKrDtjruQ?Qdx-Iz zVDg=_uj$`B7CAJ}$rJ4>8LW8{NA(@hzh65`;;4%5K&*L+NgN>#!@fT57~pCB70tMB zLu`Lru?eJ(Q|M-buztSOv4u|Ox2eil*`gnK|8i(oOe7V`HKCY%?5m5%u8N0^-U%1n zF`T)Vf~alIz9yIn2Ab4^U#pOt?{ikrlv7dBzph1u5G0m82rab^z*2M|eI6%Xm{C_? zZwCFk*mJFWHUrs;?<P{+;Y(-w=jy)6?cswJ4f{`fAso4tV#w&M)NDZfxVHJAh)gSLJtr2WOZH+=#ija4ZDuTo-jspVoj<-378aeH?B0CxbNE+Xbc z8M|^%9NcoBSd*I!ER1dsp>#EW>AHu}oh6bm={{Y^Me+M2TG#`w35u=$H=-k-5UCmp zYUO$FqV-^+5KZUuUoDOnNP{Mx#+{c z(t}SLfZ{Q^c>)xXbCQ6F?IbhPq%q=(%Aks0?ACfnAy606f`6UQ(&C3r4x-_rS)vIK zYF4k$x6_Jz{P6U3GM-#3Snv-aL!GWZpOvFzg=B#27qeFPXam@)ArAq3)*K}j7LQ!M zYniazS0Ec|)kN1Pjygwo%ZUPQYId<-q;pX`PS#; zb~Q7!1epNGOsv#b_a|J$SvqI#@rW^@_ySrdH;%+!bKuZ90iWqq0Le(^;^N@?{+;h* zu^kF{ARfINKSnZ!f(*OBFYpq5>=(Cjo+bm@y)Sri|Jrtq!FWAIjEP~l5;i(SI5z02=^u#$k-!E?u_CR z3pafH37#%aIkvS8lkQF7z%RH82I5L=hPg*rPOqAyN|OdEX4ua)E}UGUkFSppwydD>?aj(=+t&jLv+XFnYWbA-q|gnx~VmroYDa<0^Y5573)A zmLcb{u?k8a;=h+XY^2s0WbURu)cHw}G;kn1?P(s{wYqqpq&*>ri2;+nIl)&OLK3%Nt1BF9m1~ zXyivFa?0&ki)1=ri(Uq}t4GfOkW=(}Xy~-lj{cyN!s2hHvx7!OZ;S>B#XZ@d*X^k8 z9~S75Pq>caB#N#w-eU}t4#k3x04Uu5H>{5RMP+0fnUkj29|PQN zg{*4|3v{!_x6&VXH4CIZUkYmVxsF?Vl`f8eGjnlLpa<6+>Z>zY|0hPO{mt$#XvLxG zUVV)P{UgpXbQsLZ>)9&b>f&}D5!t7;$F&{3tgM5mR{emvgFc+!w9D7NQ;(q7Z)YAZ zZ}f0Ifd7&V0iRxB@tx`lF-|Gqm{SDo5O<)lL*C>PR2V>X(B1+yovx}GtRK)YMQq4Zx0mv z7pY`CQ&6;dqsYB1pE2>hascMrUG%VWfM4f#D}2~V2@#y{?*)uqQ%xFov&am@Zq~eT zSom+@gUN3?U$s`oG`uvO`T;vRgyzO`6%c=+9;mQK>p#o=6KVWtcrd9?cii4j%r7qe6lM2Pefz6Gn zR31ebhxsmWek65|_2o{eY1 zINAT@Bre&XAT-=AFO)q#gS*2bI!-$u7%|BIw!<7y*5djL0gGjS{3D5%i)Y2xaYgw9 z2eQL4>P|p#Au~l^s%w$lZjj{9v*EYeGIzZK5IHJyI$|9NWvKs`gH>>zb2ZSk>bmzifH~-^) z3x!t8wk*8~=)_aye=ZjqZ-Y97jrdGm4ZCq5d6)F7!|VW&XWM)f-Vsux))>o)D4Jpm zvA_T7s6~fBfK3!uhnCWu8CsM?Kym&#(Cn(+z}AQI)ey6Zrxk1yrknDZC2%xoOkIZY z@QUjO6s@9xgoB^mZU*}(5%RJx0AF~d^f(lGby#&d>Bc6KswEKW<6+|0Us@TtPeJ!%&Cw+ms&4 zJxJ^xZGLok>h*J#;_+L+66H|&8Z%dw3{ue9d+;aUkN9of)PB&EQ%-c* zyU#Q|@UNAn4!KG{;&8jOaCP6JK*H26QAY5{E|70W2?Yhz(l#LQuvN%I@t>ghkAC*K zK?KJ%w5@E)QJM%c?z)opI+^F6s{iZv0yfVh98MCeIQ|ce0pdo(fudJKRT%kZssb&x zF%1A2_M_oEpB$_?$C+Z9Y5s9itCus4fGDgHFxoFPL(^js#ozZqx`$SB^oLQ=h;uin z0|YJvM0B}%K->@FWz!#YT1REBsz-})uX)N46q!X`k~I^ov?JIl4hshW1;+Dv8dD=h>&*PVcuhDw8JV@=e`QbKLN z`LSe-KmwIVlnU%tj=9BI(?PIET5u678A{$6dEUAQ?p`{&CtxMgcM8WPe!o9@FN9WH zkZQ;dz_MHH{9*S@HjpV58p}}06V6n$0=``qg-GWps*y3_+*U%E8{`!^apHt#0^{!e zC^w?1D!o45weVMs8G_eo^4D=m#a&~H73)VwmvwF;t+@x{Q{sHnaRDFTQtOOOM)=q#%;j z{IG$^qw0Ix72grB=!qxfNx~Kk)c6Mqqv$JOc2Ol`hd_FZxVjGCwH9~Rl`j}qXvo3~ z|6Li_4(&nTUDrpjiXmT`ofQ)n5oPo!AvUnqjFI(->2S+J)eMn`wt}n z=pq~pR}2T^u)-x}mj>8{y6@P99<_29^zUXgJ*c{WHx!Y*W+}T{l!}yi)*&UhP25s0dnrZ@EDdJut+{@sdzNr>M>=yGFQzjsj} zYH4L7@(j%3gyoF0nbC@qB8Xls^y{Su@74;(zlzBLJVPs$Kygux7>7QBr>De!=_5=_ z0z|F!!~Tim7Z6-ZrBYL&j!;b{$BAPwzj@`RcF}Z=gw<_Z48azN?mT#U-C<8VZDy@}6*IX@#?6)fJe)RW)6KjXWWx7xNw5I&maT`RTo@W-yd%Bh!-fvgyR?bY=rFQ*fe5P7c)$}@_{NSuW z)KoAutbSbkd1E8VQr{fX`+_=+_!k*qwN(NiFcHw{sKEc`C)SpDk(ajS1<};d|pu*b2l=pTpH#O zc3apW$}y6>jWf{W0oonkdguK|JB2uvL>|dCq?2M>IO!Y`e120u)ZTKn4!Vr{bC>2j zDpWLBjm1s#!#>0itEy9OzVd(#ZjB;a!nipSjk#_BhKn3s*8@O^lc!FP+G4>CM>+6cw13_KpOraQ z!tjdG(<4EkLtOw^wEs^`#gqJeNoLoHW)nR9zc(6dZO$Ux7;y7B`@Cc?%5pt-!6JMP z!VDNiSpJp&pLhraG40R;nAbBn;SKb^0~|8%&WlU5GnKGL1CLx@T2;*Mm18l)hNFvN zZ{+tg4xD~XR7@nATcRZrE#&qX^V`pAHP%ZW;!Iq3JPQ4w-L$jI_Gy4!qt*}cJtN-@ zB$c`!y#?YI_s`#S8LdBnm56xQUGzQm5M-xVtRS)f7>oMy(K{5pwN11ZM(NC!{nDK4 zr#DZal7mNq{X56HG92Qn##*-?E*jvShX1cZm+2Na(g(IKF+;{da`OmprXO=cg;|5y zhSKs1#OPfj8B+(A0hg)geN-WPybW2HxrIQ;S$tRf@>zwK=h`XkD?P4B&I=D}dIgP! zWB)mchOdu_IZCD2T7*}wy-#SOE#s0QeJ97zw=AUUlr8G;F~C@Y4sQ)Z7_oUup->zZ zo}ui_ZaHdn@+vBkwo_M~3gbV{I~_b|mi3{PVEe^n+v_NICc(K!>Kr)m_sGz_1BewTRKLq!-yu;$LXV;L;(&Ehis z*C#Gs0v5N&P{W`xjEBM2nx2(tJZ#T2qs(DzP*Bb7u8|OA7@jX)#ua5S&t04iN#v1N zo-*rKFXQ5#naMuC=PQ}4A>y|_oINxUf`{D|Smx0DEP~hrbr4XF<%Jq9&{PMe;5NAb zp=p3{c2?N@mW3u#38Phg|9i)<`zy0`x=RWFK6eKVIQW14F z51HvN%vILtQ!+*!%kO}gVlZurnRaJtq=4O!AKw<$cE7Eamc&Clb?A=Gm*fIwa_InN zYNC`rSx&cPkCLVo?7IZI&ALOzol=VEwmYoYmy}+yx}5u|>-l|kW~A0;aM+oIdrXk|`|ljV0^GMBu+;GC+^h)bDE z-{e_k_THxsOvN(UPxx9JKtOW290HM1%?X0~kc*{@*JOxNz|rhDnqhoM`lAQC*2%5g zp?WW%p!!oNd&%i*6Ai;}VP=ras&1983-$5kgI+P5&*_y{y5v>Wr%$U0jBg{k$myXk z+f?1o`D-JYce{hqD`Zm|+69bdx&wSlM&-xh)Ja-FoKw&&JpQ9zkuoj)NRZ9G!UsEe zM4B4fNg+1R*69W8g3qg}`-?lMSUR}0LwZ&0sF?kV`dp{QrmR!rnRuxJ)>vtzB*iRC zI=H}$?L3|->@nqJ=e)R=S48y)dzi!~j4MWZQzuK7KC4vd9>45e@lioKq-#KQjO6xb zLE8GrM#Fk4&E(t; zhogJ@ODM6mym@vj>L+$x@@pNT^;Tpo-5^0r?q&4jgKXaBTMv$m8c>+%YnB__QLP^p zo;*H2R9SoG&FF;=18=rsX(W65yUsw0d4^7h1ARNIv)6{|Nfo9v4OCJFFI3Vdzr>ex ztEsXWJpz=$+Dc-#O^qyjaprrDlG#=ivaVAoJ$GSBz`zN*LMqNKh`}B_p=vQ??sY90U1FiOxT)YXOy=o= zJI%d+!WQ`blk0x>-;1C6>vd(2E%p?C?9B~U^>9D(K7##v&{TgQxYFtAn>4M0kr?2; z1O^v$^nc9t9)9HIKHf9_>5WjN9Z6hh$}4y02$8Oo?|Gz!T6p>wQ<=kJw>B0BRZgtx za%k#*(b&qL?0fUgCHf^le>9FJ_uUtK09UWoIA?V`PdYa=TY$-nci zKJuqFkElf8c%J0Fg0s6!xWum)3|rEN56jrOHBIg6`SHwT*|3$-*ubvwGprG{eRmgJ z2ow|hHDxDZgnq%~nPdZX6(yC#xk7v43QaOIry@UhrhcK6HD<`9buO3c#JD|Q0>!>7E&=;y62_M(`#0N?uXf3r|C-g2`}Kcc#n0i zO|fo`|A1S+tH`Ntu>f5QpdVqG zQM{#3y|l?vi-qadlZ)#-q(i*eEp=05a-&<}@ebMU*V*!ciIM{CuM8iS&`+^sPclgF z29{1TP1&k9PnPaXg|}t7rcQqg9o|KEo6hjXN8==Rwf=Ee)Y~i9r~T<@&!M$MUJ*Le zGoxsLV!j%Gt>fwK-<~uCspuCkXHBMB8+-gB5tSkbqRo;g+blx7_a&J7qu_B5q{aNIs ziLoP$^E+6S{j#Z(3mJKor5y*1ooy28;YVZ(K>|31iD`@?9Zd6uv;4N!&&y>^ljsUsj9E|DlJAx?)+&5JyR=hx23s%x;;Vd ze_9YIPusaoX%wvgP>1HNX5v#)vLa80c#M6=-fpEJA8og6|90LD#oULlQY%Y^S)!Rm z$2*ia;}g3EiMO?>){l$@?wS`K-`?>#Ur(=yIUMjI9ZVHCxiZ)7OEzb_7am`FFy*m* zQVIQYLLlQ(S^>#B&pKk-Y$W+_JYx3QM|*_lrl_r>n~wgY#+a=BFp}>L4T2Z=WxQ!@ z3humyW{{obi{qj=-MF|C+2&3kZASLXCs(T!GzyRBAJbIt{-f|C*r~vA0TPqxc_{o= zt=AST9C+?^h)?@j`d>}2B~*<^G<{*Cqe$}hH=8Hwp5tk`9yc2^0b)VS;QR_-o7n3?||+a`$5H>sW#06y#rd;5?iJU!jQ`Z z@~GOrPi`Nnk-;&od!5KPn-k?vk_+3L>=fxI7>2w~!3t)B(wz}TjHU-SJ_0FpzP+obKUo%$tw%Gg{K(8(o-!36K6`L z@zg#Pp~4P@2%E=ArLu1pQXU3ZiHR_uU$jT>r02isd_lEa-XsbXt2;QMUkc*5qF0|F yQaPa4B_wZx*SY&Baebno92wJ?Z8fA%|0{+`6a&V#;?-D>IUvDbR;U8k$whD%Gr<-@<{kIzpx zu=@XozKC2aqgE6zy99mlth-N}Uyvi>*|TR8Jv}G)=Huwxqobo`t?NxpOj4BG^Ub9> zRLc$q&`iBteSAvF%F9W^4ykd`Os~XQXP@`Chp?^Vjd5k$?=WYzMzP1X@l}!TgnOmL z-J~la-Gx#=;hS+xl!)6y(*&~s>f{NpTY37v3OU?JGjnrGH|-`TrUAvP!lZ%CVcs&^(st_40ZOgc}DR=2-*h1EHHJhC#NOzvIH3clI+1TIMdVgUE7Y?AB9R@K4E!{0nCZ!gK7?eMKg ze;Mt^grLg(FfZ6B={YLO-k6(>`d8I`Jl*LsB95YI1P zm+KHk+;d!J_dKGL*9J{d6IeE=IA~-rMcV2ecnHrP5X$#i^jfB6l;4}8ej;3YVCHj! zNIEprt}~m}ovSlzFk4Us|^gk&>KUyfZB#@I7Rb4Q-rJPCc*NiFZMkJ!|kWSL{&2AC(*tQ^EQlj3OPC zPbR+>8i2ia$6v?iM61+j+4hvA;nl4@OZU(&ZJJy?E~lOE+2-@EA%L@!7}plgZ0>Or zz3wKee?|3JRoyUc?S@Q?@Fsz#f!m|ngiwMBwTVmNuws>OPUnE5sf%f(5l*tn;R{~7 zh(MMfZVBk1yfm8;HY#mZ(o=mtbmcV7>ycVhTvPAMQ~Wd~=9nSiol951&kY1YYmubA`JNBt zk|kRoz*qO!==&%hQuC==fw79{@2fr;jjzw3oiN(ede?U_cz8o44mWs+6oDk%Eir{nGF2GgcBDX+bA$0#q4m#i`-c*YiS4JS@iIrQ`$f5lMoxXHK4 zG-B)!q0lnqe3oa5_8rMfnre?Sp6|CJO?`^Jt3Zy@y2KYAQofWiLjSx@n3p#3Pr0AW4(|w<`fz46(5q#|Eg`Gu$`#oK1kb+r zU-lED&C*m$s!ZFm@-t+E7*oFs4yhJpDJZmRwva3Wx$uQ7>m6ybg*r4B6NisEqB8nE zbP2M#I!&xNxW8%zjWVX7`gJ(3x;t-n*JFW@8e@jAZ5jSs*fTR9XWDAfNWpM(_d zY<<9QtTPlgM_TU9srq}q&-bfwR~Fz;yk=!~9Q!IxeIY%0KWmffo)+AC*E0DAcM6O8 z%!Rb!Ow+X4nAG9WxX(T0XNj+Zp9wdPSP-KH9V)1?JXSK_Hf)xgmOZ{%WUT7BM7Ff3 z%Yi=)V(#~ewl)#&R+2nR%7#cTj>M6viy^L7X3pD0OeVbIr|llDH$LOhLdH7`m22ow z1rsZSmGqbw4?58lvh9j{eN*L*yNr6)hGH9fN#}XvZ!u?`GluI{zy%e(x+7kgePgTc z5xp|!rc+_#-;+YB{e!0LrdCfiaapmCGR3y2{(MrC4o~4C5 z8kmeT$r;Si#+sV)kPh#Z*8#63C`-z+6dRbit>?3x2-b;s4eyd!v&LgS+c&>ihL;{1 zj%G4aMH`#Scg?yyvPW0xhS|ZjnWdu+=Uq#MGGCUzKSFhp&tZ(6Xlhe%x|b36@lPpA#eWL;~6RgWAS4{vir(s?E)f|8S`Iq-*(GEvrYZTRlblZAfI#HM8}kQ>ATQ z-upC5RxwR$%9oIDt?#6!=6e73$>F_4$e)6Cu4{(F@GDHO%+AQqcs7GA;Og|^CL(2+R zZagzxtk<6M<&6As0&`WACB?JJA%BQ;o<_Ph>lKkfQ-GDje0`J0kJH0SX+*t)DqAp1 ziDMeRs1aN%u|`yOVy~oEZP3)G1TJ3kC7CSuHSUdE%XW;49_w}`e>T9=R@~zj-O#P^ zCvAy(-xY!am;z-*Ax>w?WNO+KECBs7n%FiZk8tKSPexI6qlf!1? z+3KEw1*z2!%b`R_B09IPu)e3U2ks2V3@yikNXTK$6tH4LtP z>sXOUxe}OH6EO23t9|vilem?BlF;Rz6jp2zV4M1HMb?mbFi)> zKreJ?pi+n=?K!N+!80JreljaOO+HhBnU#CmiO@z$CG-XoEKVBJuNRi3QYPN2IO|fV z>l`w@on|Hu#YHf$+T+mZ!%X!^!sXLM_~Y9ukf!} zhWr>s{{B)gRraBBitzLBZU=tVRmg9r-oNEixIgy}OuUSxui`umKYO-h<}9xS@*d2m zPv@sUFQD)jaGb;Qxcy2`UqI442wze2mMh=b`unpu#!B>4Cvr;Ou1lW(YvcwQHKBRz zuBiCG`85+qB4c7>Get#3If_Qw1I~JRQFE6U78Px&yf;RR$Q-|BO^LyA4b4pPQ<{KnDI-n^Tfr)4G#MT^LK7~-N9n0)&nFbQmSmS_D43QWuc;gMj&c#g)&Gcg>vQJZ>r&1!_b)yEQO{XJ# zAnv{0vo1CP)zM1_b6VvhvBwFMndQX=q6Cc=2McZbn@p@Nj@)+sIcH({3e0nguub0J zaH**SWuTY-8`C?P9;o}7RWnOBSiQ0)`td!-C72JJWz>+=)O8~%lxs-PI;?A1lR`Zu zRI00hp|_hV5eXH!x6AfqoLykx`j-CC2BO4jgYL4{zR#Lem3Pz1YoFR|cOse@N1lIj zJ!#92An=(>w`Z-2l{zQpU6a_E5GT?j_v7(jl%|Joj*3q{)3a`zE31GQ$5+D6^&9{G z(#aw+*~2uYjYi?LY9xeK3ZA7cSMf;KAs(To95WVkM^@x}NeQPyrhacPGpRX7Q(VjHdpB%q__G`RO%S%PS|L+` zTGU@1^$j<0V><>TC8K6e@DHjyd`A(B?KO{XKvEvwzG2Tlx0Pa28+}N;mz+9o#5d&4yhk92_7rz>WH+RW$ruzhZ^eXA!#|6s;4jUn^tOe6vLI6 z5dU0~Z#SYxHO|e-AR8g@@;4-|6=124`s<9E%vK${dZ|Mzx7)_qwcIW}h~(-Kn&Npi5~I(sV|$u4^`)Dx^?WY#)_GWM}e zVh74doS4Wwjat6Onv0$md}o>71*!CmE&HPW+G$7O7HfT^^gp0m+Ln-|UR4UZ`0y+B zC%fqG7MLIdRZ;(?lzl)-$+BMUYdpP}@ zReru*sp-Mp+KlUzZb#;6QR_dp+qFF=;wP-W%HVKK1AXC#svOb>dhyzACl8jqcU9YtlOH+g-s9>W9){H^@zrZRmu2RUxM)2Aka2*qBv94RtA;is5!Rl?n7zkgGAWPQ)Y`B%MuaKgotwz9X-aE6;Dg z;cI0FV1hS>XR!o(wdhJ^+-{4DLM_4Vh0_>J4z{J@s^j5s$PepwLcs1_D?!uGW(jo; z-_cxBTDsOJtlFbl3tzo^M21sd`9P1mhgw*dT*JoZWYR8)W`JXV{POvS*;k{CuC5jh z=Z;u@J3Ktx#Yk!96u7u^7dVcnZbMRh_W8GUWZRnH3>-C z16wsg)(%N@&nHpPwsRG>v7g1sE?vhsGZxb1Acw!sF1X8>ya5ES-9Mb((8I`f;s%&P zSGR6l1v$%a1l>!^*|0^li^j71op|is_)j+x1|4`jJU%OA?o@G0ZWnlKu{!SW$J>=& zp;=BF>+esES8(tbU_7K3uTo%NPc!!MRep3?|GJ&Nd4lDJWf%NjhxYkS#Ib189?_x# zxsyVQf&zrB2zfOOipgq7n$<=eJWs1mFK&iBS=ZuKSaxCMBZmC;=2r!3^{!~O9J^k_ zbk}x{GT;uzo|nuplR@rHix4}HcHY!#xD45S5PDa(0Ac)GQ7;$4o=tu85cMJ&Y}fk# zqc3;8s_3OqJaF#rhCmWaIgPyqxTkRD%$XFWhbTf#*v=P1zz*lR@Mjvf!}cZC)YPPm z!0y{IvAFxhVfVdQD?ua@hwt6HH!(8ev^QTyM&{r+jr+xkT+>XTm5C^kEmgZ(RJ5_P z(<1xY9E{x-J5Hk&F{h@cCOa}JfV0)pEtC~AYZiyxRQ={HmzRNmP}r1YWlUTgK2)mS z_Uqtax?H&o`%XRe(26T70>y@G!vZ4Nlw6Z*#zHRFwzr$v;V~GwUn4`=V)FCn&+W&g z2Pv7-&4Wg5l;$?`^q?m^?w%R;Em8$hCb@BXHnFM?vMlH=4GA6>mkHyA;B;UO7Eb3K zdOA8`74MFzhlVBhhNaqmWiU#ocJ|xh?VdCo{yi>+$nwuvc*Z!F++=V9j$d_GTRQjJwapB)i~kb8v%WE5(~x%2L$XJ zLn@t2iz_0^E`IGnE-4LeH(C5CE9S&Ih>;Z*k%MxktO6DdUHKCa!vP1VrnbX=9i{ht zNlw^zNmBhtXWQDSFL_Hb^_AxAura-mjTwn#sXW;R{|~&j4<0-?&`y&#O24Vdnm;Pn zvBfEzrOJoP5Xme7$lC6MdT||8j?ohwJpT7BtX`;o-P*iAnj}levX?4gZKDIop%o+TQ^KA; zhlf03`$)ofGj1epCDte}6(m-dUH)__X^Cq z3Ro$~m(Gq5QfDKPi~snEYxdJqHaS{T{=|HIryr1R*8C7uC^Ori@txPa_EB4%M7F*t z!Stfgk_^*>JlU2io4NKKman|IxpqRSu~*JYMPE%^L7O6EQ|vr^rtiUcDp8?zOgK!Q`$IG$NkF4><(Km5F@gd#`EiLZAG zty1mg?WfQ?yoGztR5_%@-5E`LJuFBF0=kQOdvpcnh60jxZz`OE6NwM@`u)mUiP@=v zkZyVrZ6}}mYJ12Ucx@+OdWH?RzEsaw!3GwO`~78=%BHX?KWJ@s6z+UWD_TL zNUPh;A$-Gz;A`@qb!-%orW;F(J*71x_uzV(QfU=mTT;)2cH7z+MTiR}856(;RBUstsUDfhQ9g$-i?%iz1 zuM#}M!uwhi=|gpP-)a4=cLkSXZfn6x*j|Huw8y>c&y`0aB?~my2ab*Gd;a_Q;drCR zW_xS$C;m(~;1T_PrS4;L?cw;_6%lyj(-9I5Z~Zrk9wg{(V45v05rSggx`vQa_wXVP z=VW{mzJ{KCQ(LK@ zZ3QtdVyj?d_S6?$T1mh*-I8 zwfzg{eK@uBZj0sqI@hG1r(z;31NF2sJzVAE+BY-$?^y&yb@+em&d;4VvW=SBf;*zGET;4PSkOR4RLm8Pz4Rp)$EV zRe@89?A~2iS*L^NwB|9UldZOXP1q(J!p%oFc+xnM=O1LtaNW+^8Afa%no(&q!rCya zJ6|E;!1YyV0usLVh7W@=B1>PXNWP|iUA;DL=JVJH#pC1ciap-0jppgDtL^28HK#Gs&YgzY$)mP&sWswAUZkvbqu zu-GkXC4*V-^2R^t#{A7Zi(D$ktiD0f-#~N)=4*8`2a;1Q(O++$8hWd|HZsW!BMayZ zgL$%b?$^oC77y>m_;n^C;H(%~4@mWqXgZ#M5615`D(u4_=USaTqDGNZ>mYSV&-Xje zyO4&;F9E5>MY4qj1;?zctnO9QzXK4e{rK^?oxXjcIiHV@ZAewOLoHB;hEysw>DW%p ziMIYDkvFz~U+iF@2|_xU3l|W5ADW;|mtWZDn&N$Zvj|yP2i%WDiL0t67Z(@XaMsn; zv39mb*72ysNz?(0qStS*aHMRc7jm>tRIo3#+uAXeSBAxn6QeR%D!IeL!w-r{sE6fE z&pi_XLRw{dX-7GmO(d z*;}^w$_D`uavm|gQvIkE!dLKbIN+)5h4bg3Ol8S&Vi6`YE-4$Xy1OoN;F7wwoln^4 zKvgXI#x`4$U~(2+Pw&gOdvp+~HRdqiF;Y8 ztx$>su`bZ?+?BWrguVT>eH`OWyL8$);dJ{6=7uWmX!JRS|6!Y$i^d2StTZ+%N+z9l)0u-y?$)I$eDt;&OC!eY=| zu%lMzkdEFV<4#_Cw{qGcYt2hD zVI|w^NITku?im$i-#tda{qaa>cEaVOURVI2DN z_UDyYn$Cgs6|kR!JrFu~=ELqG`?jIBNBxk)IDc-!{ZbS9M@BLMwoHOwXXf|uoN~Dj zgOZ_j4Gcx^CQaiLVn7p|3#~{NhBL#oBQ(V+>qPO5WZ@n$7X2UEmucYX`)ht~V2(ip z)2FWI-J9_xkQcc}rGOWD7x#EU#m3V0?a(T&cB7=#4I7FkRM+5i^F76KJ;HuyVv5eG z)hb9UD_q<94Y)XmH%OrpKz0Re%7QCfbz`z@2q)YkU70QdzRAg;|3ieH?yu!-d4^zeITNLk_I8dT2k5>hFGXhY0;pcymsI-x`N>_N`=h zO3YLX9^;3!SF4|Dp*!;W+>V5L<$B*6;rmh{m{Bfb5~ciB*8WFddOh)f-O$iL>+e5} zgQ^1S3XFrx`}gmmn!W9N`l&|)lrk%aRwvTvI8vV4VcAZuTHF^Xf3jVd*VfX~GWcvy zJ8jK>K|#D5cn!3{i<%`ETLl~MfM5eiQ zVv;yJ7DyPaCx9pV2q(eu_kpnYXVaxJv>z%2gExdiD)z*g82>fm^fvXhPs=gA7l(r`4vO#5MW9jVc*(nPUs3vYamK zUyVR(;WquC(71?QPOa1hCP!(5LaV}JCN#3%P;|M}D$?nmw%=uzz%1ry+OsW#m683G ztaTezzCV>}mOM2Dky>wi@y;~c4&_F15x3rniChosyea)ZfHZ*1TnI5V>6=6b0@d~E zm2@~WnOC{nq|ex2fInfMyUMZNInqJhj$J+bT82R~chZQrKElzVJX{|NpBE9~DI`Rz z|NMf&QjvKo{=+VmE|B|=zC;-3&6_t5M@L6LhV^ZnaZ*uL^>sgY?r2nmsq{ToQPDP= z>?xFQ$O150x79X!41lKux=vAINJ5_DN?uP-Pt*GPQh06UCbjVt?Ud>EUuKtgR4ZUX9h zq+8O!AkuD)J+DY3W=9T?n@2!6O>!zCaF0(;PL8T zM~7KhS@9?I&(V&a3H$c0S4q6Zfn9yhCMzt@h?Q-DRyah=Qp1r51VTzYko$taptD=! z6pE2|#Hd-5LDGpE94iDaf}GC0e!;g{3&plI4bc*iVeaj6TQ&#o7I{N|gx?Pa7A~G6 zqN%B=o2?!p%FN=vsOxR12n^Q_)LDAKho~?L`MtWaX2>^sjG2n^^qp~v2@3H(mG0^>Fj)<(PHHu*{iHcVuGAunL^F?2W1i8O1{-hDYlYR$*_3)t}} zLfB@QUX1x;7^>|*(2S)Y>2|5be;Cd2`#GFg<;-)rrgy3rl5^s99|5A@$bW+he;8&7NG>R`8j4&5LYhN`0s787)e`9j zhvs#*A2cqsOZ-dn`tQ7)Yto89E|VI}bNMf6eg#z-3`QR6{X!nU2|Mr;d&KbY@C1Tv zCnxjb;TB)O1)g{^hi``;J$lp_bGttn74Q)@+b?^!wY7w8=x3?EI?_T_c# zB9RW#p;vndkp7|T%lEzz5eb-@6A>Z^>9&KJdd?-0Ca9N7VULfGv% zU|B=+_;o`76rV&u@i}j6`P!hdjUa&_m$!f^5LxLgSnLABFJJ%qeelqM1PyJ2FY2Ko z21$h?+uRl*F*Ky<>{{$Q+Oh_aWVj32GXHa^_=f-Mp`jr_#i{Y_Wu-FzqAxA8$kBHy zhw+f95)9_UDF6W<6GaxA=&ibdQ z9anc?o_nCu%P$gLvbL|=Nu1$gt(9ZtEk}>)*{pp@VzlN%*~@i6U_sdQx@kH; zc7Y6v>bXedXkSFss2+j#mYeILJyGtHThzac42}O1zl*~#LxToIDisE!)39qRf8Mpc z5&(eNS9br@&q^Mf66!n@-s%Xx7tGfmg=F~R-tO*1k6_0b`HR4yMUn0m8AJrnGv;eZ z>xfBPJ_=n0)d0$>ZOB?+wP#yF*QZ5@UBrJTVe=-HFu6K7SC()S&%6938 z&j#JNouv{cKkfffu74qgL4IA-**>xJG&ICR1I8|AQ5Ml&4dPihZ%0wn*++6p>>JtT z$+&(tY_Tur63nW6q)Y$5!%dLd?LbQ?;X6Hgz zIVD%GK4@!Wns(TRg5In^LfpVGRL2k{r2hZ0_&vuXS6)~qIaq6zc8@mnm|b~Cs*>xA zok85aOC%KT(&0+Q*^SEXDzCQjIIKVhLz_G+7JBwbwCV4Cx=d2i zV{pHo1+c;EF5PpuXVw z{EPGX8wK>=c^UnuwVSJJHfl=&4kr(y)-Kz^qdlMccYlg%2Z=yXa&F?$4?+-mdP&B#tw*L~L_PqMP&U75k6eqfkiRP=y= zt%t|v{L{jWhV$ON+AsEnkE6`yF~s12xH$ZF0Jf_Iazrtx>4ba2zO)AW-PD2%Lr1y+ zzdi4&#s%&-bC)dUIcNPC^4ev%m`Itqi)l_Z zND9fcGs;x5NSe$X<44S`?E((gw>Fp|YR`B#v9Jvg~UMvA5uKG*GA0J4uvo%F1YsF%zFBQqN^{rCE&P%yw({RwHXrh~R4@ zg#S0XZncP?s15wFrcoSh(){Zxm+Cri0}2YaqQIg4Av+e>lXZs(iG;YMNBwkFgzd^e z>Vpyztd3ChpKa0QwYhxx&C8b>uDkeckgi|E?VQ#UO_v#P7N~2?J7EmY&pTl%0$A=4 zQV!4@*wz|Rrr7q`6*L@syt6-d8io!FvH_iOAV)4kj=Wv>h={5Fp+n_)LwRFo_!lT( zwlz`1B>wlIRp-B|F^n(iB_~w(g)O%;uai>Q0DTa@A)?74NV^35+oz2Ylxznp2Muoj z+y5x(^fx+7;Vn`bY`_)sOcg+-69=#=RWWG0P`3N$9+wmVA=icli#J|H2KAWz+c4JF z)*c3ukf7xG;*1$NwfqF7=>CAXq)^%vB8^=NPQof* zrCIX1WV2+);N&{>Q2m38e3i+iq%R&vQOs-_R}oyH*Amr}ezXI1jmfrx0*zP+-`$%( z6@l0O0=Tqem-gk?th4Xx>S9;bKFKZ!&>8W?1c@sS#jr_&;L>LGj$ryMjHSv69Jlc@ zClUV}vbH{;g2CD*yCq0q@BUSPVW9NzyKuVlAIaGi*CK)|$%;p>RTpYF<B?N z0C5#oacaXHcRW!_LSb=~{nOLvSMW-V$X$rzgI$PefnCTev6CIUChb#o*^H|m_V`Z3 zdWG21qDl^Nz`gOaM|Fdn`3yFsO3G9Kywid>}UEBR6B&tFhGgWKlY?I zw2%~7m(6)tQmq<@*g?dprjhuA$89dwSl%MBMhB_kLzWeTzui;$VgKNvPLgK@ z@uuTz1#EQPyV)n!T&h5#nfhp!SFzEmC0_@Lxj?!yI8CD5@=y*g)Bh zP}q>?{9ku=b|P$2e0_I25HcZ7FuKgzSq9oowTc<~XIe@!7>Ax& z-Fep_NnENhNlL)*Lw($iL-d1J^n_mM3~25lGmIOUHol!vvA!ZmRSEq$OK*V*LJd71 z;)fb~v)p>kf8k9FN_F7#-;ASvKqzzjpJEX>Djs31{U0u7dP~*8i;eWEYO%&ZE$Lw` z+*_zO;S(pNk)mVTgpEL|9dI6q^30KK_r9sg(9Vn$wfw4+Mrfr}foIxh`G!-qJ8E76 z)OM;xc4xE0)6+;v*^g*H!114!J9E$E36~zrWs0zU@>|xnQ%zA5v8SAoKTXMgtVfL8(oHWfMlOcfHuR+r@?=ltGI76>MHPw8T6f7rJy7frDC6WstNdYcL>#^lr zr3XAL7m6B8$N!%iOn=71ctJIAnO3{|h~m!s_{{Ww{rXsLb1wRH11?Z3KVp%vd~mO$ zv-8g6l7E84nl4$;zp`>|Ei_2F09;E7gCf@T&E!!FZG8M0+cMS7DF|7tjC8H#<@n4h z;@5Neo=$6o76XabAN%0J-Mk5%z3ch8V_M7W zlBDe78xF@yIQZgl+eMOUX!1x(_@$WI?fJ-S?_r+_sT+7sa6dF1QHb>wu-@Fi}>-E-szOjgfWvc}qYY1u8@OL+VJP`0po`oaE;z;x{!l+B?)1NMaNaJDNW8 z&C3gEB}(jGg82l=B>69_wd$#?lCts^5K-^9XnhnB5jo&a%aK}t6?~AW(G+!XVRP+j zm2Hxpl-ZLn*gc2lFB7FkYvoaVye?|4b2IWG9YZ}?hI`oBug%LoPKiTNTAy{&25E|O z(lA)bzei;qN3xk15_e^w(AZ9-xeOm{@~ihsznMi^>RfcXp{~IkoI3FjmDWO+Spta& zSxIC%1}xK*txFiZAHn~9EP5`@!oShvD;nB9o;__?LmU3Nq&97k5SH!CA&95juNIFF9W?l3N%)T^f08InvZnW z+wtEL#Z`+klhk%-r`_E5DX5*6l|A;z#k+^-<;w6l>VIvXU5@_-_9>KIUcfjv; zk$X$>AbIt5o9&ARDly1-5S;V%7~(V9$@>w2j8b+fu(*7My!LVHi5w0xlA#C=Xg&c4UDsizd&u!x1RQM3E(6D*VVeCIrI1i zic#iL1fn3d|K~#Onb80FbHb;d;v@XrjRqh^9sQ;>SFY=pYW=NPW3}5U?mj>dTU`HX zPZ(R@%3#M9t&7g9(rTv+WQ8wpVZFLAzQG&&H0m0=@STPQOL<|)+bkZtxeQ4S8L|yt!A*O1<{LDfd6I7GZZ3t6bTpw{pgT|mQ12(JP&!{{ z!R+*E`LcYydB2nADna7}iL|jjtQf`JAk=}g79$Ks8KN5mI9VD+HI4j9Gao}aIwP5mz@yvSf@C4tG~ze@Na;=Z_i^)L4Y z-uMKMUAik|f3-)>yAW3K{}&+MGy0DnDC%b>Q?>YXCv{*GGSq>?famQ4!VDo!FTZR^ zsI`Eaii^#VnJV66KE>78Gq3*cf&x#+Fcf@3?o^bgRS%FWd*c3~$rbRw4UFtA<(z}7 zm&uos9T-sC(U!NbRj95?6n4a1Z2g3*S>6IsP8^ZCDxk)RMQ5nYSy!pWVq?u<#3M)5 zU%)>)1B>*<#sARC-nU6dAp4Y1sFdSiU1S;~<%LApr)2jH@!+eq#qTJ$uSJ+3>0cue zSZnn)q#Ys~J{hqtM($~|I6e&veJhgwpcPNq3D%3M{^HGL4JQqt2+ghGT3%Cq+wk&CMsA>}U&wQn#v2ceB`&!>97jqBiZ6=>q zV07o4V>^G?^&oA8gcJw^v6nZIvIXjx2I`8+Y4E5`JdtGRfvCEvAQCA))v|2DB8~6D zREo0GIU-5LS%8}c<5ztwPL1%1xTHduv)^Orz6HAV3wp$DNEmWMDFKB@vS9b_-M6dz z*Vt3e;~hOv{k?-YM^q&?Ys+Sh#4 zisNPD#U(uxs@7z)AWqkRZT7Kr@GQ$*F+p zK+Q$?E_5p6|8m;n-+%VmHeEzzR8UYDhAq*U2Q|^?osx>mcBkRLPj2A~KnE)5ud+G( zPDxc&+6gq%(0^TDbEYQaouZOZ$CUNyUxv1BvAjX4NUZ{6UE4qP#?mq}4jQ4C zbvq}^q}DmIvn5W1gmZ1;lv8Fm%I{CD`wiS5zc#{`55z1t<2Svg$Z|V_1EahhyP*A; zvxa3f9Y@t4TO2ew3Z4#psEjW6cMggc`#HnF9XNwRCleGrXI#EKMX7s5HdoUMkv4lVB;Ap)!LF}Bcj1ijEt)N6tF`6 zudl0zij0MiK*m8+o53dn47QyW_U)OgHYrp1hFO`iBh_f)j0DZOym_Oau zTm;Olq4Fm84?$yWes=ri!vfBh0M%f`leOIkKbJ~>;3f0?b+&L~0g-2eKMQ|^U6}mn zdj@E{>k|r@xX&HP7-qYr|r*`zkR85z{PTydaCPi%9wp#YtD2yfm- z%hG*&JvmQOsWpieZGnoNRe?(0y(?0w|I*WCcBT0pn~K+jNQ*vhJtK6u<=*;lN~r~|X#5iciHbCv_n zwd^})$IEA$Tuz!k>!+#XCMg-I{PR~4F{dq>A+V+p{Vb?1Ea_ zjT&62Hd|VLxXsE6VC&^Q-kO`{>wZ`UCgFlH{iEivVfx_$K$fHQvROKQ=E{+JyDhDc z29o2VokO1PRonR>qV8q@ek#A*Qms=zzv|>ff#TW^1A&%x6eDZKHvH(*p^4Dk%JBr* zC4Q&T3?^SrZTX0>jxZ1AieBYw|EL&bMlLu>TeT}K!*4xEzOt|Um(C%H0d0$JHhtyI zEWu-h;7R`R;ntYoBhRnAm&mqk@Lqd8Cobn*Jx+zosYxg{>(TU(Z@29o{m#%PucpiD z;2Nd}8b&saxes5csS74b>vK*{w3e2^eNT$J$y7<9FTwPpRjs+4>h#ACvti0>jX#T( zvPJ3dod`+f%+yIg%+|Qu;#Dn-jN0u9{AD!Ei!tibgw?igkl0<-lT$`?>Lx21hqMjVt-h z3a_8#xWA_R(axc9k*Bg`qF0mm5==|uPDr-VSkNX)S4>}wF)F3%DFFsFs6q$NtSTcN z*|EyBq@+EnWgNh6Ittp;W=?dSs-=mzd)J1^`!EvYT2lR9`ERkx@23fgI{Y*))*4cl z3Ocgg(|#w2LX0swAIWW>V?o+ENw%nW@%_lleJa`@qFB~!CXWwfm1uRn-D#Bk+MEVT zBB6|FZhZ@$Mb^eEq33&0KZ0ly-jhhc)Ys0@sTOCzwUKci+44c^x(2pE9F-|)lLve@ z(?qw;9<>uKPQf znBQgo@kUtH{q@;gna26;d=l_DEuwnE$a!I0sV9LjYx;T0_%#y>?4KytH8F;ZUO7Ju zR}I6|AaP7X(kyN4@p>(zAN6y4f&P*Eki>g3bP#(uGe&pwEV#d(V#}ymOD58oa{J z1NLsrhfTkTE*<}x5I6bS^~bdmUS3{k4Nwnp zDF^B^ud}O*4<2rzO5j?3`Y1}Ly5nHHB`Ts(h)fm}78NCsNTl-CTV~_H>>NF_m^tfaGnm#XfkTAN?;qeV|VUA^K#li`tPpFdqsS_b26f zi*DoC$^rG-pNxG^64XvU5Dog9HtBwyemK6PXinAm*S(hAviX**eJZL%e65wjwkl+<6i0tQz+ng;*` zZfzbs=WS%m512J$J`X-PhmU+A$pvkxdakZhy zGWVGOYf$)<&~$o2xI@B))_xTkN##{7Lg3&_yJvuKB7Y%HK_ZDqB@%s^62A8C3dh24 z&p6oEyG~Fk3#94aFd)C~K|E&y%S{o{7m}O`L&_(+;Bha1X>5x;Tb``W^qnuBm7DWM zesuZ$fB>7sv54hhx?#Qly3k>zA=ff6y|zUnvA@ugD?EbnZ)mfD(ScY6p9=bTxhGy| zMBDyHUlttali=s)N9^@PvWP5v z5}~2tA##`czkmNj@F?`-Kx4##eU^8n+maV{3)IYLZ|h@MR(RM+&7^QOq)7Q+c+|$T zV4yFWMf~tF)jrN(WDnI>TC^T4nsrU%)I(Vg0`0hL5b2g8`v>~rAuG*4QEPzDhi=A5 zT@zqkPM)Vve^onMqL4{Q3)BRGE-P3^U|BcbfwMRf9k)R+t@ewN8A;nJgXMC_Kb!x8 zGO%0g;b~1~o~PJhauxvKk6KBF?9C}@H!zzbl1c5zLC6fiAk^Ttd3o$Zq)+2ar3KR; z49g?FWe^Wie_%AT-~cUti5C#l-#+;C4>Acr<6mum(JgZhq!pktf`wcxj4c*@0@6d^ zZ4vGU>nLaOENr>!GN?U>CUeR0aOMyycO)PLYM$)j8z1G;evn97PSvvOM)yNUQaM-V z!Q23N z^mo2@Xky_Q*3#)=$`KHQ6U3_JHcOwESS`8xd2cl`I+}ovj&5RLuaX&`+4hMzE3zzu znaH138hKhT7ZynWswr-mw^{JoU)t-=m=`?L${!GdnpZPkKV585JoPXYWv}2u!oJLdn)TaRCef&S~yI zw1g<3)Iw|I*dwmhD}SxoQpvWQ-Xog%3~ckf8<6*^4=RG9A&DOU@ti0`k$5c2L-o|$ zpRg%xIYJ$(BM+<^2V;YEDl`q}zhQQ4gt0eIdli9QKqZa-YQ{&3Zpa9lCqQb4Jb~nN zWlnicW!KxUMDHz+vw-1L_7y`9a|;c4KpAa~&B#C-Gi^6;43&jmsBb94>F-t}fwrLc zGeZY5N7C~@?ieIJ`E+To+%Km5qVKs2WbVd*IakmX;N)8UU&EZt>SNun4B$DLdL9?! z;Gs1fE7u@Y4q1itBaxH4nuHCb4+-SD2rJF$6n7Tby#P28Ji4Gv;jzN0*aLzm;SqQo z;X{+WbK*$N_-_a$t8qySCfN)h@6bgSmG)~ruvPn-8L!MQAxE;EvLW51`()3I<2ES-AW-C-lDr64IEwPA(B zIiB;^nb}fKA=3Q|0|ZpMMBDwrRqyS2wI;u>bw7Bf939>vZBhv-4~bFa*=GRN8dyK@ z{;%fFJs#?`@8er{s(WN5WD_Z*P!2_5m7E%iDIslBLkYB4!-#^Wt{GB&k9x6Ptb3`A9Loa^9?D* z<>!dqUQ+^W!KA+*Rtix8hxcP?{L<(B^1;hZ@hA0i+Ac2u3|DdlJc`%V1=cctOXojk z8wATPBsfVzEFJRyo{1w5P_rlV>#xc|9$l{}Z>SHm`Rgp!_=HIp)5m(C`$C1(+tkO9 zr1AMN5mL?wRj1Kv?b7vX>jM^LLKn2Kq(r+unNILyxSEGu7c%PjLsOWHL$_Y-7IqZ| zfU)Nef&ycqxJ~>H1{5sU|QNnbTv2yLEP8B%hHV9SS-q3K$5V$%T?7zBeWpnWoN%sUT1x^RB+^EBo2{YOs4 z=_LmT2g~#{QKM#g3ivnl^>2W52QR@j1JN|FmjJfgrvS#HEht{ZcG%8Tvlr(lUEBCD zyZPOTje5rEGcod=XoGI(F%Z2^L~o+%*u~j-WDULu@tvigN}85bcRI=d{1M#x0z?>1 z))pP#wDM*g3gJZ_Z<%ct>34r!{L&}=S%p#1JZyjbQs{~{fs-n9vq}+(V5TOJjnZ3x zz&b5*g9+=az{`6I87(rOLlC!c`0x5RBVBN`h?b45j=git^|YsIuE-9X;#5!HdJQfKpd#9yXDo#|W8m z?_h_i3F70vgq0>nfxmHvU9X?+D=e}zb6LoqrLs)@-tM*f|C~NY&}>~yZJRIJYF*V> zRI&E@mLs(R(fp>T$Y3W&SkF}(e4G3B0#6SRL(ekE7Nm9+z7h%4I7sZQ@{`Z5PdvRu zPVNwc^BR=Jm7+aA7n|SFfZv4%JZ??H2<&DW>I;BCA#g6Hs1U&G+|{2yyZSL^U=*zg zV2EnkG&;O2?EGHyiN`Z7$}Xi|fKh;f(Za1_(+k^jXlb|ruvJ%djd!tus@k;$jBGn< z=JPT-mHIsS$(^Da%ICTu|AyP%G52OVE6IgGmIUji|20I6Ko%uPnij^{xXoeCueV#s zoU6=fPbE@`P5=!nnuU6>>Ir!gM%`Y+KsfQ-akj>u%btPqwn&l@hAhzcr*;-;@^bt+T_M34w?)bmNuud$Pcy54jN)b%-=wWUr7>Uzp2D*_<_7Z1z)oD{rMPM_ff z3nMn;NNU{w7bZr>|ModS?|Rb^>(5E3nSY6z8L@m10ygmTJ&$1iQL~R*TJ``u65hEu z4VYe-Zx29}rUzEk4MQKyAH3(U@B5@?1`{^;mQ|kd1Ml-~Q%Yj{;X(PJ8{vk7b$zh) zLOvehUC~)iaM$)o{WYoN+2oo={K*qhb3KP3f&_tanQ0ipg0#SvCZ*(>Sx^2AUUY3R zis!ZX6cx)v>-oGj3CkgieDKRw?&TWFGs6K8^Ji#Oq!86k;Htn-*+uE^D zI#Fu~E%3|a{LBzw4`kwTbv$;nLo$##Dx;-n0oNEPPdJ$c8Wy{aYEwatJM&M)ux>+= zLSokTBC2F|cgjw4h<(6Lpi1C^dxvH>h@x3VE6qFCsS**jr@xo#DE5zUTP;?>|BYtv z^K#Ck691G2^sy}p!ebWq_vmKJY@(u~&Y{9So{_POTtkldy`}XlO5NR*I*+@b^o+$6 zkJt8ucP?r}o8;%BO+r82s!|J6OMIZ;x!c|w%P%U6DKaq@jfc`7ZFwnVqwRMH#atrc zeO8q*;tYrs5AYhWNM=Ox7JsoJhXgamo`X&(y~jQJ5T_n;^PntXX|nDL1s-9wk7fdN ztd-fhktf6+`#mbp4;XFFi-gGswQJq)ZkJ`h@VrB{#Rm^_oO#ZpQ7geth}q#T_c7)o zV+BA`{B*CDTF7m)Uq^#E;mW~H+GQEHUJrr$@vCW}*v%#DZGrW00;l~#eM(Y`@7MAu zHZ}Z`T9cZ5X+!i(mhF$NWkeGFW#5a{#ocTNhe>CK4^{+OmjlbGI~2US?v_=D13IqO z)qEz94<^(jk}L0TR>A4YgGl|B#rj=c2(S^cP2{jT(zoFEBq@HJx;<)4Syma&^c zk^#G^cd4fpO=^)?>}%S>VmmKtX{0xMN8Res>@1CSvrGjg0z&NcK>D{Hu`Mv$$2k8p zx>57{_in&v8HD0K$|I`u8N5_z1fe9L>R1x+#l>qvD@VKED=0X;ci&G|@yWZfUvaWZ zv8pOj{#KXD+5o3(AnxHLWm6}z;PNi+DC*791a{Oco&51LEtUy+t4#4v5MP zoQ6>Y8AO1%kf%w}Pt~7W+?xrFNCW+?nQt?iL|l^N>kRPH6&F9<`Nz&FYSaJ)uu67Q zMYarJ8NU4HU1k?-%IjZ#wQ;au&dVv>P;5q!_h_BFe-JkpA`9Cngm^B|Cp{Qd|C@HB z6{&@nZwYQUkz{^oaOM{u|LPz zaM1VC!X6FhZL3n0!ttGx1j|U3B|ZX*cF>0XWBe+<1W<@1fJ^3>KJj(6(TJ3%dEmAR zpJcNz6mV*_-HmSj{_Tf2cM#(^w+ihRWd6H$3;Lfxr2`0d7i{ytqB^D?dRo|7y%Aw? zpn0F1HE#QlEtN9vLdkENK=P~YFb}&XgyK~2p*X?~|BoaIu7cirl#WB0tyk_x(MSL$ zJyu~A|5G!qjHD>F<*aq|^a0)?i`g$Z6_l=biw;;Bl{T@T2k9LS4t9n^LmH#OC_bNG zQDA(YC;W;6e15kfY*7L--Mk$)y6ZLz(2f`7g}zF^!jG_@Ezp%TnqZH_-p(Nz_Y8pW zEH!pGTLA=*2w3rZW2es-k~Jn5@my^35gc==nN851MKx9*h zaV+PN;|nQuWYgau?Bx83-p5aI5OhS+am9ANNt$PYo$8_2&51iC<+DQG+ZwX*)lnQBjSd_vyd#2_{!;e>5W zAc_@DBOUtaEY%r@veSmmL#=FK$ z+B0=59IVyouni87U~r0mHdzyk`Hs(M?TmzXkrd`;I|S_pII4@ev#%&AIqs zyg`doR&{oHXw-G-l0ix6WsH~huxA^(a<=fmf)59Bq!Tvr|K_5N*|5H?ARsYjg1(0q z;%8We{dJp8k_a7>?Y>WtWRAHn|J5kx3;RRHw8Kvw?{yPN;gfN7psT;_iixX7xIB_C*GO|C%$0&oRq2tNiellvo0Q`$ARTzcE%jpvbbD(j?fHm3Rtz#HRNXTAzR z^ZZ@+Fc3tHG~kR0Mhh(&YH@z~kI4YNX-zm?oE}Rm>)s$QKeK)6ci+>;Zz1lNsz!b4 zm;LB}?IVgoQY#J*6gQ!XA;@n%j1&jX%3%-tY00+L5GB>X0_JFbA4Zi<8ZO45mTW>| zyf(+`e`P}0Q&MOgnh(OT2kvtS1A|`*_MBzvxkk8VMs3Iay1hK7>AmVyN)gL86f*?H zms&HD$>jChZ&5dWWT=J^KIQ$CgxsMM%5ufT&Fg4Vi4H*)R!+Im@1!&7pFYpr3|fGQ zM%ZP;KQ%)gaq!TJZ&|WobF?*`<#iEctlF?wH_c|FppHnW1zRhOpELt&_Uxtu@S9A! zY=$4c`QRq-_pLl~LR}43&u#iGbTq0<4X00??z(aFS=znpF$>y|7KWT3BFg`N#q{85 z+y?S(9%V8#-VNs-DA`$oVnob(T83utZ>fbhFtw0WG($d;M^oZ~oHq#~PqZ2cUJJyY zu&Z&Im4isybDyLtxUYe#0e*FZP`Rus{Z%d0A;5tR2Ycng&N9*{eg1j7D298f~iL(uvb= zAuBW{Di?1qdP0;QEAJ;1SBw-5-?qD7g6#MCsS(s29~mcH zSs_l4-vufGXpIbugzs-bYTYb&M&Mb#8(ai{fi(>b3ZLg0jI+cQFSsT{us@C-pGx70LfKatO>_RqYD@!@H#-@U!PnHA7PV1}e=tcDZ2 z_?r=I`0+P0F$!W=X6o-Y#$6T&1G&$WWgzGQMbNrGP0J`t9iX~D{#+M{HXbayaw0W-W2m zxGDn84^Tz0!I(#sMjMNdrKrdhvYs&Y3GWN$1B)fUE|99_p?yV%7MO&@F5DYD8YDb+ zOISd_v0JV$E+%OB=q-U3<6;E%%P*V_fFS7!bqOXH8Z}BY4hM3Uq}QZO2y=}nzPA<3 z60^xZYnH5ehE#O)m>JuTwSuuCcwF-1|JqIbn~jM3mN0aF5u8mLGzJ}t1=_27(YIio zkzVyicX_ZOIE2E^e7+Y(t`>BAQfE)_55Ru+2@S}9z9iR4v7Oe7EWK*HmJ}vZPosDy ztoH&d;Avz9%;EP21U>?+P~)g2OqT&!!2=2iqek+Ozz>L_vS&!Tnb*=3P@h3JY~CBE zcDv;8A>I5=bgO*+tpsi%>{h7F@LpBIXt0OH%HkMAc6_k905Dat@G%++o8ZW2q165C ze`<+hPclG|q0xvla70D1ny8ro`}hojyS7^raDb@C0DzZrJ_#lAL>S=hIUcrh)WayL zCOaPH8Y%%`BiTv@=Blbr4-G!vBd1viBxJi8{a`l?X965dk25CPM5 zx|hB03lkj6C(hq(AVk-LDQt%ZKj+Mt!LU~rJtQR(3+pzvL_KS#n&e0%uD=Dq6Lo=4 zFd8uqCMg<9&uKktW%%h?WmcVQ^&21@oIeKACZf7OOqLkYxe|Zl6&GXij=#g9Fl&W3 z;hHa5-+ zZjU(pG-NKaRCq;$2E+37htHb>r-1l|D%Y=dhel;Dw9jx>n9|VF7hw*&^LB`x?`<5z^ijTZ*Oz=}JXPf*e@fuA9T@Tw zgY#DZBhvvK=yj)2&`E$l@7fA32h7s|UpxWgGiGRjKOg%EN;%BU0AJ{6f*_3*9`ME9 za`==`3j(f(x1l~2LuLrL;$-2;!{!|L;{W%DJVZqlx_&^`3UryH9tvE$1h4$NCl#g5 zOH2l;2BDF_a|-1;u}248N7;YWv6JcMl!%h8jz=U)*q`OGZ_`O@D78@X7;V%ZapwUr zYJ{~Zw2*r5p23kIMNUw=zvt)UN%Y*?9WVmmdRVg`Dt57C$^4Pya&qPDRC=ZB%1WyKk1g=>NP0%QF-vA=%D|8Ht!Gdm=_c}n@e#@?^fUc*)3F#@;;zs z+vtbYY^Bk@c-QPuyYrO#lAWV_dAD5qhkZQ9zSB)S#&viglWltjimcIwdKO z`&Kj;F#PPUZaMA%2Ygq*+!+JgC%E2SDg`2{cN@E?EtdOOJM{iYOGat)@Ig{vkq>iY z;*kTfciFnyY}b&EAKT6tn#@%zWb*cXzcsF({)^uz`()6IS99(*^_IB1wrpuWvvys< zV@Cdq=08J{DDPK0Ql7>(5A1CXDb^|>EiaK({uQE1=R5QTpG6L7N^Wu9F%L7#$C6&p zuPU+TEeHv{^R(J&Xt)LVWQI8DM3>KxnY{esr_~BKbbh0h1@k%!lp0qmwTlxgH>O(! zB}y{$i_!1;sDw*|SKOYR6s3qXB^j};31OG6mT1~SgB-478^upO=_oo!NtM|bROYld zb-2G{o@$9AWo-nR==QlOSX*;=B-Wc9ad)`)$;H<_)=HU&EJ8=}b<}yYG&irB2ThyI zo?1G-R&vOlnRfWWYXY8n&12|`2Mu)F9pA; zr|%2dF)O&})7ixI?xK?6l+7N_s(BD@Ssp_vZDbgQEcN)Syi(F@RO0~EB|iPrtQe*0 zJy)IGKAXF48R_D6co`m^`&abhb>;U$iK+t|o>4**opbcmr9&9noL=rF^yY&kGzZvS zjy6A;a)@vH*fGQXC21Djyk5?=`@$zK(E3slv9IG}q*=nRcK)sFS^Lz&ta}g0R>>)s zi~SUFznbkjvcmUtRRKF;cwPGA=zUk4#bdn7A3ev#yyt|@wN8Yeli4T#{jDngobZd| z;&3_fopBCHi{^w?9Cod;e%8B`I7ExKv{Jr9eHvCJxi39f^SDKNm0ph93K?8XmT=HI zJ6boEpYYa98n}20rrq@xvYBBR5)x=?=zj^?`7X192`jcVY* z^p)FJ-B@lj@_{n4pI4VOlE+!}tqBgfxVT^n@wpm8car-Om>bIh4yu#w(yKil#@H7S1EA< zMQ7%{*6TDNQl diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.LongQueueLabel.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.LongQueueLabel.verified.png index cd32dac343e802a464a0ea412bb2c24e429e7d7c..5d650047612c6ed691b70695ec400eae1604b48f 100644 GIT binary patch literal 24191 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 literal 22716 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 diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.Minimal.verified.png b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.Minimal.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6ee08c4fbe7989d758c35b8df89e2468e558ff GIT binary patch literal 35908 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 z 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 F{{^$+UtGS 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 diff --git a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.cs b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.cs index 6a718c5d..96bc3a8a 100644 --- a/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.cs @@ -116,6 +116,14 @@ public Task Images() => public Task Selection() => Capture(ViewerSession.Drag(Fixtures.File(), PaneSide.Left, 1, 6, 3, 4)); + ///

+ /// The minimal view, whose folded rows are drawn dimmed on a band of their own. Mirrored in the + /// native suite, which is what holds the three heads to one look for a fold. + /// + [Test] + public Task Minimal() => + Capture(ViewerSession.Apply(Fixtures.File(Fixtures.Long(true), Fixtures.Long(false)), CommandKind.ToggleMinimal)); + // No menu case here: this head shows a real popup, which is a top level window and so cannot // appear in a capture of the client area. ContextMenuTests renders the strip itself instead. diff --git a/src/DiffEngineViewer.Windows/Palette.cs b/src/DiffEngineViewer.Windows/Palette.cs index 26c12bda..73c8ff89 100644 --- a/src/DiffEngineViewer.Windows/Palette.cs +++ b/src/DiffEngineViewer.Windows/Palette.cs @@ -16,6 +16,12 @@ static class Palette public static readonly Color Rule = Color.FromArgb(70, 70, 70); + /// + /// Behind a folded row, a shade lighter than filler, so the runs the minimal view leaves out + /// read as breaks in the file rather than as a line of it or as padding. + /// + public static readonly Color Folded = Color.FromArgb(34, 34, 34); + ///
/// The two squares behind a picture. Dark enough not to compete with the image, and different /// enough from each other that a transparent region is obviously transparent rather than @@ -45,6 +51,8 @@ public static Color Foreground(RowKind kind) => RowKind.Added => Color.FromArgb(126, 214, 139), RowKind.Removed => Color.FromArgb(233, 129, 129), RowKind.Modified => Color.FromArgb(231, 197, 113), + // Dimmed like the gutter, since what it says is about the file rather than from it. + RowKind.Folded => Dim, _ => Text }; @@ -58,6 +66,7 @@ public static Color Foreground(RowKind kind) => RowKind.Removed => Color.FromArgb(84, 40, 40), RowKind.Modified => Color.FromArgb(74, 64, 32), RowKind.Filler => Filler, + RowKind.Folded => Folded, _ => null }; diff --git a/src/DiffEngineViewer.Windows/ViewerForm.cs b/src/DiffEngineViewer.Windows/ViewerForm.cs index 0dfe5824..998ac9e7 100644 --- a/src/DiffEngineViewer.Windows/ViewerForm.cs +++ b/src/DiffEngineViewer.Windows/ViewerForm.cs @@ -420,6 +420,7 @@ static CommandKind Map(Keys keyData) Keys.End => CommandKind.ScrollEnd, Keys.N => CommandKind.NextChange, Keys.P => CommandKind.PreviousChange, + Keys.M => CommandKind.ToggleMinimal, Keys.Tab => shift ? CommandKind.PreviousItem : CommandKind.NextItem, Keys.A => shift ? CommandKind.AcceptAll : CommandKind.Accept, Keys.D => CommandKind.Discard, diff --git a/src/DiffEngineViewer/CommandKind.cs b/src/DiffEngineViewer/CommandKind.cs index 53529469..94796f99 100644 --- a/src/DiffEngineViewer/CommandKind.cs +++ b/src/DiffEngineViewer/CommandKind.cs @@ -15,6 +15,13 @@ enum CommandKind ScrollTo, NextChange, PreviousChange, + + /// + /// Switch the panes between every line and only the changes, each with a few lines either + /// side. View only, like : it changes what is being read, never a + /// file, and applies locally even when the queue belongs to someone else. + /// + ToggleMinimal, NextItem, PreviousItem, SelectItem, diff --git a/src/DiffEngineViewer/DiffView.cs b/src/DiffEngineViewer/DiffView.cs new file mode 100644 index 00000000..65846e4b --- /dev/null +++ b/src/DiffEngineViewer/DiffView.cs @@ -0,0 +1,394 @@ +/// +/// An entry's two sides as the panes lay them out, and where each shown row sits in the entry. +/// +/// Every entry has two: all of its rows, and the minimal view, which keeps each change and +/// unchanged rows either side of it and folds every longer unchanged run into +/// one row. Both are built with the entry, since they are pure +/// functions of its rows, so switching between them costs nothing. +/// +/// +/// A view, never a filter, the way a folded queue group is one. Scrolling, the scrollbar and change +/// navigation count rows of the view on screen, because those are what is being scrolled. A +/// selection is held in rows of the entry, because it describes text rather than the screen: it +/// survives switching views, and one spanning a folded row copies the lines that row stands for, +/// since those are what lie between its two ends. +/// +/// +sealed class DiffView +{ + /// + /// How many unchanged rows the minimal view keeps either side of a change, and how many rows + /// navigation leaves showing above a change it brings into view. One number, so a change + /// navigated to in the minimal view arrives with exactly the context kept for it above it. + /// + public const int Context = 3; + + /// + /// For each shown row, the first row of the entry it stands for, ascending. A folded row stands + /// for every row up to the next one's. Null in the full view, where every row is its own. + /// + readonly int[]? lines; + + /// + /// How many rows the entry has, which only the last folded row needs: it stands for every row + /// up to the end. + /// + readonly int total; + + DiffView(IReadOnlyList left, IReadOnlyList right, int[]? lines, int total) + { + Left = left; + Right = right; + this.lines = lines; + this.total = total; + Changes = FindChanges(left, right); + } + + public IReadOnlyList Left { get; } + + public IReadOnlyList Right { get; } + + public int Count => Left.Count; + + /// + /// The first row of each run of changed rows, in order. + /// + public IReadOnlyList Changes { get; } + + /// + /// Both views of an entry's rows. The minimal one is the full one itself when nothing folds, + /// which lets switching between them tell that nothing on screen would change. + /// + /// + /// False for a picture. Its rows are its properties, three of them and each worth reading, so + /// there is nothing to leave out. + /// + public static (DiffView Full, DiffView Minimal) Build( + (IReadOnlyList Left, IReadOnlyList Right) rows, + bool fold) + { + var full = new DiffView(rows.Left, rows.Right, null, rows.Left.Count); + if (!fold) + { + return (full, full); + } + + return (full, full.Fold()); + } + + public IReadOnlyList Side(PaneSide side) + { + if (side == PaneSide.Left) + { + return Left; + } + + return Right; + } + + public bool IsFolded(int row) => + Left[row].Kind == RowKind.Folded; + + /// + /// The entry row a shown row is, or for a folded row the first of those it stands for. + /// + public int First(int row) + { + if (lines is null) + { + return row; + } + + return lines[row]; + } + + /// + /// The entry row a shown row is, or for a folded row the last of those it stands for. + /// + public int Last(int row) + { + if (lines is null) + { + return row; + } + + if (row + 1 < lines.Length) + { + return lines[row + 1] - 1; + } + + return total - 1; + } + + /// + /// The shown row an entry row is on: itself, or the folded row standing for it. + /// + public int Find(int line) + { + if (lines is null) + { + return line; + } + + var index = Array.BinarySearch(lines, line); + if (index >= 0) + { + return index; + } + + // The complement is the first row starting after the line, so the one before it is the + // folded row the line is inside. + return Math.Max(0, ~index - 1); + } + + /// + /// Where the view opens: at its first change, with rows above it, or at + /// the top when there is none. A snapshot that fails on line 200 is about line 200, and a reader + /// handed line 1 had to go looking for it. + /// + public int Opening(int body) + { + if (Changes.Count == 0) + { + return 0; + } + + return Target(Changes[0], body); + } + + /// + /// The scroll top that brings the next change into view, or null when none is left below. + /// + /// Next is the first change whose place is below the current one, rather than the first change + /// below the top row. Where a change is put is rows under the top, so + /// counting from the top row would take the change already there for the next one and move the + /// view three rows to arrive where it started. Clamped like any scroll, so the changes the last + /// page already shows are reached together rather than one row at a time. + /// + /// + public int? Next(int top, int body) + { + foreach (var change in Changes) + { + var target = Target(change, body); + if (target > top) + { + return target; + } + } + + return null; + } + + /// + /// The scroll top that brings the previous change into view, or null when none is left above. + /// The mirror of : from a change it put there, that is the one before it, and + /// from anywhere else it is the nearest change above the view's own position. + /// + public int? Previous(int top, int body) + { + for (var index = Changes.Count - 1; index >= 0; index--) + { + var target = Target(Changes[index], body); + if (target < top) + { + return target; + } + } + + return null; + } + + /// + /// The scroll top in this view that keeps the reader where they were in + /// : the first row on screen that both views show stays on the same + /// line of the screen. Changes and their context are in both, so it is almost always one of + /// those, and the change being read stays put while what is around it folds or unfolds. + /// Unclamped, since clamping is the session's. + /// + public int Follow(DiffView from, int top, int body) + { + if (from.Count == 0 || + Count == 0) + { + return 0; + } + + for (var offset = 0; offset < body && top + offset < from.Count; offset++) + { + var row = top + offset; + if (from.IsFolded(row)) + { + continue; + } + + var shown = Find(from.First(row)); + if (IsFolded(shown)) + { + continue; + } + + return shown - offset; + } + + // Nothing on screen is in both: a screen of lines this view folds, or of folded rows + // standing for lines this one shows. Whatever this view has for the top line goes at the + // top. + return Find(from.First(Math.Clamp(top, 0, from.Count - 1))); + } + + /// + /// A drag's two ends, from rows of this view into rows of the entry, which is what a selection + /// is held in. A shown row is the entry's own row, text and all, so a column needs nothing. + /// + /// A folded row is the lines it stands for, whole: an end on one takes in all of them, from the + /// first when it is the end the selection starts at and to the last when it is the one it + /// finishes at. Part of a label is not part of anything. A press with no drag behind it is + /// still a click, which clears, rather than a selection of everything the row folds. + /// + /// + /// Rows are clamped into the view first, because a head reports where the pointer is rather + /// than where the rows are. The column a finishing end is pushed to is left for + /// to pull back to its row's length, since that is the one + /// step with the text to measure. + /// + /// + public (int AnchorRow, int AnchorColumn, int FocusRow, int FocusColumn) Unfold( + int anchorRow, + int anchorColumn, + int focusRow, + int focusColumn) + { + if (lines is null) + { + return (anchorRow, anchorColumn, focusRow, focusColumn); + } + + var lastRow = Count - 1; + anchorRow = Math.Clamp(anchorRow, 0, lastRow); + focusRow = Math.Clamp(focusRow, 0, lastRow); + if (anchorRow == focusRow && + anchorColumn == focusColumn) + { + var (line, column) = End(anchorRow, anchorColumn, start: true); + return (line, column, line, column); + } + + var backwards = focusRow < anchorRow || + (focusRow == anchorRow && focusColumn < anchorColumn); + var anchor = End(anchorRow, anchorColumn, start: !backwards); + var focus = End(focusRow, focusColumn, start: backwards); + return (anchor.Line, anchor.Column, focus.Line, focus.Column); + } + + (int Line, int Column) End(int row, int column, bool start) + { + if (!IsFolded(row)) + { + return (First(row), column); + } + + if (start) + { + return (First(row), 0); + } + + return (Last(row), int.MaxValue); + } + + int Target(int change, int body) => + Math.Clamp(change - Context, 0, Math.Max(0, Count - body)); + + /// + /// The minimal view of this one. Every row within of a change is kept, + /// and each run of the rest becomes one folded row on both sides, which keeps the two panes + /// aligned: an unchanged row always has an unchanged row beside it, so the run is the same + /// length on each. + /// + DiffView Fold() + { + var count = Count; + var kept = new bool[count]; + for (var index = 0; index < count; index++) + { + if (!IsChange(Left, Right, index)) + { + continue; + } + + var from = Math.Max(0, index - Context); + var to = Math.Min(count - 1, index + Context); + for (var near = from; near <= to; near++) + { + kept[near] = true; + } + } + + var left = new List(count); + var right = new List(count); + var starts = new List(count); + var row = 0; + while (row < count) + { + var end = row; + while (end < count && !kept[end]) + { + end++; + } + + // A run of one is shown rather than folded: its row would take the same space as the + // line it stands for and say less. + var run = end - row; + if (run > 1) + { + var folded = new Row(null, RowKind.Folded, $"... {run} unchanged lines ..."); + left.Add(folded); + right.Add(folded); + starts.Add(row); + row = end; + continue; + } + + left.Add(Left[row]); + right.Add(Right[row]); + starts.Add(row); + row++; + } + + if (starts.Count == count) + { + return this; + } + + return new(left, right, starts.ToArray(), count); + } + + static List FindChanges(IReadOnlyList left, IReadOnlyList right) + { + var changes = new List(); + var inside = false; + for (var index = 0; index < left.Count; index++) + { + var changed = IsChange(left, right, index); + if (changed && !inside) + { + changes.Add(index); + } + + inside = changed; + } + + return changes; + } + + /// + /// Either side, rather than the left alone, which is all a text diff needs. An image's rows + /// are coloured per side, and a row is a change if the reader would see one on either. + /// + static bool IsChange(IReadOnlyList left, IReadOnlyList right, int index) => + IsChange(left[index]) || + (index < right.Count && IsChange(right[index])); + + static bool IsChange(Row row) => + row.Kind is not (RowKind.Unchanged or RowKind.Folded); +} diff --git a/src/DiffEngineViewer/Model/RowKind.cs b/src/DiffEngineViewer/Model/RowKind.cs index 1c3d9377..8f8babba 100644 --- a/src/DiffEngineViewer/Model/RowKind.cs +++ b/src/DiffEngineViewer/Model/RowKind.cs @@ -11,5 +11,12 @@ enum RowKind /// /// No line exists on this side. Rendered blank to keep the two panes vertically aligned. /// - Filler + Filler, + + /// + /// A run of unchanged lines the minimal view left out, drawn as the one row standing for all + /// of them. Its text says how many rather than being any of them, and it has no line number. + /// Never produced by a diff: only makes one. + /// + Folded } diff --git a/src/DiffEngineViewer/Native/DeviewStructs.cs b/src/DiffEngineViewer/Native/DeviewStructs.cs index 023b61b3..ef3833d2 100644 --- a/src/DiffEngineViewer/Native/DeviewStructs.cs +++ b/src/DiffEngineViewer/Native/DeviewStructs.cs @@ -14,7 +14,7 @@ struct DeviewRow public int Kind; /// - /// -1 when the row is filler and has no line number. + /// -1 when the row is filler or folded and has no line number. /// public int LineNumber; @@ -184,5 +184,11 @@ enum DeviewKey Quit = 14, NextVariant = 15, Copy = 16, - SelectAll = 17 + SelectAll = 17, + + /// + /// m. A shim built before the key existed never reports it, and the footer button still + /// reaches the same command. + /// + ToggleMinimal = 18 } diff --git a/src/DiffEngineViewer/Native/NativeViewerWindow.cs b/src/DiffEngineViewer/Native/NativeViewerWindow.cs index 26da667e..a7c72c4c 100644 --- a/src/DiffEngineViewer/Native/NativeViewerWindow.cs +++ b/src/DiffEngineViewer/Native/NativeViewerWindow.cs @@ -121,6 +121,7 @@ static CommandKind Key(int key) => DeviewKey.End => CommandKind.ScrollEnd, DeviewKey.NextChange => CommandKind.NextChange, DeviewKey.PreviousChange => CommandKind.PreviousChange, + DeviewKey.ToggleMinimal => CommandKind.ToggleMinimal, DeviewKey.NextItem => CommandKind.NextItem, DeviewKey.PreviousItem => CommandKind.PreviousItem, DeviewKey.Accept => CommandKind.Accept, diff --git a/src/DiffEngineViewer/QueueEntry.cs b/src/DiffEngineViewer/QueueEntry.cs index e54c06e5..1888622f 100644 --- a/src/DiffEngineViewer/QueueEntry.cs +++ b/src/DiffEngineViewer/QueueEntry.cs @@ -56,14 +56,29 @@ record QueueEntry( // Computed once, because the diff is a pure function of the two sides and a new entry only // arrives on stdin or the socket. A `with` expression copies this field rather than // recomputing, so change the content by building a fresh entry, never by `with`. - readonly (IReadOnlyList Left, IReadOnlyList Right) rows = + readonly (DiffView Full, DiffView Minimal) views = DiffView.Build( LeftImage is null && RightImage is null ? DiffRows.Build(LeftText, RightText) - : ImageRows.Build(LeftImage, RightImage); + : ImageRows.Build(LeftImage, RightImage), + fold: LeftImage is null && RightImage is null); - public IReadOnlyList LeftRows => rows.Left; - public IReadOnlyList RightRows => rows.Right; - public int TotalRows => rows.Left.Count; + public IReadOnlyList LeftRows => views.Full.Left; + public IReadOnlyList RightRows => views.Full.Right; + public int TotalRows => views.Full.Count; + + /// + /// The rows the panes show: every one, or only the changes and the lines around them. The + /// entry's own rows stay and either way. + /// + public DiffView View(bool minimal) + { + if (minimal) + { + return views.Minimal; + } + + return views.Full; + } /// /// A picture on either side makes the whole entry one, because the two sides of a comparison diff --git a/src/DiffEngineViewer/ScreenBuilder.cs b/src/DiffEngineViewer/ScreenBuilder.cs index c8c426d5..4dc27d0b 100644 --- a/src/DiffEngineViewer/ScreenBuilder.cs +++ b/src/DiffEngineViewer/ScreenBuilder.cs @@ -16,10 +16,11 @@ public static Screen Build(SessionState state) { var body = BodyRows(state); var current = state.Current; + var view = state.View; var selection = state.LiveSelection; var left = BuildPane( current?.LeftHeader ?? "received", - current?.LeftRows ?? [], + view, state.ScrollTop, body, current?.LeftImage, @@ -27,7 +28,7 @@ public static Screen Build(SessionState state) PaneSide.Left); var right = BuildPane( current?.RightHeader ?? "expected", - current?.RightRows ?? [], + view, state.ScrollTop, body, current?.RightImage, @@ -42,7 +43,7 @@ public static Screen Build(SessionState state) Queue: queue, Left: left, Right: right, - Buttons: BuildButtons(state), + Buttons: BuildButtons(state, body), Status: BuildStatus(state, current, body), Columns: state.Columns, Rows: state.Rows, @@ -73,13 +74,19 @@ public static Screen Build(SessionState state) static Pane BuildPane( string header, - IReadOnlyList rows, + DiffView? view, int scrollTop, int body, ImageFile? image, TextSelection? selection, PaneSide side) { + if (view is null) + { + return new(header, [], scrollTop, 0, BuildImage(image)); + } + + var rows = view.Side(side); var end = Math.Min(scrollTop + body, rows.Count); var visible = new List(Math.Max(0, end - scrollTop)); for (var index = Math.Max(0, scrollTop); index < end; index++) @@ -88,7 +95,7 @@ static Pane BuildPane( // Attached to the visible slice rather than carried beside it, so a head draws a row // and its highlight from one thing and the frame comparison that decides whether to // repaint already covers both. - var span = SelectionText.Span(selection, side, index, row.Text); + var span = SelectionText.Span(selection, side, view, index); visible.Add(span.Length == 0 ? row : row with { Selection = span }); } @@ -122,7 +129,7 @@ static IReadOnlyList BuildQueue(SessionState state, int body, out int return QueueProjection.Visible(state, body, out top); } - static IReadOnlyList