From c92016f50b68d54bc8a33974de0269f21c5cfa8b Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 00:26:54 +0100 Subject: [PATCH 01/29] initial impl --- .../AppKit/DiffRevertActionResolver.swift | 259 ++++++++++ .../AppKit/DiffTextViewRepresentable.swift | 41 ++ .../TextDiff/AppKit/DiffTokenLayouter.swift | 8 +- Sources/TextDiff/AppKit/NSTextDiffView.swift | 463 ++++++++++++++++++ Sources/TextDiff/DiffTypes.swift | 42 ++ Sources/TextDiff/TextDiffView.swift | 71 ++- .../DiffLayouterPerformanceTests.swift | 31 ++ .../DiffRevertActionResolverTests.swift | 76 +++ .../NSTextDiffSnapshotTests.swift | 62 ++- Tests/TextDiffTests/NSTextDiffViewTests.swift | 210 ++++++++ Tests/TextDiffTests/SnapshotTestSupport.swift | 3 + .../character_mode_no_affordance.1.png | Bin 0 -> 3218 bytes .../hover_pair_affordance.1.png | Bin 0 -> 3721 bytes .../hover_single_addition_affordance.1.png | Bin 0 -> 2748 bytes .../hover_single_deletion_affordance.1.png | Bin 0 -> 2673 bytes 15 files changed, 1257 insertions(+), 9 deletions(-) create mode 100644 Sources/TextDiff/AppKit/DiffRevertActionResolver.swift create mode 100644 Tests/TextDiffTests/DiffRevertActionResolverTests.swift create mode 100644 Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png create mode 100644 Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png create mode 100644 Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png create mode 100644 Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift new file mode 100644 index 0000000..093974e --- /dev/null +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -0,0 +1,259 @@ +import CoreGraphics +import Foundation + +struct IndexedSegment { + let segmentIndex: Int + let segment: DiffSegment + let originalCursor: Int + let updatedCursor: Int + let originalRange: NSRange + let updatedRange: NSRange +} + +enum DiffRevertCandidateKind: Equatable { + case singleInsertion + case singleDeletion + case pairedReplacement +} + +struct DiffRevertCandidate: Equatable { + let id: Int + let kind: DiffRevertCandidateKind + let segmentIndices: [Int] + let updatedRange: NSRange + let replacementText: String + let originalTextFragment: String? + let updatedTextFragment: String? +} + +struct DiffRevertInteractionContext { + let candidatesByID: [Int: DiffRevertCandidate] + let runIndicesByActionID: [Int: [Int]] + let chipRectsByActionID: [Int: [CGRect]] + let unionChipRectByActionID: [Int: CGRect] +} + +enum DiffRevertActionResolver { + static func indexedSegments(from segments: [DiffSegment]) -> [IndexedSegment] { + var output: [IndexedSegment] = [] + output.reserveCapacity(segments.count) + + var originalCursor = 0 + var updatedCursor = 0 + + for (index, segment) in segments.enumerated() { + let textLength = segment.text.utf16.count + let originalRange: NSRange + let updatedRange: NSRange + + switch segment.kind { + case .equal: + originalRange = NSRange(location: originalCursor, length: textLength) + updatedRange = NSRange(location: updatedCursor, length: textLength) + originalCursor += textLength + updatedCursor += textLength + case .delete: + originalRange = NSRange(location: originalCursor, length: textLength) + updatedRange = NSRange(location: updatedCursor, length: 0) + originalCursor += textLength + case .insert: + originalRange = NSRange(location: originalCursor, length: 0) + updatedRange = NSRange(location: updatedCursor, length: textLength) + updatedCursor += textLength + } + + output.append( + IndexedSegment( + segmentIndex: index, + segment: segment, + originalCursor: originalRange.location, + updatedCursor: updatedRange.location, + originalRange: originalRange, + updatedRange: updatedRange + ) + ) + } + + return output + } + + static func candidates( + from segments: [DiffSegment], + mode: TextDiffComparisonMode + ) -> [DiffRevertCandidate] { + guard mode == .token else { + return [] + } + + let indexed = indexedSegments(from: segments) + guard !indexed.isEmpty else { + return [] + } + + var output: [DiffRevertCandidate] = [] + output.reserveCapacity(indexed.count) + + var candidateID = 0 + var index = 0 + while index < indexed.count { + let current = indexed[index] + let isCurrentLexical = isLexicalChange(current.segment) + + if index + 1 < indexed.count { + let next = indexed[index + 1] + if current.segment.kind == .delete, + next.segment.kind == .insert, + isCurrentLexical, + isLexicalChange(next.segment) { + output.append( + DiffRevertCandidate( + id: candidateID, + kind: .pairedReplacement, + segmentIndices: [current.segmentIndex, next.segmentIndex], + updatedRange: next.updatedRange, + replacementText: current.segment.text, + originalTextFragment: current.segment.text, + updatedTextFragment: next.segment.text + ) + ) + candidateID += 1 + index += 2 + continue + } + } + + if isCurrentLexical { + switch current.segment.kind { + case .insert: + output.append( + DiffRevertCandidate( + id: candidateID, + kind: .singleInsertion, + segmentIndices: [current.segmentIndex], + updatedRange: current.updatedRange, + replacementText: "", + originalTextFragment: nil, + updatedTextFragment: current.segment.text + ) + ) + candidateID += 1 + case .delete: + output.append( + DiffRevertCandidate( + id: candidateID, + kind: .singleDeletion, + segmentIndices: [current.segmentIndex], + updatedRange: NSRange(location: current.updatedCursor, length: 0), + replacementText: current.segment.text, + originalTextFragment: current.segment.text, + updatedTextFragment: nil + ) + ) + candidateID += 1 + case .equal: + break + } + } + + index += 1 + } + + return output + } + + static func interactionContext( + segments: [DiffSegment], + runs: [LaidOutRun], + mode: TextDiffComparisonMode + ) -> DiffRevertInteractionContext? { + let candidates = candidates(from: segments, mode: mode) + guard !candidates.isEmpty else { + return nil + } + + var actionIDBySegmentIndex: [Int: Int] = [:] + actionIDBySegmentIndex.reserveCapacity(candidates.count * 2) + var candidatesByID: [Int: DiffRevertCandidate] = [:] + candidatesByID.reserveCapacity(candidates.count) + + for candidate in candidates { + candidatesByID[candidate.id] = candidate + for segmentIndex in candidate.segmentIndices { + actionIDBySegmentIndex[segmentIndex] = candidate.id + } + } + + var runIndicesByActionID: [Int: [Int]] = [:] + var chipRectsByActionID: [Int: [CGRect]] = [:] + var unionChipRectByActionID: [Int: CGRect] = [:] + + for (runIndex, run) in runs.enumerated() { + guard let chipRect = run.chipRect else { + continue + } + guard let actionID = actionIDBySegmentIndex[run.segmentIndex] else { + continue + } + runIndicesByActionID[actionID, default: []].append(runIndex) + chipRectsByActionID[actionID, default: []].append(chipRect) + if let currentUnion = unionChipRectByActionID[actionID] { + unionChipRectByActionID[actionID] = currentUnion.union(chipRect) + } else { + unionChipRectByActionID[actionID] = chipRect + } + } + + guard !runIndicesByActionID.isEmpty else { + return nil + } + + candidatesByID = candidatesByID.filter { runIndicesByActionID[$0.key] != nil } + + return DiffRevertInteractionContext( + candidatesByID: candidatesByID, + runIndicesByActionID: runIndicesByActionID, + chipRectsByActionID: chipRectsByActionID, + unionChipRectByActionID: unionChipRectByActionID + ) + } + + static func action( + from candidate: DiffRevertCandidate, + updated: String + ) -> TextDiffRevertAction? { + let nsUpdated = updated as NSString + guard candidate.updatedRange.location >= 0 else { + return nil + } + guard NSMaxRange(candidate.updatedRange) <= nsUpdated.length else { + return nil + } + + let resultingUpdated = nsUpdated.replacingCharacters( + in: candidate.updatedRange, + with: candidate.replacementText + ) + let actionKind: TextDiffRevertActionKind + switch candidate.kind { + case .singleInsertion: + actionKind = .singleInsertion + case .singleDeletion: + actionKind = .singleDeletion + case .pairedReplacement: + actionKind = .pairedReplacement + } + + return TextDiffRevertAction( + kind: actionKind, + updatedRange: candidate.updatedRange, + replacementText: candidate.replacementText, + originalTextFragment: candidate.originalTextFragment, + updatedTextFragment: candidate.updatedTextFragment, + resultingUpdated: resultingUpdated + ) + } + + private static func isLexicalChange(_ segment: DiffSegment) -> Bool { + segment.tokenKind != .whitespace && segment.kind != .equal + } +} diff --git a/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift b/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift index 73d59f0..d8407f0 100644 --- a/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift +++ b/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift @@ -4,8 +4,15 @@ import SwiftUI struct DiffTextViewRepresentable: NSViewRepresentable { let original: String let updated: String + let updatedBinding: Binding? let style: TextDiffStyle let mode: TextDiffComparisonMode + let isRevertActionsEnabled: Bool + let onRevertAction: ((TextDiffRevertAction) -> Void)? + + func makeCoordinator() -> Coordinator { + Coordinator() + } func makeNSView(context: Context) -> NSTextDiffView { let view = NSTextDiffView( @@ -16,10 +23,26 @@ struct DiffTextViewRepresentable: NSViewRepresentable { ) view.setContentCompressionResistancePriority(.required, for: .vertical) view.setContentHuggingPriority(.required, for: .vertical) + context.coordinator.update( + updatedBinding: updatedBinding, + onRevertAction: onRevertAction + ) + view.isRevertActionsEnabled = isRevertActionsEnabled + view.onRevertAction = { [coordinator = context.coordinator] action in + coordinator.handle(action) + } return view } func updateNSView(_ view: NSTextDiffView, context: Context) { + context.coordinator.update( + updatedBinding: updatedBinding, + onRevertAction: onRevertAction + ) + view.onRevertAction = { [coordinator = context.coordinator] action in + coordinator.handle(action) + } + view.isRevertActionsEnabled = isRevertActionsEnabled view.setContent( original: original, updated: updated, @@ -27,4 +50,22 @@ struct DiffTextViewRepresentable: NSViewRepresentable { mode: mode ) } + + final class Coordinator { + private var updatedBinding: Binding? + private var onRevertAction: ((TextDiffRevertAction) -> Void)? + + func update( + updatedBinding: Binding?, + onRevertAction: ((TextDiffRevertAction) -> Void)? + ) { + self.updatedBinding = updatedBinding + self.onRevertAction = onRevertAction + } + + func handle(_ action: TextDiffRevertAction) { + updatedBinding?.wrappedValue = action.resultingUpdated + onRevertAction?(action) + } + } } diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 75ed788..191562c 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -2,6 +2,7 @@ import AppKit import Foundation struct LaidOutRun { + let segmentIndex: Int let segment: DiffSegment let attributedText: NSAttributedString let textRect: CGRect @@ -124,6 +125,7 @@ enum DiffTokenLayouter { runs.append( LaidOutRun( + segmentIndex: piece.segmentIndex, segment: segment, attributedText: attributedText, textRect: textRect, @@ -252,13 +254,14 @@ enum DiffTokenLayouter { var output: [LayoutPiece] = [] output.reserveCapacity(segments.count) - for segment in segments { + for (segmentIndex, segment) in segments.enumerated() { var buffer = "" for scalar in segment.text.unicodeScalars { if scalar == "\n" { if !buffer.isEmpty { output.append( LayoutPiece( + segmentIndex: segmentIndex, kind: segment.kind, tokenKind: segment.tokenKind, text: buffer, @@ -269,6 +272,7 @@ enum DiffTokenLayouter { } output.append( LayoutPiece( + segmentIndex: segmentIndex, kind: segment.kind, tokenKind: .whitespace, text: "", @@ -283,6 +287,7 @@ enum DiffTokenLayouter { if !buffer.isEmpty { output.append( LayoutPiece( + segmentIndex: segmentIndex, kind: segment.kind, tokenKind: segment.tokenKind, text: buffer, @@ -297,6 +302,7 @@ enum DiffTokenLayouter { } private struct LayoutPiece { + let segmentIndex: Int let kind: DiffOperationKind let tokenKind: DiffTokenKind let text: String diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 00920a3..cdfebf7 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -50,6 +50,19 @@ public final class NSTextDiffView: NSView { } } + /// Enables hover affordances and revert action hit-testing. + public var isRevertActionsEnabled: Bool = false { + didSet { + guard oldValue != isRevertActionsEnabled else { + return + } + invalidateCachedLayout() + } + } + + /// Callback invoked when user clicks the revert icon. + public var onRevertAction: ((TextDiffRevertAction) -> Void)? + private var segments: [DiffSegment] private let diffProvider: DiffProvider @@ -58,10 +71,35 @@ public final class NSTextDiffView: NSView { private var lastModeKey: Int private var isBatchUpdating = false private var pendingStyleInvalidation = false + private var segmentGeneration: Int = 0 private var cachedWidth: CGFloat = -1 private var cachedLayout: DiffLayout? + private var cachedInteractionContext: DiffRevertInteractionContext? + private var cachedInteractionWidth: CGFloat = -1 + private var cachedInteractionGeneration: Int = -1 + + private var trackedArea: NSTrackingArea? + private var hoveredActionID: Int? + private var hoveredIconRect: CGRect? + private let hoverDismissDelay: TimeInterval = 0.5 + private var pendingHoverDismissWorkItem: DispatchWorkItem? + private var hoverDismissGeneration: Int = 0 + private var isPointingHandCursorActive = false + + #if TESTING + private var testingHoverDismissScheduler: ((TimeInterval, @escaping () -> Void) -> Void)? + private var testingScheduledHoverDismissBlocks: [() -> Void] = [] + #endif + + private let hoverOutlineColor = NSColor.controlAccentColor.withAlphaComponent(0.9) + private let hoverButtonFillColor = NSColor.black//NSColor.windowBackgroundColor.withAlphaComponent(0.95) + private let hoverButtonStrokeColor = NSColor.clear//NSColor.controlAccentColor.withAlphaComponent(0.8) + private let hoverIconName = "arrow.turn.down.left" + private let hoverButtonSize = CGSize(width: 16, height: 16) + private let hoverButtonGap: CGFloat = 4 + override public var isFlipped: Bool { true } @@ -124,6 +162,22 @@ public final class NSTextDiffView: NSView { fatalError("Use init(original:updated:style:mode:)") } + override public func updateTrackingAreas() { + super.updateTrackingAreas() + if let trackedArea { + removeTrackingArea(trackedArea) + } + let options: NSTrackingArea.Options = [ + .mouseMoved, + .mouseEnteredAndExited, + .activeInKeyWindow, + .inVisibleRect + ] + let area = NSTrackingArea(rect: .zero, options: options, owner: self, userInfo: nil) + addTrackingArea(area) + trackedArea = area + } + override public func setFrameSize(_ newSize: NSSize) { let previousWidth = frame.width super.setFrameSize(newSize) @@ -148,6 +202,27 @@ public final class NSTextDiffView: NSView { run.attributedText.draw(in: run.textRect) } + + drawHoveredRevertAffordance(layout: layout) + } + + override public func mouseMoved(with event: NSEvent) { + super.mouseMoved(with: event) + let location = convert(event.locationInWindow, from: nil) + updateHoverState(location: location) + } + + override public func mouseExited(with event: NSEvent) { + super.mouseExited(with: event) + scheduleHoverDismiss() + } + + override public func mouseDown(with event: NSEvent) { + let location = convert(event.locationInWindow, from: nil) + if handleIconClick(at: location) { + return + } + super.mouseDown(with: event) } /// Atomically updates view inputs and recomputes diff segments at most once. @@ -186,6 +261,7 @@ public final class NSTextDiffView: NSView { lastUpdated = updated lastModeKey = newModeKey segments = diffProvider(original, updated, mode) + segmentGeneration += 1 invalidateCachedLayout() return true } @@ -208,16 +284,319 @@ public final class NSTextDiffView: NSView { cachedWidth = width cachedLayout = layout + invalidateInteractionCache() return layout } + private func interactionContext(for layout: DiffLayout) -> DiffRevertInteractionContext? { + guard isRevertActionsEnabled, mode == .token else { + return nil + } + + let width = max(bounds.width, 1) + if let cachedInteractionContext, + abs(cachedInteractionWidth - width) <= 0.5, + cachedInteractionGeneration == segmentGeneration { + return cachedInteractionContext + } + + let context = DiffRevertActionResolver.interactionContext( + segments: segments, + runs: layout.runs, + mode: mode + ) + cachedInteractionContext = context + cachedInteractionWidth = width + cachedInteractionGeneration = segmentGeneration + return context + } + private func invalidateCachedLayout() { cachedLayout = nil cachedWidth = -1 + invalidateInteractionCache() + cancelPendingHoverDismiss() + clearHoverStateNow() needsDisplay = true invalidateIntrinsicContentSize() } + private func invalidateInteractionCache() { + cachedInteractionContext = nil + cachedInteractionWidth = -1 + cachedInteractionGeneration = -1 + } + + private func updateHoverState(location: CGPoint) { + let layout = layoutForCurrentWidth() + guard let context = interactionContext(for: layout) else { + cancelPendingHoverDismiss() + clearHoverStateNow() + return + } + + if let actionID = actionIDForHitTarget(at: location, layout: layout, context: context) { + let iconRect = iconRect(for: actionID, context: context) + if hoveredActionID == actionID { + cancelPendingHoverDismiss() + applyImmediateHover(actionID: actionID, iconRect: iconRect) + } else { + switchHoverImmediately(to: actionID, iconRect: iconRect) + } + setPointingHandCursorActive(iconRect?.contains(location) == true) + return + } + + setPointingHandCursorActive(false) + scheduleHoverDismiss() + } + + private func clearHoverState() { + cancelPendingHoverDismiss() + clearHoverStateNow() + } + + private func clearHoverStateNow() { + guard hoveredActionID != nil || hoveredIconRect != nil || isPointingHandCursorActive else { + return + } + hoveredActionID = nil + hoveredIconRect = nil + setPointingHandCursorActive(false) + needsDisplay = true + } + + private func applyImmediateHover(actionID: Int, iconRect: CGRect?) { + let didChangeHover = hoveredActionID != actionID || hoveredIconRect != iconRect + hoveredActionID = actionID + hoveredIconRect = iconRect + if didChangeHover { + needsDisplay = true + } + } + + private func switchHoverImmediately(to actionID: Int, iconRect: CGRect?) { + cancelPendingHoverDismiss() + applyImmediateHover(actionID: actionID, iconRect: iconRect) + } + + private func cancelPendingHoverDismiss() { + pendingHoverDismissWorkItem?.cancel() + pendingHoverDismissWorkItem = nil + hoverDismissGeneration += 1 + } + + private func scheduleHoverDismiss() { + guard pendingHoverDismissWorkItem == nil else { + return + } + + hoverDismissGeneration += 1 + let generation = hoverDismissGeneration + let workItem = DispatchWorkItem { [weak self] in + guard let self else { + return + } + guard self.hoverDismissGeneration == generation else { + return + } + self.pendingHoverDismissWorkItem = nil + self.clearHoverStateNow() + } + pendingHoverDismissWorkItem = workItem + + #if TESTING + if let testingHoverDismissScheduler { + testingHoverDismissScheduler(hoverDismissDelay) { + workItem.perform() + } + return + } + #endif + + DispatchQueue.main.asyncAfter(deadline: .now() + hoverDismissDelay) { + workItem.perform() + } + } + + private func setPointingHandCursorActive(_ isActive: Bool) { + guard isPointingHandCursorActive != isActive else { + return + } + isPointingHandCursorActive = isActive + if isActive { + NSCursor.pointingHand.push() + } else { + NSCursor.pop() + } + } + + @discardableResult + private func handleIconClick(at location: CGPoint) -> Bool { + guard isRevertActionsEnabled, mode == .token else { + return false + } + + let layout = layoutForCurrentWidth() + guard let context = interactionContext(for: layout), + let actionID = actionIDForHitTarget(at: location, layout: layout, context: context) else { + return false + } + + guard let candidate = context.candidatesByID[actionID] else { + return false + } + + if let action = DiffRevertActionResolver.action(from: candidate, updated: updated) { + onRevertAction?(action) + } + return true + } + + private func actionIDForHitTarget( + at point: CGPoint, + layout: DiffLayout, + context: DiffRevertInteractionContext + ) -> Int? { + for actionID in context.candidatesByID.keys.sorted() { + let includeIcon = hoveredActionID == actionID + if isPointWithinActionHitTarget( + point, + actionID: actionID, + layout: layout, + context: context, + includeIcon: includeIcon + ) { + return actionID + } + } + return nil + } + + private func isPointWithinActionHitTarget( + _ point: CGPoint, + actionID: Int, + layout: DiffLayout, + context: DiffRevertInteractionContext, + includeIcon: Bool + ) -> Bool { + if let runIndices = context.runIndicesByActionID[actionID] { + for runIndex in runIndices { + guard layout.runs.indices.contains(runIndex), + let chipRect = layout.runs[runIndex].chipRect else { + continue + } + if chipRect.contains(point) { + return true + } + } + } + + if includeIcon, let iconRect = iconRect(for: actionID, context: context), iconRect.contains(point) { + return true + } + + return false + } + + private func actionID(at point: CGPoint, layout: DiffLayout, context: DiffRevertInteractionContext) -> Int? { + for actionID in context.runIndicesByActionID.keys.sorted() { + guard let runIndices = context.runIndicesByActionID[actionID] else { + continue + } + for runIndex in runIndices { + guard layout.runs.indices.contains(runIndex), + let chipRect = layout.runs[runIndex].chipRect else { + continue + } + if chipRect.contains(point) { + return actionID + } + } + } + return nil + } + + private func iconRect(for actionID: Int, context: DiffRevertInteractionContext) -> CGRect? { + guard let unionRect = context.unionChipRectByActionID[actionID] else { + return nil + } + + let maxX = bounds.maxX - hoverButtonSize.width - 2 + var originX = unionRect.maxX + hoverButtonGap + if originX > maxX { + originX = max(bounds.minX + 2, unionRect.maxX - hoverButtonSize.width) + } + + var originY = unionRect.midY - (hoverButtonSize.height / 2) + originY = max(bounds.minY + 2, min(originY, bounds.maxY - hoverButtonSize.height - 2)) + + return CGRect(origin: CGPoint(x: originX, y: originY), size: hoverButtonSize) + } + + private func drawHoveredRevertAffordance(layout: DiffLayout) { + guard let hoveredActionID else { + return + } + guard let context = interactionContext(for: layout), + let chipRects = context.chipRectsByActionID[hoveredActionID], + !chipRects.isEmpty else { + return + } + + hoverOutlineColor.setStroke() + if chipRects.count > 1, let unionRect = context.unionChipRectByActionID[hoveredActionID] { + let groupRect = unionRect.insetBy(dx: -1.5, dy: -1.5) + let groupPath = NSBezierPath( + roundedRect: groupRect, + xRadius: style.chipCornerRadius + 2, + yRadius: style.chipCornerRadius + 2 + ) + groupPath.lineWidth = 1.5 + groupPath.stroke() + } else { + for chipRect in chipRects { + let outlineRect = chipRect.insetBy(dx: -1.5, dy: -1.5) + let outlinePath = NSBezierPath( + roundedRect: outlineRect, + xRadius: style.chipCornerRadius + 1, + yRadius: style.chipCornerRadius + 1 + ) + outlinePath.lineWidth = 1.5 + outlinePath.stroke() + } + } + + let iconRect = hoveredIconRect ?? iconRect(for: hoveredActionID, context: context) + guard let iconRect else { + return + } + drawIconButton(in: iconRect) + } + + private func drawIconButton(in rect: CGRect) { + let buttonPath = NSBezierPath(ovalIn: rect) + hoverButtonFillColor.setFill() + buttonPath.fill() + hoverButtonStrokeColor.setStroke() + buttonPath.lineWidth = 1 + buttonPath.stroke() + + let symbolRect = rect.insetBy(dx: 4, dy: 4) + + let base = NSImage.SymbolConfiguration(pointSize: 10, weight: .semibold) + let white = NSImage.SymbolConfiguration(hierarchicalColor: .white) + let config = base + .applying(.preferringMonochrome()) + .applying(white) + + guard let icon = NSImage(systemSymbolName: hoverIconName, accessibilityDescription: "Revert"), + let configured = icon.withSymbolConfiguration(config) else { + return + } + configured.draw(in: symbolRect) + } + private func drawChip( chipRect: CGRect, fillColor: NSColor?, @@ -251,4 +630,88 @@ public final class NSTextDiffView: NSView { return 1 } } + + #if TESTING + @discardableResult + func _testingSetHoveredFirstRevertAction() -> Bool { + let layout = layoutForCurrentWidth() + guard let context = interactionContext(for: layout), + let firstActionID = context.candidatesByID.keys.sorted().first else { + return false + } + cancelPendingHoverDismiss() + hoveredActionID = firstActionID + hoveredIconRect = iconRect(for: firstActionID, context: context) + needsDisplay = true + return true + } + + @discardableResult + func _testingTriggerHoveredRevertAction() -> Bool { + guard let hoveredActionID else { + return false + } + let layout = layoutForCurrentWidth() + guard let context = interactionContext(for: layout), + let candidate = context.candidatesByID[hoveredActionID] else { + return false + } + if let action = DiffRevertActionResolver.action(from: candidate, updated: updated) { + onRevertAction?(action) + } + return true + } + + func _testingHasInteractionContext() -> Bool { + let layout = layoutForCurrentWidth() + return interactionContext(for: layout) != nil + } + + func _testingHoveredActionID() -> Int? { + hoveredActionID + } + + func _testingHasPendingHoverDismiss() -> Bool { + pendingHoverDismissWorkItem != nil + } + + func _testingActionCenters() -> [CGPoint] { + let layout = layoutForCurrentWidth() + guard let context = interactionContext(for: layout) else { + return [] + } + return context.candidatesByID.keys.sorted().compactMap { actionID in + guard let rect = context.unionChipRectByActionID[actionID] else { + return nil + } + return CGPoint(x: rect.midX, y: rect.midY) + } + } + + func _testingUpdateHover(location: CGPoint) { + updateHoverState(location: location) + } + + func _testingEnableManualHoverDismissScheduler() { + testingScheduledHoverDismissBlocks.removeAll() + testingHoverDismissScheduler = { [weak self] _, block in + self?.testingScheduledHoverDismissBlocks.append(block) + } + } + + @discardableResult + func _testingRunNextScheduledHoverDismiss() -> Bool { + guard !testingScheduledHoverDismissBlocks.isEmpty else { + return false + } + let block = testingScheduledHoverDismissBlocks.removeFirst() + block() + return true + } + + func _testingClearManualHoverDismissScheduler() { + testingHoverDismissScheduler = nil + testingScheduledHoverDismissBlocks.removeAll() + } + #endif } diff --git a/Sources/TextDiff/DiffTypes.swift b/Sources/TextDiff/DiffTypes.swift index f5bdf7d..4bc24d0 100644 --- a/Sources/TextDiff/DiffTypes.swift +++ b/Sources/TextDiff/DiffTypes.swift @@ -49,3 +49,45 @@ public struct DiffSegment: Sendable, Equatable { self.text = text } } + +/// The change variant represented by a user-initiated revert action. +public enum TextDiffRevertActionKind: Sendable, Equatable { + /// Revert a standalone inserted segment by removing it from updated text. + case singleInsertion + /// Revert a standalone deleted segment by inserting it into updated text. + case singleDeletion + /// Revert an adjacent delete+insert replacement pair. + case pairedReplacement +} + +/// A revert intent payload describing how to edit updated text toward original text. +public struct TextDiffRevertAction: Sendable, Equatable { + /// The semantic action kind that triggered this payload. + public let kind: TextDiffRevertActionKind + /// The UTF-16 range in pre-click updated text to replace. + public let updatedRange: NSRange + /// The text used to replace `updatedRange`. + public let replacementText: String + /// Optional source-side text fragment associated with this action. + public let originalTextFragment: String? + /// Optional updated-side text fragment associated with this action. + public let updatedTextFragment: String? + /// The resulting updated text after applying the replacement. + public let resultingUpdated: String + + public init( + kind: TextDiffRevertActionKind, + updatedRange: NSRange, + replacementText: String, + originalTextFragment: String?, + updatedTextFragment: String?, + resultingUpdated: String + ) { + self.kind = kind + self.updatedRange = updatedRange + self.replacementText = replacementText + self.originalTextFragment = originalTextFragment + self.updatedTextFragment = updatedTextFragment + self.resultingUpdated = resultingUpdated + } +} diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index c1cabb7..08229b3 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -4,9 +4,12 @@ import SwiftUI /// A SwiftUI view that renders a merged visual diff between two strings. public struct TextDiffView: View { private let original: String - private let updated: String + private let updatedValue: String + private let updatedBinding: Binding? private let mode: TextDiffComparisonMode private let style: TextDiffStyle + private let isRevertActionsEnabled: Bool + private let onRevertAction: ((TextDiffRevertAction) -> Void)? /// Creates a text diff view for two versions of content. /// @@ -22,18 +25,51 @@ public struct TextDiffView: View { mode: TextDiffComparisonMode = .token ) { self.original = original - self.updated = updated + self.updatedValue = updated + self.updatedBinding = nil self.mode = mode self.style = style + self.isRevertActionsEnabled = false + self.onRevertAction = nil + } + + /// Creates a text diff view backed by a mutable updated binding. + /// + /// - Parameters: + /// - original: The source text before edits. + /// - updated: The source text after edits. + /// - style: Visual style used to render additions, deletions, and unchanged text. + /// - mode: Comparison mode that controls token-level or character-refined output. + /// - isRevertActionsEnabled: Enables hover affordance and revert actions. + /// - onRevertAction: Optional callback invoked on revert clicks. + public init( + original: String, + updated: Binding, + style: TextDiffStyle = .default, + mode: TextDiffComparisonMode = .token, + isRevertActionsEnabled: Bool = true, + onRevertAction: ((TextDiffRevertAction) -> Void)? = nil + ) { + self.original = original + self.updatedValue = updated.wrappedValue + self.updatedBinding = updated + self.mode = mode + self.style = style + self.isRevertActionsEnabled = isRevertActionsEnabled + self.onRevertAction = onRevertAction } /// The view body that renders the current diff content. public var body: some View { + let updated = updatedBinding?.wrappedValue ?? updatedValue DiffTextViewRepresentable( original: original, updated: updated, + updatedBinding: updatedBinding, style: style, - mode: mode + mode: mode, + isRevertActionsEnabled: isRevertActionsEnabled, + onRevertAction: onRevertAction ) .accessibilityLabel("Text diff") } @@ -49,6 +85,7 @@ public struct TextDiffView: View { } #Preview("TextDiffView") { + @Previewable @State var updatedText = "Added a diff view. It looks good!" let font: NSFont = .systemFont(ofSize: 16, weight: .regular) let style = TextDiffStyle( additionsStyle: TextDiffChangeStyle( @@ -67,7 +104,7 @@ public struct TextDiffView: View { chipCornerRadius: 3, chipInsets: NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0), interChipSpacing: 1, - lineSpacing: 2 + lineSpacing: 0 ) VStack(alignment: .leading, spacing: 4) { Text("Diff by characters") @@ -88,13 +125,14 @@ public struct TextDiffView: View { ) } Divider() - Text("Diff by words") + Text("Diff by words and revertable") .bold() TextDiffView( original: "Add a diff view! Looks good!", - updated: "Added a diff view. It looks good!", + updated: $updatedText, style: style, - mode: .token + mode: .token, + isRevertActionsEnabled: true ) HStack { Text("dog β†’ fog:") @@ -129,6 +167,10 @@ public struct TextDiffView: View { .frame(width: 320) } +#Preview("Revert Binding") { + RevertBindingPreview() +} + #Preview("Height diff") { let font: NSFont = .systemFont(ofSize: 32, weight: .regular) let style = TextDiffStyle( @@ -164,3 +206,18 @@ public struct TextDiffView: View { } .padding() } + +private struct RevertBindingPreview: View { + @State private var updated = "Apply new value in this sentence." + + var body: some View { + TextDiffView( + original: "Apply old value on The sentence!", + updated: $updated, + mode: .token, + isRevertActionsEnabled: true + ) + .padding() + .frame(width: 500) + } +} diff --git a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift index a8598de..38ac3ca 100644 --- a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift +++ b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift @@ -17,6 +17,10 @@ final class DiffLayouterPerformanceTests: XCTestCase { runLayoutPerformanceTest(wordCount: 1000) } + func testLayoutPerformance500WordsWithRevertInteractions() { + runLayoutWithRevertInteractionsPerformanceTest(wordCount: 500) + } + private func runLayoutPerformanceTest(wordCount: Int) { let style = TextDiffStyle.default let verticalInset = DiffTextLayoutMetrics.verticalTextInset(for: style) @@ -38,6 +42,33 @@ final class DiffLayouterPerformanceTests: XCTestCase { } } + private func runLayoutWithRevertInteractionsPerformanceTest(wordCount: Int) { + let style = TextDiffStyle.default + let verticalInset = DiffTextLayoutMetrics.verticalTextInset(for: style) + let contentInsets = NSEdgeInsets(top: verticalInset, left: 0, bottom: verticalInset, right: 0) + let availableWidth: CGFloat = 520 + + let original = Self.largeText(wordCount: wordCount) + let updated = Self.replacingLastWord(in: original) + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + measure(metrics: [XCTClockMetric()]) { + let layout = DiffTokenLayouter.layout( + segments: segments, + style: style, + availableWidth: availableWidth, + contentInsets: contentInsets + ) + let context = DiffRevertActionResolver.interactionContext( + segments: segments, + runs: layout.runs, + mode: .token + ) + XCTAssertFalse(layout.runs.isEmpty) + XCTAssertNotNil(context) + } + } + private static func largeText(wordCount: Int) -> String { let vocabulary = [ "alpha", "beta", "gamma", "delta", "epsilon", "theta", "lambda", "sigma", diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift new file mode 100644 index 0000000..566d560 --- /dev/null +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -0,0 +1,76 @@ +import Foundation +import Testing +@testable import TextDiff + +@Test +func candidatesBuildPairedReplacementForAdjacentDeleteInsert() throws { + let segments = [ + DiffSegment(kind: .delete, tokenKind: .word, text: "old"), + DiffSegment(kind: .insert, tokenKind: .word, text: "new") + ] + + let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + #expect(candidates.count == 1) + #expect(candidates[0].kind == .pairedReplacement) + #expect(candidates[0].updatedRange == NSRange(location: 0, length: 3)) + #expect(candidates[0].replacementText == "old") + + let action = try #require(DiffRevertActionResolver.action(from: candidates[0], updated: "new")) + #expect(action.kind == .pairedReplacement) + #expect(action.resultingUpdated == "old") +} + +@Test +func candidatesDoNotPairWhenAnySegmentExistsBetweenDeleteAndInsert() { + let segments = [ + DiffSegment(kind: .delete, tokenKind: .word, text: "old"), + DiffSegment(kind: .equal, tokenKind: .whitespace, text: " "), + DiffSegment(kind: .insert, tokenKind: .word, text: "new") + ] + + let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + #expect(candidates.count == 2) + #expect(candidates[0].kind == .singleDeletion) + #expect(candidates[1].kind == .singleInsertion) +} + +@Test +func singleInsertionActionRemovesInsertedFragment() throws { + let segments = [ + DiffSegment(kind: .equal, tokenKind: .word, text: "a"), + DiffSegment(kind: .insert, tokenKind: .word, text: "ß"), + DiffSegment(kind: .equal, tokenKind: .word, text: "c") + ] + let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let insertion = try #require(candidates.first(where: { $0.kind == .singleInsertion })) + + let action = try #require(DiffRevertActionResolver.action(from: insertion, updated: "aßc")) + #expect(action.kind == .singleInsertion) + #expect(action.updatedRange == NSRange(location: 1, length: 1)) + #expect(action.replacementText.isEmpty) + #expect(action.resultingUpdated == "ac") +} + +@Test +func singleDeletionActionReinsertsDeletedFragment() throws { + let segments = [ + DiffSegment(kind: .equal, tokenKind: .word, text: "a"), + DiffSegment(kind: .delete, tokenKind: .word, text: "🌍"), + DiffSegment(kind: .equal, tokenKind: .word, text: "b") + ] + let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let deletion = try #require(candidates.first(where: { $0.kind == .singleDeletion })) + + let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: "ab")) + #expect(action.kind == .singleDeletion) + #expect(action.updatedRange == NSRange(location: 1, length: 0)) + #expect(action.replacementText == "🌍") + #expect(action.resultingUpdated == "a🌍b") +} + +@Test +func candidatesAreEmptyInCharacterMode() { + let segments = TextDiffEngine.diff(original: "old value", updated: "new value", mode: .character) + let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .character) + #expect(candidates.isEmpty) +} diff --git a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift index e98ed74..e8d4f34 100644 --- a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift @@ -1,7 +1,7 @@ import AppKit import SnapshotTesting -import TextDiff import XCTest +@testable import TextDiff final class NSTextDiffSnapshotTests: XCTestCase { override func invokeTest() { @@ -70,6 +70,66 @@ final class NSTextDiffSnapshotTests: XCTestCase { ) } + @MainActor + func testHoverSingleAdditionShowsAffordance() { + assertNSTextDiffSnapshot( + original: "cat", + updated: "cat!", + mode: .token, + size: CGSize(width: 260, height: 90), + configureView: { view in + view.isRevertActionsEnabled = true + _ = view._testingSetHoveredFirstRevertAction() + }, + testName: "hover_single_addition_affordance()" + ) + } + + @MainActor + func testHoverSingleDeletionShowsAffordance() { + assertNSTextDiffSnapshot( + original: "cat!", + updated: "cat", + mode: .token, + size: CGSize(width: 260, height: 90), + configureView: { view in + view.isRevertActionsEnabled = true + _ = view._testingSetHoveredFirstRevertAction() + }, + testName: "hover_single_deletion_affordance()" + ) + } + + @MainActor + func testHoverPairShowsAffordance() { + assertNSTextDiffSnapshot( + original: "old value", + updated: "new value", + mode: .token, + size: CGSize(width: 280, height: 90), + configureView: { view in + view.isRevertActionsEnabled = true + _ = view._testingSetHoveredFirstRevertAction() + }, + testName: "hover_pair_affordance()" + ) + } + + @MainActor + func testCharacterModeDoesNotShowAffordance() { + assertNSTextDiffSnapshot( + original: "Add a diff", + updated: "Added a diff", + mode: .character, + size: CGSize(width: 320, height: 110), + configureView: { view in + view.isRevertActionsEnabled = true + _ = view._testingSetHoveredFirstRevertAction() + }, + testName: "character_mode_no_affordance()" + ) + } + private let sampleOriginalSentence = "A quick brown fox jumps over a lazy dog." private let sampleUpdatedSentence = "A quick fox hops over the lazy dog!" } diff --git a/Tests/TextDiffTests/NSTextDiffViewTests.swift b/Tests/TextDiffTests/NSTextDiffViewTests.swift index 014daee..9c309b5 100644 --- a/Tests/TextDiffTests/NSTextDiffViewTests.swift +++ b/Tests/TextDiffTests/NSTextDiffViewTests.swift @@ -1,3 +1,4 @@ +import CoreGraphics import Testing @testable import TextDiff @@ -141,3 +142,212 @@ func nsTextDiffViewSetContentStyleOnlyDoesNotRecomputeDiff() { #expect(callCount == 1) } + +@Test +@MainActor +func nsTextDiffViewRevertDisabledDoesNotEmitAction() { + let view = NSTextDiffView( + original: "old", + updated: "new", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 240, height: 80) + + var captured: TextDiffRevertAction? + view.onRevertAction = { action in + captured = action + } + + #expect(view._testingSetHoveredFirstRevertAction() == false) + #expect(view._testingTriggerHoveredRevertAction() == false) + #expect(captured == nil) +} + +@Test +@MainActor +func nsTextDiffViewRevertSingleInsertionEmitsExpectedAction() throws { + let view = NSTextDiffView( + original: "cat", + updated: "cat!", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 240, height: 80) + view.isRevertActionsEnabled = true + + var captured: TextDiffRevertAction? + view.onRevertAction = { action in + captured = action + } + + #expect(view._testingSetHoveredFirstRevertAction() == true) + #expect(view._testingTriggerHoveredRevertAction() == true) + + let action = try #require(captured) + #expect(action.kind == .singleInsertion) + #expect(action.replacementText == "") + #expect(action.resultingUpdated == "cat") +} + +@Test +@MainActor +func nsTextDiffViewRevertSingleDeletionEmitsExpectedAction() throws { + let view = NSTextDiffView( + original: "cat!", + updated: "cat", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 240, height: 80) + view.isRevertActionsEnabled = true + + var captured: TextDiffRevertAction? + view.onRevertAction = { action in + captured = action + } + + #expect(view._testingSetHoveredFirstRevertAction() == true) + #expect(view._testingTriggerHoveredRevertAction() == true) + + let action = try #require(captured) + #expect(action.kind == .singleDeletion) + #expect(action.replacementText == "!") + #expect(action.resultingUpdated == "cat!") +} + +@Test +@MainActor +func nsTextDiffViewRevertPairEmitsExpectedAction() throws { + let view = NSTextDiffView( + original: "old", + updated: "new", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 240, height: 80) + view.isRevertActionsEnabled = true + + var captured: TextDiffRevertAction? + view.onRevertAction = { action in + captured = action + } + + #expect(view._testingSetHoveredFirstRevertAction() == true) + #expect(view._testingTriggerHoveredRevertAction() == true) + + let action = try #require(captured) + #expect(action.kind == .pairedReplacement) + #expect(action.replacementText == "old") + #expect(action.resultingUpdated == "old") +} + +@Test +@MainActor +func hoverLeaveSchedulesDismissNotImmediate() { + let view = NSTextDiffView( + original: "old value", + updated: "new value", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 300, height: 100) + view.isRevertActionsEnabled = true + view._testingEnableManualHoverDismissScheduler() + + let centers = view._testingActionCenters() + #expect(centers.count == 1) + guard let center = centers.first else { + return + } + + view._testingUpdateHover(location: center) + #expect(view._testingHoveredActionID() != nil) + + view._testingUpdateHover(location: CGPoint(x: -10, y: -10)) + + #expect(view._testingHasPendingHoverDismiss() == true) + #expect(view._testingHoveredActionID() != nil) +} + +@Test +@MainActor +func hoverDismissesAfterDelay() { + let view = NSTextDiffView( + original: "old value", + updated: "new value", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 300, height: 100) + view.isRevertActionsEnabled = true + view._testingEnableManualHoverDismissScheduler() + + guard let center = view._testingActionCenters().first else { + Issue.record("Expected at least one action center") + return + } + view._testingUpdateHover(location: center) + view._testingUpdateHover(location: CGPoint(x: -10, y: -10)) + #expect(view._testingHasPendingHoverDismiss() == true) + + #expect(view._testingRunNextScheduledHoverDismiss() == true) + #expect(view._testingHoveredActionID() == nil) + #expect(view._testingHasPendingHoverDismiss() == false) +} + +@Test +@MainActor +func hoverSwitchesImmediatelyBetweenGroups() { + let view = NSTextDiffView( + original: "old A old B", + updated: "new A new B", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 340, height: 110) + view.isRevertActionsEnabled = true + view._testingEnableManualHoverDismissScheduler() + + let centers = view._testingActionCenters() + #expect(centers.count >= 2) + guard centers.count >= 2 else { + return + } + + view._testingUpdateHover(location: centers[0]) + let firstAction = view._testingHoveredActionID() + #expect(firstAction != nil) + + view._testingUpdateHover(location: centers[1]) + let secondAction = view._testingHoveredActionID() + + #expect(secondAction != nil) + #expect(secondAction != firstAction) + #expect(view._testingHasPendingHoverDismiss() == false) +} + +@Test +@MainActor +func hoverReentryCancelsPendingDismiss() { + let view = NSTextDiffView( + original: "old value", + updated: "new value", + mode: .token + ) + view.frame = CGRect(x: 0, y: 0, width: 300, height: 100) + view.isRevertActionsEnabled = true + view._testingEnableManualHoverDismissScheduler() + + guard let center = view._testingActionCenters().first else { + Issue.record("Expected at least one action center") + return + } + + view._testingUpdateHover(location: center) + let hovered = view._testingHoveredActionID() + #expect(hovered != nil) + + view._testingUpdateHover(location: CGPoint(x: -10, y: -10)) + #expect(view._testingHasPendingHoverDismiss() == true) + + view._testingUpdateHover(location: center) + #expect(view._testingHasPendingHoverDismiss() == false) + #expect(view._testingHoveredActionID() == hovered) + + #expect(view._testingRunNextScheduledHoverDismiss() == true) + #expect(view._testingHoveredActionID() == hovered) +} diff --git a/Tests/TextDiffTests/SnapshotTestSupport.swift b/Tests/TextDiffTests/SnapshotTestSupport.swift index fdf3be2..68d4e9e 100644 --- a/Tests/TextDiffTests/SnapshotTestSupport.swift +++ b/Tests/TextDiffTests/SnapshotTestSupport.swift @@ -62,6 +62,7 @@ func assertNSTextDiffSnapshot( mode: TextDiffComparisonMode = .token, style: TextDiffStyle = .default, size: CGSize, + configureView: ((NSTextDiffView) -> Void)? = nil, named name: String? = nil, fileID: StaticString = #fileID, filePath: StaticString = #filePath, @@ -87,6 +88,8 @@ func assertNSTextDiffSnapshot( diffView.autoresizingMask = [.width, .height] container.addSubview(diffView) container.layoutSubtreeIfNeeded() + configureView?(diffView) + container.layoutSubtreeIfNeeded() let snapshotImage = renderSnapshotImage1x(view: container, size: size) diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png new file mode 100644 index 0000000000000000000000000000000000000000..403187648a2e2732664c1e8a0b837129e183605a GIT binary patch literal 3218 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 literal 0 HcmV?d00001 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png new file mode 100644 index 0000000000000000000000000000000000000000..7af2dfe3cb470b7dc954de96139e9e6d8eab8a85 GIT binary patch literal 2748 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 CIGGp# literal 0 HcmV?d00001 From c8d3439e1c6b51e4f22ae7e0344d3ed2b72daba9 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 00:37:55 +0100 Subject: [PATCH 02/29] revert changes --- Sources/TextDiff/AppKit/NSTextDiffView.swift | 15 +++++++++++++-- Sources/TextDiff/TextDiffGroupStrokeStyle.swift | 9 +++++++++ Sources/TextDiff/TextDiffStyle.swift | 14 +++++++++++--- Sources/TextDiff/TextDiffView.swift | 5 +++-- Tests/TextDiffTests/TextDiffEngineTests.swift | 9 ++++++++- 5 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 Sources/TextDiff/TextDiffGroupStrokeStyle.swift diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index cdfebf7..10611d5 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -552,7 +552,7 @@ public final class NSTextDiffView: NSView { xRadius: style.chipCornerRadius + 2, yRadius: style.chipCornerRadius + 2 ) - groupPath.lineWidth = 1.5 + applyGroupStrokeStyle(to: groupPath) groupPath.stroke() } else { for chipRect in chipRects { @@ -562,7 +562,7 @@ public final class NSTextDiffView: NSView { xRadius: style.chipCornerRadius + 1, yRadius: style.chipCornerRadius + 1 ) - outlinePath.lineWidth = 1.5 + applyGroupStrokeStyle(to: outlinePath) outlinePath.stroke() } } @@ -597,6 +597,17 @@ public final class NSTextDiffView: NSView { configured.draw(in: symbolRect) } + private func applyGroupStrokeStyle(to path: NSBezierPath) { + path.lineWidth = 1.5 + switch style.groupStrokeStyle { + case .solid: + path.setLineDash([], count: 0, phase: 0) + case .dashed: + var pattern: [CGFloat] = [4, 2] + path.setLineDash(&pattern, count: pattern.count, phase: 0) + } + } + private func drawChip( chipRect: CGRect, fillColor: NSColor?, diff --git a/Sources/TextDiff/TextDiffGroupStrokeStyle.swift b/Sources/TextDiff/TextDiffGroupStrokeStyle.swift new file mode 100644 index 0000000..c676a71 --- /dev/null +++ b/Sources/TextDiff/TextDiffGroupStrokeStyle.swift @@ -0,0 +1,9 @@ +import Foundation + +/// Stroke style used for the interactive revert-group outline. +public enum TextDiffGroupStrokeStyle: Sendable { + /// Draws a continuous stroke. + case solid + /// Draws a dashed stroke. + case dashed +} diff --git a/Sources/TextDiff/TextDiffStyle.swift b/Sources/TextDiff/TextDiffStyle.swift index ada66cb..5653acf 100644 --- a/Sources/TextDiff/TextDiffStyle.swift +++ b/Sources/TextDiff/TextDiffStyle.swift @@ -20,6 +20,8 @@ public struct TextDiffStyle: @unchecked Sendable { public var interChipSpacing: CGFloat /// Additional vertical spacing between wrapped lines. public var lineSpacing: CGFloat + /// Stroke style used for interactive revert-group outlines. + public var groupStrokeStyle: TextDiffGroupStrokeStyle /// Creates a style for rendering text diffs. /// @@ -32,6 +34,7 @@ public struct TextDiffStyle: @unchecked Sendable { /// - chipInsets: Insets applied around changed-token text when drawing chips. /// - interChipSpacing: Gap between adjacent changed lexical chips. /// - lineSpacing: Additional vertical spacing between wrapped lines. + /// - groupStrokeStyle: Stroke style for revert-group hover outlines. public init( additionsStyle: TextDiffChangeStyle = .defaultAddition, removalsStyle: TextDiffChangeStyle = .defaultRemoval, @@ -40,7 +43,8 @@ public struct TextDiffStyle: @unchecked Sendable { chipCornerRadius: CGFloat = 4, chipInsets: NSEdgeInsets = NSEdgeInsets(top: 1, left: 3, bottom: 1, right: 3), interChipSpacing: CGFloat = 0, - lineSpacing: CGFloat = 2 + lineSpacing: CGFloat = 2, + groupStrokeStyle: TextDiffGroupStrokeStyle = .solid ) { self.additionsStyle = additionsStyle self.removalsStyle = removalsStyle @@ -50,6 +54,7 @@ public struct TextDiffStyle: @unchecked Sendable { self.chipInsets = chipInsets self.interChipSpacing = interChipSpacing self.lineSpacing = lineSpacing + self.groupStrokeStyle = groupStrokeStyle } /// Creates a style by converting protocol-based operation styles to concrete change styles. @@ -63,6 +68,7 @@ public struct TextDiffStyle: @unchecked Sendable { /// - chipInsets: Insets applied around changed-token text when drawing chips. /// - interChipSpacing: Gap between adjacent changed lexical chips. /// - lineSpacing: Additional vertical spacing between wrapped lines. + /// - groupStrokeStyle: Stroke style for revert-group hover outlines. public init( additionsStyle: some TextDiffStyling, removalsStyle: some TextDiffStyling, @@ -71,7 +77,8 @@ public struct TextDiffStyle: @unchecked Sendable { chipCornerRadius: CGFloat = 4, chipInsets: NSEdgeInsets = NSEdgeInsets(top: 1, left: 3, bottom: 1, right: 3), interChipSpacing: CGFloat = 0, - lineSpacing: CGFloat = 2 + lineSpacing: CGFloat = 2, + groupStrokeStyle: TextDiffGroupStrokeStyle = .solid ) { self.init( additionsStyle: TextDiffChangeStyle(additionsStyle), @@ -81,7 +88,8 @@ public struct TextDiffStyle: @unchecked Sendable { chipCornerRadius: chipCornerRadius, chipInsets: chipInsets, interChipSpacing: interChipSpacing, - lineSpacing: lineSpacing + lineSpacing: lineSpacing, + groupStrokeStyle: groupStrokeStyle ) } diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index 08229b3..6150fc5 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -102,9 +102,10 @@ public struct TextDiffView: View { textColor: .labelColor, font: font, chipCornerRadius: 3, - chipInsets: NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0), + chipInsets: NSEdgeInsets(top: 1, left: 0, bottom: 1, right: 0), interChipSpacing: 1, - lineSpacing: 0 + lineSpacing: 2, + groupStrokeStyle: .dashed ) VStack(alignment: .leading, spacing: 4) { Text("Diff by characters") diff --git a/Tests/TextDiffTests/TextDiffEngineTests.swift b/Tests/TextDiffTests/TextDiffEngineTests.swift index 07784f8..ec83fef 100644 --- a/Tests/TextDiffTests/TextDiffEngineTests.swift +++ b/Tests/TextDiffTests/TextDiffEngineTests.swift @@ -168,6 +168,11 @@ func defaultStyleInterChipSpacingMatchesCurrentDefault() { #expect(TextDiffStyle.default.interChipSpacing == 0) } +@Test +func defaultGroupStrokeStyleIsSolid() { + #expect(TextDiffStyle.default.groupStrokeStyle == .solid) +} + @Test func textDiffStyleDefaultUsesDefaultAdditionAndRemovalStyles() { let style = TextDiffStyle.default @@ -194,7 +199,8 @@ func textDiffStyleProtocolInitConvertsCustomConformers() { let style = TextDiffStyle( additionsStyle: additions, - removalsStyle: removals + removalsStyle: removals, + groupStrokeStyle: .dashed ) expectColorEqual(style.additionsStyle.fillColor, additions.fillColor) @@ -206,6 +212,7 @@ func textDiffStyleProtocolInitConvertsCustomConformers() { expectColorEqual(style.removalsStyle.strokeColor, removals.strokeColor) expectColorEqual(style.removalsStyle.textColorOverride ?? .clear, removals.textColorOverride ?? .clear) #expect(style.removalsStyle.strikethrough == removals.strikethrough) + #expect(style.groupStrokeStyle == .dashed) } @Test From 37e42e205100504d2ac710961d6dcb1e705e641d Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 01:50:50 +0100 Subject: [PATCH 03/29] feat: enhance diff revert by handling word boundary spacing Introduce handling of word boundary spacing for standalone word deletions when generating a diff revert action. Add the capability for adjusting replacement text in the DiffRevertActionResolver to ensure proper spacing is maintained when standalone words are deleted or reinserted. This prevents incorrect merging of words when reverting changes. This change improves the accuracy of diff revert actions, especially for deletions of individual words that are adjacent to other word segments in text comparisons. Additionally, modify test cases to cover scenarios where standalone word deletions should revert to include proper spacing and validate the overall improvement in handling word boundary situations. --- .../AppKit/DiffRevertActionResolver.swift | 127 ++++++++++++++++-- Sources/TextDiff/AppKit/NSTextDiffView.swift | 4 +- .../DiffLayouterPerformanceTests.swift | 4 +- .../DiffRevertActionResolverTests.swift | 75 ++++++++++- 4 files changed, 190 insertions(+), 20 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift index 093974e..41f9cab 100644 --- a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -19,6 +19,7 @@ enum DiffRevertCandidateKind: Equatable { struct DiffRevertCandidate: Equatable { let id: Int let kind: DiffRevertCandidateKind + let tokenKind: DiffTokenKind let segmentIndices: [Int] let updatedRange: NSRange let replacementText: String @@ -34,10 +35,16 @@ struct DiffRevertInteractionContext { } enum DiffRevertActionResolver { - static func indexedSegments(from segments: [DiffSegment]) -> [IndexedSegment] { + static func indexedSegments( + from segments: [DiffSegment], + original: String, + updated: String + ) -> [IndexedSegment] { var output: [IndexedSegment] = [] output.reserveCapacity(segments.count) + let originalNSString = original as NSString + let updatedNSString = updated as NSString var originalCursor = 0 var updatedCursor = 0 @@ -50,8 +57,12 @@ enum DiffRevertActionResolver { case .equal: originalRange = NSRange(location: originalCursor, length: textLength) updatedRange = NSRange(location: updatedCursor, length: textLength) - originalCursor += textLength - updatedCursor += textLength + if textMatches(segment.text, source: originalNSString, at: originalCursor) { + originalCursor += textLength + } + if textMatches(segment.text, source: updatedNSString, at: updatedCursor) { + updatedCursor += textLength + } case .delete: originalRange = NSRange(location: originalCursor, length: textLength) updatedRange = NSRange(location: updatedCursor, length: 0) @@ -80,12 +91,29 @@ enum DiffRevertActionResolver { static func candidates( from segments: [DiffSegment], mode: TextDiffComparisonMode + ) -> [DiffRevertCandidate] { + let original = segments + .filter { $0.kind != .insert } + .map(\.text) + .joined() + let updated = segments + .filter { $0.kind != .delete } + .map(\.text) + .joined() + return candidates(from: segments, mode: mode, original: original, updated: updated) + } + + static func candidates( + from segments: [DiffSegment], + mode: TextDiffComparisonMode, + original: String, + updated: String ) -> [DiffRevertCandidate] { guard mode == .token else { return [] } - let indexed = indexedSegments(from: segments) + let indexed = indexedSegments(from: segments, original: original, updated: updated) guard !indexed.isEmpty else { return [] } @@ -109,6 +137,7 @@ enum DiffRevertActionResolver { DiffRevertCandidate( id: candidateID, kind: .pairedReplacement, + tokenKind: current.segment.tokenKind, segmentIndices: [current.segmentIndex, next.segmentIndex], updatedRange: next.updatedRange, replacementText: current.segment.text, @@ -129,6 +158,7 @@ enum DiffRevertActionResolver { DiffRevertCandidate( id: candidateID, kind: .singleInsertion, + tokenKind: current.segment.tokenKind, segmentIndices: [current.segmentIndex], updatedRange: current.updatedRange, replacementText: "", @@ -142,6 +172,7 @@ enum DiffRevertActionResolver { DiffRevertCandidate( id: candidateID, kind: .singleDeletion, + tokenKind: current.segment.tokenKind, segmentIndices: [current.segmentIndex], updatedRange: NSRange(location: current.updatedCursor, length: 0), replacementText: current.segment.text, @@ -164,9 +195,11 @@ enum DiffRevertActionResolver { static func interactionContext( segments: [DiffSegment], runs: [LaidOutRun], - mode: TextDiffComparisonMode + mode: TextDiffComparisonMode, + original: String, + updated: String ) -> DiffRevertInteractionContext? { - let candidates = candidates(from: segments, mode: mode) + let candidates = candidates(from: segments, mode: mode, original: original, updated: updated) guard !candidates.isEmpty else { return nil } @@ -222,16 +255,31 @@ enum DiffRevertActionResolver { updated: String ) -> TextDiffRevertAction? { let nsUpdated = updated as NSString - guard candidate.updatedRange.location >= 0 else { + var updatedRange = candidate.updatedRange + if candidate.kind == .singleDeletion, updatedRange.location > nsUpdated.length { + updatedRange.location = nsUpdated.length + } + guard updatedRange.location >= 0 else { return nil } - guard NSMaxRange(candidate.updatedRange) <= nsUpdated.length else { + guard NSMaxRange(updatedRange) <= nsUpdated.length else { return nil } + let replacementText: String + if candidate.kind == .singleDeletion, candidate.tokenKind == .word { + replacementText = adjustedStandaloneWordDeletionReplacement( + candidate.replacementText, + insertionLocation: updatedRange.location, + updated: nsUpdated + ) + } else { + replacementText = candidate.replacementText + } + let resultingUpdated = nsUpdated.replacingCharacters( - in: candidate.updatedRange, - with: candidate.replacementText + in: updatedRange, + with: replacementText ) let actionKind: TextDiffRevertActionKind switch candidate.kind { @@ -245,8 +293,8 @@ enum DiffRevertActionResolver { return TextDiffRevertAction( kind: actionKind, - updatedRange: candidate.updatedRange, - replacementText: candidate.replacementText, + updatedRange: updatedRange, + replacementText: replacementText, originalTextFragment: candidate.originalTextFragment, updatedTextFragment: candidate.updatedTextFragment, resultingUpdated: resultingUpdated @@ -256,4 +304,59 @@ enum DiffRevertActionResolver { private static func isLexicalChange(_ segment: DiffSegment) -> Bool { segment.tokenKind != .whitespace && segment.kind != .equal } + + private static func textMatches(_ text: String, source: NSString, at location: Int) -> Bool { + let length = text.utf16.count + guard location >= 0, location + length <= source.length else { + return false + } + return source.substring(with: NSRange(location: location, length: length)) == text + } + + private static func adjustedStandaloneWordDeletionReplacement( + _ replacement: String, + insertionLocation: Int, + updated: NSString + ) -> String { + guard !replacement.isEmpty else { + return replacement + } + guard replacement.rangeOfCharacter(from: .alphanumerics) != nil else { + return replacement + } + + let hasLeadingWhitespace = replacement.unicodeScalars.first + .map { CharacterSet.whitespacesAndNewlines.contains($0) } ?? false + let hasTrailingWhitespace = replacement.unicodeScalars.last + .map { CharacterSet.whitespacesAndNewlines.contains($0) } ?? false + + let beforeIsWordLike: Bool + if insertionLocation > 0 { + let previous = updated.substring(with: NSRange(location: insertionLocation - 1, length: 1)) + beforeIsWordLike = isWordLike(previous) + } else { + beforeIsWordLike = false + } + + let afterIsWordLike: Bool + if insertionLocation < updated.length { + let next = updated.substring(with: NSRange(location: insertionLocation, length: 1)) + afterIsWordLike = isWordLike(next) + } else { + afterIsWordLike = false + } + + var output = replacement + if beforeIsWordLike && !hasLeadingWhitespace { + output = " " + output + } + if afterIsWordLike && !hasTrailingWhitespace { + output += " " + } + return output + } + + private static func isWordLike(_ scalarString: String) -> Bool { + scalarString.rangeOfCharacter(from: .alphanumerics) != nil + } } diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 10611d5..8cb3674 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -303,7 +303,9 @@ public final class NSTextDiffView: NSView { let context = DiffRevertActionResolver.interactionContext( segments: segments, runs: layout.runs, - mode: mode + mode: mode, + original: original, + updated: updated ) cachedInteractionContext = context cachedInteractionWidth = width diff --git a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift index 38ac3ca..0134700 100644 --- a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift +++ b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift @@ -62,7 +62,9 @@ final class DiffLayouterPerformanceTests: XCTestCase { let context = DiffRevertActionResolver.interactionContext( segments: segments, runs: layout.runs, - mode: .token + mode: .token, + original: original, + updated: updated ) XCTAssertFalse(layout.runs.isEmpty) XCTAssertNotNil(context) diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift index 566d560..bd75bfe 100644 --- a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -9,7 +9,12 @@ func candidatesBuildPairedReplacementForAdjacentDeleteInsert() throws { DiffSegment(kind: .insert, tokenKind: .word, text: "new") ] - let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: "old", + updated: "new" + ) #expect(candidates.count == 1) #expect(candidates[0].kind == .pairedReplacement) #expect(candidates[0].updatedRange == NSRange(location: 0, length: 3)) @@ -28,7 +33,12 @@ func candidatesDoNotPairWhenAnySegmentExistsBetweenDeleteAndInsert() { DiffSegment(kind: .insert, tokenKind: .word, text: "new") ] - let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: "old ", + updated: " new" + ) #expect(candidates.count == 2) #expect(candidates[0].kind == .singleDeletion) #expect(candidates[1].kind == .singleInsertion) @@ -41,7 +51,12 @@ func singleInsertionActionRemovesInsertedFragment() throws { DiffSegment(kind: .insert, tokenKind: .word, text: "ß"), DiffSegment(kind: .equal, tokenKind: .word, text: "c") ] - let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: "ac", + updated: "aßc" + ) let insertion = try #require(candidates.first(where: { $0.kind == .singleInsertion })) let action = try #require(DiffRevertActionResolver.action(from: insertion, updated: "aßc")) @@ -58,7 +73,12 @@ func singleDeletionActionReinsertsDeletedFragment() throws { DiffSegment(kind: .delete, tokenKind: .word, text: "🌍"), DiffSegment(kind: .equal, tokenKind: .word, text: "b") ] - let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .token) + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: "a🌍b", + updated: "ab" + ) let deletion = try #require(candidates.first(where: { $0.kind == .singleDeletion })) let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: "ab")) @@ -70,7 +90,50 @@ func singleDeletionActionReinsertsDeletedFragment() throws { @Test func candidatesAreEmptyInCharacterMode() { - let segments = TextDiffEngine.diff(original: "old value", updated: "new value", mode: .character) - let candidates = DiffRevertActionResolver.candidates(from: segments, mode: .character) + let original = "old value" + let updated = "new value" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .character) + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .character, + original: original, + updated: updated + ) #expect(candidates.isEmpty) } + +@Test +func standaloneDeletionRevertRestoresWordBoundarySpacing() throws { + let original = "Hello brave world" + let updated = "Hello world" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) + let deletion = try #require(candidates.first(where: { $0.kind == .singleDeletion })) + + let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: updated)) + #expect(action.resultingUpdated == original) +} + +@Test +func standaloneDeletionAtEndRevertRestoresSpacing() throws { + let original = "Hello brave" + let updated = "Hello" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) + let deletion = try #require(candidates.first(where: { $0.kind == .singleDeletion })) + + let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: updated)) + #expect(action.resultingUpdated == original) +} From ab3c70568029335abb46d53bf28dc9c5499a6f1c Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 02:13:38 +0100 Subject: [PATCH 04/29] refactor: enhance handling of punctuation replacing whitespace Introduce logic to treat deletion of whitespace followed by insertion of punctuation as a single reversible edit. Update `isReplacementPair` function in `DiffRevertActionResolver.swift` to support punctuation replacing whitespace. Handle cases where punctuation replaces whitespace in `tokenDiffSegments` of `TextDiffEngine.swift` ensuring that whitespace deletion is visible. Update corresponding unit tests to verify functionality: - Test that deleted whitespace followed by inserted punctuation is recognized as a single segment in `DiffRevertActionResolverTests.swift`. - Confirm `DiffTokenLayouter.swift` renders deleted whitespace as chip in such cases. This improves diff clarity for text changes involving punctuation. --- .../AppKit/DiffRevertActionResolver.swift | 17 ++++++- .../TextDiff/AppKit/DiffTokenLayouter.swift | 3 +- Sources/TextDiff/AppKit/NSTextDiffView.swift | 4 +- Sources/TextDiff/TextDiffEngine.swift | 40 +++++++++++++++- Sources/TextDiff/TextDiffView.swift | 4 +- .../DiffRevertActionResolverTests.swift | 22 +++++++++ Tests/TextDiffTests/TextDiffEngineTests.swift | 47 +++++++++++++++++++ 7 files changed, 128 insertions(+), 9 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift index 41f9cab..bba4648 100644 --- a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -131,8 +131,7 @@ enum DiffRevertActionResolver { let next = indexed[index + 1] if current.segment.kind == .delete, next.segment.kind == .insert, - isCurrentLexical, - isLexicalChange(next.segment) { + isReplacementPair(delete: current.segment, insert: next.segment) { output.append( DiffRevertCandidate( id: candidateID, @@ -305,6 +304,20 @@ enum DiffRevertActionResolver { segment.tokenKind != .whitespace && segment.kind != .equal } + private static func isReplacementPair(delete: DiffSegment, insert: DiffSegment) -> Bool { + if isLexicalChange(delete), isLexicalChange(insert) { + return true + } + + // Treat deleted spacing replaced by punctuation as one reversible edit. + if delete.tokenKind == .whitespace, + insert.tokenKind == .punctuation { + return true + } + + return false + } + private static func textMatches(_ text: String, source: NSString, at location: Int) -> Bool { let length = text.utf16.count guard location >= 0, location + length <= source.length else { diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 191562c..9ced935 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -64,7 +64,8 @@ enum DiffTokenLayouter { } let segment = DiffSegment(kind: piece.kind, tokenKind: piece.tokenKind, text: piece.text) - let isChangedLexical = segment.kind != .equal && segment.tokenKind != .whitespace + let isChangedLexical = segment.kind != .equal + && (segment.tokenKind != .whitespace || segment.kind == .delete) var leadingGap: CGFloat = 0 if previousChangedLexical && isChangedLexical { leadingGap = max(0, style.interChipSpacing) diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 8cb3674..6978062 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -94,8 +94,8 @@ public final class NSTextDiffView: NSView { #endif private let hoverOutlineColor = NSColor.controlAccentColor.withAlphaComponent(0.9) - private let hoverButtonFillColor = NSColor.black//NSColor.windowBackgroundColor.withAlphaComponent(0.95) - private let hoverButtonStrokeColor = NSColor.clear//NSColor.controlAccentColor.withAlphaComponent(0.8) + private let hoverButtonFillColor = NSColor.black + private let hoverButtonStrokeColor = NSColor.clear private let hoverIconName = "arrow.turn.down.left" private let hoverButtonSize = CGSize(width: 16, height: 16) private let hoverButtonGap: CGFloat = 4 diff --git a/Sources/TextDiff/TextDiffEngine.swift b/Sources/TextDiff/TextDiffEngine.swift index c7accb2..e25ee15 100644 --- a/Sources/TextDiff/TextDiffEngine.swift +++ b/Sources/TextDiff/TextDiffEngine.swift @@ -58,6 +58,15 @@ public enum TextDiffEngine { segments.append( DiffSegment(kind: .equal, tokenKind: .whitespace, text: deletedWhitespace) ) + } else if isAdjacentToInsertedLexicalToken( + operations: operations, + runStart: runStart, + runEnd: runEnd + ) { + let deletedWhitespace = whitespaceRun.map(\.token.text).joined() + segments.append( + DiffSegment(kind: .delete, tokenKind: .whitespace, text: deletedWhitespace) + ) } index = runEnd @@ -154,14 +163,41 @@ public enum TextDiffEngine { operations: [MyersDiff.Operation], runStart: Int, runEnd: Int + ) -> Bool { + isAdjacentToLexicalToken( + operations: operations, + runStart: runStart, + runEnd: runEnd, + kind: .delete + ) + } + + private static func isAdjacentToInsertedLexicalToken( + operations: [MyersDiff.Operation], + runStart: Int, + runEnd: Int + ) -> Bool { + isAdjacentToLexicalToken( + operations: operations, + runStart: runStart, + runEnd: runEnd, + kind: .insert + ) + } + + private static func isAdjacentToLexicalToken( + operations: [MyersDiff.Operation], + runStart: Int, + runEnd: Int, + kind: DiffOperationKind ) -> Bool { if let previousLexicalIndex = previousLexicalOperationIndex(in: operations, before: runStart), - operations[previousLexicalIndex].kind == .delete { + operations[previousLexicalIndex].kind == kind { return true } if let nextLexicalIndex = nextLexicalOperationIndex(in: operations, after: runEnd), - operations[nextLexicalIndex].kind == .delete { + operations[nextLexicalIndex].kind == kind { return true } diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index 6150fc5..ef9852d 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -209,11 +209,11 @@ public struct TextDiffView: View { } private struct RevertBindingPreview: View { - @State private var updated = "Apply new value in this sentence." + @State private var updated = "a default in-app purchase flow where they have to provide their email and password within the app" var body: some View { TextDiffView( - original: "Apply old value on The sentence!", + original: "a default in app purchase flow where they have to provide their email and password within the app A", updated: $updated, mode: .token, isRevertActionsEnabled: true diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift index bd75bfe..d7fc738 100644 --- a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -137,3 +137,25 @@ func standaloneDeletionAtEndRevertRestoresSpacing() throws { let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: updated)) #expect(action.resultingUpdated == original) } + +@Test +func hyphenReplacingWhitespaceRevertRestoresOriginalSpacing() throws { + let original = "in app purchase" + let updated = "in-app purchase" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) + let replacement = try #require(candidates.first(where: { $0.kind == .pairedReplacement })) + + #expect(replacement.originalTextFragment == " ") + #expect(replacement.updatedTextFragment == "-") + + let action = try #require(DiffRevertActionResolver.action(from: replacement, updated: updated)) + #expect(action.kind == .pairedReplacement) + #expect(action.resultingUpdated == original) +} diff --git a/Tests/TextDiffTests/TextDiffEngineTests.swift b/Tests/TextDiffTests/TextDiffEngineTests.swift index ec83fef..e04c566 100644 --- a/Tests/TextDiffTests/TextDiffEngineTests.swift +++ b/Tests/TextDiffTests/TextDiffEngineTests.swift @@ -51,6 +51,25 @@ func punctuationEditsAreLexicalDiffSegments() { #expect(joinedText(segments) == "Hello,. world!?") } +@Test +func punctuationInsertionReplacingWhitespaceKeepsWhitespaceDeletionVisible() { + let segments = TextDiffEngine.diff( + original: "in app purchase", + updated: "in-app purchase" + ) + + let deletedWhitespaceIndex = segments.firstIndex { + $0.kind == .delete && $0.tokenKind == .whitespace && $0.text == " " + } + let insertedHyphenIndex = segments.firstIndex { + $0.kind == .insert && $0.tokenKind == .punctuation && $0.text == "-" + } + + #expect(deletedWhitespaceIndex != nil) + #expect(insertedHyphenIndex != nil) + #expect((deletedWhitespaceIndex ?? 0) < (insertedHyphenIndex ?? 0)) +} + @Test func whitespaceOnlyChangesPreserveUpdatedLayoutWithoutWhitespaceDiffMarkers() { let updated = "Hello world\n" @@ -273,6 +292,34 @@ func layouterAppliesGapForPunctuationAdjacency() { #expect(chips[1].minX - chips[0].maxX >= 4 - 0.0001) } +@Test +func layouterRendersDeletedWhitespaceAsChipWhenReplacedByPunctuation() throws { + let style = TextDiffStyle.default + let layout = DiffTokenLayouter.layout( + segments: [ + DiffSegment(kind: .equal, tokenKind: .word, text: "in"), + DiffSegment(kind: .delete, tokenKind: .whitespace, text: " "), + DiffSegment(kind: .insert, tokenKind: .punctuation, text: "-"), + DiffSegment(kind: .equal, tokenKind: .word, text: "app") + ], + style: style, + availableWidth: 500, + contentInsets: zeroInsets + ) + + let deletedWhitespaceRun = layout.runs.first { + $0.segment.kind == .delete && $0.segment.tokenKind == .whitespace + } + let insertedHyphenRun = layout.runs.first { + $0.segment.kind == .insert && $0.segment.tokenKind == .punctuation && $0.segment.text == "-" + } + + let deletedWhitespaceChip = try #require(deletedWhitespaceRun?.chipRect) + let insertedHyphenChip = try #require(insertedHyphenRun?.chipRect) + #expect(deletedWhitespaceChip.width > 0) + #expect(insertedHyphenChip.width > 0) +} + @Test func layouterDoesNotInjectAdjacencyGapAcrossUnchangedWhitespace() throws { let style = TextDiffStyle.default From dbc2742a4bc3d71f54886796d73e522ffa12a468 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 02:26:47 +0100 Subject: [PATCH 05/29] feat: enhance word boundary handling in diff revert actions Add logic to adjust standalone word insertion and deletion in DiffRevertActionResolver to preserve boundary spacing. Introduce new tests to confirm correct handling of these cases, ensuring reverts maintain intended word boundaries and spacing adjustments are consistent. This change improves the accuracy of text transformations during diff reverts, especially for word-based operations. --- .../AppKit/DiffRevertActionResolver.swift | 41 +++++++ .../DiffRevertActionResolverTests.swift | 104 ++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift index bba4648..228d089 100644 --- a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -258,6 +258,12 @@ enum DiffRevertActionResolver { if candidate.kind == .singleDeletion, updatedRange.location > nsUpdated.length { updatedRange.location = nsUpdated.length } + if candidate.kind == .singleInsertion, candidate.tokenKind == .word { + updatedRange = adjustedStandaloneWordInsertionRemovalRange( + updatedRange, + updated: nsUpdated + ) + } guard updatedRange.location >= 0 else { return nil } @@ -369,6 +375,41 @@ enum DiffRevertActionResolver { return output } + private static func adjustedStandaloneWordInsertionRemovalRange( + _ range: NSRange, + updated: NSString + ) -> NSRange { + guard range.location >= 0, range.length >= 0 else { + return range + } + guard NSMaxRange(range) <= updated.length else { + return range + } + + let hasLeadingWhitespace = range.location > 0 + && isWhitespaceCharacter(updated.substring(with: NSRange(location: range.location - 1, length: 1))) + let hasTrailingWhitespace = NSMaxRange(range) < updated.length + && isWhitespaceCharacter(updated.substring(with: NSRange(location: NSMaxRange(range), length: 1))) + + if hasLeadingWhitespace, hasTrailingWhitespace { + return NSRange(location: range.location, length: range.length + 1) + } + + if range.location == 0, hasTrailingWhitespace { + return NSRange(location: range.location, length: range.length + 1) + } + + if NSMaxRange(range) == updated.length, hasLeadingWhitespace { + return NSRange(location: range.location - 1, length: range.length + 1) + } + + return range + } + + private static func isWhitespaceCharacter(_ scalarString: String) -> Bool { + scalarString.unicodeScalars.allSatisfy { CharacterSet.whitespacesAndNewlines.contains($0) } + } + private static func isWordLike(_ scalarString: String) -> Bool { scalarString.rangeOfCharacter(from: .alphanumerics) != nil } diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift index d7fc738..69c2845 100644 --- a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -159,3 +159,107 @@ func hyphenReplacingWhitespaceRevertRestoresOriginalSpacing() throws { #expect(action.kind == .pairedReplacement) #expect(action.resultingUpdated == original) } + +@Test +func singleInsertionWordRevertCollapsesBoundaryWhitespace() throws { + let original = "A B" + let updated = "A X B" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) + let insertion = try #require(candidates.first(where: { + $0.kind == .singleInsertion && $0.updatedTextFragment == "X" + })) + + let action = try #require(DiffRevertActionResolver.action(from: insertion, updated: updated)) + #expect(action.resultingUpdated == original) +} + +@Test +func sequentialRevertsKeepLooksItAsPairedReplacement() throws { + let original = "Add a diff view! Looks good!" + var updated = "Added a diff view. It looks good!" + + updated = try applyingRevert( + original: original, + updated: updated, + kind: .pairedReplacement, + originalFragment: "Add", + updatedFragment: "Added" + ) + + updated = try applyingRevert( + original: original, + updated: updated, + kind: .pairedReplacement, + originalFragment: "!", + updatedFragment: "." + ) + + updated = try applyingRevert( + original: original, + updated: updated, + kind: .singleInsertion, + originalFragment: nil, + updatedFragment: "looks" + ) + #expect(updated == "Add a diff view! It good!") + + let remaining = revertCandidates(original: original, updated: updated) + let looksItPair = remaining.first { + $0.kind == .pairedReplacement + && $0.originalTextFragment == "Looks" + && $0.updatedTextFragment == "It" + } + + #expect(looksItPair != nil) + #expect(!remaining.contains { + $0.kind == .singleDeletion && $0.originalTextFragment == "Looks" + }) + #expect(!remaining.contains { + $0.kind == .singleInsertion && $0.updatedTextFragment == "It" + }) +} + +private func applyingRevert( + original: String, + updated: String, + kind: DiffRevertCandidateKind, + originalFragment: String?, + updatedFragment: String? +) throws -> String { + let candidates = revertCandidates(original: original, updated: updated) + var matched: DiffRevertCandidate? + for candidate in candidates { + guard candidate.kind == kind else { + continue + } + guard candidate.originalTextFragment == originalFragment else { + continue + } + guard candidate.updatedTextFragment == updatedFragment else { + continue + } + matched = candidate + break + } + + let candidate = try #require(matched) + let action = try #require(DiffRevertActionResolver.action(from: candidate, updated: updated)) + return action.resultingUpdated +} + +private func revertCandidates(original: String, updated: String) -> [DiffRevertCandidate] { + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + return DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) +} From d5d0f8f45eaa51d917c63996ed31c36a723dc491 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Tue, 24 Feb 2026 02:41:19 +0100 Subject: [PATCH 06/29] feat: add debug overlay for invisible characters Introduce an option to render invisible characters with a debug overlay in NSTextDiffView, activated by a new `showsInvisibleCharacters` property. This feature aids in debugging by visualizing spaces, tabs, and newline characters using distinct symbols in red. This change doesn't alter the core functionality but enhances debugging capabilities, allowing developers to better understand the alignment and structure of rendered text, especially useful when analyzing unexpected layout issues in text diffs. --- .../AppKit/DiffTextViewRepresentable.swift | 3 + .../TextDiff/AppKit/DiffTokenLayouter.swift | 9 ++ Sources/TextDiff/AppKit/NSTextDiffView.swift | 88 ++++++++++++++++++ Sources/TextDiff/TextDiffView.swift | 11 ++- .../NSTextDiffSnapshotTests.swift | 19 ++++ Tests/TextDiffTests/NSTextDiffViewTests.swift | 19 ++++ .../invisible_characters_debug_overlay.1.png | Bin 0 -> 8957 bytes 7 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png diff --git a/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift b/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift index d8407f0..f195e42 100644 --- a/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift +++ b/Sources/TextDiff/AppKit/DiffTextViewRepresentable.swift @@ -7,6 +7,7 @@ struct DiffTextViewRepresentable: NSViewRepresentable { let updatedBinding: Binding? let style: TextDiffStyle let mode: TextDiffComparisonMode + let showsInvisibleCharacters: Bool let isRevertActionsEnabled: Bool let onRevertAction: ((TextDiffRevertAction) -> Void)? @@ -27,6 +28,7 @@ struct DiffTextViewRepresentable: NSViewRepresentable { updatedBinding: updatedBinding, onRevertAction: onRevertAction ) + view.showsInvisibleCharacters = showsInvisibleCharacters view.isRevertActionsEnabled = isRevertActionsEnabled view.onRevertAction = { [coordinator = context.coordinator] action in coordinator.handle(action) @@ -42,6 +44,7 @@ struct DiffTextViewRepresentable: NSViewRepresentable { view.onRevertAction = { [coordinator = context.coordinator] action in coordinator.handle(action) } + view.showsInvisibleCharacters = showsInvisibleCharacters view.isRevertActionsEnabled = isRevertActionsEnabled view.setContent( original: original, diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 9ced935..4f636d2 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -15,6 +15,7 @@ struct LaidOutRun { struct DiffLayout { let runs: [LaidOutRun] + let lineBreakMarkers: [CGPoint] let contentSize: CGSize } @@ -39,6 +40,7 @@ enum DiffTokenLayouter { var maxUsedX = lineStartX var lineCount = 1 var lineHasContent = false + var lineBreakMarkers: [CGPoint] = [] let lineText = NSMutableString() var lineTextWidth: CGFloat = 0 var previousChangedLexical = false @@ -55,6 +57,12 @@ enum DiffTokenLayouter { for piece in pieces(from: segments) { if piece.isLineBreak { + lineBreakMarkers.append( + CGPoint( + x: cursorX, + y: lineTop + (lineHeight / 2) + ) + ) moveToNewLine() continue } @@ -153,6 +161,7 @@ enum DiffTokenLayouter { return DiffLayout( runs: runs, + lineBreakMarkers: lineBreakMarkers, contentSize: CGSize(width: max(intrinsicWidth, usedWidth), height: contentHeight) ) } diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 6978062..3a478c9 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -60,6 +60,16 @@ public final class NSTextDiffView: NSView { } } + /// Debug overlay that draws visible symbols for otherwise invisible characters in red. + public var showsInvisibleCharacters: Bool = false { + didSet { + guard oldValue != showsInvisibleCharacters else { + return + } + needsDisplay = true + } + } + /// Callback invoked when user clicks the revert icon. public var onRevertAction: ((TextDiffRevertAction) -> Void)? @@ -201,6 +211,12 @@ public final class NSTextDiffView: NSView { } run.attributedText.draw(in: run.textRect) + if showsInvisibleCharacters { + drawInvisibleCharacters(for: run) + } + } + if showsInvisibleCharacters { + drawLineBreakMarkers(layout.lineBreakMarkers) } drawHoveredRevertAffordance(layout: layout) @@ -635,6 +651,78 @@ public final class NSTextDiffView: NSView { strokePath.stroke() } + private func drawInvisibleCharacters(for run: LaidOutRun) { + guard run.segment.text.unicodeScalars.contains(where: { CharacterSet.whitespacesAndNewlines.contains($0) }) else { + return + } + + let font = (run.attributedText.attribute(.font, at: 0, effectiveRange: nil) as? NSFont) ?? style.font + let attributes: [NSAttributedString.Key: Any] = [ + .font: font, + .foregroundColor: NSColor.systemRed + ] + + var x = run.textRect.minX + for character in run.segment.text { + let source = String(character) + let width = (source as NSString).size(withAttributes: [.font: font]).width + defer { x += width } + + guard let symbol = visibleSymbol(for: character) else { + continue + } + + let symbolWidth = (symbol as NSString).size(withAttributes: attributes).width + let symbolX = x + max(0, (width - symbolWidth) / 2) + (symbol as NSString).draw( + at: CGPoint(x: symbolX, y: run.textRect.minY), + withAttributes: attributes + ) + } + } + + private func visibleSymbol(for character: Character) -> String? { + guard character.unicodeScalars.allSatisfy({ CharacterSet.whitespacesAndNewlines.contains($0) }) else { + return nil + } + if character == " " { + return "Β·" + } + if character == "\t" { + return "β‡₯" + } + if character == "\n" || character == "\r" { + return "↩" + } + if character == "\u{00A0}" { + return "⍽" + } + return "Β·" + } + + private func drawLineBreakMarkers(_ markers: [CGPoint]) { + guard !markers.isEmpty else { + return + } + + let attributes: [NSAttributedString.Key: Any] = [ + .font: style.font, + .foregroundColor: NSColor.systemRed + ] + let symbol = "↩" as NSString + let symbolSize = symbol.size(withAttributes: attributes) + + for marker in markers { + symbol.draw( + at: CGPoint( + x: marker.x, + y: marker.y - (symbolSize.height / 2) + ), + withAttributes: attributes + ) + } + } + private static func modeKey(for mode: TextDiffComparisonMode) -> Int { switch mode { case .token: diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index ef9852d..d37353b 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -8,6 +8,7 @@ public struct TextDiffView: View { private let updatedBinding: Binding? private let mode: TextDiffComparisonMode private let style: TextDiffStyle + private let showsInvisibleCharacters: Bool private let isRevertActionsEnabled: Bool private let onRevertAction: ((TextDiffRevertAction) -> Void)? @@ -18,17 +19,20 @@ public struct TextDiffView: View { /// - updated: The source text after edits. /// - style: Visual style used to render additions, deletions, and unchanged text. /// - mode: Comparison mode that controls token-level or character-refined output. + /// - showsInvisibleCharacters: Debug-only overlay that draws whitespace/newline symbols in red. public init( original: String, updated: String, style: TextDiffStyle = .default, - mode: TextDiffComparisonMode = .token + mode: TextDiffComparisonMode = .token, + showsInvisibleCharacters: Bool = false ) { self.original = original self.updatedValue = updated self.updatedBinding = nil self.mode = mode self.style = style + self.showsInvisibleCharacters = showsInvisibleCharacters self.isRevertActionsEnabled = false self.onRevertAction = nil } @@ -40,6 +44,7 @@ public struct TextDiffView: View { /// - updated: The source text after edits. /// - style: Visual style used to render additions, deletions, and unchanged text. /// - mode: Comparison mode that controls token-level or character-refined output. + /// - showsInvisibleCharacters: Debug-only overlay that draws whitespace/newline symbols in red. /// - isRevertActionsEnabled: Enables hover affordance and revert actions. /// - onRevertAction: Optional callback invoked on revert clicks. public init( @@ -47,6 +52,7 @@ public struct TextDiffView: View { updated: Binding, style: TextDiffStyle = .default, mode: TextDiffComparisonMode = .token, + showsInvisibleCharacters: Bool = false, isRevertActionsEnabled: Bool = true, onRevertAction: ((TextDiffRevertAction) -> Void)? = nil ) { @@ -55,6 +61,7 @@ public struct TextDiffView: View { self.updatedBinding = updated self.mode = mode self.style = style + self.showsInvisibleCharacters = showsInvisibleCharacters self.isRevertActionsEnabled = isRevertActionsEnabled self.onRevertAction = onRevertAction } @@ -68,6 +75,7 @@ public struct TextDiffView: View { updatedBinding: updatedBinding, style: style, mode: mode, + showsInvisibleCharacters: showsInvisibleCharacters, isRevertActionsEnabled: isRevertActionsEnabled, onRevertAction: onRevertAction ) @@ -216,6 +224,7 @@ private struct RevertBindingPreview: View { original: "a default in app purchase flow where they have to provide their email and password within the app A", updated: $updated, mode: .token, + showsInvisibleCharacters: true, isRevertActionsEnabled: true ) .padding() diff --git a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift index e8d4f34..1f6dcbf 100644 --- a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift @@ -130,6 +130,25 @@ final class NSTextDiffSnapshotTests: XCTestCase { ) } + @MainActor + func testInvisibleCharactersDebugOverlay() { + var style = TextDiffStyle.default + style.font = .monospacedSystemFont(ofSize: 20, weight: .regular) + style.lineSpacing = 4 + let text = "space tab\tnbsp:\u{00A0} newline:\nnext line" + assertNSTextDiffSnapshot( + original: text, + updated: text, + mode: .token, + style: style, + size: CGSize(width: 560, height: 170), + configureView: { view in + view.showsInvisibleCharacters = true + }, + testName: "invisible_characters_debug_overlay()" + ) + } + private let sampleOriginalSentence = "A quick brown fox jumps over a lazy dog." private let sampleUpdatedSentence = "A quick fox hops over the lazy dog!" } diff --git a/Tests/TextDiffTests/NSTextDiffViewTests.swift b/Tests/TextDiffTests/NSTextDiffViewTests.swift index 9c309b5..57ca7f5 100644 --- a/Tests/TextDiffTests/NSTextDiffViewTests.swift +++ b/Tests/TextDiffTests/NSTextDiffViewTests.swift @@ -93,6 +93,25 @@ func nsTextDiffViewStyleChangeDoesNotRecomputeDiff() { #expect(callCount == 1) } +@Test +@MainActor +func nsTextDiffViewDebugInvisiblesToggleDoesNotRecomputeDiff() { + var callCount = 0 + let view = NSTextDiffView( + original: "old", + updated: "new", + mode: .token + ) { _, _, _ in + callCount += 1 + return [DiffSegment(kind: .equal, tokenKind: .word, text: "\(callCount)")] + } + + view.showsInvisibleCharacters = true + view.showsInvisibleCharacters = false + + #expect(callCount == 1) +} + @Test @MainActor func nsTextDiffViewSetContentBatchesRecompute() { diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png new file mode 100644 index 0000000000000000000000000000000000000000..df39e7308489b0ffc83ad0a64e74dd081a98a391 GIT binary patch literal 8957 zcmeHNXIxWDum==D5Wy=&QJRe=MQH-kR7BJO(g}os(yNrvi^2sI6i}Lg6r~d&v;c+@ z6cq$XXdyxfK{^Q?LQnFJUhn(-KEL1na86FLb9QEDXJ`NWpFB4*(Bt9|r!BkfDdLrW4#+pRhY92z?W-|mikU05R(+}%+ACd=gM^Wmk4kP z0vGUlKFhzqu*l~h`uCZs{8yt>jvyd?&QJfAj%g6{5|J&L&#bL;O{-M2G+*M<;gQO# zKc%|jnFGU1c{#q~%<^2sq@sNC>}4LEHkaYcGZ(8;wVSYi0tx!6#2n8OpCGDZ6p-c& zKCfdMwW*F)$h}8W2z(P7_f$ikWTG@i2shl;psDt5q7CO=Q$ILdILxEX#0=c*Wd3q# z;ZI9@f9?qr3%e+Avwgx8dy@HA8z3;O#?0~tS=B8e|4$=3Py6HJzoY=scCffMQ{AxH zY1Z4nyJBKyIfY?9Ecm89ij~u2VW5a>u~gOOFpnkvFuUC_Qg9}S$MSi*G@|9<{!(M! z5}HBZqT->53*sVTK!>iJJna|EwZiu{YmN)4{fHBZXd1n{HJk0dx3V)O!e|<8ixxs? zKF#)S8^PycQdSG{3*Q!^EGRvVqzL!HVvw}+$@O1`>2p-%Ig|}Y-5~mO3Msn}Uv4Is z!z;|-=2Y{^nVt;mowCN9+v*(qcxl(AlRG#>grlAi%=F#FdA-DX$DVY)bc?Oxz?Jc> zwN4QNpnci;p?P`+7I4PXR91F7vZXpIB}d*q3gX|dOBHM%s=4Md{N!-R)}rg)(S;G` zJT7nda8Gx{?=*-cQ*Kr=Ki7r z;04=l-ZMeJpmJ_!pbv_c>ad#h_gf`ev~RLa6H)I6N zNb%gDPyQzuz)<2F9wcD&#d91Qi2>Q@I&;zY%~d72A>D}@TbBEi33Bo4?)H>3qEYO?)4^$y)#-7Ezpt#m$x^5FmkvWNk8Drrd{9C)%jsnMK1>BJR~%_Q=E(D&smkz>uWHqkYkYtYkDHL zlwAit3x~{$sjq!L2@+@x<8UmWK6{iPedkykNBT5<>-j))*@+Cna8>7pb zMvi}wf1-p^)r|3K`gz2J2VZ6)F4FGuHl8IkCrM0l0F`OI+fgeV0tm*0YqzN~29yy303WX~B&3^yXHYQXLMFVLi zH2M?U@=N#r^}KK0teP=5XHw z*A`Xi*wkM3l}EAI6{lv0Dy95YYPm`{!u^$W#b7q-?Rk4P**hEiLlN9s2dmYn2RF|2lbmIFwkgg23&y5ZMkF>Nf1_dsx7asm zr{DA|y;!qM&c_ERIHGM7;TQdhR=du1_F5mpPlY!khx0fG;fuEo+@N@)Xlxq1aaG6= zRQCSY%$fR*t!<}6NZyIqT3ceRNB8t3ok9T!oh(_)qX})HcZj~r_bZ&v zTrKO-f#|=}9E<6*VVcsiy&^+UC415Lb%%E-h{d7*}IvNN;s&?iIJeGmz?|f zM92gMn(Ihw-r!FEGJg@t=&?ui(`BKb-y zqR-D()UC92h+)JR!JU$pjk0plw6lRWo3-Tq%A-yKdCm==X?fl@)aLx^yd3p6LPoG$ zLI%#-mvc8Lnu&#ys{L+*{_K2WwSaBVN1KFr+LCwVhJYsQ&usRfaP%z0#TfF?Iw>87;2WCwgs&U zX6HNYgc)bV8M~BYBh7=*ffjWSyxwXjq&ulsv7hD0!>@q=pSR6UL~|ea=0phk6>_4! zvVK!F5H#dvdB7NHy3&Auo4GZi0wui9fXWl>f^nB*ADfOA^!vJpV<*aCR=9+(0+Q@6 zD29(*c=M%rjExFiTR1R^%6ddIrJ}o-SJm7(3S>2#%Cbk!b(cVJ*=LY=Y>_buKJ~qX zUk3b!OX;wrniiD-`uG7w=BO@XnmN$ovUu#eDY1&_I22JsA78Ew$;&OO#=t%fh0`%a9oUVSQwA;mgCNPcV zxc{wB>vyKj?7I1!8&Znk`%nJp8zp4J!V09kh z*`RP{Aqo|TZmyt0vAKYZ^!#9u6sx*h&I7nh zna-Nh61r_TL#-{#%SlROIljAeSOD1~K_iWo=am;tMurO64_AiRLEk>V2w+%?!yL>n zmdBFRm#_If5V4SXev>Fe|H&O$jkgW$RSBHqzAjt}$NJBeF&Dh+5ue6SjCTr$ zerLNtE;gbhMhVfPFoC;&AGom^4G2Z5N={o)+P?@uZG2BE;Sq|SPz_OQSNc`Wip{1D zS*22|O8s5lBWeQ3+G&N)E1{?=h2HCEpZpQ;Ed>e*A=P;*uu*Lly_8TS8#F>hUUuPe zC@4=Fk}2Wzu!-FB2e8}*tdtXegbjYN_htBMbRjM)f8?GIuzfynge>*Q?)aXtY>fb2 z<5oH&UWH!Ob$fnPvc95p--Ll5`m3A`_YKPY5^Q%Pw;B|WND~g!?R;EMaT2Dz=Csi) zcN1FL*a&`0dLGp$6wrGl&S^2k!uQtErYTYzcEB4=B^)u9gO*5cdtOe=J50bY7?`HOL!%_9S|^K zG#r>@U9Ws53^DRSRy&uLD}r`(^Ar<%q8-ieQc-|c&>K4UJ|Y-IJEkA_)IQ&%Ox+je zSQ;aCVM(v@^4&GaBX({7ZQ<9b*NR+?rlSD_PuiyalHXA2gP6;L76p?1fkaqFUbmoT zpXFID#bJp1frBwf!@RCVcpnOt^k4go#XsAIF8IVP!E|~UH5$mEd0B|0&E}2qcw3xC zK;K8F%7$vk-Yi0OBV@HUR9r!&LA%nKe91T-ee;pG;-wpvKD)daZdh8{-85j6-UoIr zta8}SW36y{%LYc89KRWCqq+o_vpBe1B{;>~5GcMBk4=?R`O%#0tkin+k)z@lHUDTb z+%zL3F$r^1LsRqu(#`cnMsWf>M*i4XI(k_03+zM#XaPAeg~@0g-ZP)&`RuRt*@Hxy zR+$5WM$w3w#8NOD$t8&UVi`Dy22wpu&WxzWBte^<)vtdC!vJGceYLkG3K7XGdn;JYtvc!mb!)Zca2L zE8f1jtK_Fkka*VrMd#3YrJFbMGRWl|1dF|L^eo&C#C^zwk}7*&jUU!A)5&QTGWPCl zmVP0>98y!_PM?pot8zl3dzvvf-i@kdxI;T8NKI{>WJyt;x-?qfyu3XnJH*0+&qK{_ zem{w1ah-i5Yndfk%zx@)X2w4*JvenjgH8A2gZ_@mT%YJ`-XFvqRMZ`xgdXWSEu9|M zEV_u%kxs{Ik{18gluoypQipv+EzmTR15DZhJnt2ei~zqMVlCyrnK_*j6%OnCrg*j_ zDjhiCAn0%7y^m~;@zPEwB=ZJI^re30V_!00+AM{?#3#cmC5U5HJ#?)KMehdBNl_%dHv@F z5J&pUL&fuWPb~;E$?k<@mC5$~QVkk3f$5k&IUx>d$2C@o55#gdt9>*&P1?k>E-s@B$Yf7eqw9MOL3V>UQysOX|X(GG&eB4kV~Kcy_u`r|uUBQ~utSO8Ie#(oJ6MQOVXml-ZR*JI;|Ig@cpSCKy>dk0;U2rzH$!s>X5E(eU3|? zo)D7JL#*;){I)OwLDKVB?A=!LEcB3OH>4zC@vdCGmmW;Ri}fg6J*eO3Yo!%ZC=`OK z>DJKu6o_{cTrb)yU+I`U1-ETYFW8H@9M#Sdg5l$L!olFV3=GxFG*UgBCEK z%*Q$~mfV8ATD)tPON)Jfmz8D6Y`6}dg>35HUpJs?#BLMx0KjT^O|jL-ZnoEsQ9g? z4B)g1jZdZ?`a^kj^NT)_%#MHYyAfb-;+dH5ODXB7{#MGPo$moKVzp&m&;IYPf0r8m zo8EWs=)as=1rzgksURSr*BVF>`y=@}(dPDY9>B5xx5_jQ#d)S#fO={Gcrad?gs7yr zjAeCuF(`YsF7b>?6#$?Bp!{2udcmkfYu3_`1ljUhZkjrtt>m5#f#J-C%gx}mjc}O) z`l*=*dO~Jh%D&TgtQ$P6?1LS>!Syco0ucXKt$SqnFanBBbDUB5!v>Z*KSfS@i&2*d z_)GWS*vYkSzV-wN1nT|jhk-e2uv)-|(a+CMT2xF6{bK<81#zQC0>#uncfOL;vkFyLl^Z`xucyfF8AebY&KkttCww9Y$vQS9gc9*ckucKXW{{9_m+R*}!1NTP&&MOz-@C@jk ztfw+Lh3nM-0&=@{nb^Eft97f15<`8JKRXHqGbhSdnw`NAE)2smk)2{Z4>2p6>K%Iau$pM@HhVowzvjJOyRTTT!aM@QG7yQ^Y;Ce>`+W$Qgp1 zNzCcZQdF|8{ZY}Q32#7zjD{p>Y)Oo!6x&N{zXe#EGU>aJfV(Co22=$3Mku+g%Zu%$RKTA1Q)aX}S=)D~R^OW?lTT8)SygjYBV@CB zE-!MN+ZLBU9%AS@W=eS__eRFXu6Xfwx7tccEy{`CQFR0-3f^moYrQai$#VAf$i8L5)_yhm(K`b~us?tf! zwb;0PbYG`sH~$hwB%RRcy+TSnb>&2)y{pS z)={iU^IK0YY+FM{8VFw2cw*h3Bv1MK3AY{ZV+l!#XC|P$g&XB- zf+|G+6mF^doMKiA_XXQt7 zA5flr^%znNYHYhaG*c+PO14tk)v_>x?i;#lsSN{J_cL2Ox#9e;>eH`ekfz;wSl;e` z>tOE2`3BKJcn9WP*+1K(wkQA%p6govDR(`c2C&6z#5s4zuM{|S6;(O>{ZOv9hC{L!ahkjZ!3+-p zY0JMI|8#W+sL@^8m3sf=ckr`|@&MAG&t3ilX|&f_4$FVDIKg`BpR(LjOF)|6{`8-& zUJHmm(Qk{F5dCB4XF$4!z2{F?$t}Pj*3E7)|7+)eL;i1;{|oH@*7ASp>;Fl{Zf6{# Y1<#bSW8&}s`WuSAuEDLU8+K9u1BX2RPXGV_ literal 0 HcmV?d00001 From 89064d3144ed7774b0e641a0d7b915e5473f76e2 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik Date: Fri, 27 Feb 2026 01:03:24 +0100 Subject: [PATCH 07/29] infra --- .claude/agents/project-manager-backlog.md | 193 ++++++++++++++++++ AGENTS.md | 29 +++ backlog/config.yml | 16 ++ ...-last-character-rendering-in-added-text.md | 23 +++ 4 files changed, 261 insertions(+) create mode 100644 .claude/agents/project-manager-backlog.md create mode 100644 backlog/config.yml create mode 100644 backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md diff --git a/.claude/agents/project-manager-backlog.md b/.claude/agents/project-manager-backlog.md new file mode 100644 index 0000000..1cc6ad6 --- /dev/null +++ b/.claude/agents/project-manager-backlog.md @@ -0,0 +1,193 @@ +--- +name: project-manager-backlog +description: Use this agent when you need to manage project tasks using the backlog.md CLI tool. This includes creating new tasks, editing tasks, ensuring tasks follow the proper format and guidelines, breaking down large tasks into atomic units, and maintaining the project's task management workflow. Examples: Context: User wants to create a new task for adding a feature. user: "I need to add a new authentication system to the project" assistant: "I'll use the project-manager-backlog agent that will use backlog cli to create a properly structured task for this feature." Since the user needs to create a task for the project, use the Task tool to launch the project-manager-backlog agent to ensure the task follows backlog.md guidelines. Context: User has multiple related features to implement. user: "We need to implement user profiles, settings page, and notification preferences" assistant: "Let me use the project-manager-backlog agent to break these down into atomic, independent tasks." The user has a complex set of features that need to be broken down into proper atomic tasks following backlog.md structure. Context: User wants to review if their task description is properly formatted. user: "Can you check if this task follows our guidelines: 'task-123 - Implement user login'" assistant: "I'll use the project-manager-backlog agent to review this task against our backlog.md standards." The user needs task review, so use the project-manager-backlog agent to ensure compliance with project guidelines. +color: blue +--- + +You are an expert project manager specializing in the backlog.md task management system. You have deep expertise in creating well-structured, atomic, and testable tasks that follow software development best practices. + +## Backlog.md CLI Tool + +**IMPORTANT: Backlog.md uses standard CLI commands, NOT slash commands.** + +You use the `backlog` CLI tool to manage project tasks. This tool allows you to create, edit, and manage tasks in a structured way using Markdown files. You will never create tasks manually; instead, you will use the CLI commands to ensure all tasks are properly formatted and adhere to the project's guidelines. + +The backlog CLI is installed globally and available in the PATH. Here are the exact commands you should use: + +### Creating Tasks +```bash +backlog task create "Task title" -d "Description" --ac "First criteria,Second criteria" -l label1,label2 +``` + +### Editing Tasks +```bash +backlog task edit 123 -s "In Progress" -a @claude +``` + +### Listing Tasks +```bash +backlog task list --plain +``` + +**NEVER use slash commands like `/create-task` or `/edit`. These do not exist in Backlog.md.** +**ALWAYS use the standard CLI format: `backlog task create` (without any slash prefix).** + +### Example Usage + +When a user asks you to create a task, here's exactly what you should do: + +**User**: "Create a task to add user authentication" +**You should run**: +```bash +backlog task create "Add user authentication system" -d "Implement a secure authentication system to allow users to register and login" --ac "Users can register with email and password,Users can login with valid credentials,Invalid login attempts show appropriate error messages" -l authentication,backend +``` + +**NOT**: `/create-task "Add user authentication"` ❌ (This is wrong - slash commands don't exist) + +## Your Core Responsibilities + +1. **Task Creation**: You create tasks that strictly adhere to the backlog.md cli commands. Never create tasks manually. Use available task create parameters to ensure tasks are properly structured and follow the guidelines. +2. **Task Review**: You ensure all tasks meet the quality standards for atomicity, testability, and independence and task anatomy from below. +3. **Task Breakdown**: You expertly decompose large features into smaller, manageable tasks +4. **Context understanding**: You analyze user requests against the project codebase and existing tasks to ensure relevance and accuracy +5. **Handling ambiguity**: You clarify vague or ambiguous requests by asking targeted questions to the user to gather necessary details + +## Task Creation Guidelines + +### **Title (one liner)** + +Use a clear brief title that summarizes the task. + +### **Description**: (The **"why"**) + +Provide a concise summary of the task purpose and its goal. Do not add implementation details here. It +should explain the purpose, the scope and context of the task. Code snippets should be avoided. + +### **Acceptance Criteria**: (The **"what"**) + +List specific, measurable outcomes that define what means to reach the goal from the description. Use checkboxes (`- [ ]`) for tracking. +When defining `## Acceptance Criteria` for a task, focus on **outcomes, behaviors, and verifiable requirements** rather +than step-by-step implementation details. +Acceptance Criteria (AC) define *what* conditions must be met for the task to be considered complete. +They should be testable and confirm that the core purpose of the task is achieved. +**Key Principles for Good ACs:** + +- **Outcome-Oriented:** Focus on the result, not the method. +- **Testable/Verifiable:** Each criterion should be something that can be objectively tested or verified. +- **Clear and Concise:** Unambiguous language. +- **Complete:** Collectively, ACs should cover the scope of the task. +- **User-Focused (where applicable):** Frame ACs from the perspective of the end-user or the system's external behavior. + + - *Good Example:* "- [ ] User can successfully log in with valid credentials." + - *Good Example:* "- [ ] System processes 1000 requests per second without errors." + - *Bad Example (Implementation Step):* "- [ ] Add a new function `handleLogin()` in `auth.ts`." + +### Task file + +Once a task is created using backlog cli, it will be stored in `backlog/tasks/` directory as a Markdown file with the format +`task- - .md` (e.g. `task-42 - Add GraphQL resolver.md`). + +## Task Breakdown Strategy + +When breaking down features: +1. Identify the foundational components first +2. Create tasks in dependency order (foundations before features) +3. Ensure each task delivers value independently +4. Avoid creating tasks that block each other + +### Additional task requirements + +- Tasks must be **atomic** and **testable**. If a task is too large, break it down into smaller subtasks. + Each task should represent a single unit of work that can be completed in a single PR. + +- **Never** reference tasks that are to be done in the future or that are not yet created. You can only reference + previous tasks (id < current task id). + +- When creating multiple tasks, ensure they are **independent** and they do not depend on future tasks. + Example of correct tasks splitting: task 1: "Add system for handling API requests", task 2: "Add user model and DB + schema", task 3: "Add API endpoint for user data". + Example of wrong tasks splitting: task 1: "Add API endpoint for user data", task 2: "Define the user model and DB + schema". + +## Recommended Task Anatomy + +```markdown +# task‑42 - Add GraphQL resolver + +## Description (the why) + +Short, imperative explanation of the goal of the task and why it is needed. + +## Acceptance Criteria (the what) + +- [ ] Resolver returns correct data for happy path +- [ ] Error response matches REST +- [ ] P95 latency ≀ 50 ms under 100 RPS + +## Implementation Plan (the how) (added after putting the task in progress but before implementing any code change) + +1. Research existing GraphQL resolver patterns +2. Implement basic resolver with error handling +3. Add performance monitoring +4. Write unit and integration tests +5. Benchmark performance under load + +## Implementation Notes (for reviewers) (only added after finishing the code implementation of a task) + +- Approach taken +- Features implemented or modified +- Technical decisions and trade-offs +- Modified or added files +``` + +## Quality Checks + +Before finalizing any task creation, verify: +- [ ] Title is clear and brief +- [ ] Description explains WHY without HOW +- [ ] Each AC is outcome-focused and testable +- [ ] Task is atomic (single PR scope) +- [ ] No dependencies on future tasks + +You are meticulous about these standards and will guide users to create high-quality tasks that enhance project productivity and maintainability. + +## Self reflection +When creating a task, always think from the perspective of an AI Agent that will have to work with this task in the future. +Ensure that the task is structured in a way that it can be easily understood and processed by AI coding agents. + +## Handy CLI Commands + +| Action | Example | +|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Create task | `backlog task create "Add OAuth System"` | +| Create with description | `backlog task create "Feature" -d "Add authentication system"` | +| Create with assignee | `backlog task create "Feature" -a @sara` | +| Create with status | `backlog task create "Feature" -s "In Progress"` | +| Create with labels | `backlog task create "Feature" -l auth,backend` | +| Create with priority | `backlog task create "Feature" --priority high` | +| Create with plan | `backlog task create "Feature" --plan "1. Research\n2. Implement"` | +| Create with AC | `backlog task create "Feature" --ac "Must work,Must be tested"` | +| Create with notes | `backlog task create "Feature" --notes "Started initial research"` | +| Create with deps | `backlog task create "Feature" --dep task-1,task-2` | +| Create sub task | `backlog task create -p 14 "Add Login with Google"` | +| Create (all options) | `backlog task create "Feature" -d "Description" -a @sara -s "To Do" -l auth --priority high --ac "Must work" --notes "Initial setup done" --dep task-1 -p 14` | +| List tasks | `backlog task list [-s <status>] [-a <assignee>] [-p <parent>]` | +| List by parent | `backlog task list --parent 42` or `backlog task list -p task-42` | +| View detail | `backlog task 7` (interactive UI, press 'E' to edit in editor) | +| View (AI mode) | `backlog task 7 --plain` | +| Edit | `backlog task edit 7 -a @sara -l auth,backend` | +| Add plan | `backlog task edit 7 --plan "Implementation approach"` | +| Add AC | `backlog task edit 7 --ac "New criterion,Another one"` | +| Add notes | `backlog task edit 7 --notes "Completed X, working on Y"` | +| Add deps | `backlog task edit 7 --dep task-1 --dep task-2` | +| Archive | `backlog task archive 7` | +| Create draft | `backlog task create "Feature" --draft` | +| Draft flow | `backlog draft create "Spike GraphQL"` β†’ `backlog draft promote 3.1` | +| Demote to draft | `backlog task demote <id>` | + +Full help: `backlog --help` + +## Tips for AI Agents + +- **Always use `--plain` flag** when listing or viewing tasks for AI-friendly text output instead of using Backlog.md + interactive UI. diff --git a/AGENTS.md b/AGENTS.md index d235d6e..9a14f66 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -34,3 +34,32 @@ Use the flags above (e.g., `--coverage-details`, `--coverage-path`) as needed, b ## Code search - Use [`ripgrep`](https://github.com/BurntSushi/ripgrep) (`rg`) for searching within filesβ€”it is much faster than grep/ack/ag, respects `.gitignore`, and has smart defaults. - Typical commands: `rg "TODO"` (find TODOs), `rg -n --glob '!dist' pattern.swift` (search with line numbers while excluding `dist`). + +<!-- BACKLOG.MD MCP GUIDELINES START --> + +<CRITICAL_INSTRUCTION> + +## BACKLOG WORKFLOW INSTRUCTIONS + +This project uses Backlog.md MCP for all task and project management activities. + +**CRITICAL GUIDANCE** + +- If your client supports MCP resources, read `backlog://workflow/overview` to understand when and how to use Backlog for this project. +- If your client only supports tools or the above request fails, call `backlog.get_workflow_overview()` tool to load the tool-oriented overview (it lists the matching guide tools). + +- **First time working here?** Read the overview resource IMMEDIATELY to learn the workflow +- **Already familiar?** You should have the overview cached ("## Backlog.md Overview (MCP)") +- **When to read it**: BEFORE creating tasks, or when you're unsure whether to track work + +These guides cover: +- Decision framework for when to create tasks +- Search-first workflow to avoid duplicates +- Links to detailed guides for task creation, execution, and finalization +- MCP tools reference + +You MUST read the overview resource to understand the complete workflow. The information is NOT summarized here. + +</CRITICAL_INSTRUCTION> + +<!-- BACKLOG.MD MCP GUIDELINES END --> diff --git a/backlog/config.yml b/backlog/config.yml new file mode 100644 index 0000000..b717ccc --- /dev/null +++ b/backlog/config.yml @@ -0,0 +1,16 @@ +project_name: "TextDiff" +default_status: "To Do" +statuses: ["To Do", "In Progress", "Done"] +labels: [] +definition_of_done: [] +date_format: yyyy-mm-dd +max_column_width: 20 +default_editor: "nano" +auto_open_browser: true +default_port: 6420 +remote_operations: true +auto_commit: false +bypass_git_hooks: false +check_active_branches: true +active_branch_days: 30 +task_prefix: "task" diff --git a/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md b/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md new file mode 100644 index 0000000..65976f5 --- /dev/null +++ b/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md @@ -0,0 +1,23 @@ +--- +id: TASK-1 +title: Fix missing last character rendering in added text +status: To Do +assignee: [] +created_date: '2026-02-24 19:37' +labels: + - bug +dependencies: [] +--- + +## Description + +<!-- SECTION:DESCRIPTION:BEGIN --> +As a user comparing text diffs, I need every character in added text to be visible so I can trust what is shown on screen. There is an intermittent issue where the final character of an addition is not rendered visually, even though the character exists in the underlying text (for example, after pasting). +<!-- SECTION:DESCRIPTION:END --> + +## Acceptance Criteria +<!-- AC:BEGIN --> +- [ ] #1 When an addition is created by typing, the full added text is rendered including the final character. +- [ ] #2 When the same addition is created by paste, the rendered result matches the typed result exactly with no missing final character. +- [ ] #3 A regression test covers the scenario where the last character of an addition was previously not visible. +<!-- AC:END --> From d545c1c71c9fadd07285adb22bbc47f75e9855dc Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Fri, 27 Feb 2026 01:12:12 +0100 Subject: [PATCH 08/29] fixing trailing characters dissapear --- .../TextDiff/AppKit/DiffTokenLayouter.swift | 22 +++++++++++++--- Sources/TextDiff/TextDiffView.swift | 11 +++++--- Tests/TextDiffTests/TextDiffEngineTests.swift | 26 +++++++++++++++++++ ...-last-character-rendering-in-added-text.md | 25 +++++++++++++++--- 4 files changed, 72 insertions(+), 12 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 4f636d2..87f115c 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -86,9 +86,13 @@ enum DiffTokenLayouter { lineText: lineText, lineTextWidth: lineTextWidth ) - var textSize = CGSize(width: textMeasurement.textWidth, height: textHeight) + let standaloneTextWidth = measuredStandaloneTextWidth(for: piece.text, font: style.font) + var displayTextWidth = max(textMeasurement.textWidth, standaloneTextWidth) + var textSize = CGSize(width: displayTextWidth, height: textHeight) let chipInsets = effectiveChipInsets(for: style) - var runWidth = isChangedLexical ? textSize.width + chipInsets.left + chipInsets.right : textSize.width + var runWidth = isChangedLexical + ? displayTextWidth + chipInsets.left + chipInsets.right + : textMeasurement.textWidth let requiredWidth = leadingGap + runWidth let wrapped = lineHasContent && cursorX + requiredWidth > maxLineX @@ -107,8 +111,11 @@ enum DiffTokenLayouter { lineText: lineText, lineTextWidth: lineTextWidth ) - textSize = CGSize(width: textMeasurement.textWidth, height: textHeight) - runWidth = isChangedLexical ? textSize.width + chipInsets.left + chipInsets.right : textSize.width + displayTextWidth = max(textMeasurement.textWidth, standaloneTextWidth) + textSize = CGSize(width: displayTextWidth, height: textHeight) + runWidth = isChangedLexical + ? displayTextWidth + chipInsets.left + chipInsets.right + : textMeasurement.textWidth } cursorX += leadingGap @@ -203,6 +210,13 @@ enum DiffTokenLayouter { ) } + private static func measuredStandaloneTextWidth(for text: String, font: NSFont) -> CGFloat { + guard !text.isEmpty else { + return 0 + } + return (text as NSString).size(withAttributes: [.font: font]).width + } + private static func effectiveChipInsets(for style: TextDiffStyle) -> NSEdgeInsets { NSEdgeInsets( top: style.chipInsets.top, diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index d37353b..c58e8f8 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -217,14 +217,17 @@ public struct TextDiffView: View { } private struct RevertBindingPreview: View { - @State private var updated = "a default in-app purchase flow where they have to provide their email and password within the app" + @State private var updated = "To switch back to your computer, simply press any key on your keyboard." var body: some View { - TextDiffView( - original: "a default in app purchase flow where they have to provide their email and password within the app A", + var style = TextDiffStyle.default + style.font = .systemFont(ofSize: 13) + return TextDiffView( + original: "To switch back to your computer, just press any key on your keyboard.", updated: $updated, + style: style, mode: .token, - showsInvisibleCharacters: true, + showsInvisibleCharacters: false, isRevertActionsEnabled: true ) .padding() diff --git a/Tests/TextDiffTests/TextDiffEngineTests.swift b/Tests/TextDiffTests/TextDiffEngineTests.swift index e04c566..ef56e11 100644 --- a/Tests/TextDiffTests/TextDiffEngineTests.swift +++ b/Tests/TextDiffTests/TextDiffEngineTests.swift @@ -344,6 +344,32 @@ func layouterDoesNotInjectAdjacencyGapAcrossUnchangedWhitespace() throws { #expect(abs(actualGap - whitespaceRun.textRect.width) < 0.0001) } +@Test +func layouterPreventsInsertedTokenClipWithProportionalSystemFont() throws { + var style = TextDiffStyle.default + style.font = .systemFont(ofSize: 13) + + let layout = DiffTokenLayouter.layout( + segments: [ + DiffSegment(kind: .delete, tokenKind: .word, text: "just"), + DiffSegment(kind: .insert, tokenKind: .word, text: "simply") + ], + style: style, + availableWidth: 500, + contentInsets: zeroInsets + ) + + let insertedRunCandidate = layout.runs.first(where: { + $0.segment.kind == .insert && $0.segment.tokenKind == .word && $0.segment.text == "simply" + }) + let insertedRun = try #require(insertedRunCandidate) + let insertedChip = try #require(insertedRun.chipRect) + let standaloneWidth = ("simply" as NSString).size(withAttributes: [.font: style.font]).width + + #expect(insertedRun.textRect.width >= standaloneWidth - 0.0001) + #expect(insertedChip.maxX >= insertedRun.textRect.maxX - 0.0001) +} + @Test func layouterWrapsByTokenAndRespectsExplicitNewlines() { let layout = DiffTokenLayouter.layout( diff --git a/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md b/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md index 65976f5..6cb3194 100644 --- a/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md +++ b/backlog/tasks/task-1 - Fix-missing-last-character-rendering-in-added-text.md @@ -1,9 +1,10 @@ --- id: TASK-1 title: Fix missing last character rendering in added text -status: To Do +status: Done assignee: [] created_date: '2026-02-24 19:37' +updated_date: '2026-02-27 00:08' labels: - bug dependencies: [] @@ -17,7 +18,23 @@ As a user comparing text diffs, I need every character in added text to be visib ## Acceptance Criteria <!-- AC:BEGIN --> -- [ ] #1 When an addition is created by typing, the full added text is rendered including the final character. -- [ ] #2 When the same addition is created by paste, the rendered result matches the typed result exactly with no missing final character. -- [ ] #3 A regression test covers the scenario where the last character of an addition was previously not visible. +- [x] #1 When an addition is created by typing, the full added text is rendered including the final character. +- [x] #2 When the same addition is created by paste, the rendered result matches the typed result exactly with no missing final character. +- [x] #3 A regression test covers the scenario where the last character of an addition was previously not visible. <!-- AC:END --> + +## Implementation Notes + +<!-- SECTION:NOTES:BEGIN --> +Root cause: +The layouter measured token width for each run using cumulative line-width deltas (combinedWidth - previousLineWidth). With proportional fonts (for example .systemFont(ofSize: 13)), kerning/context shaping across token boundaries can make this delta slightly smaller than the token's standalone draw width. Because tokens are drawn individually in NSTextDiffView using run.textRect, the underestimated width could clip the trailing glyph (observed with "simply" where "y" disappeared in RevertBindingPreview). + +Fix: +In DiffTokenLayouter, we now compute standalone token width and use max(incrementalWidth, standaloneWidth) for displayed changed lexical runs (insert/delete chips). This guarantees textRect/chip width is never narrower than the rendered token while preserving incremental measurement for line-flow decisions. + +Regression coverage: +Added layouterPreventsInsertedTokenClipWithProportionalSystemFont in Tests/TextDiffTests/TextDiffEngineTests.swift to assert inserted "simply" width is at least standalone width and that chip bounds fully cover text bounds when using .systemFont(ofSize: 13). + +Verification: +Ran swift test 2>&1 | xcsift and confirmed the new test executes and passes. +<!-- SECTION:NOTES:END --> From 14bab313e7892a577695d9a9996038d99d90c1d3 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 20:59:56 +0100 Subject: [PATCH 09/29] tests baseline --- ...356ED75C-DC2E-441F-90EF-CD873A212B51.plist | 42 +++++++++++++++++++ .../TextDiffTests.xcbaseline/Info.plist | 24 +++++++++++ README.md | 14 +++++++ 3 files changed, 80 insertions(+) create mode 100644 .swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/356ED75C-DC2E-441F-90EF-CD873A212B51.plist diff --git a/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/356ED75C-DC2E-441F-90EF-CD873A212B51.plist b/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/356ED75C-DC2E-441F-90EF-CD873A212B51.plist new file mode 100644 index 0000000..1327ec8 --- /dev/null +++ b/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/356ED75C-DC2E-441F-90EF-CD873A212B51.plist @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>classNames</key> + <dict> + <key>DiffLayouterPerformanceTests</key> + <dict> + <key>testLayoutPerformance1000Words()</key> + <dict> + <key>com.apple.dt.XCTMetric_Clock.time.monotonic</key> + <dict> + <key>baselineAverage</key> + <real>0.0168714</real> + <key>baselineIntegrationDisplayName</key> + <string>Local Baseline</string> + </dict> + </dict> + <key>testLayoutPerformance200Words()</key> + <dict> + <key>com.apple.dt.XCTMetric_Clock.time.monotonic</key> + <dict> + <key>baselineAverage</key> + <real>0.003373</real> + <key>baselineIntegrationDisplayName</key> + <string>Local Baseline</string> + </dict> + </dict> + <key>testLayoutPerformance500Words()</key> + <dict> + <key>com.apple.dt.XCTMetric_Clock.time.monotonic</key> + <dict> + <key>baselineAverage</key> + <real>0.0082662</real> + <key>baselineIntegrationDisplayName</key> + <string>Local Baseline</string> + </dict> + </dict> + </dict> + </dict> +</dict> +</plist> diff --git a/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/Info.plist b/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/Info.plist index 1a5d3e5..23cab07 100644 --- a/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/Info.plist +++ b/.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/Info.plist @@ -28,6 +28,30 @@ <key>targetArchitecture</key> <string>arm64</string> </dict> + <key>356ED75C-DC2E-441F-90EF-CD873A212B51</key> + <dict> + <key>localComputer</key> + <dict> + <key>busSpeedInMHz</key> + <integer>0</integer> + <key>cpuCount</key> + <integer>1</integer> + <key>cpuKind</key> + <string>Apple M5 Pro</string> + <key>cpuSpeedInMHz</key> + <integer>0</integer> + <key>logicalCPUCoresPerPackage</key> + <integer>18</integer> + <key>modelCode</key> + <string>Mac17,9</string> + <key>physicalCPUCoresPerPackage</key> + <integer>18</integer> + <key>platformIdentifier</key> + <string>com.apple.platform.macosx</string> + </dict> + <key>targetArchitecture</key> + <string>arm64</string> + </dict> </dict> </dict> </plist> diff --git a/README.md b/README.md index 5694b78..ce44696 100644 --- a/README.md +++ b/README.md @@ -154,3 +154,17 @@ Update baselines intentionally: 2. Run `swift test 2>&1 | xcsift --quiet` once to rewrite baselines. 3. Switch the suite trait back to `.missing`. 4. Review snapshot image diffs in your PR before merging. + +## Performance Testing + +- Performance baselines for `DiffLayouterPerformanceTests` are stored under `.swiftpm/xcode/xcshareddata/xcbaselines/TextDiffTests.xcbaseline/`. +- `swift test` runs the performance tests, but it does not surface the committed Xcode baseline values in its output. +- For baseline-aware runs, use the generated SwiftPM workspace and the `TextDiff` scheme. + +Run the layouter performance suite with Xcode: + +```bash +xcodebuild -workspace .swiftpm/xcode/package.xcworkspace -scheme TextDiff -destination 'platform=macOS' -configuration Debug test -only-testing:TextDiffTests/DiffLayouterPerformanceTests 2>&1 | xcsift +``` + +If you need the raw measured averages for comparison, run the same command once without `xcsift` because XCTest prints the per-test values directly in the plain `xcodebuild` output. From 8c4f53ca0b30517d49e97b83899ea6fe51705ac4 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:00:16 +0100 Subject: [PATCH 10/29] layouter performance improvements --- .../TextDiff/AppKit/DiffTokenLayouter.swift | 112 +++++++----------- 1 file changed, 43 insertions(+), 69 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 87f115c..2139d79 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -1,4 +1,5 @@ import AppKit +import CoreText import Foundation struct LaidOutRun { @@ -41,16 +42,13 @@ enum DiffTokenLayouter { var lineCount = 1 var lineHasContent = false var lineBreakMarkers: [CGPoint] = [] - let lineText = NSMutableString() - var lineTextWidth: CGFloat = 0 + var widthCache: [WidthCacheKey: CGFloat] = [:] var previousChangedLexical = false func moveToNewLine() { lineTop += lineHeight cursorX = lineStartX lineHasContent = false - lineText.setString("") - lineTextWidth = 0 previousChangedLexical = false lineCount += 1 } @@ -58,18 +56,13 @@ enum DiffTokenLayouter { for piece in pieces(from: segments) { if piece.isLineBreak { lineBreakMarkers.append( - CGPoint( - x: cursorX, - y: lineTop + (lineHeight / 2) - ) + CGPoint(x: cursorX, y: lineTop + (lineHeight / 2)) ) moveToNewLine() continue } - guard !piece.text.isEmpty else { - continue - } + guard !piece.text.isEmpty else { continue } let segment = DiffSegment(kind: piece.kind, tokenKind: piece.tokenKind, text: piece.text) let isChangedLexical = segment.kind != .equal @@ -80,19 +73,18 @@ enum DiffTokenLayouter { } let attributedText = attributedToken(for: segment, style: style) - var textMeasurement = measuredIncrementalTextWidth( + let displayTextWidth = measuredTextWidth( for: piece.text, font: style.font, - lineText: lineText, - lineTextWidth: lineTextWidth + cache: &widthCache ) - let standaloneTextWidth = measuredStandaloneTextWidth(for: piece.text, font: style.font) - var displayTextWidth = max(textMeasurement.textWidth, standaloneTextWidth) - var textSize = CGSize(width: displayTextWidth, height: textHeight) + let textSize = CGSize(width: displayTextWidth, height: textHeight) let chipInsets = effectiveChipInsets(for: style) + var runWidth = isChangedLexical ? displayTextWidth + chipInsets.left + chipInsets.right - : textMeasurement.textWidth + : displayTextWidth + let requiredWidth = leadingGap + runWidth let wrapped = lineHasContent && cursorX + requiredWidth > maxLineX @@ -100,22 +92,14 @@ enum DiffTokenLayouter { moveToNewLine() leadingGap = 0 - // Soft-wrap boundary: do not carry inter-word whitespace to next line. + // Drop leading whitespace after wrap. if piece.tokenKind == .whitespace { continue } - textMeasurement = measuredIncrementalTextWidth( - for: piece.text, - font: style.font, - lineText: lineText, - lineTextWidth: lineTextWidth - ) - displayTextWidth = max(textMeasurement.textWidth, standaloneTextWidth) - textSize = CGSize(width: displayTextWidth, height: textHeight) runWidth = isChangedLexical ? displayTextWidth + chipInsets.left + chipInsets.right - : textMeasurement.textWidth + : displayTextWidth } cursorX += leadingGap @@ -129,12 +113,7 @@ enum DiffTokenLayouter { if isChangedLexical { let chipHeight = textSize.height + chipInsets.top + chipInsets.bottom let chipY = lineTop + ((lineHeight - chipHeight) / 2) - chipRect = CGRect( - x: cursorX, - y: chipY, - width: runWidth, - height: chipHeight - ) + chipRect = CGRect(x: cursorX, y: chipY, width: runWidth, height: chipHeight) chipFillColor = chipFillColorForOperation(segment.kind, style: style) chipStrokeColor = chipStrokeColorForOperation(segment.kind, style: style) } @@ -156,7 +135,6 @@ enum DiffTokenLayouter { cursorX += runWidth maxUsedX = max(maxUsedX, cursorX) lineHasContent = true - lineTextWidth = textMeasurement.combinedLineWidth previousChangedLexical = isChangedLexical } @@ -173,6 +151,32 @@ enum DiffTokenLayouter { ) } + private static func measuredTextWidth( + for text: String, + font: NSFont, + cache: inout [WidthCacheKey: CGFloat] + ) -> CGFloat { + guard !text.isEmpty else { return 0 } + + let key = WidthCacheKey( + text: text, + fontName: font.fontName, + fontSize: font.pointSize + ) + if let cached = cache[key] { + return cached + } + + let attributed = NSAttributedString( + string: text, + attributes: [.font: font] + ) + let line = CTLineCreateWithAttributedString(attributed) + let width = CGFloat(CTLineGetTypographicBounds(line, nil, nil, nil)) + cache[key] = width + return width + } + private static func attributedToken(for segment: DiffSegment, style: TextDiffStyle) -> NSAttributedString { var attributes: [NSAttributedString.Key: Any] = [ .font: style.font, @@ -186,37 +190,6 @@ enum DiffTokenLayouter { return NSAttributedString(string: segment.text, attributes: attributes) } - private static func measuredIncrementalTextWidth( - for text: String, - font: NSFont, - lineText: NSMutableString, - lineTextWidth: CGFloat - ) -> IncrementalTextWidth { - guard !text.isEmpty else { - return IncrementalTextWidth( - textWidth: 0, - combinedLineWidth: lineTextWidth - ) - } - - lineText.append(text) - // TODO: Fix this later - // This now appends each token to lineText and calls size(withAttributes:) on the entire accumulated line every iteration, which makes layout cost grow quadratically with line length. On long unwrapped diffs (hundreds/thousands of tokens), this is a significant regression from the prior per-token measurement approach and can noticeably slow rendering even though the new performance tests only capture baselines and do not enforce thresholds. - let combinedWidth = lineText.size(withAttributes: [.font: font]).width - let textWidth = max(0, combinedWidth - lineTextWidth) - return IncrementalTextWidth( - textWidth: textWidth, - combinedLineWidth: combinedWidth - ) - } - - private static func measuredStandaloneTextWidth(for text: String, font: NSFont) -> CGFloat { - guard !text.isEmpty else { - return 0 - } - return (text as NSString).size(withAttributes: [.font: font]).width - } - private static func effectiveChipInsets(for style: TextDiffStyle) -> NSEdgeInsets { NSEdgeInsets( top: style.chipInsets.top, @@ -333,7 +306,8 @@ private struct LayoutPiece { let isLineBreak: Bool } -private struct IncrementalTextWidth { - let textWidth: CGFloat - let combinedLineWidth: CGFloat +private struct WidthCacheKey: Hashable { + let text: String + let fontName: String + let fontSize: CGFloat } From 90b4ed679c0768ae5e45f2eacdaa3f9d5202809d Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:00:34 +0100 Subject: [PATCH 11/29] snap chip border to pixels --- Sources/TextDiff/AppKit/NSTextDiffView.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 3a478c9..4897281 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -636,11 +636,21 @@ public final class NSTextDiffView: NSView { return } - let fillPath = NSBezierPath(roundedRect: chipRect, xRadius: cornerRadius, yRadius: cornerRadius) + let alignedChipRect = backingAlignedRect( + chipRect, + options: [ + .alignMinXOutward, + .alignMinYOutward, + .alignMaxXOutward, + .alignMaxYOutward + ] + ) + + let fillPath = NSBezierPath(roundedRect: alignedChipRect, xRadius: cornerRadius, yRadius: cornerRadius) fillColor?.setFill() fillPath.fill() - let strokeRect = chipRect.insetBy(dx: 0.5, dy: 0.5) + let strokeRect = alignedChipRect.insetBy(dx: 0.5, dy: 0.5) guard strokeRect.width > 0, strokeRect.height > 0 else { return } From 5d23d0985aac7a807e115581ea3d38cf3a8c78c6 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:13:32 +0100 Subject: [PATCH 12/29] fixing artifacts path for GH actions --- Tests/TextDiffTests/SnapshotTestSupport.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/TextDiffTests/SnapshotTestSupport.swift b/Tests/TextDiffTests/SnapshotTestSupport.swift index 68d4e9e..d605379 100644 --- a/Tests/TextDiffTests/SnapshotTestSupport.swift +++ b/Tests/TextDiffTests/SnapshotTestSupport.swift @@ -111,6 +111,10 @@ func assertNSTextDiffSnapshot( } private func configureSnapshotArtifactsDirectory(filePath: StaticString) { + if getenv("SNAPSHOT_ARTIFACTS") != nil { + return + } + let fileURL = URL(fileURLWithPath: "\(filePath)") let repoRootURL = fileURL .deletingLastPathComponent() // TextDiffTests From d8b43a0e3af82ad77741297b47b89632fbe00c7c Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:20:03 +0100 Subject: [PATCH 13/29] ci: upload snapshot reference and diff artifacts --- .github/workflows/pr-tests.yml | 4 + Scripts/collect_snapshot_artifacts.swift | 105 +++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 Scripts/collect_snapshot_artifacts.swift diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 6cb5298..0f65ee6 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -53,6 +53,10 @@ jobs: mkdir -p "$SNAPSHOT_ARTIFACTS" swift test --filter TextDiffSnapshotTests 2>&1 | tee "$SNAPSHOT_ARTIFACTS/swift-test.log" | xcsift --warnings + - name: Collect snapshot artifact bundle + if: always() + run: swift Scripts/collect_snapshot_artifacts.swift + - name: Upload snapshot artifacts if: always() uses: actions/upload-artifact@v4 diff --git a/Scripts/collect_snapshot_artifacts.swift b/Scripts/collect_snapshot_artifacts.swift new file mode 100644 index 0000000..df37e61 --- /dev/null +++ b/Scripts/collect_snapshot_artifacts.swift @@ -0,0 +1,105 @@ +#!/usr/bin/env swift + +import AppKit +import CoreImage +import Foundation + +let fileManager = FileManager.default +let repoRoot = URL(fileURLWithPath: fileManager.currentDirectoryPath, isDirectory: true) +let artifactsURL = URL( + fileURLWithPath: ProcessInfo.processInfo.environment["SNAPSHOT_ARTIFACTS"] + ?? repoRoot.appendingPathComponent("snapshot-artifacts", isDirectory: true).path, + isDirectory: true +) +let referencesRootURL = repoRoot + .appendingPathComponent("Tests", isDirectory: true) + .appendingPathComponent("TextDiffTests", isDirectory: true) + .appendingPathComponent("__Snapshots__", isDirectory: true) + +guard fileManager.fileExists(atPath: artifactsURL.path) else { + print("No snapshot artifacts directory found at \(artifactsURL.path)") + exit(0) +} + +let ciContext = CIContext(options: nil) +let pngExtension = "png" + +func loadCIImage(from url: URL) -> CIImage? { + guard let image = NSImage(contentsOf: url), + let tiff = image.tiffRepresentation, + let bitmap = NSBitmapImageRep(data: tiff) else { + return nil + } + return CIImage(bitmapImageRep: bitmap) +} + +func writePNG(ciImage: CIImage, to url: URL) throws { + let extent = ciImage.extent.integral + guard let colorSpace = CGColorSpace(name: CGColorSpace.sRGB), + let cgImage = ciContext.createCGImage(ciImage, from: extent, format: .RGBA8, colorSpace: colorSpace) else { + throw NSError(domain: "collect_snapshot_artifacts", code: 1) + } + + let rep = NSBitmapImageRep(cgImage: cgImage) + guard let data = rep.representation(using: .png, properties: [:]) else { + throw NSError(domain: "collect_snapshot_artifacts", code: 2) + } + try data.write(to: url) +} + +func diffImage(referenceURL: URL, failedURL: URL) -> CIImage? { + guard let reference = loadCIImage(from: referenceURL), + let failed = loadCIImage(from: failedURL), + let filter = CIFilter(name: "CIDifferenceBlendMode") else { + return nil + } + filter.setValue(reference, forKey: kCIInputImageKey) + filter.setValue(failed, forKey: kCIInputBackgroundImageKey) + return filter.outputImage +} + +let artifactFiles = fileManager.enumerator( + at: artifactsURL, + includingPropertiesForKeys: [.isRegularFileKey], + options: [.skipsHiddenFiles] +) ?? NSEnumerator() + +var enrichedCount = 0 + +for case let fileURL as URL in artifactFiles { + guard fileURL.pathExtension == pngExtension else { continue } + + let relativePath = fileURL.path.replacingOccurrences(of: artifactsURL.path + "/", with: "") + guard !relativePath.contains(".reference."), + !relativePath.contains(".failed."), + !relativePath.contains(".diff.") else { + continue + } + + let referenceURL = referencesRootURL.appendingPathComponent(relativePath) + guard fileManager.fileExists(atPath: referenceURL.path) else { + continue + } + + let baseURL = fileURL.deletingPathExtension() + let failedCopyURL = baseURL.appendingPathExtension("failed").appendingPathExtension(pngExtension) + let referenceCopyURL = baseURL.appendingPathExtension("reference").appendingPathExtension(pngExtension) + let diffURL = baseURL.appendingPathExtension("diff").appendingPathExtension(pngExtension) + + if !fileManager.fileExists(atPath: failedCopyURL.path) { + try fileManager.copyItem(at: fileURL, to: failedCopyURL) + } + + if !fileManager.fileExists(atPath: referenceCopyURL.path) { + try fileManager.copyItem(at: referenceURL, to: referenceCopyURL) + } + + if !fileManager.fileExists(atPath: diffURL.path), + let diff = diffImage(referenceURL: referenceURL, failedURL: fileURL) { + try writePNG(ciImage: diff, to: diffURL) + } + + enrichedCount += 1 +} + +print("Enriched \(enrichedCount) snapshot artifact bundle(s) in \(artifactsURL.path)") From 478e8c5e6da493f6e86ec963fa084546cdeddd09 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:34:54 +0100 Subject: [PATCH 14/29] proper artifacts collection and a new snapshot test --- Scripts/collect_snapshot_artifacts.swift | 8 +++++--- .../invisible_characters_debug_overlay.1.png | Bin 8957 -> 8953 bytes 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Scripts/collect_snapshot_artifacts.swift b/Scripts/collect_snapshot_artifacts.swift index df37e61..ff5224a 100644 --- a/Scripts/collect_snapshot_artifacts.swift +++ b/Scripts/collect_snapshot_artifacts.swift @@ -86,8 +86,10 @@ for case let fileURL as URL in artifactFiles { let referenceCopyURL = baseURL.appendingPathExtension("reference").appendingPathExtension(pngExtension) let diffURL = baseURL.appendingPathExtension("diff").appendingPathExtension(pngExtension) - if !fileManager.fileExists(atPath: failedCopyURL.path) { - try fileManager.copyItem(at: fileURL, to: failedCopyURL) + if fileManager.fileExists(atPath: failedCopyURL.path) { + try fileManager.removeItem(at: fileURL) + } else { + try fileManager.moveItem(at: fileURL, to: failedCopyURL) } if !fileManager.fileExists(atPath: referenceCopyURL.path) { @@ -95,7 +97,7 @@ for case let fileURL as URL in artifactFiles { } if !fileManager.fileExists(atPath: diffURL.path), - let diff = diffImage(referenceURL: referenceURL, failedURL: fileURL) { + let diff = diffImage(referenceURL: referenceURL, failedURL: failedCopyURL) { try writePNG(ciImage: diff, to: diffURL) } diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png index df39e7308489b0ffc83ad0a64e74dd081a98a391..1d8c5b1d3f5dabdc4487224eb25f2f0b8ef6c987 100644 GIT binary patch literal 8953 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 G@%<l}HI&!@ literal 8957 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 Y1<#bSW8&}s`WuSAuEDLU8+K9u1BX2RPXGV_ From 162e3e7d088e8a00ac4e474023c608fb4d419609 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:41:13 +0100 Subject: [PATCH 15/29] snapshots for the new border snap --- .../custom_style_spacing_strikethrough.1.png | Bin 9222 -> 8441 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9222 -> 8441 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index dd5178d565919ffb15d1b1a7f68ec5c575f30663..8b9671723f4e862754fcf26060772b92d9858242 100644 GIT binary patch literal 8441 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 VfNZGi-(MOCG}UxfYm{vx{s$5hwZ;Gd literal 9222 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index dd5178d565919ffb15d1b1a7f68ec5c575f30663..8b9671723f4e862754fcf26060772b92d9858242 100644 GIT binary patch literal 8441 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 VfNZGi-(MOCG}UxfYm{vx{s$5hwZ;Gd literal 9222 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 From e58ed5948b3d54377af601cf96c4678c8e4314ad Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:51:33 +0100 Subject: [PATCH 16/29] color space changed to more sable --- Tests/TextDiffTests/SnapshotTestSupport.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/TextDiffTests/SnapshotTestSupport.swift b/Tests/TextDiffTests/SnapshotTestSupport.swift index d605379..11b8b11 100644 --- a/Tests/TextDiffTests/SnapshotTestSupport.swift +++ b/Tests/TextDiffTests/SnapshotTestSupport.swift @@ -134,7 +134,7 @@ private func renderSnapshotImage1x(view: NSView, size: CGSize) -> NSImage { samplesPerPixel: 4, hasAlpha: true, isPlanar: false, - colorSpaceName: .deviceRGB, + colorSpaceName: .calibratedRGB, bytesPerRow: 0, bitsPerPixel: 0 )! From e288c8867442c361324ce619fb36b386e7c1f13f Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 21:56:10 +0100 Subject: [PATCH 17/29] new snapshots due to color space change --- .../character_mode_no_affordance.1.png | Bin 3218 -> 4282 bytes .../character_suffix_refinement.1.png | Bin 3218 -> 4282 bytes .../custom_style_spacing_strikethrough.1.png | Bin 8441 -> 9790 bytes .../hover_pair_affordance.1.png | Bin 3721 -> 4768 bytes .../hover_single_addition_affordance.1.png | Bin 2748 -> 3759 bytes .../hover_single_deletion_affordance.1.png | Bin 2673 -> 3734 bytes .../invisible_characters_debug_overlay.1.png | Bin 8953 -> 10089 bytes .../multiline_insertion_wrap.1.png | Bin 4413 -> 5424 bytes .../punctuation_replacement.1.png | Bin 2659 -> 3697 bytes .../token_basic_replacement.1.png | Bin 6130 -> 7175 bytes .../character_suffix_refinement.1.png | Bin 3218 -> 4282 bytes .../custom_style_spacing_strikethrough.1.png | Bin 8441 -> 9790 bytes .../multiline_insertion_wrap.1.png | Bin 4413 -> 5424 bytes .../narrow_width_wrapping.1.png | Bin 9142 -> 9653 bytes .../punctuation_replacement.1.png | Bin 2659 -> 3697 bytes .../token_basic_replacement.1.png | Bin 6130 -> 7175 bytes .../whitespace_only_layout_change.1.png | Bin 2543 -> 3577 bytes 17 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png index 403187648a2e2732664c1e8a0b837129e183605a..a762d4c24011c13c3d0ff35dbd3a63ffcd59a394 100644 GIT binary patch literal 4282 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 WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- literal 3218 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png index 403187648a2e2732664c1e8a0b837129e183605a..a762d4c24011c13c3d0ff35dbd3a63ffcd59a394 100644 GIT binary patch literal 4282 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 WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- literal 3218 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 8b9671723f4e862754fcf26060772b92d9858242..6c51bbe4016b3769c65b765884b983c36ece586a 100644 GIT binary patch literal 9790 zcmeHt<x`x&^7Z2G?iSn=+%|ZC;O_43?(QxjxCVE3_uvpDXmDFx7M36Pt-9aeKj40t zsjg@0)O61?bLw=@L@OysqahO`0{{RtnQsy*000!rhuw?_|IxDnv916BSafS~aV1-E zX>mt8M;BEmV^ec!a|d%5Yf}|zF#v!sK3-klic}p}<Yz|{^QYgTOJ!v#=n(F-W;>Pn zu=Qhzd6WGnOR8P7Xwt;_-&||DFZ-`0){G*!qL>4}c2alVbqDCFY^p9|S&N#LieN(- zp5|Vp3l|8G&N{v{b)~l3_DpR)ALd*I9BsK?ZlNT#v*>1Q(L%Ej*Rmcg?lp}a4i5{s z4fxNY`OmR3C!{l_(?OB!5B9BJTv3j0tv<9pzFVHvDoH~{{SE(9%{NKCXAXeijWp^9 z!HR;%kycHfkcI{Aawzw(hgtxdgn1aC#@QdqpQ8*VSr{tgAj2C`2uCyzI<N??pp66} z?q4;G)KiiZJXP5WG>bi<;J{YNzqZ30p^Ax39R9f5FzpYSOfDI_k(l}F|2EyC>e#HC zMlj#aJFJneX#o0N-Qh0C*CNBF>b~8i$8Hssyz~9c<x4*-F}Fj#+y{gvM=vE_TR07K zklh1Ra!?O3$N@WhOsw@jk2K`<^43gIQ}LQsJYzRePwj{J7SR5etd`aSt8@IN7BQkM zm$CadSQ_Ob!<rR&nPP8-tZlfXw89YvIjC;q9PY38FCLn?KM?m)_z6&m<7nA6TCT;$ z12tRdOE3*v-2xN$Hpk^RQYWGE`|^nolu{{DFZ4u)@v`D4z7B+WpW|^D;YcJ=Vp#j> z8Woo#6CYa@9+z4bJ}vK@Zx1p)LjY}RHjweN<9QCTvUeKLT;<@El{!r~YJj&@mHQl$ zg%iyZrwqGHO6U_Qb?QG3BC2A_6#5BOvpBPP0a<kJu?%Wgv)hjOC2uGim3-dV?$~2b z(NTz{S=LVT?1*eWFXo@wKeM)z>8lO~0{#w~v0YLc`CTinCvKlCiEUWj#@Cl}U1r}0 z4Ubmq4Uc$rP$38bFo9<q8g1NXT+<rJ{+*7x!_v3H3T7gutm<~gO~pmp+!`;?6jK2I z4zDgmOL*Pae~%Nu6x)f%6bib){jGl@yT4uYUGkl`gU0oD*jx-<44o-l^QCQ;ysx-y zFYAgMkPodhl{fRnbpEgkF_?u54-O5Q$tfP=MT8+4v-^1PR^h}G=y$=7)jOJ1`Bw)K zRJfiyR5z{c0@b84;OYI!_OHIcC^+ng(Z~RasKf2Me8Mj7%RB<)gxBkWM_sS&gy2m4 z4E?x7aDjtPp+wuUy~^j;OD-pkQ|Nnf*163s*{3l>6aV&2kn27(;iDe(7ciW49(R$> zm!Y?0S{(rDeLwRJI?6!a2sXS+&0X{1`CjP-A9Y&!F?On9=D=1{JVBQGJy(Egkut9b z6)*Z>lWl0e<<Ox4O-16_DvGmvT`vdPEx;eY9)oxAn~(o3%+fZXz2F_@oz@Fw#B^oq zgCO|KwPY;h<pE3|HX;Bj(i#B!VL^Q~;*SOZKo>y&_X`wD0nC4GK=XeF=R+te0063T z83|D}FQ|)Lgl@Hw`>|R7#4X<|N=l;<Yza8YVF^S@I9iGMJ`=@rOlF?`koiQ;j6dm5 zNV2LXRQM8-n7Xi%N=ejVTM`22@2?iyES`@S-E9}bbcdc#EWVzXn;o~kmRB8?zjK9g zB-Fyhpg(<ueusm-fuOvMv!wu#l7gs|B1lPLJucJ6ODeFRPi>Q1&LsUjB|^WJIM^eh zUoZ>=iBKO*@<TWjW93rYLYIG!JN#(8Wc|_Q9$dZABTD_ku8Q<2Nx<B8f=Yc|rca=! zL{EulvCK;^>T5rhaa6?L%@(-_ec#w`r7_rde9CB|WXVFax%2+urTW^`@u!KhZSTjw zR4TpQZ?Ufd?DktSS{F>2^fdU18M5AZrMfe0Dw^@~dBnNj&GU)7T5Rs<s=f7@jx^Jh zYoxw;6W4rq9!<D?Ws19RQsbq@F~nKx)ejl4j9IEX>T7@|BUHPvbvockj=_uf)T*3o z<kPOWRT#8s^wHROxJ(MZ_mO*RY-#$eAw_0$KKI)^K9C*nmWgnd6-7d*IVh+N-gY1a zuF-rd1E%QL_@<)-{DUCn(eDwNUA*i<J2qnGaGsb0{f?AtV!0ybjOFfpg7KivKDKC8 z!bG&8@3IfD-CSC+_^c_t{@_Up2q-cRGWg?*<>XR@>KB0((q@ZXSVDN63RSrhA8zo( zyXPI5a~sz|Bt<|{+m??UoqYBu*TZR<+hdkW`WtlK(uVc|b(Gtb&$O5>tVS&!tMC<? zwI1iw8v$E%?7|`n0qd`-)hvr>sO(rc#b%0>zm4LFxn<Ye9NFI?k9|#!{IU4N+%}(t zeIL>c-vyckx4N!+nfJ#MXS)#)>myAxME`bTFa65%_AT}Q^pbZd9&(iDtDpdUbMrnf zjEoxy*=6FE*&*}X^7oZ|IG@k#rFlrRWi$#0`0`n_nD66z-}KU(-A2f3=VM)1;PlUS z!t@ou?>T6{zpVD%(P>D50{$3BlGOv7ibjpd1D<waJRt8QIEp_$OTwcOe`@>d@zXG{ zm$-8LH9X)xy2ly&PnT!izoR3;N6RjnL*toTLCuwFZ5jf7x8(0Xc~~zzJWo>dbRB!t zJKfJLglN3@KD@2{o>#3{qqb73&s?78Q|b5k*R!FOfKAV8a-~Msa#95HWO_?<5Ar$u zVQJz%MDqSL2At+k5IAM%xS3>z6YnoF+iZ6(gYa%!*)gdqi<5IXGKqp)u}PP7N(}zK zu~r15t+yuh>TuyyXp4ueu+kp8)x$p7Nk*oNP90*CR@*mQ(~82N9q(gx#aMUA6kExY zg=D)L*@*q{TdZBGWK=2ibJLx*kB}i-mpoIiA{J%~eP{2vQ`y%RB>+|KnD4sZ&hU=u zfKSTv&4#0}Toz>LCno6gSpr`c^UcmyY8u|=?ybvn>83JRW7FTR69dz#>Usqp_-oMW zTZJxso9M3PgG7I3IGc+W!%y}|HlqqyZCC&u&F!-)Ak(Vb?KFQWGT!U;YJrc$CxL1d zM6MTq8@&eh+9wSIc@!fsdK6yB)^yn}c)!yL-MVZ-KnNV(uh(PdPoUj}7F*4e?Y_S6 zSsYY)lKno@S)7O9?P6(+j<<)6gQNVwgsRj@1U*3*c+@1*1b!*DZjjjX%@n(7<V+Ul zP;+0v8>BwCM+EqCT&yJ=rtX9z_+cHq-p*#S_dZd#UX4)%#_3nB>bb`6v=4+LOch3w zGto#V#4S(VOHCUMR0-@w(V$BBU1Q!UNOR=m@HrQ`oh(Sc+@H}W3O{7|L7tBq`kycV zcFhnFN6btnkO_WYBX56YvfpUso(vPCBH?x5y4ro`*bF6@>-KhaRW8)mBV;QbG%9k; z)N_e;JD#K3RP)&o7!hUC#Ge<D>uAJY(hODCjYpJ-WKEuV38GZWQLjQ|BgJuCt2E?V zid3s$5nUW57Fq$^D3})z(6Z$e7{46{sFug9p;sPv5z~LK;!wrm5QZ9}A}!uH-25Z8 zalk#gNVzl$Sy5RZB)Hj&WzYCHj9Kh-t=A#*jV{jznJB&gEOVSAIuOeg^Bo*;J%D%d zU8mzA>`dJ)o?G5y&8BB1_qCqZYefyktTwpU(5o?cd)bJSr`vVBF?@_wuDR#0U%2m# zXnr9muSDcKz~8%d?MN9v;9YNvw~0{7>+qyEv6HhH{)UL<b-qVyU8Kutj>i+Aukx+p zKlh!nrC8KtPnZ_JGpQQ-aBI+aH`pvQdH+k6hP`q^owPP|>^Q*xA?)i>y>1A(A@IIv zS^f8NR>#YW<hPygcQf$^qQ(RHV4116$8C1|^=8gh_}XIQp@@l_gQ=O_TtQEs-$=FI z%#M9;t&E{)LH&TgPD5x5jplN$xx2(8GiVBEB_0>+hXUtI6{#%Rjl*_rR`X)Dou^E} zG|DO}1@fE*%i5N?v@_Y<sTwspKV~o1TjZX*0kQ1-m*|*Zi9VZsn;a{qrrfE8_TGzr zGelKY0#UF<jK-6Ygho+st`+JH|4k6QY<E(3o!@j@ln)^YdD4y^)u!HN#a4!4#AEtp zSxm07T#2n+Cxr)Zb-#W*qEg!#^}$As6#IMMph6yek|i=&xWNr%%|Hg?X~Pa#>MSWJ zMWjo&fe|7jpAh%DHhbQPg;z9U%mfw#6CM~Z^HX`kp|Vu=#q^JT`BR+S|4#YjPebwR zLt9_GEwtyBqR6wvWiQylw7$N{pvPzQ=O`Jmz)*PPPw30~SrKscHMLXdS0OGMs5A9> z6qqptjx7!mqHku=1|`ISVabUshK0PjvdS<RwQ#(XMcKj~o)|<tdn&4Mfk!xxB6Nan zS4lUO#oAZ?EP`r|k0QJpmA@`uP%oKD?!lnnwvKXFu6z9Ju1l5bQyj=@?>pfnuWmh1 zq`v13Wyn&L?UxGt2e@xBuo1?cic`BpyE^TUTfXu?qu_>$hvbhu`@p$dp3EqB3CT-q zmihLl{a(B4RbeERlO&Ga#^*sjd7Lg{KbtIOK5t`%+0W7SlGOD<Iyb%c<1Hl2(b)#x z?^b9nvf!DKOvCBjydu*T)m!a1ELiH^ZuZ-05`|PM)fZ#A#u`mVkYOfybVcJ4_VlAi zZLar5pl1Q5HeOiTD5&spc(8eBacKd;sWN7v#0|p*Z9Y<m(8{K!u;5+ce$^1(pa-hc z!XKY|7>wGXU2}X$sb;wvtzDaIAruW4h4I*!XV#JKwrv+8IryB4s3ah`I>Wx+Yb&_| z!4qDjT<xJ|UH1t4xWQ$@66&#B7r$zqF7b^iwq<aJ{QL<|Y@hxovV?Q9xb&L4s?^T$ zy=Na&S41{HLTW@*%HB3F0b4j;4MMohr~#Lu2(&{flgIKK^d2p;LXmFEWBTek5&sv$ zS@cn-+rt@)F3+p2hC?jsek(+BN(0legk@io=k_Fp>PCmV(`Dw@hT+!uNb`I|Dso(W z!UlX+ov_#xhbv|;pHSeqtbsvZT6k<8<?go5Mxl{dIyG=lPsz<Wq@D1Rr9D>Y?QU@t zj{P#r42<>IkBKQByOV?tt}@Ch+U|P#jQi^dH$iue21Gj|5^p;)oI$q9rc*KvJ#3?t zu&a>Qd!~eqEr@Z-<-ib<iB(g4{~dVmYBrC}9RMfAsY6xuUXw7`IU)~ja_^w1RGxs| zqE<k045XPi=GY5#HsK$+UhN|h(l>t~1hsBNxI(eVOH1`8CQ6UwHtmRq%Yq||p4&UZ zKCO8+<oJX{>xo5X#frQVReMATnG&+_p@LF4Y=XyP{t!f%Rv<ep82j(?`AK!8<0uNv zd+G2Yl*B|(De&#Wc5S?(f#5l_8$y(zOw^)73h5nGN~sQY;XFapUuJP(d#+zVLm2K$ zssnoG6>iXhcK4^tGwrJ@k>ThF_eu!P=xMq?w7=JHuAubsTFv!u2HO#(0Wg?JF^5Is zM&4hKfF$DKZy?eySYPheOFgZ*(~=$W5$X7)@crsCL``LhEjja*BPPm7?y=fe&@$KT zgIB|O?x>^F2jo;SC?B*V2}ZvxQremgc+R)04}iv(o{g=W(a0RuO{u5ckE1=@qoNx1 zh?zlRUI1+L(LFF!1Gql^X*?7|#L8=5A;B7(DB35xp>M`TQb?|6-KnE`p33X^D#F36 z?o^@&TJ;K8RRlho$sA8)F5b9R56oCyI3RLo_fuM2nK9e4bTvOp$ZgnD1m@7pG;h-G zUJ0R+bXU|X1I9wp1;)L&ojzff5tU=aFJK*yoFb0duU_HpO&I$R{0PzvBM~qF9dn5H zBiDWzj^u1^V~4%QYLdl8<&=}Vu?r%*F3;w+%_g`^Bb?pCkWuG=ALF=rKFZI0+zvFn zY~N347v~fbdIb#~j1U;6VTe5SGwh~o8bnux7SeVLbUUpESH)a_7U_j5ULfGBnWxte z9h2gF*&&_hbINGF-fXR>yV5mOj|t@y*D&On)jnC_*Z)^9UzW;=yxGPfA?i;#FNh9P zdQguQb*4UEb9^f5wPXm0cgs~zm1ofs=i>l(U{OwnzegtiRWL1>O7Lq)m%kiZ_u%n9 zI4Bk|*mP5!(-0lHj>vgX9GzbRG>kaSna^C^rsoM9ZE~i$O&S7)N$bS8EL}@ak@x(% zBH@$*HG@jWMkna6W;0B?-Y3^k{5(0A#Lp4LSvQyLUy%`ZgRvu4+8g%iVzV+1&h5C2 z5h8LIx!EH4K;`)XHoag_8qN?MA^u?ft_3bRdJ(^#rD5P(%e>$qbGwEze!$nDNQ5fQ zIvxzHk8r$T)8}e({8&QE`9T4o<IgO|o9?UnmI6?=x;gz{jlUtmK+E}Wc^{3$&o~RQ zwA}j;^Vl(D>U;b^+FIX*=?{-A-3|cP7$L)~|KxSdJAuwq6HR9C289rvu5~4oB@|$< zH#tKS*3K78|K!6@AQEu<WnDi0&Ji}(WjMXl|8u<zUP4&n%l^ktjwhCGY?^2hnnM|j zK?*yIL^RQlk`%p@Q88P#K{{PpDMt}--SV+whT#0IdzW5Pg0ndWIlzulmze`MvX6C( z!lvru`>4<wx>LwP%GEd|JhGuL8$o5&-LE%OhYkGXQ3bguZ0-H1)*Rf>y!9ru$)0;q zR6`USaC9J@<tAQU1g|O%2oE0y*)Cke#*<a6JQXDNRC_it@U(nXo_yreOwVpjl<dCZ z!Jqd8c5&>Wr{YT1oUAv0y)P5BV^4^b7^gY*fy%2WW*#7<1lxXnhrSh$x2eUM4z=x? zgRqEQ+w-8)C0P2%T-!cKDE7Uuf6<jtNQhhLX-A1qOm}cmh>x+|06YKOcoHt|Y#Z{x z>l!*3g`&uFA<pR)S&y~y)%|Mg?;RRBjfn*<E&uFF&@(?F`;gKOBlKubRw5ogEH<ae zZ>b&D4?#2`R61FfYc_V-b)t~$pnpH1(lglQeEkQd0JOCvYxHEKb`F=mu3WLI(<4Q_ z2u$l%ZYvA;j?BFawNE{WQ=})WvgMJbTxhf&LHr9bVmKPwG*a`A5&a6|sVh`f@(|P1 z^>Sh|{6Ud(dl9-!t7Fqvf2Bs94I5<mt;(}5lZeD}Y7i?wOBw#K!MGO>HN!TAw(PZ^ z&}@i!6*1(LL-q&qdJq9(WWNCZkJj|q{kzktntt7;Ax_PyHDcyw6v_Q$ADJkmf4yI5 zycat-xL#-(I894?q+*EvjZC)eKu;Y)yWE#!I!<dZ8n=0K$B5{0C>o@41B&x28WtW{ zsua>UCgS9qQgW$E8&A2b1lg@hvP2E4>(!PSIoV9ZeLz-?=J5|roEpan>-}8#6mjV% zv)}OS(!zEUB|w7dROT`{z(pR;DWRKLYhvp>)&()kHdAQ&%RP};gJvw)B18Y7yU$mZ zaz)}=`Cz@dHnHyei60831Os>R?gAtvuA3a)ztcY%FPGVnc$>cY-dtzQmRg68s>rx% ztr_dlm5*>Z-PhjVyu5hcchR^=?iZ@ijq|GFViJ^?Nl_k&4^DUP?kan&mv}c!r+(Da zWS3|rCk!z{E5Eew*1*2`O4Fwtmh7t7lyG?qYF#YE6_3Y;t9=>YN}9pQFg`!csG<dJ zzSxW^(_Kx?JVwDY^OCM1BPD%h#2oiVt-^hoR!ssRy(VHu{l=9uhXS<EyQ8qXBux#! zjhp}+cyPc3(u^Z-700CV=7pZ8%#!-`I+L&=<G*v0)A05BQ?pvGV@dxBI0riSNKvLn zzr_}(4F<#$l$N-1rH5}-)Zw}fFj-@b_tot0(wOf)V(UGDkFQpoq~+-t#`X_Q1!MiH zfF$$ud^jX5$>AFTNrh;$DNN5V%w9t1jH04ozS;R@^u=4Y40&H3xv@!mIZ#~RbQul1 zVn&)<0uYGOqiWbUeKi~WT6Ht6TF*tG#}NPFxafe&_wVP1q^1ABU*`FBCZ(>HG+p%T zxrCw3B`DU$Slg2(ufIi<0p+y2Y%TTnAZqBjJSVKy3q{dxeAHdh@h6`i#;z&{ft{nX z<gzvk)=a1iHK7#K)L;pd+Df;L=;c|7BR)Qqp7P>4EntTzG!pF1be!$$<|i`7CvW7# zisQNmWHO{;uDARvJSORZe@FD=M_+()o$R?{IlRl>pT`Ti10jC5vG)k%Uj45|Uvgc^ zjys=vj^x;T(z+asJiIyu#@1rz!D$5aGKoBYVS%bLX>NDvUM#@WAliChei-Y-09bm_ z;@d%`dI|W1{-B`c{O8vU$!?8WJw{L~1Fd*J#E%9DoFOrqaEq*gKqKMuXdyOI4+L`0 zU?-IW7bG3%SlrXZRNAGbg{fV+dPdjZtLMdU4?+x%h|TnU+|pwm+W8_J^C20R1G=M= z)1D$J5%MIm+f*?B{)q^ifFIAdXc7~jtETfr<W%P_lW4l!GCtC)$yZ_#4aPB&r(_0| zNooqh0Q&?z(Wm)Vd5uW-mn1P-<$&9t+gU;@PYp~raJ#FIPm;ZOX8iq*^h2=%fBb7b z&46FgKb6o+6}6Zlp)`yG7M_hb0iV=|*zb~i$B<Q|hJJ=wMyGX+SB3fQ*7d$r9%C5F zO57ytNW*oOCw-N{Wbk7i)?@y3GFA`8D8xnJJ?9p9npPy>Y*Od&`Kgg=K_c~<*LHE! zZr^n^54<?N_Y^&=kc5}r9|$V#;{~SmK1L|txH7OW4YdIo92N8E%F+4c;SIc6{W#BD ziTr2uC36MN{GViKZ@j3wU>E!;$DV&W_7d3=Ow1-3ZTBVtQJ?d4TJ5Y)`|G)_7bKEC zQizmynn1NbN&g9MxT^jIGe9DtTV<TrOq0BE47Y6@(5OY3juA2FB~6hGL3nE+lCan9 z@M{AeqS1#;nS<?OVUc~cvW4ea0QCXlZs-YgR~SqCpPAeHgYc-x1U<34MZ9kPD}GHt z6i<9@7S_|N)On)8$(8@Y4Cp8O_u<ELh+L;Ju^G8B-v#zxznG67C}W`63%i~D(Ykpr ziMP;3#DHa%|44QRo5O~!K}OYWVU)t%jED=>{kj9apgsI=ArVVd--M!2tG@wbr}20q zlla@S-Z{*|8+<fW_xA>YM>(z~zK@sA(s&=i+^`O44Ib;5Msra`%gK&#XNO{#bH#HF z6W5Y*P0)R#O!#Vyfg-1Rl1b7r(lDxPl<I7bT@o+248a&X!JMZPt<tY+U9wkNMWs=O z8Jeg$wV!!&tBvcq7P-y7zx;l&AfnxAbpnxc=?;gr_(q6$1wX`By?>}v1M7}iC-dDc zI9<W0z%I|O3tL9OTCAQD>LyB?9WIB11y#;D7PSDa3lt>GHh;W!qt|<ML_k;_QfSP! zVWIm80PRekF(Fq%5cPv4imDKgbqKlu^GoDdhUJriL8PK_Ljy+I#Rh>eyNT{S2`|So zF_$&v1%{xOjp;8Pu@JkM_PGWp$&UhAd_zci8pC){Ou5H5BHMl4R`eUmwWWoRiYFIJ zH?_Kx05rxI&U`HsRFo|h<ycfol26^FzN-DtHBc-|1jEeBv23!`->yQIxJSM%6RVf1 zcWI0)?KxnN=X}i>2;ux()oDZpm;2@*(d6(UaT<jO!Lp*z_adzXU;Ny-VG>cc<cbgD z56+E4<y(4uA11TYtKei7WW|hrC9UI$GnDv;Q|7xD4Gd1sYvo`47QEt;V%0X}U>Rnj z*Q!FxQ}?1xF}uf^`dBqo>bL~|(}?bk-IB<t@<LRU$gk(rFk=)H@p#nR*o_iJeID0Z z|K=5$Y@)uCvz{;AP18*=tqAKuOczci@jNbl(u6qgPl_s?D3Ht~3qVPj5mK2ggE7O0 z>A{+d)$XpTae?c@yfX`196S}W+QPgkU`21^lx|`3Y?ei1%9K~bg-7Zp1)a)^uruQY zTKuMZ=51=i_*oBi3Kk=%&>#T+jn<Iwpodn{0zQ=Ia99!v36Ao$*xp-x|JMN}V=`VL zYd0UB-B7U&tt7ykq=O^u4i<}HCszQ2-X=B7x9lj9oeH`<WD}@pwUr;JHp?7SKV;DK z6;<{vPbQfa<1-<-;PJ+hsRiM*dl^bv=*~ZR=up=%n)f!8?Hk#pvom5y0zyNJg1M@A znF|E>oZpuMpMq`o{>?*)&!$}+vZf(8bSh>duhW!coU*QN`uA8<4B_T{W|?n%3)kFs zui12cvm$c+%OGqo5gBoRkP#^@ON-X4JK*gMQG>0*9@=j(A?OU^4g2@X!4#!y%uOhi zY`f7~Lx}|JW?|0vfB4}&89{HqOLUYq8T3$7z)Dzoy+1~v6FvN)#mIvFy`-`jV(1gH z8abSH`rFMXV|2|59R7A%EE8A%{_OYU)YOd=(VcZ@^hxxn6`0Jb>z-~-R!h@WuHP_r zIqb{nvt2!vW50@ktwqGIyfCl1*YNrsI^%2o<ES9D41r$%Kj3icU;~S<T1+&UvwE$3 zzy*9aPM&uPPOuleTVJE%b~;kT{Q2kocg9H#L(1IuO=&`DFBOjw8$a~1;5{aSYbbHC z>A=BeM8Rt2BA*5QC{^QMk@OL4qPb?Vs74U{!&Is~c$gS3f;hZG&jH)mO}|XvWVF=@ zrM!@>wiBn%ex?mG>0!Ng8-DNGR7sjvPyle7sq&=RsO)2Tb~^=uZP_UD-~P(3i8#Cm zTDkMY8#~z1i4O^xTH7#)iM2%%k*YPwqG}rMN@Hb^*3jsl!umOg5ie@YxPx_iZBWNk z3j;f^@Y<q5r_nYUjq5x~?JjRxtFR+wF0=S23j_{loPz)IIhm2Qy<kgaj~byvVbhS* z5|tSn2Yh5}5@-kud=s@p9jY4+XOwG7<nYKs4wfm(D#TE9o+}Wwz^>rbI$>!{4&U-$ z)wDhhJDNlbwo-Uh!v}ob6o&ytf9R;sA37=!+eG94i5J|*@}mE$DE9#yMw}gLT*hJ( zNo>ks82JKFa|Fy^n!J42Z$Yr6uvYb?Mq1yYKkZOJ5wpCz4U#7VkoXYijQIQOvtYmV z1EIOJASYqM)KJ(?m<0naLB^aPS8stIu-8Q-Ux^PK<=4;yz>o<xCDi)|?71B0A?gDs z8U#ND6*2O0X$Qe77`RcSKgasOg#yqrU{GUaf?!{1K4AF@e`r2%2p=;e5aOo-ke;MJ zV8GmZ=?@(G$IR#)EOb!Vpu`VYpn!4W{~Z3`3jc3Q{O{2Hk0t*9d3fg?suM&XANYK* R`Jbm7GLi}swPHpg{|7}SO~e2I literal 8441 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 VfNZGi-(MOCG}UxfYm{vx{s$5hwZ;Gd diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png index ba14bfad76c6a58de0ae4250f94da6bd1e3b522d..db01cc7b8ccff2c9a4669b8a00201eae2c493ab6 100644 GIT binary patch literal 4768 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 NYN%?fd{VM~^&gHYu{8hy literal 3721 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 CKZ>aU diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png index 7af2dfe3cb470b7dc954de96139e9e6d8eab8a85..3a2c264ef753b137f9043cd6550ddbe9873d29d6 100644 GIT binary patch literal 3759 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 CYQlm5 literal 2748 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png index 3c3ee0f458732ad4fff5f12cdf361af68fd5fa1e..7cd14b8d74d8809c45654328a0b0e422582d4b40 100644 GIT binary patch literal 3734 zcmeHK_fr$f7EU0Pgpz<LNRiN_NGLWUU?70Ts0f09fEc7BJ>=3Oy(owQyizWZ2nf;y zDFOy*(jqFTi1dUWrS~3Q?ho&uc=LAV?0mC(cF)eY=X|sK*z^`g03r?n0008mYer@O z01(8+HoV;I{{FtwB>(^<=x%6e>S2g6^zrn;oBKX+bjCP)JLBCQ%`gT40P^Wm3p+PS z3lY>m4b^Alzee{L7N!caE<CUCH2W4a%w#!NdyT55dDfsww1u%8_tWR54hr0rQ6gwq z>uW|D<H)vEQRZRkVj?21#xxHUt+dm(hk5y36g=N>u9})w@A08$bays;`O)0C|I#=g zsb1Cg#kc~8s`wkk%#X?HuG#i>Z9*%tPk`8mIFtOh%HOAf5>su>!;8!C&hcMcb=ya- z^KVQsz=W~b!7}70*-2*r>v%_%T?7cd-wpodumf(_@yv!#3V*BxSc&CASE_n5Q_d#f zuBa-NB(d5@5_sn1wroH={wpKNx))xTE6es=p<OJ^x+VAHL-c<5yDMWJ?IY19&#E<u zB6QCBt#lRqi-~v`*<yN>kWiuKUflsZa&B-3ugU@JsEx6B$SSJc(IT`_l1V5o(fZbM zrl>#D6-JK^`m0s<Q|FS=L9He(8}ip9vuyrZ=qUhWQUy^NvMqP2(%4-kq35ZU+r_T6 zgq`}?6D}OYC4{TH_OHH6uUwv>RhJT{)`TpJQ0-R5x#<RnI7FRDr^4m9``P@2ZjHYV zHunOoax!@*Q!k0~i6<$jTh^``bcb8jDi*+S?+D?~CP%xCN76n4$<1W(8PhcBw8eX< z_Tw2(Y5J`(!3)PV?2j3d;86E4Tl@SXh&a>jCG(Zr%blN$1$vwEE(=h1=OL?mp7~9~ zpzug;rLUxI+08<(k^fP!Tj^hYU>9Gxeod@8HZ^)jQZ{W`<D^VJJXMiq?v&*8P5Zjw zg{~K}{!Z%+-}-}ra%N<$#KuHsAi9&~>XgB#>Fu~q)`AW84)%I{`umsneQlz*RU-AO zC7C+l|C=E1D*g~b=pOFR!S^1u;pTo-;^wq$_*p!UIK$^hEbA`JpZ{zLA-?yqZO5!% zzU72^g|P5^P@SJ=eZg{%L%Ih*YzU(Ax^mkdOmEZlQaxzfsnVyzr^csI6JPzwc(NZo zqT7z4hR5M?e$xJA%)|cR<?|j(75Q%=v+n7)N67{@g9u$Er`XGFAKRR6m@tpW#eg5E zhXiPq9(yWkN9FFS^l>UBmPLpb`!9HxRS!()-MRXLTQRI~YWW=JE$^uqIjr7E*;p@X zNX+79VZfssmxn7NJN;KZb-5hEaAD_BB6@AU(I@GNO}7_T`|-c4dITqv+;eJbv;I8! zNSmH=fK;4SIl({ELQ$H3&!kFzD-^6vcbfrJhMq;X`CwUxq9ehtoc+n%$OA>4ZJT$O zpo}ukzJ0fzixI9<AC>`SsKTHvvmnKG2RaAxXY|KbD--eFQtA0k+aPa+all~Mhx<qS zhatpu&VD+eo^r%_q!7f{;W*I476_#CU95|-F+hclc>%z9cfh~m0c4vv+W-I#3des( zfFKIze=)%3-^t{k68-=H_y}u+z7qso%(nIv89E+!w8kywfUy_*to_X>10j|eG5DNc zR@I=aHG;I(Vx*eVL4qg39bf@hbt|vw>dWeD8gORnw~MF5QvkO+<rp%m_u;L)puxd& zE|o)`u)!Sdbi&l1H}6J#7nq-ph?UfmrOU)Uos#CSm+MNhBS!jwi_5QCT)Q}52Z@ZN zcXR>uPJ*Y^L3;(-Zv`CGh2fFgvJ65DTtt$Ov92EZxmD1`l}kf@3~dlbkSZZ^i_imC zI;?;R8X|89q|J%Y!&`!<fx-!q`c%F)`jg1)Ltxo~pBx@{z~!glU1GY9fFU&fMm;Hk z>d5@76#S=qVP+W-ou?TU%>jJ~<v3isn!G;8@=b~z7y9cijSE;%bbewbN4H%eF!tOg zW(iE@Zf{6`)I2bqdw2mVw6l(dH%MGZ9U`j2$uYInlG8WWC01N;SS(o0?tM&FmUuy7 zp+kFuP{w(8VRp-dP6`RbfzZf+%eJ3NBmZbKMClDl^>HD{p77aSJY7KO33RVzm!QCb zlk9jMp3{kuJ`lmNbQll=C&a|yTgSl~_ha6p^+FHS5D0<!Ulm<h7d%MM+c#u6V1Xok zu}G!#-<9{5>vuQPv^dX|j0Jz3-1T}VJ7h$u|6G0vKtJfU?CWMPd;9RGij%AB{*%a! z(47^TfpXjUV)LS`&oamtN7x9^0l20Ver-z~@pj7=dDhs?BTdu$gADD9V?lCXW4Rsm z#QxTzN7I=<b9s5PpL29X)p1Qp!|^=VB0!^=ji+NyTLIts(35onmx8`r*Oa;brRC%r z5ow58+k$%2#K@CVnde+9L${agD>7KP#vmcvcb<=n)pb(zT@@%Qy!ac24<5)YjZsB) zOsp+@hi9*%(dZbW@~N%)Ur@t%!3(iQySiaJz9!8%I)Rh4w91C~A|9=46#rwq$B#dg zycEUBBbd>!6$3t2N%(DcGaIRCR8&(Vq7$&tQf^yE%FKMcyFTYQTvO+KG*s<scoyXT zkCxBX?WM8X>CYcq9j<+8Vut6@pE0xwOG+T3YWG$o@%L_@)UXG*e94MEWA%n|BVDb# zyIX_9?{II^l<wM_i>~4;)~QSZfQ^JT(r5kWzGkKctuR^#>;2^Je+c2q%-0KNjV8UW zsOYM4?tw{5`;=_qtLA2BCs(JsWD?C7wr?F`hjKL?<CJ$EU+c~|@eebyw+23(QEFB3 ze(ZzncWR)Ixt!P~d;v|cGg&H8)3KBB`$v(Gi;>14oALv22LD8Vu{o38thco=<QVcL z`_hj)a}{<}mnu*(^G1M%_b5_cQPJ>LkdRQru$oOxcM|&o1jQvJ-ah!qog}Sy%DnI< zx`Zmc6ED0>lbE<VNR#r@_3X;Wq->+M7e{{WY%p3m*T)_|e(dJvrZHqN=)3b2y8O{g zm{|r&g5R;U%=#xN3idu=@rfNZfJ-YSHI<`b?-VLbOv`8dd}ee)4E;FrywU*FOC%=u za_H5&Z_3MKZ@L@xJ6$)ovWlk$E>E%!_l1auofyKTpfIxl^!Yh@mW3FrH@CC%8dy`1 z6FculYJk-BHyf*tm9-fo98R4L*>Jn|g%X_hzU`%9ys4!n_v+@s?s`3OKVV($Wv{ih z^~>G^eGYksf;|Xr=576g?;`e4!I1ZBok=$G!R##l`^@yTJuOv%#NS#$qp4hoziUgW zf<%7ec^iNU3DGWK4mCbjpP89K2Cq3KZi{a)zj6L3GVwt@C$sA#OGqOMzD~r})_IM@ zO-?#^j=le>DlI69>?8bb!KJK`iy{thq*;KP)9ynO%rc(;gfyId&90R^z~BOP0=4G0 zgeHXwjsD4>Grb|Pb~v%vktjNw+|iS+9xn~?y7BT(p`IsOhFENNRqxfqdPXf`qIsYW ztCJlr)+V`7k}I$Po8mj(7~I|4+ZDyd_Zelq3^f^>i5QiGmqOXwK+EseOHI7NX8Gmn zndy-Z@e+AB1Ufm^80yq`Z^o+P{-Wm3;kbji#>U2h_p3-S;UPzEk(6@@oU4JIvAYH- zrIiU0W$QiP$z(W)=eqcjMX=<freCdO;q9sTA5A=6L^tI;E|VZV^v<3Hh;=&#=j>@< z&E<P>*=tdMAyH{zjH=b<w3AFrQ=Hmaog&R(FS3=K3Az~v(^XXtKd(tbRqeqY;N=RM zq$&KI{azqF<H&@5duiyvWJqeri1(nqWl{N=eov^7w`GHmF{Edsqe(UG)a4M7k8uKt zHS<d;{21?7sL(Cdj+S&-U}{8qgrecfsgNVYrCxdybV6%Mu1{dL7_&|>f9@*b1QGJ3 z$J>Jnnt%$;2mC|LH>USt<9d=c`W)rLZdPcL5A=iP@2S(%7qboSxo7UHR)@A>Xpoy< zC??|B()^g2F8>u8%cx1S_@_n{CzuIy3q-@T=$koD!c`&N1|WLz>th}^GLe>GLIONN zG;AJU`qrLDc&GUoQv=P*`c7T)M2|n}ADliRmRB<^&m;Ywk3)GZkHGL|vl1ZFHxbpR z)*N+}omqEygI-8ksD9@KlOk$CO1uMc$;oLEC?F&XWo{!6^Z=W}$^@jO6oEtz5fHJk z<{HO<Fa>^BLR<S5#~#~%@1}bSs7yg0U3rl}$Odh&{Wmhd%YyITh={WHVlt6n<}nJK zdG6H};mQ{PuGZncZ+^mkiu&k2*XxP$_6T;M+L!rL@)VPZC`#}16WA6Tb|CiGqYJA~ n25_Ot%81neAMAgLF&3XSri5FT5`z2pNr=62%jk`Pebj#d^pnt% literal 2673 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 CIGGp# diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png index 1d8c5b1d3f5dabdc4487224eb25f2f0b8ef6c987..7097fbf5565ff2485ab06e0c69d96fe5377d7e87 100644 GIT binary patch delta 8127 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 baCN;qgSe5b^Y%jm{O`H4wo-wD^_%|zZ$T~! delta 7002 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 QXTYDTB1EC^sk#6E05Jj&9{>OV diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png index fd100898a357ddeabeddca90898dad3ca346b7a8..95212ccc9b48d00e4f81ded950d528a80b819e46 100644 GIT binary patch literal 5424 zcmeHLS5y=4w+#@gA}9h<1f+-pktQM~0aQS`g7gyU9h4%ygsxzt_XHJCL;KNt=mHT! zM{4MV8hVG^@!tD?x=;80_wdb}b-r2ao7v}_z4w~8&$LzP>DcK&AP~LU(<izh5Sa)N zC(}>?R~yrc0T2j$#qsguXU>mRAG^D_d+5Egw6;~Xb+h$wwANL91Oh#L|6bqRfm8oF zETg7On7=oCC@(Mm%7s*7xr=Up#5m!?w#;=>B*CRz=~LJGRF>my$@#Nyj(1_#l^C19 z&m_!{Oq&I7IiWXVAz#X$eF2BxIqEx6%^6^&U8|8St4pYMZop0+FJ%&gm!~~9r!Re~ z7BNkp79ba4FM=!%&XxUIYHO4AY7Xk759)&me@GHax=qG0-+~$6Ao6rfj~-MVlI+)t zo~e?>Ohx`Fc-YN5XA8PuZZ9<t1uLC)(vDgk(YDFCWb({iYpnno-pFRyD#fLJmWY8X zi`@AcchNQxL%qy*U;?K0+?x0xFZI3fE-zNO>j64ln{Tio{4}IedCIwMB3$QVnOM+u zJVo_EijYV0Y&0WMe__%qrud#?Svw=iw#Jcmn-64OS0Cv?w+(Bv)(@!XBzXP!Dc#>B zoIjLi&xjBA^=_8$?$~^CRv`}0r1K8e&AhzCzy+F_6M~fZAM$aPXgLbSVBZ@$JovQ} zb5y;=Vn-gd39)yS9qp6JwR@)|vKc$SbJZXp)@Jx4JLS<i98z_?LjW3Ok$KsxQ_TBp z|KyEfRvOJ*ybS9l_Ba7igNp4(ogs!5g5Mb7m0lqq=O#O~CK9^IkQgNU;<E(qgbg!T z8*}RWF2&{uzjbD@mrPGS@h~_Bn!fy+PsdJh$RXr9<Qxsptm9km9$$c}UN~KJt`Yjh z9_5kvw)%dy5FPaS>MsZTIiS7!XzgC{4T-CXs>O#Naq=cCh_T)J$`dcxrDqdo(=V%j zMe0{Fucys!P5+P|8J{jvI<`KR;G@)WVQ-T<Q;us_M@lpP!TrHGcPEXyS;z*t8OGMB z7$ECLJXgH<?b)3mUY+AZSspl23w(LB1imb7a`}Qfm?C6t!k|iO?f!2Ax}aKj(>B#z zsJ0C(7ozWCS@!jdv6R6HIX4y*RO4GmV^3vzws6>`5bxY|7|(q>WPW-9Hrwlo^gzDG zhjyCJ-1C5Yz+ZEFB2}G+{D}9RH;cdiL$~CZ@_Z8c$m9=1{*Fx~w57GhMni|d92G%p zDeC`58qM^c)x3`CSBbj~I;bF&^@r!WTS3{#tilVGWGcbHym_J|g|^##1fQA$8*ij* zoqxo}e%_m44d{3=qQi6BMV`_s5FU6Rc3q+6RX7_yw(<G;_K?R)DfY@-oMTpbMf&Qy z)~<zlE4pF{A(qRFO{hC-wS+p({=6#{DGrOEk^qT^E$(U;=d2Tcxwf82s)uKSa)&0B zG7K{X6n&=-*axBZ^9@8$0W8n=K-X8W%?eNca5%iR*-(cahvr_}H}!QBm<Ig`Y_K4m zp8E&wQViii)hH4LNx=6~yY&bbAc%*yMrw9iS|A}HrU8*fJA%MKL<TH&V1Yp7DDwYg z$V5;S|A|4#e>a`Nt$RQq#x%7jN-uoLHl~7}=^tkO+AjVcgYpBBF?;_y%W(_rj9as- z(0za7y^1TpjcF;`&HLLA_SBA(rjbanvzUR<>#y2tLqF9FMtkqOnvM2p(%)WXv>xfz z?i4Cww+;n;x${N7vvr#Iu|e91zd=FZ%-5HD*#ieX4Cp0hvi92d9%r@6OtH&{i}8el z$Zsn0pePFX&@mu#nj2)~u_PKAo<2)3O~I92w3YHz#n7fX60qfUgKVv-8;ecY+1a^L zhA6lLq__}n{>fWgv#lOWzuE8x?d|PqMn<W`GM|OX8czx55fL_p;QICP3anh3513IA zr3L=YWuT;l$dvU~*Upx|oAJOker|3~?g8x8jAGgY*Yw|+GP@t}RUK{J-RfiYer57I zoqVNUD+41&{8&X0LYw#HK}r3Du949ladGjT5mWcBRtAOjtVuhf>IcrxQqCh!4>zX- z?%a7Ab>*heM5U{9*?}Vs8F;)Z6dq(GBO@abbmE0~Uhd86sT8_<SIr{i+*?gcD~UjG zc>D2V3I+9*NdrSuQ(;leS*daFH?;(t;h*}t&!5kt`<v3`e2VIKd*vjo+Gy}zDvXLi zwYG#yqUbqpqYaB6h-UpLDA2^aalCu?&IX$diAN$ufm?z_gTI=G$Brwa{LO~R7$yYM z*3r@ZMLBliXnVfYV^JONQ67A}vuH=`mi~Mdz-Wd<>3_tRb8|~CUt217qRQR<buujI zr1Qf~xo@UbZcBY0I}2SNdxYm{;?_|FILOx4wkwSCl1*2<fE`<Nb8~!h@@;*6{oCKj z$<MlREECI@z>I`R@?gqj3|KEuQ`|Cl|MTb1*REc@RlA%U-nh2NIQ|bZKHe(NyfM&t zb#?U#4)%dlW<YbEnjC0@cttc-@}{`d&GOwzxuMa~jDDqXs<+v$L$`#4)H~wX_-1Ek zmn0PcFc8H|4#Q0+wNdvI_ddCA%{0e<`t(xWo2ZV{jEag1o+=28{_p-`GRn=(&GVcL zI8U-j$qmp5Iz5nL{WM+gr>Cy2{`>Oq@UX|mxKz!n*)Uqvt;bPE%4|1o++h;bPJ{*= zq_!$U!9y1%>+3GNtNmZ2&FX#oedzzFatHBCNlAIkwb7OZ($`*`pPml0C<AXVL#g>P zH$NZS98Mi%nwpyG&|#0uhOn`*d942t-_{-!)keY~rw1EM^l6imW_swG8zC@4dEVf@ zNY0_l*EcO|IhJ;Ic@Ys2smA!gT`f<?CxeT>kqY=gvwy52MJ(#8R}AC$LKRt=syABt zE63k7q?^Mz=_->RZUAS4Gr<PSC~IM$?F%WZw|*41J2H@gH%&sDYMo{6o`4XQEIcLS zCYc97&5I~$3hMH#Rltl6&Saj(kG)$Vesy~cJ8H_=iPN>b^w}XBep_ZDx6b{ex(TpW zTQ`g#e~BsXpuV<%gPf*3Ua@NRBt2?jcTM0Ss!B8XRaito7*7)u&4%CiL-4AAPRT{( z0xH6b2w7ne&=7ruhLXCCq`@Z2JTr&cP;`d3{?1g)*tIdqf~n{vw+gDCMQa1!j|b#< zI@fPjzN5ON1VX%lFn$W))5*SqsWat5;^ah`7e}+)P@BxFIU*DQ69gl;Qk;sOKAACO z$UG90Q-#TSPFF2T&e?T`pQn>v@3ea&HChTHCEm0cjUB1v6*m^D?lBsiPTc_D*}VjI zpbi*>p}(B*%A6{Yglo7%croME=IXH;#P5vaJi3kNZTx9x3yE^UA)-v!;$)5WYMIj4 z`@&U_+r$KUKdUEkoEJD3yqEdmL2!IiRcRbgXcLq+wJbs_Ma(C-fPk(>8F{&*b8p>w z_|#(jWH7n0F@NO{`U)wJOy^(0j&^-Z``CqtKCo~bo{UEpnh@ELJRf_U&Og=XGuzn# zRbfKdA@);D&h>iLy3SHA!^bl1k?|P#85D1SQ!N0dukw+D4~cBxk%|7GwtynLCP#97 zd)zzUSUYZ7v4b_N?AmVSR@b*pTJGC%=NI2ly*7})-Ak{Bk<=<>s29u_aY=;RZzMNh z{_q*9s|(D(*J`vC3j>jxYc!p-^yjojbu*Cse)!$hKOT1OX}cF>%v&c-Occc&=`KM@ zI@#2^;BK5jaS8{sbYMksZi7(B*?FDB`3l?4RQvW$K7&rTKaNX(a5mCg_}i*o(l_}k zmEc`;L;TUeC7*R2XIX}MU|9Sp3l2-TXab%!?)#Qs9ovl!aejV#p^<T{M7VX5L1PUg zEv^l_nBf~-&OK}y2>xCjiR-Mlz4TkcKN^f(8bWGR*t??*i9C`J5nfG};xj~jdaYWA zP8yH6Cp&jUztz`31c*G#q)E2qY&ey17lQ9OJyAYjqDN{dr~F>8r8aoo@Cdf;wN5${ z<mf3!r(oq7zI{)@LG8Jt-?MKzFYSdOCFYNpF=FRNP>PzLQ_-z7<mQ@9C!hM@NYr$L zyYO&bf`9bMNr%EYo0xCt9`_KwUPXRqwAA6)N~dIhH@PdHlq4MDE39$N04mrHXTf4f zrHfEmye7~siuue(LdxT>n7rLJxSxt|6@THspeDUEDMA+}#J5=0keW|}knnv@-qjq` z$j}S@SgtT9`}*ErfP9+kpvJgHk~9qYNoAt)H<u_?9v5Q=aJIScS?vv`zu!lCr$=?} zJCF7(x8OL|&TkF1*1ql!5q8IH%N@^85Z_ru)QTT7AJ6L1E;TdN#^E<E3a?v;B(|}J z*s!pXCKc3uNw54Mu4M{Z&%yx!pP{0sj}=L&e*(4%Bi<zciO4ijh;txeWk}{DR!2f_ zVg9RNo17N3Hwz|6`o{;ew?6i`RQskAe{Czp-96%u4A`f+NN<H?df`#5u<$^SUJl<^ zUV+7m6#hSh$3?T%0lUSvN&|<=`D=^>nZeY=gRp{&3p$yT&8u&-FI*+fN6o7cWMp7j zjAB(HPJ;alG33Pwb?~syP;y3L3WV@=m76ALrYIfK=xq$UBX>{X=E;0rIx-Cy^LZL@ z939&|ZnN{gG4?g)T^|mE+5!Jqwgyp_|6!2Oe0k}ny61*>C+Ma>eM#5#^!+m}ZOTC5 zZ62cMp%_+2otAM_ap-M#4lw34<!|doCwU*v;Zv)XLc6_9`i=9CZ!2&@@?tN%h|efe zG7hIsL%_+QimHq=H4!&wtJ-9FLqo4RyfLP@M*|c*fEi%lHTS6fM<9e9IoLq*+U@_7 z9YG|eqzEo9F7~jrf&XfA28)<IEdw`9#J)FkyMmdORnXEB4oz)2ZLjfMwizifmIyxc z9jkCo@$o=oMu&&HA}_J>14<bd#!h@cy!yUG5fI~7<V$Y!l$4Ynt3!7I&v2c-m_Q)N zQH?YqC~U{e9hXksoiuzlC-0h8x_su4cKhpS7P|zIiQa1?ew!xaYZ*@Qi@d;hUEP{I zAC&eDLt7qg&C(--Pky+Yn10}td-J;-<3pT|`s+$Kq5kETL*Jj%1J=P6JB)$=T$WEB zJjEa^D5z=?xUCGQQaD{ND}6Ql=r5D0tH-~d@8}vUvtMjDoK66=zN_AE*XCe-3}CWx zld%%Z@Osk4=@LWsexHPtl>W)yinY@{c%ukTemAb|*RKp5pw#!Hku^0n|4U$oO~u-W zmaS1;tHbCXjUV0J-RW<cnVHib*PNXN8dtic$wX*qYbU>ZM+e^+uW+^{U7TOz;1G^w zfyB@M`iSjL5)Q)S(j<RzUib-`VS>%?7pQ#TT*+#a12o5y40BLYP7%C1)IqK2f^Te4 zzBi>e{*QHZ4N+fHGfp#G-dH}`Tf(~IvL_B*P#|Jl@)99pT-qkW_wb?7z`(%o>5(ki zQ9WH<O@-v%R$!EAj+l)uB(%~b+I<olJ3F7gjfr8L+8t2B?|Z}~2<p6}`h3No=DR(3 ze|;WFRQ5Y5T<FVrTpDobwlYyw{9_q#OkS=C1A37uYbRNPF^u>O4tH0naM!>+SVg5k z;@BirT3TCs?1>Cemm$f>wb9~~f2@D`3+{dZSi}saPqDTpB9*w;%oI+|kQ@;K*83S? z7#SIPjh%fpW54Y!Q>k4KyPBqEBG79md6IxU(4;mAK_F6D^MLVIc>=Ibg8=mU-~~EE z+Fe~u?d@?<ZLLX>d7a(8^&t?ugiQ?m9Rh*)Vt)?Qlh42UdvxeHcXC#itHsHUlHFxo z#+B1(F8`-0AGsianHI;6IG1n*?LEhg=Ku~`wm6iwU~kV$#&-+lF6>QIp>E*6#mDzp zepEFL%H`g?GMI0RZw&f!YrbItwL)>b-dnbC#S5xIfKCu<ez$V6+u7NvKYbdLraY>2 zTC=w}b!kwP>hg`3k9z9NrmrfZoar9cAdnW%i;MH3!^{(qg(@I24l+T6ZCTh5FHjl_ zGR!^BeU`sa(NtgODKT3ed_YcPM9XMoV0N7^G*p9(9GeSs1)?Mn!nR#m{NKm^1?1lj e`G3#CkwQZzYP+aispId@3N>ZzCq<85hW!`!P7GN9 literal 4413 zcmeI0`9GB1|Ho&>HpmtkR7kg!HQ^>pg!m9zWbDgeFeXbfV+)O?5+!A6>`RucBQw^q z6p;*)b?k22FxG5YhVRw)`}q6;-{0>a&UKyZobx!>>+wG4^?p3hiMeZL$i*ST0Rn-z zjQ*p49|Qu+0`+7lEAVu+CH(|m;K%n3bwTAl=azsEHKdi1o2e;C8mL1-;O8h1^PeF= z5djJa1j&Z{w*@Sl&Gg?oDEUvPXQWFv2*g`uq<`~4Ab52m)YoDsqhpij0{aE<oFX5@ znZaZi<h%Sy(3pc&|K5)Xf}DS}pe%+jNAP>AF?+Pc3xcaqUzv$;i*(|I_4qYeH#<H% zCkf|DTLN=3$oYlQf1o@UF1&fu*en)OaZ`NKF>Zf;Ce&@MaWQjCYcZfl2H%@r7-IJB zrH+(3Gp|mzC{%wS66wmvrvn1Z=s0c0KLtT{44$?WtA<Mp3V@lRvd3(|ut}&I+t5tw zbIkG4esEQU>}3d4`5f-jg6vFBh6ZNtTfz^US0XCLtD_{&P@Y{^H#g4_0%Ccrredhf z7Iuyz1%Zm+m4RS6=>s3l)%|I2cGssW&d9(otE%o5yb4$zFw%Q=s_$aFreFW2iX!2| z2YngK@`1*^$rAU>pn^+ootl6K9CSpkbh_Tv-5vcS`{pP)sA{clF>`v_=5U;ZPFd*5 zC@C;aD-POPsNd?**jX;A7_vE3jsih2w&JBOR!d7u!L*#`x)mh!@FW4=Utro#uV^k$ zOcaomltfY9D~{G<=okzVi42~JhOIndJtdTFUFG(%sOa(o7YMrT1z+&tYRzC{$led% zU|t|v7kS}M82XTDm3wcsg3>(%B4@w0ysNXbuh^m_F)1nkig`g1FhQ!4dk+Rj^qtZ5 zqJFw{(eU*^TMR!bVBMiR{koE}n7MZ7f&bUGwy0-)kst_^nMEQ}%OW(DX(N)2r&_Ya zvZ4uziWQV2x^;`FpnkTk*>ImzyW0@3KJ+6;4;cndOinJ?ob5pWn(M@hR#sNp5S(!G z_VuoM(h?G-M`Yw-oDK;0Ob(D5efv#%`oq@m15$teb@|2(2e+;+|Al@#ZUpyAZ<=Z^ zx6I|scY}iJDAW#7t>6&^`2w&JYEBpRwOq3`Nz!<{p*dpT7(BR(T^qMvc$l|znxB8L zA;1Si`|&w!kqgYsTV$MVz*JKF%;YlOz6p@v@$-XG^}s`WywW?bvFb9<`|W>bgtxH5 z!@`=h)I`b0-|bS6)yX#14^ax@a`N(U2ZzjzY$EZ&VoyeY48PRMn&WV}eQR#q>(}s; zV+IM)%G%K2fdzMO63%O2M=V`kKbU1|3fHr)wDM>V%y*@be5P(_oM^1owwl4<E&>;x z>O=|<aHPOZXFz})F~YpijKpYt&NKXLzKi7EE6Va5&nGM_JW52p%gxR8pKbx$qPdCT zbxN($JgV;Ok?v=^Zw6MO->0S)*Vd|OES>csBNSd0X=Xi|ZKqZ!xly2Acni@x+JF^A zadi1}Wo3hZTUMpP8X`!NW*SiCQ(y($;8mIxClDMju>6x^uScVLAe<*Buhn3Ii|+rn zLQ1N?qIkf}#d11M7HO~9`E;_YSyqr-`Dapg;9;r9ew%O19Ixkb*f&TwR>Ll(?@FZV z7g_WR8po{_iAlx5$G#2Cm>6&Y5<s|1`IZWn6t&~CUk%zkeCdB-UU;6Zjn<o(+>n;l zDAa~AEZAa|l$*OAFQ0xl0y-8bg+QQBl62Y@j%qCKJLHOCgmR*ab}=_fDIBC2vT0}8 z;nJ8~u&3!{Gix<8NN~lHks}<hqsRL~%~w%Rn|76KL-#w{P&|{-e76jRcFz3(4=*Ik z>;pfu<*#xP1svbOBC%C2z>H;T4xDbAJinwKHW%noDJH7&z-x5s_w3v|e3s`=Ld*fS z`H;A>C!@PVn&1~3k=DE?@*9kCO&j%2-35G~%pySn?|$zn_50-Kzg=-s5-E26$9i%Z zJk0yp6n3S_C8B9>1H|=Y8<+O_M4hQOORGZaK(icKmExe9c9D%6O`C`$ZD|KYJ!1<i z6Iw2012c<Mw{X>@>>t-AT&oy2uR9PYkT50km;N@`a<mRC>2pK}mJF3COCnQ~O&mXf z<4+9)h|)@AQYvWq*0=q`vrlk{PDk{yNgR+X&8MHW925`!Rts&uAHLI@^Qoi#MtSqe z5|7@LY3~>J#S-@{hl6ceq489cVNF1j{l#{zoSX65Ld7x-_X~y{j$o@3`#9s<@>Kh- zkDQt2cCqLHZ=rKV6LmXU`91dKDkwT}v*zrBH<r_wJtgACw)oShFz_NB)-<?kd(aUc z+}=bvoi<UU5D=8LxU`c*Pu!v|itMe#uQFY6NM+>83)-JbY9c%3Pcq^Iwm0~B=xo~O z^R&Y^Djm{~bv?*SLEe3*?4_GNBo;0%PlfHVnI7&uR@KVHPUt_m3Bs|;Op~Jr>+R2m z?tMNMbe;8?B1@Xsm8dn=dgB|#;LSRW_s4lVec|g>9b`%)VUp+E^I+#M9*ow+O{{45 zY$_W0ouh#?Sh`OtTp-5!6c)Ofah$qiF*O%v9JVqVdDWYG`695yH#ybV;I$$Q)=*Xd zt)^Y}Rpb{b?L}h7k-rmXDNQ#)i_rYfJ`!t%xQUp?30Ur+7K|`-s@#A{`-$twaqsI4 zVn=0eZl3Ne4ba>!IZeJTB!7o;;v>mIPcwjriGL+=YH47XilSOJ<+kb%C!71CmhMoU zIL)>?v$&Ttx>2dhbQFGqqD`*8p!V_(Gp|P!WNJhZZjtPU?$UgdYd);c*l>68LIqjZ z{rdD6W1BXnJJl_pOFg5klAmJC#5OsVcwNY+AP?|&yOeLM;1IswJrSdMJ1acdOT~|A z7>Qqx-gjTwdmAgc+aQd+&MN`yu_sL3$@s=$+q*Kv@VYO?*xd73n$SK@q1-C!T9h4} zTR)-P2>e2!mF=9Aue>YVUOCDd+kYK&VCWeh!iJCB@rR24P-BruW0pVLXtVTBpCzpE z$wV~1IrFVEl2vOrJM#`B>6jRj712t0L5VZ*ny9^%a4*4FW4pYp>}Z-@LwsX*p6&jT zgfHtxKK?dwJ0*72Jcs`@zw-M0{>xXfq?y{Vd7D>RyZrc>f>>|CvMe_FkoSyt_)$iW zyrkB)mPYy%pAG9IuZIA{G*i2Y=<GyaXAb+lvWO^H_!RxKC2!dWZQD53Mo!);5X3Mf zwYyOQC*`HCF0dE0GXXW#SrfC}pY0SKCkO{cGzCxLT2=VjwV3(Ub;DNZK!Hx%w_QC8 zyD%dK_X>-(q<-uk;cr;Bx>rV>AAAY6OOM<Vqr=W;aU7+-nc|0cB%pYUd?34ujwv$b z-^O8G<DTu~jX6D2kCd<ZcJvj!4!#yPhY3h6^7$>R0D;!BZ`kRoDirhSwB)sLrKkkj z38or=fHW*1PAHy3`~`syNP;0H@(dL#K_E}x2YBf1^8_HHr7)*6(KlvV)x(e5L!1Wl zlbo%A?Tg?TsfyAFSQ|*VXsC-;^BlNLLhpTzyb^Konv#;r!;z~yt7De*p)yYH^3C2~ zzx*=P9_hx!#Jr5D!}^qp_(TayJk@FBCj_9?Fw2SD=hZ*FeR~?eVQg$%k8;BN9~@QA zHh)yHZ@`wp%WU#vVG6~l{(|7`K0}g6pG3&;PoHAbg;*dP>5KdB_1=X+%U`ZdG*~|Q z)hU&OAW;EC5gj{je|1)-CsWI|GGuS<Wu{gLoc!y%45?0t7!5Ge1M$*BM1El*8UVZ; zsHg_E^peSY-UIJofT;>@gdWgneR;v_je7%ikKMKQ=iZ6jIEsBvOioHdE&a?7K4I)( zu53iQSE2E5-{uO+*^C5bTz_nkXBa>9UeRS`@0f8omI@Hf=sLg^I<taMdUi;S_k?oD z?!&`tcG1z%szvj2b0hY3rKPf__-kL+zI5Z23~$}Kl`|U63G?hqmJ_+|_u-ORdJ({1 zo(mLw&gP|Y%9<mg!FMLY#A=7ucTw%dAKSJ;5MBuUA9`{O0ktg;miTlcs}qMxtzFhb zRXl!(a{=^(n^5OEuRbujB`qgsI@=LHJlFYdRnytUh2-=Z(m=vgMbftxx~n=WDawGw zp6XcP&d8hl`T5a4^Ru(Fzl@Jhq5is-v9Fw>w=&i2c<F_S<=wlyfgAdN*h#_X7Rzf} z)Zy-`O><b|AGV<f{mBV(ck^(_>i5zC3$lRd;GN=Cm5yo()u12WB^bQ7R>pn4yg4YF z>ZR<?ks@oId$`unJM`-r0E7b`P8MHLx}BPVxwli~Q<YI~<y34fsZ^@xShbhO&(OnN z)Y^Dmsye3FAWn!+#Eb_ZZ6_ufZS5)1bG_Z&B#DK3*(#DN_A6zx<ez_>=jZ3CkMi^L z)dSYj8wvg6g^lRpa>Nw_L&L80oiPF;lCqXdWl`>E#jcDX91{`})Uhk?wVc9-?E^kq zRyd3Tpq&v=<<{*FtoZXm?pr_#@@0AGB<Dc30`zc}<x}ewGp?g+p6vUvl*fOv)%+Y0 z7kA2QlxTGC-aU2S>8Iz<^+ZZhtiMcC+gp&L*x{=xDi)6(J;I8*2~!@)Z*h1><M{x* zBj&ip1_FUIkeQxm4O@5_yj4t=8SyxQl&V3XQF7Cggf9;29KfLkXAD8utJ!?abO25> zEomU!{Hx4ofUPZ_w)maN69qGq*?FxdX(%BuvmFam)>3g9==^uszXADohy4G%&~gH{ XTFrw@=ghbKxyCTMWu{-Q>lE=n(!C#P diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png index 90d69851f55bbfccc2b02af158227451c90dd5c4..b4127e2fa250341aa505390846b52925a9a39585 100644 GIT binary patch literal 3697 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 WDbBqfk-Yl%Zx5|&ge=v582n$jftvjQ literal 2659 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 Sz1Q|Xd(IA5?5P)S-2V#}ghrD9 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png index 2cdec609af6ed4f629250b4ac8ca77f7c50ad235..69c28def26af760ebe2d7dc20e43d6851c12fc62 100644 GIT binary patch literal 7175 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 literal 6130 zcmeHL`9GB1`yZ0DXptyFN%l!($(|+qz8j$|gRwofiD5{R#}b8+CB`-wjHzKp##SLU zGIoQpWoIlAV+-HW>-G67zRwTm+}AnxeV_ZhuJ`r6?(4kc%}jLJ&+wc9008XzdfFBM z0MjPJ4rOCy^elaVT*ied$U;{WP({AJ$Qayrx6=n38w11{HXDE`&I`bD{0O7*Fd6{B zoX`Bf8K%wr6aTXTp~p9A%PvU(0Jo>UwuV(G(@O5C&?^Ikc3V+qrf9Pm(R?djHu+_? zDG~96p)D8gb<k&Wb*-s-W!Hv}C=_n@31)4zY*%M{@{;Bo!CvhbX2p%WYj@kz9;7PX z{2ALAB{8AsL9S7y)q>}mw@1QFaDzJFt1LGFOl%JT%sFz=;yGJALBB3O1N@!4&pgmD z^WG<G_}kmg4dLvA!}{Tofh*JCfpYMxoXn6Vm%-|{SxveGw~!`P^)<N;2l;_WXZ*Lp zk?b>K%?38s9hmWN^h)Y5Z1%dRb)ot>=HrFG2)&+lB*AwBt1DQu<R(UZwyVJGyjkw< z)<(e;ZB14GykVO8>=RlB_=HsLAH2kJA(~=O%Le+UDCJf@*}C45a47!8M)wM$PJ(;L z@b^T``C*K&+3z4heQYL9d}?P{<nP|o1(=SqgIkaa73M9Kw*J*RuOv)<T!|6C)Kp^J zNxu4+-p*W|qV`^7{(LRbdTFS@Jh9Gvi}i}|oOlzYU(=uP@G|dfYFCLA(zobn=TWuv zv4bwMy?*BWylNeuCY;F^wpqfCdeKO0B7jGueE#(6Lw%-O<h^zWDy*vEODo``??+x~ z84lOZ?(fbcSGv@XDwE;}<I+I8_n%6PvT)-O;NulV&qf=M#2xNTr%=nSD@FqbvCb38 z%Bvr7*MrunGg8tHAHG!jHBM2)h{ZMp`&^}{F2_r#Wy8xXs9y+@GofEnz4<X!$Jpm{ zv#ze#8Z5&RH8`<P)wWzRJOZz8=akhvcM(^~y9T=#w&A9{@$DAIn^Gn3GxYvk?H%NR zZqn5!7!V%k2pvZC^X0*o(DETmR{M<2V4k$RL{)X2IR?x?&`ht}zj4bZd<k8;+{W!( zW0I?csBz57KyPhQoTKV;>>`C;%-&gWS1bn-?sj;Yy+^U)^?#(X5m{S+Nvxx7&-uL~ zY;5{t4vq$68yC-3`K*sZDlnBEU3rAHru~drBfW;sZ*Oj4U|UPjg@U-M+Rl4jDz2)q zO+BFn-Rl7_jNjewv8o#z#Rv)K)capoXOZV-j%7J$+#aun43uZ7NoaQaHy=RT9|G&= zktusbi5TEsi;<Ll{rQu~1`$EC;VJtH8(=--TO54*Un`4gMJDM3!>{u_a1)0I`yMzL z%Bi*?(+VP@c%RKGkQuGEDG<5yd5)ax?SX_78uwT0W6$r;zI7(tBj0av3jKMKHc;_4 zgf`e&)kp_9)CIaj8WZmjzwt-zJgJ{bknlmm=^u)cl}I&?!qBl0%J8S?6K8!3Ip==H z2{@HiYD%QjZ$tEl2dSBOFWX-beq(PZVJ_=HBdV7GhRUT<p7D79WDxg|n5qc@tG3sB zho<l?c?4fOrt}M(vlsL;vd_K`JR)~+%3)$G`Tb#B?h`5YgNgp}wWd9j@IU1C(QVVi ztv9*j)kusTe~5&3Nl1Idueu!a%*tGjKOs@7>0`HW0^)wVqabK!xw?yZAG$U^=GU<P zHEBOQ?t*|{X)Y905Xc`k^Ja?_IsHmunGp}QV^1f>Ow<p8d6l6)1-=IR8;m#@`g}^@ z9ZYq-^)k&j@MkPHaXF3bfS)wI|C7bCE^ElQb_^WH2hD`jhdt<r`)l=H@aErS<+Cf` zt)+pIps=HZ?b<XGrSIbrzdJQM@Wv4h#435WiKwGSb{^Sp^wA*G_PM(GJZd-OHrb&e z^uuDNbq0=AVe}uZbTbg;VU1r$>QGl=-efmniNoxAh~!%*7+UP!Wd{pkUWa57uX<#| z7LC#crTQwo9iy7PGZYt51FPMfl!#8xuXs6D7v%Bu1X2wSD@e47Nov|#k_g}I(Z!e| z)v8i95VlSM3W-;LFro^4LFL!8MN7nUV4)RVj`GOWIda#%!2pdUohg&~@XyaL{X}dd zJ)4$hm2l6s?=e1un(b>(ktBX6+Kzb=-7B77TGD@7raM`a>tk&d@AbN}IVeQdX_Dd$ z9(Ih0vr8NVF1H4m5(Jue)oyo>jP?FOL3hz_hyE!3t~^4VsGR1{UH)+M0yX^B8F6bx zb{aKh;xONOY(5En?@{anM68&3TfTiFW)x>M&gs#%|5UZ8ncNyyzd{JQ#?#rmk>f}F zPN({-D<A#&y}}?s^~Z<&{+1)9EbenZvSMv4eL|93g##M?Y;^cieQWU**rpL{QL^gx zBip(pir7lEV?DG=5KStUJopn|Yn`<{5!I}m#{f|ZcCqlKW7sT$;HEFTDp;UDN>-e| z-i~IF!VffYJ7clLuj1N0@W)vt|By#6m#FS<9p~m&h_ou&dXG}MsNs(gpY8E*EVWtu ziTXkMaK7&D{vHjRLrTL6MEr_YrQ2!Dn$4zvbwVhQoek!rjlRZCMDAn8;M-#(qxKxa zv*yV=xgmr0s|{u-X9SLsFI%iDr(DG_??P4oLTp8H)Pya6Xa^;70Y}>^)>f#srn{I# z2kzIc4@%Y`s0Ei4j7ALWaV9JiQ0%}P(MP<ccvWFF6~pbc^iA}kDPFK<!Zlg(D;E$n zBhK>B;lb^dqHdh%Ng8N+iFW7<{agrs0~qX*uDAwt0DZ(;cv5!^2g;mP>!F_?*NcUn z47$Bw95gLwaIieSe?w#tWbVkLwHDfs$9eZxK2d+g=Me<%{NNBb?gymS$S8mH*_&CU zuTzUK9>^FBynSV5Yu+iyedbk;Tb;xFNO8br$A|egP#_gt&*f(?><<a3_#y}C7p3&R z0Yv`pRDgD=ZWlv~cz60t)mK2B+33jevv)pzYAbeXgrT?Op;Ifh6VUk_5Da(X{QXb# z@o<0Md*CE=iekLi1AEDG5`fdgAngL5QhzSeB_F4DuxY70^I9u`THO8Tjw3PCi6{@D zR5>oM`_|27paX?M%Q@j2-$l@zjWUm9;!!NPGGJolRj<KH`;znq)}2MvU_c3cB~92k zkn&686yHq5YIlKFfe0WKXRD)uxRXVms9z;^Wau_;n^l92+lyq65uGYNQ#MuKXQEu^ zYVPhe`Y`}KBm!*r{lUwkA~eb3$bDGj)%PybyZF7fqg?pdC)d7CA^6N{^eO%Yi;VSH z%vNwrdS-{vRid;vr@uwtE3<twn%VP1M$RSX=tP__A|m@?Fn&kEeVzrb9M%T?ZoFiC zzODkh$Krl>FzfRs+my!XUW}Gdw?USaQ_Yajf~Bxgzz?U$h)_sw?C&U3)Bts5bes$L zh*Nd0sayC+cGzTZ{(FXkT9*wL<hufeaI2m{8sLfvQofq-PL2lwgP*kVqqyp7zWq=K z{Da$)5JVSJeF9&OFt8yJR8Bg^e33PiX>=(YtR{cokk74N-yN3SJ9s8+oXtt%O1BLw zmu#Jt^&1@u3<~lkzf+8V>a0LwU9>|G-s+)UA{fcaLxscX)*+U-ByRhp=dj-~Lrq>- zEPVGem8`tB-1-RNdm6?ekrHV2xhJf)<-Brnf|anySZYRE6MNsqU-8c_Z$2FlYu`=3 zGnp+7<k+>rfa=^i7IuVD*NBUx-lJMWl`i1F<29XURCO|<w^qlL5q?&NdYHswh2*V7 zdxec~<IM<|k2j^&G7DaEbRlPRktG~$PFv%3wn2on*Z9@rd)D13WI~B~hqAmeWf(VU zPJC(11DYQFDnHjEC0S~oyh2=CrS~{!3Eu1q#B7J=7^%0}qdibEx0fOM;!YpD8d`z1 zqf>KhAE%Rh*5+mL*ycker*}K|4*qoOlyeqSvll4z^kJ{@hA;@hqMlC~Y6O?Up0)<{ zV#;w+S00z&MLF1$dM4FEV#?gHHj7#pRNZ(qkas*6-F-Yk&#OpvdkAYUOS+M(qsvVr zlG+#&XLX~a==zEla3hsu3L?L>lfJ;LcJZI*{I&l|)y;6sr}+^%EKWmIIBZYMZES2* z8t2IS<uYo!(ZIk!$paTk!%%R5n6G%jx7L2mx6hil1|6zWOb?#96Ut`iB_X@@9$&Xm zCbGc9w^t%04po;x|CFrEb?t`}cYrdW-ut!jvr^w{SL3$zw&LccoLo9K-lFJzO|GZH zqh>^D-Cp6|15gKwlrsh<r@YiJs_v{~DNrmUNNN@J<LS=ygPqYR`ZygKbXv2dgbT4( zW$k5VFM~k!KlOn$lJiultmm#?WcYb_^S3xYKh>zrr9Rkelb7X+8ws`uOS|Fy4;m+! z(8l-&WWUL;5NP(L67K95Bp_H>Ao;G63$x#wgcvk6sRnmGD$%>9?VjRBa`KEwVYMQq zW)w-ES(@sR_V$S;Ub@S+^B~_q1z>XE#^Kq>BL|tWz;SF21#eVDIRIG)Hmzy4%}zx9 zUm*pafLx2Rz1x+WA(6YY+>|BTGqzqf?to2$X2o(unZdKY&H+<&4Lr+O{ZAoR!Cpgc z0xLl-#VLDG1(+u0dv$l&=}ijZVY*97vqUaXgObu&Hh^M+@<<~!h>iKLrzVtF>kMmX z+4Kp@gzI!Oug7%LK@WK)C|NavdQ>c*ntv4jW2o%m_~&w)3J7qdre@u>U3YQ+JUT=s z*Q~-E-p(^A^wT&cjgI2N>EzH*kxs9Wq7YP@CA__Si2a&OD}Gh(eT64?lEvqxQ`U)A z&Dr!`L#Zr_hOBcX{kxZuh9ovIzRESFri8nv6LcbJr_Z6ntZ#mAb@3yr3Ef%$&`ycg zHkdxu`e@(goGe+RFe6^f9b3v8oW!9S;<{jeFhq)hH(*mU({&Y<)UChw^>LMRE`4VT z5h<=6O3NrRN)wkSg?cWtu`)TcS@i*A@tK?7%!rFq-M7To|8?6sxg?Ce)WvhLH2N;b zPH-Pv=vYKv#D+daq+$@h_v{v4rq{A+9d}9~qI;}$8oszLrmBO|jU=U3C2dc?2-gX= z^yfkaO`9)8J#+*#A41;ra#of&Cv+Isn?v3|^4qik9dxzzDD}YZd2p%_xJoSs;;NjB z3{4w#D<t4~Y7%PaQSFJ@;(9Wu{v+DB_e!4kD(-BGa@SbC(%L{9>p3+keEf??KuI{M z-vX%^QZnn81|97=3hwAnhuRu8_)j#&`X!B|M79}Sskv;b(sR1$g+|QW)byazF#`P% z_NBN4p?;<I8s}G;DaJrEM3IQ-X8H@<J(z(Y{|pz_wzpJAq4X)Yapv962s9^#zdao# z@U%gyliK|!G%NsF`Yte`;ze1nxW?dpmea3%wDu*Gq)scm+M%q;Eub`_I6_r%h<J8> zl_AHXr6`ItqnhC7^7vVUEM89JZzcehu*Y;rCf~N+u-5M>iiCvz8&BtR=nYKA|0|)J z{q@G=*=X$}U*oRuC6rCP-(!x=LNRkxqpYV19*nXZaJILRwh=c@Dbed6h{_o%E}=Nu z|4OkJ`nbq-fj==;1#aKFm`a!SO~7PjdvMeDT1@<UOO4cz%A@^x>hi|t^ESJMC3Ae5 zt1?|r<RB5jY1%Y2zAU)TZ?fEqv+<3{a6FmY-7SIsq}0D6ArDkZI*+O)_EOM3eI&I7 z>o;N!_#bjN@RFmhP6j_EpbxRbp<!V-sd)V`MA2_;qlEfqAu(MQH{KSxxpom2@w3rM zae5U4mZPt3LJgSBM%%csmZPO0CC2fukx}yj?@3e64=nle;$75t|2Y^l{HCDu1K&PH zFUV;ri?T=XDG#3?_Vw-mVoH%x|NL%`J%}VUx2I6P2K+OmG%&8FA(n+HyhK?ymOA|5 zbKzu)5<+Nh1WD$`f05^wrbyH5BrJYdzXTP!&sMFtlVIt=of#tg3}V<SlI+rhqx3D3 zGyNnf%)|z*{Edr@L!$v!ViuITcn!Lh<yVQ83z*CD;DQM&6~XDM<icd#YVJH4hl}hk z4z`!OJO%V^Gd|G*ifs#>q2Byk7=iAw!=8`WgAIygxZgNi4)+0e1MjXED*|-VR12RS zEvtMpSOS)y*+kv?$}0p+-}<Yb<Xdp)r3Yfub)9-O7R~Ey<8o$=YZfS?g67VSy(8|< zCGB~erXZydY1*)1r%^2y<()BH9i%%nGu!9$nWQeL?@V!arl-n(bRVdM3>L$*XrS8a zt%SoP7-Hc<%&{C3efRW^*us;q9N3%3a?Op$%(9Ej=hdpT7%IZEXX-2$gQHyHMgB@R z7w<B$s7_8!EB#eMcC-K*+aejE%zs55rpphyPyF}Ve=fQ4UzGeuod54hA^PY9&FymB TIuuGc*536WnrK&PK7RgxC_W&; diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png index 403187648a2e2732664c1e8a0b837129e183605a..a762d4c24011c13c3d0ff35dbd3a63ffcd59a394 100644 GIT binary patch literal 4282 zcmeHK`8O2q_n#S3gHW<G5oOE1WX~?kBuj)4qsCy2CHoSFw<RUg*pg+2M1_bM+Ypsq zWM5|NV{I%^F&KR2{XOUNSA0J|+<RW<dG5LQ^}NnK_nzmem4(S!RtPHq05}UZy=e^q z0QDHy_Y4ce+v)e*0|1ygkcNg<C_@uNKX1PPn@11e2or=aA^-`uHZcGI)KgMyojnC? zFX-ep)JTi=$BmSfU^tFdGVtEkgYl%*V?>S5luWueUO%mSeL5d0ew{)uMoQ{j(C7N{ zZZ3W9#OaH~6|b_5WZ5FTRS|RCHQK;|N#PJ5nA&i?hL~QDYVMudU(VZ#UYQBpoMB6= zmvPFP5d+CUKFTf)FVu7{x3y^oeTf=48#N#+oti0?DGt0u`PxF-*b?rT8Q-njJMo}? zv@!uEO(#s0tM^=8Kmd+;+N+&onDr04z~c{T;I<pydBO|lzYzfT`~{r9s(<9XR7!#w z$z1#J{J4#rbb3W(*OB>j;4gBjmdd*d$*a9a-Ku4;EkuT!;||faM$@P^a-8Lh8il9} zvrP57*-`;n^G~?2wu@6iNtJTQns%-eL<17MEdp>RHYEhGZtJwcZ67xYtOmXRpf=bl zT{@EE!8IEf7W_r4r(^RbouCNIV-1eB&SPKZybPFIkdm#6*b}*2Wsa0e>P@ltRPEeJ zqSY_+x`U!NWj&CZ;{zIR-Jj{pY$j87&e@gfwAsHe$Tm2F$<|%y5YtX{$zu=dQV6F1 zJqWSS&pESz(coi)JQtI<BWxRVq3sD0#ayu3AoPocsV;MJdJhoWf`u$ur3<BR+}CO2 zd6m+w_a#1jokziy`(~OjCo<B>^-U=&WYx29^{r<iZFFvZ_N(OnF`(|Q*Krqhbx^^e z<V57xz=y9}p0*-Q?9t(#Wx)er_eUZlicondCXOa>HGNUx;*~eT7>RBhx94tynzuMq zI<u|@y8Uh#90>=CSYy?ao03;U^*fF|++NM$f3)Ais&P&HnD~L}$sG4}(Twu7PbM1M zVTogbYeAwO5HH!FF49PTz>kx!u$A#D*ovAX`|;^$CN!07SEoW%{%*$_)#&HcX7XFx z!cFI`tgZKhnm0ubDs~4Tp<X~#Lm2Ul2a6MZaj#n!gX-SH2#KR9GmAR&{ejp3tp99G zm-C!l04xCJFBFJ1@fr!=Qbui7zWKzujLg0>g*9-Tkkz{8mZ1Ih+gCR;%T=Dlc<=-H zh!C|h?i4;}B1>nLpIcc}c?{qCz;)m9nz4D^yT(~85|Jg8t?Nt{zLa<osP4t92|mP# z_>I3MA<<^qq{`Tiz-@1>Qx79yk;*z3biY1|yEvQt`Of<GNWfZkFUP`jWImqo`scH6 z-HVimtd&YqyzEP@xNFqLRieOP2?rtDa|uxOSV{e>AN2T$j~xCM5r}0`r%T+}bF9_i zoGWJ<IP~mQjq#u~Zvo16O2T%n!z9`s&VtlO<Gy{dw}kvC6Qcfg3iB140Zc?TyPO;z zMMV8(8kq&u<4%}P#KPFx;bXmw0ilk#2X!|$2S_pS836DJ62QzrK!!mW1^|F?p#Po# z^>9r8#Q@)bFaKzoZ~y@8BG8-qcf)`id0_7gD}wDOpXFO!;km9j0TA~Ydj;`x8HV@n zTO=Xtk@`lUn{4lv(quk>&hd(hrWKvB(l<(rIj1klZy=TXCX2!kD*Ok+wXFI!gVrj* zp{}Yree%S;hUic^j_SS_v1Pd4zy3Y)`qm!)$E@Ow=pQ~t_e^7$O#x{!x;Xb+;=uF5 zKttiG_v&<7lcSPZO);*>>Q>oSZy;G0mW-uA$+&B4!&mjK$*C`0TZCa{3;v>dpjKx3 z>ms)M2(}jdC93F@?(M|7aGQtT^GkkgiZHVZSuHc~D+fl~_UF%WiKB=m&@+Yu_IX;V z%&uT%C?5@1v9woQVqMbqS<GL5Fojh&_|`WY>b^7GPxQO)2wvuaVDTdcD=Z@z;6f|3 zisrfAzmohX2v>WJ;502@=HQSsRqy{s!v#|Ll-ab^xOGLbl}?Y8l$Ff{bBm9F1AY`} z54E7tlHf-9PhSRuH&-?i(M#COLooz~-tT#Mg_J+0*q-emli&P!FQoDLWQ|8}U#^;% znwovln`x@NynHqrpPVTa`ZPX1zU!4DTvTCTlDC4=lPSHk*v-8*P#DJ!QSMsPx_<?D z{#Qzj4cns)5@D#u!%_o%9NA0|)Q!HsyE#quZ;^GX?P6r_i#LIH(96>!1OK2j@Djt0 zDqD_zaPhl&QosG%ht?wMkNx@8eDm<W)1=^ZhnDE0#^;x{9fyX77F%PPsvqz9zW?|! zgcLgd(HVomT+LPWQ95)(AT)edSixyATg-W{Ato;_t5k4CZH-rAw+K6?hORSB;g_MS zLNBYT6bAQj!h6>zb8>Q&f`8t1Ab4eVHrBsnHpR^|uLJK{SqZndw->=kA||O_)rj6a zFLDdI#naxB==Ck}Z2H`sYw3oqt!=e?A7pqsIVmYkBXC*WC)7FI?&$XM!7=Z?>Pp64 zor;X{S%GWGGly|E@kv!%2cs*no-dXsa!YTQFv^it%%_N);6vbF8Lfyvrel>bc?rt` z<qD+@-~QJsW(J0aRE?d|zM0h#-rP~lupBj2@J959*4ko$>q<)BxeO49x5XtTq`EC~ zouwn*^9mcUOd7e)&+N{fms7-0OAD-y&+bJ9*O=ncQu5vk=>IfX2fnM&ISMe(Q@>N| zJ1v!vkbp@`bM+eA{+uao-@}j<(UTz=us)$UOxPGL%Rc%}iqZ-Dh1*vOT^lm0^&yLM zUe>De3w5R~Hn*5=>IN)MYuJb?%iP^P@xhimVdU1xV>!;jO@0)t4o2r`lqiBk-sv0E zlB8|U4mF2zj(=!!fi*`E@-zaCd1W0%IfZmCY&3RsbZDNkipmUs6S%*#WNl*uUs-hY zu(rnFy(g{lHy*DIiRI{`KS%NTobwvA!}3h@M2)<=v;6zjEB@d8eCLH@JGiS(yM~0+ z-Y(E`&<y@5>P!sbajpX?NJw<zZ-s15Asf4fOD(g{i5RQrAGJN@b}zr>6zdqY1Mhf# z(c<u)^Z}KaCvuVzioOAjK00(*rc@<8n#2dh(LGUT6DL61i%%nmA@pCvFT@nCS&4tY zoryG*aImHQ`FOx9?;?|bBUH7M@hV#mA)P54;E!=>yRp+FO_raIjiFm|2QUe>&6#Fu z$kpx-h9~@Mi_c2C#m5gCEI^`jf<W#V2y>n9w9<Sj({IQ>5O$LFP!Vk8iech}hr|(` zep`)3BB0!f{T5z(lLtdTpFm<N90^KfXV|S{dl{Y=(%!O-pvkHQ!<v14hlYyLyV6GE z$;F*0aKK6jT68-*?lx_WBci`}-p_Q9;N*^mxt!<b?hDHefl5nBeP2hpxfPGws@yFd z=Ls}n=$LKL%8XN~@jO)!ECzW-avb8#r3yDw_+5Q`Dm2>sh0y2|tRQ^U$?0&x<56W$ zq|w3xIp+mA*i%CLuvu#GlTTk`!SLUZw7Im76kvb;jq&(~{_i2wvA!Thg7mr%@|}er zbt#%LDCM8Tfb|4Va+Q%78Ry24`w6KqF$sxW-ztk|ZJnLDS?Me>EV)@tO<GT%JyYt{ z^sJPX6qLqye2{~EmWdFlBAypS9jYW%6zsMnWg~yP1f`=2MoqV;x5TRZl6iAj9v*+v z^4D4kZSW9PA|1(!ZT3@WIkgWh^EDA2Y9^@yNLA;iu)*i2G&fg}4TYN8qwPNblEUiY zQf=1apUfnWm6%^T<UyvbspDAY=Dx%kc}Uoo-+Rze6m<TkheQQnBrXVR_=E#`xVvFq z=FjlEjraM2RMq@fg}dqNG58b|s<G*!Q)q8DWxra@uVrm_7flJ)XxdAQ%-D?;Eltg8 zTCZHP7!<@ZRlz$`mm>&-vfh>c{Ojpl+7Zg$*6o+_dyJi`4o>TN#1X_Q#N_1qr*<FO z(F{PMzlOlfKeatc)&57pv9*{#cKpq!;B?xyd#$x!<k;cR!R`jiJubLuKuUA})1!HV zNybW8YwXX{7@h%*l-8{>u?zSm9>Wi;_g(ij!_kwD+`RtV{yQs{c4qZHN;i9xGF}EO z859cicV(<IIqZ0yxa?&4s7?g4TTw?3sM4f-muk1C-ZM>;-|bMp)}GhZf-YHWt>J&( zaUngc?V0!l?<*=GdtGrN2YC<My!RuP!W&W;+vs{Mi}qRLmJv&=j!LY9Jwfvh4j!9I ziIw*ANh^E_9g?H9(+Vh`GA*Tywh~Z+OP^6?&hY8YFf@*`J!_v0_1&+lF6m9)BvMpE zdr3-<>9kK#{}_))fiH$?PUpYCz65}kVIT|Lgt9FqCJ;y~5qnwa^5xA7(Fc>Lb70Kj zT!!3nd3@rNv5V1-fqJfb`SYdZzc23{+}HC<PRysQ<K^c|R{~0h$*8%18?-M@FAg*? zZWi6SJ1`{VRnU`l5-q;>;g)&m#CYQ$^^ILGZ7d&JavoT?T=*{K{fkZv0PK3+(~7TN zG3ig?J4V_lWjm-X1$#!2TL9sh1^F1s?*-4B|0Eh?hU*4#@hN7eGZ@>0%!f|-eq0E5 zX4ITu=8u^;w$TRbak~Nx$d=opG3GJAqz&ECbbvCDMHqi{!Sa7W|C8YVcNfH-FmWFm WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- literal 3218 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 8b9671723f4e862754fcf26060772b92d9858242..6c51bbe4016b3769c65b765884b983c36ece586a 100644 GIT binary patch literal 9790 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 R`Jbm7GLi}swPHpg{|7}SO~e2I literal 8441 zcmeHN_d8r&yVgSxM1&|AB}(*?5Yc-OMD*UG1v61+^iHC`5k~KXXd}w#!eB%viEc)V z&Wzs2nfE)_`ThI>-w$i=XYIA`eXqTrdp*~Et!saJqpLxEm-#LM0Rgq<E7i9I1cZY4 zxPhDue-u`r!{ASZ-fuOO32H`JxA2`8j;5MUIywaW_?Vo4FxHiT<lkHHjTzqv2#5-Z z{_hH*U;**}#RLui4o*Y>DhLSJL7J*ch7iKN+&k?L)S6;xq~rNGc}VK*`>_wK#0rYy z3u^4mO{}cy-IRypFMGpW^Y^o+t3XD>(t8ZV>p5@qdtq@}v?L_a)wTQ8g_wn`K<EA8 zKChd6G^i}_TV<tN=da*xL*KIsr=y$<RT5Q2k`O|YtXrb(a{jn5@{eJ><8N8-(q>2? zce`VU`#V9WdvK=;nWB-bOrh5D*+GF!>Y1r3qe`Ms!HG4}pKSz{fc25OHeQq2`CkeR zppcyR-q|A_&#KmsvMi?4bF0Bf2KNupkg3*Lk=KAk+=fn@gM=>yS6B;Vl+|vkDc200 zn9E_>n~*B&*j*4J^K-ZJYGke@Am67)1nDB=f}%67xB3;_!^>#Vw(j9^G#XsxRw+ES zz+8LOB01KXDKQJoKW=UWJ0@*<HaGq=!GCr4EmSmycI^GSV7(IYNbAd5ZeNGK(1N7j zzWE)wg&r1rZ2dTkI9JLnaMT~G(fTYgP&)P29J;m9yhPA})INdjFYEVn;i(!k3rtJt zM;z4n>pSYHnL3BPHcaQ0Kcv-R{&fCE7FpA)e{gqe5cjr(0|iN7S}sdrHpT=gjQZ_= zS2JMk4s`dC;QmYhYSK25MQW6cn)#gutEXx)Zn=I;-tBA=Y*T!CA~Vt0V?i-l8gKSh zciH4pyA_tumc|DNy{?nH#v=SSa=~-)BAuoyD93kW8@WPpb<L0EhSRO4s?_3l(+8`j zVV41;4=k!0SB<$O%En+8!fg{}Izn9&C4oOPGD?Do8mXo}(s8+`85!42+k|#pe;(qq z`^gP$z};NUhY=Dp8x7Ly$=bnD0dD_JMy&szJu>l(j&bEg5s(r_b5Xlp^TVR=^z7+8 z2o!p=W7E;y^Fc`T=SHp^)=~<4^GnZ30cUy`I{47wLq`k)@$RfxC8q3kW2L(FdjsAy zkP9C?hwwVW_m%-z?hD0EXaE}1g)Eqd8mG*6oDmbFzJ$V^=PUVp=Ux58=-{(O$#(;^ zS3@?q&r@imX>j?zp}E#m%k2D|PV;Bcyq4YrIk6|}*`T@JPxO0X#P?ttkNrzNB;Iw; zlnZRi4cM+|nsv(dA0wx6#&n!Dwe7bKVGd5FZRV#eKpub~tWr(X89EgGHTY;mO5S5Q zLkuT%ac=27^1P*eHZ2r)l#gTDsfOpVg`6*|Gs5Isw#u@DaA1`G*G~5nkP3yikYm&J zp_5#ov4S$~sclfHN$vL7q;|INzU5-H*-tt9AM#3@#=`Xpvv&myp>;F%cG|w3-09^w z9mX$*=J1+*vbs)ekCVro;aBjU`Jzq{Ym@Kpi>{pe)A!`hZ82trl<oZOg7UoiL0&Z_ zuD{A=50C&*HmI}3qpt6vUk?TE%<<MQ@A-+7rg@+nJ<scb(wmF1(5B*~m;7gKB@ELp z>yX3S^LNs3nXE+?d#eOHA<r2nu^(qeurbfAw2$Ef*EKeNXET>y0eY~)K!B^v>Fns} z%XObCm)&ObSyaG<jtnrr*nRxv{G3uG&ZW5K>Fz9I?Qlp0Zik35Lw5#yAlbkT`o-#h z_-Uq`^MjidZs7}F+A@0$zjm)MUA1XnGXRz{_-?8PtedRq7I!u8R@;$2?{U02(RmG$ zK#(n82CZj0dtERY7t&dT-kf;gQ{HG|6Z{;$hhGsxR+Son;D$Q%<G@`zx0;qRYJj{f zw02TJIx^a%arEU5<YNwmDgesq!;5KNy*KYtoal~S>h_y;gw6`owtr@Mk-rMGG7ydt z8mKa>51LDEzS1@JVtg^U7Wq0)c2=a`#^(%6l<vzbz{v2|%kIHjezMe7HlJ~&rn&c( zj`92+x#8&3y^)af!b?xW1TuA!!ub{5XT^aNg^`aK?~wufsk}p*U(#IJr|`v!&x}T^ zpxD=x_=p{%IeK5!jf&00`U)FQJ&i@1Axx~4C(t=5cOF9ut^_Er=u>^=nX1`i9|x3s ze#W#Pjp8`VzkNHTR+~xcbTvYJii4k?uO?r4Dd&AohZr&SV#5VkzfVp+YP=4IOfH2- z`KFUs*~R=w7LQMf*OeYi-)~9S^IOV0o%61p`@<zNws+FUn?L_4RCcONC)4SQMs6TL z5RDLK^Q>D8)b{1d9Wt#y{0p_2L*q`R96mXW&;2?1VxU{Mksm4#J^8FHTo;Jxn2x!} zw#`B@dRAG}$`9|zNW%+nc2ou<J1tzZR7+h`tZ=iXce?d8|8nu_cxyG6zUG2GS?)AL z4?)JxRIr*PGdg>1jeEJuT<VFaP<rS~)p8G?SYH-}kaio)Z2ea@|FwT&xF!tW7V8{Y z{}FE6U12VK+_c~|bb-d_&T9fmD#$BcO-%Hq<8-ca^X4Zxi8;esoInkB=vqWLrqt3c zUP;wuR$q7($O3BjtlqVJ#+&Q&`BwC!O;fXyt3rBD-|ClDx$LI~-xBXzb23s!_BMR9 z3DOT7CdI_XN2QXf^uMf@+p-CETu*?DB**hx=2)h5FOB3#-?s2iMM_1|^=2>4aDXU6 z8*I8l<j+c>*6%w4&zji$W(ucJ4ecWB*oa*J^-Pp)U7ZCSh{`UDR(H09JiFTfo3;+D zKI3#@XQJ`=B3kx0DVrXGy=CUg549f2AX`V@)&PA(u^(z&`E~^S;=?Uw!;ygP`iA$v z=4xJSU``_g*GhHTnobwG@*2&6!D}as=E&%mvp?j>=D&b==jqR6-xGrYtU`Wt&M)kK z4{rgipJ9!RjGC5XST3)R6`S|*;uXlh6H|&3LQ1Tdzc^d)4$e#<U7eWN+-=#&tC8Ea z-OSDV4Q$(6KeBCaKAoF>mPI3fUH~Uv4k+7D%^Z_E%Tdr^YASp^nuyoy4_(;<RdjJ2 zZtE^j01f4<Rb=v6f1HdDlTcMqojAfO%oO$EupZsIQ?pZ3JV;|0y05FKNb0&H{Jy{K zF!2w5{l0^c9akK14n9m!ebIg3E_$yz$1{#XT`+V!JO17np+hu`jV6LJmgX-P!~{ah z1Y5GJ1JIa|{gmIQ8>Gxr9WW?##5UBoQt#NY#M%$10*QIgS4Q1>ZMiu<L;`vO#yP0f z=_bLII^HeDX5L2GM+o;Tpw>w)!V?qh(lKqd$WocI6)K5wTSeW7URTwx^&m|-m;y#E z_D9JI?fUq}X%SwNC7PWa6!Y<BMbHAS!&SNB{Hji}d#sysG6~DSD-3QfL7`XkmIqXH z<19VIYu>nvjW)jqoobF;ODFjE5y|;?p^~$$XRsbNj{eB+5p+AV_0Ez{TjinqarC%1 zDeEKIZ96Udq`AS<FMUW6@_mBR595HZm>7#43mGnu3b<t}Y|QB=pz}iHZMf1vK+gWH z|Iac{&O<v^0h^vC(~$lm+Cd-itKdgIY_q&R^oWqPEmUxbiTIZxQ|gEfh6Ed5Ei<%| zhS}oeD|RK!GJ(~BeNF-37|pjFijWmpRv;sDcjFUscV-o<LP%Fh@T`wwVoE%&wr{mM zANnT}-2!R_1ghs6zPDT?8u6&4bNz%}hLge6MNMB&K{SueYkW~m4mLi>I0oje>s4&_ zF?-j=2&nyQpIAx~kk#jx&IXG!js?Zuk;zWQAgZ1w;v?r;@-XVW{w^2`?z+kq+Z@@z z*9pJGK#R~iMgt0*yR+1I4jT-i?0n~B0P*6^mQtRFElhT8NVu&nKJ6hNxz-QF;63v1 ziJj-sjMkgf4D$!9EZj^4=1vLX;7X=>Z&dbeVr(x4+kM0VI?uIQ@zw9=%^yZ5LDk~{ zhs#Eu-&ddO+Z-Nc@6-8j>V8(2;@wr5PJPz&kFk;isYuM7lq#UKLJBO=w_iiJb(3=} zJ3R;agqi!d!ZjQgCBf)>KJuB+0Vj32EY-RUUK%r{?2<+=Wc*{ptG7go5HCe~4b54I zbl52jd-+!W1I-VZ2oRj+!b@v7?}&+X^lz1Z*ebqIZFVrTQpC6dy`&Pg=#KCE^oB^V z8T6;tU-o4F5GYdGh}1yR6Dc*1G6DJx?g7XS9@P&rwq{UjWyKQu_2;)Xw;2SvJlz^Q z)QDraT=L<n?ZO2F9{%LrJN~6t+bFPzXq>j52eu!m2X0q<ZNCrfx;ZuX-!xAGS3d@r zvsoHVRXEV@8wPLc%3f}O+7DuKy+@_}PX3s*Wh)Iu35GmsmuZcr8vlhHZ4zx1XFQ5b z&un{}@Q9R#-3N)~*~E!IRy#}bl{XXNTG%S=^Kww^6qJRh=(0uBb${?&j(+$LS|N3O z?#zq0mMM7jjxZ-#lB<!w^}TL4r>YN$&!<H9nYwc}TD}KVLQaUK+I1jB^gay)jvYEu zFu=yO3s-ES=>9`g&=&RSb*h6qVnj;VlycOnH6Y<;{7;cS&8o?6ucD-t8?zs?S&SRe zMnv?wN5Q<Ak<njdxJ|$ocj*4=(+!&JaiLz=1e0T1<O8JdDc+C<c1X1MG-{cjk`YSL zbb77U3L<#tBL^#u)k2!y*)n5dEudzFUdYFRRkh?(O&r~d6Q#XjwiUP7ScTu)+4TzP zFClW;&6Kw(D)$Z|;e}TO&F=8yjx&_RW4nTOydxem370YAJB(ogVy!yHnWOi~Gx<ak z=xv+vUPMqKsZaiDw?0|qD@sH+NH+TeAuMTvJmwP`VgL;4rrcus&ThvB;%8#n=UjQ} z36DcQ<RcynpHd+A_kY64B%H1*)grDeFB=>5v&?ZPFTeH&=7&I2W}6{X5jKOUS`cNJ zG7oGUK}&ALkpJC<qeD8i5muJWFf#6ZFz%ii0?;&Jy3{x+`h$v?W=zuKoA(d)pu^de zNDsTMBt0KeYtvDA*}-)_Xx5Q^A4*{MU?bPwB<~7*H65I6cBRYazQcBB217F+YvsK% z<olOvLBCWg?9L#86c~dAMvTJ_`G_~9k?VC)4oT8H?!xc=XY6AARR*{oEXX03Jf}bW zF*2!cQ~)1+c++fsh}k_DAniXH6sSF>ejq2j?;ewF4~d=mXj^c3va>PN@9=K8s-k3N zf*B$oixZED==QwqkWEfwAiKW>fO0{!4HhVdtiHt!4IB+W58U?*uknpvU!h=BUaamb zU5fUki;gdA?uZ*ZN!$^ZJ8PdEpVU2$xfgb4Sgn_>C{8N@%+%)XAd8CZf&AJVfika7 zxTHU?ior~EOKvqZ387j&H-7#8X;5vjp^IA?t6k}pPIW*2ZL-@@Xw(Vq_I8&AMR)Tb zr*J1<+fohMjXduuc&T1dr~C*K{(_{t&c)p<ZKif^*QBT<OB_3;46b@p_m^2<P;ElT zzKSoWd(jyQGdAJ3bJ^T}o>o`XAC+O|U)t&`A`wkll|xy+w0z|6P_?;oL=o8nF%WwS zKPb0rG>`pTz1?PFuffM(?F}6z6>(7>rezcm$X&oHaX6^S%Vv3*8H7mp#|6A0ORg)i ztqKZ`k+Ca%8l~`a2`pwcSoR{Mc<5ch#i!8Bj$^MA`l-EK4Lb8fb;h|~8L#CPA=%UB z%1W83kSpWlug?$c1l|V8gZA6S)YahGv9ViP&if^4!NcU03@?uxV#{RR9Ll=v<jleF zQ=vKOgfRD<aq65Gfu9!@E*{wo+AYSK4mk;3bKOm#)MC~sSh4EqH{$B<V4^>u(^zEV zE24N-s$ux4D_M#AkN}0(4^K}RPDJzJ6AV$6Q`^Vl-agLXR1++N{&tySb$#YS?hs&P z>#+g0^KNduxG4isg*|@jAuCU@4++ca9DEr;{_#g`n&L^Sy)<}1?j4fYzivMnT)fEk zfXrLMDoKlMAM}di?k<|P@O~3xv3Hz+3TD!T;_}T@5&5%hsle0rA|A^hAOGrjz1jM4 zL;c4z{Dy_oaLq5ls4mt0OCflx@>MXO#RQ2tl?~`-`E&y5)V61SgJKqX|N7O2-_e{~ z%e1<@_!(1c;`V7~u&7(a-n>VFFW*s()^5s$>q6u5iyiQ;hl8^&?5X!xGmPKRhVw5> z4Ee%sSYSsvd9H!(qX1|p^V_H<s8&HsC{5*W3dYM;6Po@`45sXv(Go5OM~>G3EL7#o zUH6T}wzs~z`i`4cm;42k+)&kmQp~!q(7_hUatSBhNOZ>Ny{54b8BgDDOsH<sU4-(* z&nm1v<%TI>j2vxR*BfJb0ym!-!XmV-Gq^8RL#n>11ByB|0owu%R2|Tw+RJYR9$i49 zksE@*LZB^&<Qmw4<s$q_#V_IQpPPNc{*Md(H++GAGohRoTH5^h$BH$eg3qjO`!7iu zEthO&1ovDNKtR-4``>g6eiMrRQmsGI8X!ds7!8T_XbG}eeV!KdRL$n%Y8y^YLUgpM z8TI9^V1CHE24B<i;*<H1p}Sv<L+Dh^){deng(BeGuFOQsCy5V*jvHS8qBXAYrG8k= zC-Q)vJB%^dUjRi7+u$Vsjo6)(5NTpmS8%qu4J-;hb3sp|4_c&9Ui30c&5_=LxHS~A z4ZHS_<odza>ML>Wxg|8lJ*tRWc_3+Mw6!;{mU$I1QB&^;kXdPPs8T_e#kV1}i=wJH z9y5Wm=><MQn^a&g*SEN$v^w44i+=J+&qXTli+qG*{J9j!_3uHz;xZK~GsZ5O$HeyR zba@$yZgpYNuf-K#0C<Sm%b7u&^qsuq9K{Db2Z9tW+Lqia(P-~6xhcta->~1+w9nqc zQ`bi-p$x*-eV@YO%l;8j)&F5T;laK@A(p4y{N=jcze{SdDSyu&ivlKmixp~9*6SL@ zblyl+rybpssvlsamxs&Uo1Hgr1Uha|-PmNyk3^GI{Bz3^5-#UAjc6LtC3c@CK82Ye z+wHlMUJAJbKXca_-bco7-jBLs@4rx?k^3U^uzQRg29WQi;X)bIT6Y9JrkbA=p5)^& zj-b8HKi4-?x!=TKE^ghotJ1EjYx#7AIyy79N1j?oT=4;=^2IoVlO`L*txB*8$;2CD zZfN(LMt37PTh*GU;Z!YDaZw^3`a1JXxTzkKP!G!f#{#Jtudu;m_@ApPyC8K1L&rUt zCU`X&C>2_K$-CI+UE4NJ{pne~4t#dlZ_y>C<JqM@I{HZo*{Y2UMymJp+b4nFH7YU= zr=MxB70g{SKS9`spDorq>)G57|An=UfcLV?p&lq_Ftjr?Ir75U$(ajP$Yo!V8260b zZ{h5vJ(Q8cszDhXeD@lsFJIW=_vYG8cBX5mtp9zTcJ2gjbtxw8o~Sjwr$&|IcdyA~ zzIF1EFuX{JJ7=IT-?5t@eR54P@x;F}hrpG55pkEos+X3@V*+SZ?REx~obctMYfVMV zfa1sNH}XF;-6r^7Kg!<OKK|LP$8Q+f+DH2%AuJps<+GZBtR8pgUbAcGQ5Ywc$h9p{ z&e;{E*L-THoRJdt!k)uYC};DbQ)!_l86VecS=!SfsQ`|S&qL|Yt$N0vSG}9%*Ct_q zGmlu&2?d8owJAxfmPFI`$|4NP8hj0&IC2L@(Ep@0v)|%&KPYXzI@t#X|7kR?S8Gc< zKaWPYHH#EI^(vI`>^lTrR*Po8!l6_Z|JJZ^I3UiA2UOb2Y0X<hZ*d_JCd#BxPDsYZ zLGK|FhE3njen$`kkuKC<I`1Z!s-Q$kSo;L`?3hCqsb75^r8KKeJ7EVAXEd}>5j9dj z>?bc)gNweFd(axC8rXZquZ)#<3c+xyN-ATUvs!MTmVT}Z{@iNU$E$j$e;94dH-vTQ z0~l1)TufTuL<OsTbk>;`78qt7xejv9@r;prKkH$a3*@NJ5jA1SGxFp4obt7koBqBn zt=P-u8WvA@y%G)L3Gr*zh$u}m$=P@Gx7iSF)lVgzc88`bn;N7Jy>~c%i(c}y@}@rj z!WS%QhOTM9ZM}c?){l-aPjNBiF>mG0)cI@_#l9Y;Wzn&zof#nEc3Ge1yrP3Q<iKcx zTa>&D#ltdVC6#bUjG>oj1#u;VC8RL0{1HFzp6BY2O|R?ogAgaiQ)kgEw4E`42lj(q zR8g1Jt(|wOUip;;*}@}wPDx3cqC<}J5M$9dO#JJftGW(KV?1pJPPr5m<sx+*kHVZ` z*Yx%X=MsG0$+KRuHCO($QsPPBd!MICWvo3N<5?W-_{nSj&n+l&n$4Cz3$|lzpZ4XZ zD?xF{@+=t$h}cOkTmf<{N^mNOC(;mOl}y1Gl%)G;*L<tJ8!6-*DR1tM6GNuMJk4x( z(qpk<%pMJWl99n<E2#U~-%W|+`ufFOM17JR0syU9u3*exzH_L;@ICxS#k`Qa{{HF# z2?f2?5;a{8ptz@*p}zZr29R3{%BFOF@I9ja`fvy*%mSYKu9tJfNBs9rp&-?tYB<W= z`F~SId<9XL<r`$vcx*P~J8k8rV=y)TggCw>GjS_UTxJMnhqyl0_3`%~?xwtU^D(Uy zw!42vc2{)SMN)-0U?Y4YQ^IK~>y&@jI<B)v-aJlGKHTYOlucUX<#NPMx_@L^*PX6- zss%l`)4ra!(1KhXgOSagAoy_1%ezyk{ncWPE%|P!dGf^=_>YOP*gTU$PwHI><0Bcj zSMg6HWqm08ai5T!%J7<*U={iPip_0LBrGL`SMn#p80bLu(W)!coBlRYV_9_c^we(q z5vAUD{Y~2v#=^5lznp)+H&yo3DXe|dl-~82XoOO?ISg#{DvoMltZ&ZLp|5bh)pT3T zp|8o*Hgs}`F2O+5_=~}}x}x}xXX@b3PluV^s$NJ&uAe-r{10EUq3C0zkA-Y~pCx$s z&L`*1Tl&>6(LA#SOUiGfQ2sgGJb0=Z&o8HFoq|5>PA!Y|?<h*2JBK{d<vw_~@a9+b z0L?DChxAlW4RR7&C)R3nL2n>D@X~%4@*pBs)n6H)=Q)tVf#Y}!f*tY(mxDehiXZ2- zc0Mf8^{E=9El=9Yi<jTpzaL^@+e6wf$C=7%DE=W-B~<f2zNqKa-bdH-KL$hzFlhdO zP)Aw+0gvN-Lb_Msii=3*x8-Tu>_nXGM07;rrgVH-{|=;vQ5k0i=vU)i8z;#-80VWW zPlz~EcnBX=Jv%8f{}e{9N<Lt#R=}r8qROs=hq-R6HR5p}X;Zr66!kxoe^kuE!zO>n zzvm|6q~&0bWC$;MLPs0^jAFpHw1V-E79OXpNG3p}rimwZy`R#pWgzk`4Udb$Gn2%9 z#uHCIVUJ8Jvo;jK<H+&M<PW&<#3h<|m`+Ez@qZ`$-!J@MN&I)w{kKZ||LZUopyN^e VfNZGi-(MOCG}UxfYm{vx{s$5hwZ;Gd diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png index fd100898a357ddeabeddca90898dad3ca346b7a8..95212ccc9b48d00e4f81ded950d528a80b819e46 100644 GIT binary patch literal 5424 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 literal 4413 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 XTFrw@=ghbKxyCTMWu{-Q>lE=n(!C#P diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png index 626e00daf97fd4fd2a26f5d89b03f6a46b7df96d..f6cf9f0e57d0463ddd515bc1d61284284fe72aa6 100644 GIT binary patch literal 9653 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 literal 9142 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≪qZCxg-@UIuZ9XvRpTnq%0UF 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png index 90d69851f55bbfccc2b02af158227451c90dd5c4..b4127e2fa250341aa505390846b52925a9a39585 100644 GIT binary patch literal 3697 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 WDbBqfk-Yl%Zx5|&ge=v582n$jftvjQ literal 2659 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 Sz1Q|Xd(IA5?5P)S-2V#}ghrD9 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png index 2cdec609af6ed4f629250b4ac8ca77f7c50ad235..69c28def26af760ebe2d7dc20e43d6851c12fc62 100644 GIT binary patch literal 7175 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 literal 6130 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 TIuuGc*536WnrK&PK7RgxC_W&; diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png index 1098d6f2701d1646c2b41e0c5a9ed89b62ddbcf5..c877e38a7b1ecbe003a8e63ff095c3310ed38ad3 100644 GIT binary patch delta 2621 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 delta 1543 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 From ef1627d8632fdf3b319b29b3881b67219fdd11d1 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 22:05:18 +0100 Subject: [PATCH 18/29] regenerate snapshots on Sequoia # Conflicts: # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png # Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png # Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png --- .../character_mode_no_affordance.1.png | Bin 4282 -> 3377 bytes .../character_suffix_refinement.1.png | Bin 4282 -> 3377 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9790 -> 9389 bytes .../hover_pair_affordance.1.png | Bin 4768 -> 3767 bytes .../hover_single_addition_affordance.1.png | Bin 3759 -> 2747 bytes .../hover_single_deletion_affordance.1.png | Bin 3734 -> 2693 bytes .../invisible_characters_debug_overlay.1.png | Bin 10089 -> 10063 bytes .../multiline_insertion_wrap.1.png | Bin 5424 -> 4427 bytes .../punctuation_replacement.1.png | Bin 3697 -> 2618 bytes .../token_basic_replacement.1.png | Bin 7175 -> 6140 bytes .../character_suffix_refinement.1.png | Bin 4282 -> 3377 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9790 -> 9389 bytes .../multiline_insertion_wrap.1.png | Bin 5424 -> 4427 bytes .../narrow_width_wrapping.1.png | Bin 9653 -> 9085 bytes .../punctuation_replacement.1.png | Bin 3697 -> 2618 bytes .../token_basic_replacement.1.png | Bin 7175 -> 6140 bytes .../whitespace_only_layout_change.1.png | Bin 3577 -> 3580 bytes 17 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png index a762d4c24011c13c3d0ff35dbd3a63ffcd59a394..d62c86ed15f9c92a058ee54ed957ac437455b064 100644 GIT binary patch literal 3377 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 literal 4282 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 WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png index a762d4c24011c13c3d0ff35dbd3a63ffcd59a394..d62c86ed15f9c92a058ee54ed957ac437455b064 100644 GIT binary patch literal 3377 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 literal 4282 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 WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 6c51bbe4016b3769c65b765884b983c36ece586a..d2d6cf23325ba4e7c1ebc8039659ccbeef412677 100644 GIT binary patch literal 9389 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 CQdv3x literal 9790 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 R`Jbm7GLi}swPHpg{|7}SO~e2I diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png index db01cc7b8ccff2c9a4669b8a00201eae2c493ab6..3349b79749e5aab797643be8dbece778ff521702 100644 GIT binary patch literal 3767 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 bMmfHU^=3Wmfw2|+^MORdQFrTg9H0IN8DiI{ literal 4768 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 NYN%?fd{VM~^&gHYu{8hy diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png index 3a2c264ef753b137f9043cd6550ddbe9873d29d6..60aa6368644a4a1ff721ee4e1a7e72828c9de24a 100644 GIT binary patch literal 2747 zcmeHJ`#aO`8{cNK5oRmNX|uE_=X{JMpE-|&M2aP+sC7_?gv{iS(3B93C6aUGkQ5sq z5#N@C5Shc3;~eHZwC}qgKL5n``u=b~&+ECL=X%}GeLt`3zMlJz_STZ(^5P&6NYaL6 z;RFJKp#XM+?E*%REj1%x0tY!+n}NzXiqpWt@Zwn;zmq3HhXD)&f#WZO{+tH`CJz`0 z1Ytt{^?;#Fk$*AB?ayXPuR;(AB(7^?Vd{Jv%zJjl&ShY4n~?mLN-_;Iq!K;`<EVqL zp39@tE=f}ECt6kOa>O1}=FAy{kGf~d1Z;!GF)_(gD22ieQ-VpC;mdL7LWUa}JtGn0 z@~qM%m2HZ!2qRCObJrdUpC9G8;PnT7<D<jB7|m*M1Z8u=;c#A%!`bZKE=k^UAa^}V zWWFzM?Mw4{R{nalWIgLx<#UGl5hNxWe*n>^M0+ie;5rC*#T9}#pAxO~5MH-7IBvH@ zZcM8zPD*IcCHje+>#M)2N`#z0!R!<r-MHoX+l%}C1+`!x*-$VML=M=N@6B<$J!lO6 zY8h*Z9bhE9-^k4i^&$L{jc0!of3_{!)uQCdQ34p`;lV|icHfD%SmK~GwJD<O-ophU zII@&uQtL1K2#ZAc?ezax?!!gQ7Bw#oYNw)eA4~`o?KB}K9B_J4t$XOzjP&%e?ak#^ z#l>b35yrcum6Ixc+OSw`UQ5CPi3+75r@DUz?#MWv64R(9@SnG}$@r}br<YJM9*)&V zkPGhwc}!Pjlak}H(j#H$g@Z507Dfyun%Oa8m42V)$qgZztN<q`<eAd5(FaeYWAya& zxQ3y05PSm#(|f#*k6@H_2=@6)&WMoTyo4VO-_h{J>(S)o2G9kP-&0eew<E)ps;jF# zN1J2S)YNY55vdGcnUYD@zK{Y(;a;W2tdkobf#8OyDJN5UeN(l8{)@&k<qs|67v^9~ z0q9Vqvc3zpTfXh~)hj9|GPGLfha1fK!Ge{`cG(7!$;rto1K$#$KhHqiM4#8x?9Ijp zd@OUX+YWOJiak@p<T@YSxWw_+$liM1w9~11DBLJ`>>v1Ce`U+kGfqg(u}~=mgR4_> zI_r-?@UzfraoSM#YyU6GL-j$2eBYKY-YBU>oF(u6<+&qR1;-cM&P-2_OG?`9LP}eY z*(J$;^P~2fLXL6RSlvSf;31WugAWp0TU+}ZLMyVaJXAg|AN1=#>`YysLCp$}4~d%Y zwcKByv*ifEYA+pfQ-;X1<<B#&b)>1&WoXqkSH9=@f63X<3Q^07Cr$F+w>-eSB{R^j zQjx!%ot?RJ18+>iH5SsDE3@CF!@|Pe-d@7y<>k?Ha>}83rKP3AwT+D)$y)jIEGvjA zf<#P4*fR(Pge59i<n^6Zias81{%gu1*TltNUtizz=ld{N9ihURSMWyLy>@p^jZ&SG zZFB&eCfaegJKv_5dkCvC3B4jCGYX4}Enov>XWtFF7#LVpEVFyRo<*{hRgzqEX{km} z@3|9-wKy6Z2+Fksf~F`M(HbMSyeBz~4hnzbQ!ycGlYj9qTY6$+l9W}7;{D7_Ia2&S znbi92(sOTmj7}HY$F_~LJDwcTrSzyJq5oE{ydV;r+cBEaYk6^6*miOF#av*lNl;OF z`C6#wwSxToS6A*Va-#(!*XtC%<QzZ!LbRds+h&Nu^~bCqwnTXI&enSGNn;P#*RNmu z8zUP+Q8#biq&tiN?(vVw3X};9c60?kbk`{%z;|AFm`1155!}tC@iw}8azd8fWeSCI zV{7f&(1&n5t8aQ6bYLD6U6)2hLZ5DlHQbyWZHb>j86G`~GBPrnu_x9aakM@$oguKL z>0IsCaXGrkFd&`x8flEAt0$66K78bcGg{)M*M}#<kr*%<VvF!?*X#`Zi8B{AH=FtT z`<oNG0LI=SGJz41*E!`m+gIih)a0tZX!BX6XRUK&2j_hHVn$Y$xcZ$Oqo9{N#`QUT zeqdT!8q@lrGH;6);O*n1d((UI*g@Xpjcn*o9E8HxT8`XL2^g$~yOxvLK+3&*FX8W< zy%OhK=#X)sEu=9@v4*$qsAFusoX#AX@MDIr&x`H>@owzfw=LeZvx(iBXa3*|dA!Z# z$(fW^iG8INq>%1>$HU*y20#}6Ko)+SXZOSU4x61iCFA!crz~!WzXRITqUx(7e@#yM z48OYtNIq`x(Cm)=x^(+-NR>b*>i72AUWpTXxm8wD*ZLj?JobvZc1w~{dZEy-Zhf%5 za68Yk0*6Jm6uXqX*V?cJ#6)B*{7BJrq0`9T-gz<VnA~P8q>7`>7_dRSKh&Y~JGbt9 z=2nr!K{UwvynCubM)JKy4-eGpVE0g-$AKZr+F0mZ$-8AaxmB%{yGBw4PgqT|A&Rm> ztaw8RZ>E3X)3K)lMM5yF%J>r?-7X_=)2hjSekg9&nAsV$#qNAjl!%d5O<d30ee<1- zqIxgxCPejw_Nf13l?97_EZ1{q#<A~g3c59a{O`Ux9M9n-Qdnhohsy$!D!&zdf>~cL zFbU(UwzA-e^;Bvybp*x^nM=l(nObZuBN8VKye(VNUYdH|wnNZW#Gb;1!|lt6!|uh4 zmcy=@ig+pY)$tAEdw331iB7x(edmmrKt|+du6%XKa&+2qO~c=fSup;~G&fV#o8F)H z=@2e9-P$dcDhoNU1q*yqv1QllP%0`?_tz}<=-!%%EPE0+93K1t)9$iZ)H#wZAx~!s z8N@m`4c{$vJCgLIFEnLN+IUGh<GUPQ=QSRI<~3w2*ifPGvWRsOX0BouLZG!(IIsc+ zmR5%s?Enp+V2%j8cB~Hud=jb#%OZA5!ZV3fnx~oUei8U3EYY+J`sg}|1%>Q^qN>{E zNJJD^oQ9(Zn?rC2CMJ_^`H=|80yy-e^A(Uf(I8RwJq^8G$Sw;ijR{vBrc>bnEzUPp zmrlh2949f;aZo!9(Nss}K~gkSUxtaf1hK)ZdO`qN_&ML*s?7T!QBxG@oyz~O_P<xP ZZRwS=XOWFaP}QGLq>ZJ$MY)+L?Y|8trOf~U literal 3759 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 CYQlm5 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png index 7cd14b8d74d8809c45654328a0b0e422582d4b40..0c629c05804280bf0134edeb1a248bc063b41c6d 100644 GIT binary patch literal 2693 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 literal 3734 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png index 7097fbf5565ff2485ab06e0c69d96fe5377d7e87..ecfefb3599e5f28c0ca4b94732b24aca33250809 100644 GIT binary patch delta 7611 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 delta 7631 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png index 95212ccc9b48d00e4f81ded950d528a80b819e46..e2b4f684a6785cf85556ccd54f2dd37ff480922b 100644 GIT binary patch literal 4427 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 PIn>b8hTp?!K79H=L?$I= literal 5424 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png index b4127e2fa250341aa505390846b52925a9a39585..f06ddd4556fcb42acfb2706539836c26005f93b0 100644 GIT binary patch literal 2618 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 literal 3697 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 WDbBqfk-Yl%Zx5|&ge=v582n$jftvjQ diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png index 69c28def26af760ebe2d7dc20e43d6851c12fc62..0c12beb31fe43eb95f57dbb720775644c10379af 100644 GIT binary patch literal 6140 zcmeI0`8QkJ`^U9a)j<bs`CN*&rW#6%MoUTE79~O}NQKavMMBLg5}mXc)rpvbs3C}X zNQ_BZHPoy~)R?yBMobk$V)&+at?z$vf7s_d`|N%8bJpwZ=e^f@N8hnD6+0w#NJvOX z%<T3pYayXMtAaR8R77wU?iWfI-1Y=ooBl0S(tT!5(7Eb<&&&f17E%?&qC$IKdJ75v znIdRXf+i%iH*@d*KiRXIx$pmDp|C%L?0J`0LPC-OX19!N!uD{|4}{q^Q(7g@CG_U# zo;Esu=ftV~(yAB2PM61WVyONcc*D02h8o3l)27KuPBkm5r<?qsdGTQWZCut_aJcry zG_dWc@)L!b=g$vl({YPwm~P+7K|c<4SKG&fV8iQ3d2sx(knmZdJ)%gaa0P&!J@fsX zpmRfL@9`z!if5B$5w$}OpSzT-bQ~_Rin87x$Eo2Nes0Y2c>6a_9=rvl_d)=A^UVo> z_mqyq+xlK+4Lzo;9jEFrF)zZ*HBn~U=HcCIfk*cKN%K?Tj!I1eKjyTD?$Jv=lwA86 z4a<kp$+je$%U|IW&%?*hR93St`Ot7fkCMJ=Ie0_6x01*t3NE;N&P%L<4O3i)o=D_F zOS-lLX<`l=ugS&Cb`7tH)cDmHmBRC{37EeHpZ)m8<_XbKv-ROSl?X;>xD1k+`Jg$v z*5&Qg(iMbDNZ*{t;oVF8Rp8p_(;s&Fg+!TqXrNCrytJ{&vAHm6JjYyKKYM2x;L1?v zyR|`6<Ba}Y^SN-Ncu+1=8GMP2*=P~VeNOF=rA+6Q1F)O7^s~lU0K}$kMFpw{mX4ZV zS(YY`g3HU6Ct63cjAH@KHyvh@r@Qc;@yb?Co`%|gXeUH{G~wKg+*)qs^Z<8PTkWfT z;reUeTss0foBb+-3WnNo9%S|@y5(2JYu7xk_!OrXawL<KL^X=XKIX14p!80hO5o7r zO;<y5k$G^DiDGq695T+)nKzp|0YDU-mhCx0P0{gwFN59qL1~pme~Y&=O!>i_s^s~U zQavs@P^!{H$7=^<G6LFF0PgLl_!|>%#^xrwmH+&yk0Qq}D9l!mh2RagSNqrcK$`Y> zmcE(LYj~Jdp<VHcZh5X{L<hV#xFIFv9JByoSL&3JXYYFl-_)RE)DsY;gLGSKeM)}1 zz?-uTGUg`D$lPCE+?AX1O$d`%T+sui>iYRo!?_i{V|B%qMb|x#$Qh23Yzkbc=yfO0 z>K;RWk<7!7d%O?w9=w$C0Pb#876jDSI+$4iLRnX_qDT$lLkD^2MXKk}&=AqvSd=Fd zI{KqF-+jIDuqIOKmBdAzeh`z08c$fS5=A1GJN<_e`HOU5u`BB>E(kL~vh|@p&1l04 z^2}S<v2q44YAWHY;?JBB2KevYkC}CCc~#De+#T!IW2>Xr$3hRwtf`eYxa1MAb<~ZY zu^~&J4mhkYjB)DNC6$aqsAN&-S7XT``8U^HpzvTEhq^u<GWpIlmD15vLf;9mpL`EG zgvvVQK`_J|!r6L7_0eh)6Xc%IP}17e)cUWBsY%hcAzWG1;4q3s3U*>&kK@d28}{(H zSI22mn^ACVUvtQ<nVa*>Sig!kAXv4E+gYGJPw<4JOc#b*yXP?^F_{(XPb>AikMhL+ zTFu|xS>AnB1qt67vnzQxwzs=#A^(`+IzjtU{ZyjE{LffTjjCuD#cs2te<TdoM*|IC z3)s-dg5vcTj_}bhkIEqOGQtrb0%S3(UxVARzq@ofH50EZHQ;sMyz|mMSeSMA2b4Kq z3o&p(f9d1C!%kM$mz(tPj$uEd4EZ^~?Jf#75^&tcS1E+gsUA7^@{9`svzCGpK-;OL zv4RKTQ6ceoypLXzfUL9ra??pv(?2Jo5`FNKVZrd?9@_2>x_-3}gc1y|BQqj*Ho3)i zKO353CGoHA-Bo-ZPQ>Y^YPlBJiSw@oPH&(XikVk`-P53N1wcHM%7apnUe{C?U&>+2 zu-m*L-+In;C7K-@Xf~zL+Ied42k{HXgBWF@L++B1`v?FO>_e>GvsX0UFE#1wVP!J@ zO($q?1hwVN)r}SIEV8eh|8zi32W+d74<nP{XbyR8D#=-?FhS4O?glP;|6xZ}eU?+? zb}&o1;FM<z@e{(qZ-O`AgD-CDLKj5Bf2*FZapL(_2f37RMw9jP!ZeJX>8q$wsaoGL z=g1WAXChl8uqxjN%4@*3mWXXSV6x=X{t-=wiq4YR(C99_L2Gwy9X)t{xJ`t$Tt?NM zm!VryMYza$UDqv7u%|_a2c*SH%T|I|6JzvSqU-P)Zs9<){c;A7Wsptq``N&ujPQ=c zd3bMj>9Uag`N}ux0-AvERWA^1vJH?6R=l9?(RraN)uk{{;d1l@4(jAx3?o-O*>`|< z$ar^W8#AS4pI7BQLP24St#M}dzc%BMg<5i9-}gjbpGgnRKp)Rag=4r3id)-zH=K2z zcuQdSwbnqySRHw{Xi>bw22#yfo$KEYNUzq@D8D@)qgJx?J7g?)FnGgD#x_B5T93kC zsP9>H#+AuMZe1QShCw#@Ez*9;?eV2@*o_Yc0y*42lGx&e(;qt=B*PwkTgt-ni^l?c z4EFPHzchQ4AdmITctiwh+RQ<7k-eElG#A_%3-2if_T{J>`NEF<+C2(682%br;v#G# z7RnkS`y{Ea>B8VQ#P_9WgpjR+%9ZWtSPZ&P%!D+_i)UyJ3D!nUetAdpAQVCRY_<sq zV=sE^nZQ>U9cy}_qA`@m=EJ5R+!=u@u!&#njC9TOV0;Sd2TwhaRKK(69%bjeD9J6H z8TcZN)V&gUt3sGsj&{5V*8g6X5z_rQa)Vr1=r-~_68O_$h(Ur@%F(1fD?Pg_A`P&4 zs7g3UKY#HY0Mn<#?-`M^FO}c*;OP1Kl>*mOSs_1b2*qu7UC7371n}u6X{pyJ<iZPX z2!wxOBX@_t$WMGNyoC3ol?!CC`aZPo3GjEPHjPn~@@t0r{psNd3(7Z_*r!~;>gN$Z zI;TgMyy_+>PXdQL=(N@>>72|<?!PQ{0d&juug5<vyjRZMe6jHxa>Rxy5Iw{JnV>uV z_*1E@+Ca~K(4a|I>Xldn+HlF<lmz)tklb0p$)a-mtJ-J9_<QDOV}}EDzXeQprVtYv zL^kGfnf^o!=cJOw(%{3M3<GKpXQWzlRrp5TJnrtDTo6&CwtkT|VpqdL=Q~mBX6{PG zuUs(ox885F%<28`3@Bln*b*lVJ<bp6SeE`R@<ixhn9*PqF!+~^=CqWG`dw(3lkQSe zkhYmj?MSxiF+zof2C_I$I;Y7|=~Hi<eRf#?l`&EBG4fHxSvkz=JG!@m?#G~YNLfaP zX;N<0>#fJS2g7Zv)n$xIQwe|FtDr==^U|JVE;0fa8zvquiqG0=xYNRZxWs2#g%qO> zbU9%oP^p+tqni|$TK<zWbXxsE&3j&voeuX;My7d1?wSJeOP__IAKJ+jnc-T~AKG7Z zHVo=`(QKbYp_ob$CDN2#wuxAeVdQDZVVlM*yUo$sKujU5z%3Wq0qMPR!D62xMC}E_ zfSso9*MAM4MgXVklnVezwo4>HACc4*rgRVkUs3@mM5SksC3-#h*T7|&!oD?e728*D z40*G!OdEZgb|3HA7ZGL5hlJYy`j#9t)In$p8TMAzoF*Ybz5V3^zNgQmhw9Il-86dF zKA8ino67P1>?!*E*2lv<{l&@LP{@8qOY=zw3UY26cSBiMrK=YVP2|zx?;l~Gp!)%8 z-2dGZ37P%yQX)s1A#Tk+KPGKj-n>Qj;ACBC$0vQVjx+>(#@IjrXIU|amYf#`rx63B z2Vi)I{$)&wz5e3eI*~Z(d!LDM^RdT()!}075np}~`JMd2(%&WRM)u$|T)3Soq_HG1 z=O-??1vDDYF2?S>)?e@v|5!@j(X&rm)8TIQnvhQA3`@<>we%fG4)UyoVa~U5*A?<8 zkyMofn`+nKTkjzrf{<{zXT%mDy8pn|5IDoFrO(6@s|8OJVJ$pEP_OMZD7``z)t=#9 z1UmnGuEL6&H@jI+3yAGjdlOJ~jQj<p3LFcFk(FbeJAP=7=B!!lMn#9lZ|odV?Hn#s zN#6g;eczu=(M%#(n%+G_(0}6p2A%6PpPH1cp&?M$Qz^-?S@EUn@$imghStFQDP82P z21Wp8Hr&H;y02v1Zbq|%Z@0z&)i5)?9rAm6x;SY*d!x9|sW0E&)qxULz`a`KX%xBf z-WY`3tk{|eMk83>XmsQTnnJ}>MoVzpdMKhwaOA2tre7m(Hs;qe8<Sfp|7!;ClY)S) z&drt=<**!|zAY#)&ZYU-O4%e@xT|o}lVPRw?KONldZD&Wos|kUC_N;BJTGTc4o|cU z$$QmWSd>(vd$2+zNmVWD-Vtely1Wq-xDzshnyHi{-SfVYDWa$J)G1>g<YFy5rQ^fw z^o&U`vRS)LoR4Z*_qvg*J{F*3Vg$dg=Mi`Dj_zKOC&xwI6!(1}uu^)$EPU|!g`uLF zk(Grqomb6pxdV14W4Y|yRAFby7?EC;D3WudIeaF`8M|DJ&3%aTuobycI)KlHMU#Z{ zS&rKY<|9c%c31D(#NNS-ccsp3)9MX<oX#&X9ND$L)P|(rUsoN&SKxE=j>@y`TKPa) zl(a?ll-*ysBOv`X%lbtZhR@`;NO)v*oU{S61*_k}lfx1X0!E(g$CDIy#`3=!!kw?x zS4iKlj$1^t-b&QL;(qBfg_IBaA<}HhU|*zAB}u$TSFl<6I0-AROrcAt;27jFsUjh# zIZyAZ-rLSZyhEJY?$D$o&6hp2lC5W~0yI?QbArlf><!gMg$q)f#mbiwrfs7XPJ(LY zcyDVIS~DCEh^xfO9S`I<T<*PkAR4AbOrT~+^<Fj?WyF2(<epSJw$?^7|3iCr%SO@4 z$|2u6U-`g5`rBa_tLiiEsW#<zTW-3VUJ`x&_gRO1y#p?N@;3{Ju{Yo3E6BfRNao`k zOs@OfNE2zi{T%|9{~rAN(XWEM2tpBTy<p$#f%e<rTBQ!z@Y!>bC#}|UTk}@`hZAAC zr<GWA<%4QGEkbQWL*;|E-;djsXyLhq(#siy7tru3v;G_}<x$J;h3xu~yDR&&>D^z@ zNN|=0M6OPbn_->ovuDm>yxzI+`$aA>zSCyE88LzPk?&iE7CBmR_|4p+2+Pxch8jZN z**Eyw*^5<9<pCl<@DU{a_fddrdyo%>J1o7$YiHCcrt~c!qUC}I?ne2(8aAQ35DyI> zR8IT8-?=f<D6q}nC%x}yfgyq{!o6uMj!1VME;Z>?CQ9VDe?56B-2CsMzYG-L9SHz2 z)x1exy9&mPf!nL`nh+J3!D|(e!GfD}YBg=MZRICXnGjJ?`aHi+)rfgj_+T6o!&lSO zl<}2XE@k=jf}ZUtEQPzNovfcu_1U^Y+6k4pIamU}*w*L`oU70b-x{XOHoQ+xFukUi zWYY#!G=9S?_;F5YIMih>F}ujv`dXjok-Z;|-)7T`=N?&62UNd`Sv+;pQ6yC*iF6e( zi%u2t)U+igB1q=Bb6-zI*YW)N0o*`V2xc7U@$NejrWK}sVr9U64r?hJ4C2IFQPKen z=9bn_$vm}}$6SOE36YGC)n^7_R-8bq5a;2b#&(spkzXuMgNbqy1!2;`fZ5bJ>ORax z#g2dJA4=(#ba#tcdywZ_7?S}jYCl?Bx;LS2fw*EnbbzX=<zARrE0U8Kg>E!ciD)jF zy@FTQv|3ZVtWp{fl<|+5|9VnTyID&JQgraS97GhUDy$`YzSz#nU-w0m%E24{k`5J? z{t$AIZ_N)8_Ba*o;Zh<)VvGzkYJj_LV`HE%y0<#XrUy59O^(kdO=y1h9Q}LsX#haL z*ZklPD_2YSdgmkiCdXY9?z3is{mZlv?}Yb5s#5;xqpR<|J<wm!0|g3~2X}&K`KKwh z|J1&=Z-u>cDbX4bzo-_9(u6Rxb9^Y*hmx9d8rtu+WaaQddQ<<*y$I;a?$8$o$n5n# zSl7okuT69de*wo3r4a~lnt#h*Q5n(QUWAvjQyJGnF{z~uvpdku>jYA_7vI9pZvTUB zWTmci7n`t1A;>_h-+-OB@nYMq&v%`t+|8o$(4yiiLxnRn72_4CLP{A15eyE6FrWQ# zRi1nl&A|n*<|CMADY`FHz!|ex0213AT_=ksvA)EeWxFx6lTuS;87o)RICRN|2k~~6 zmHTTCcPV<P2|t)JA7a)7VA$4`@mx}WSH-BD$iL2vzqlx*cjA?z)6IXai6&vMKI1bH zjxYbs_)zrh?2jgKt3M{gjk7L$MZ=puwFdud=!m`)dMazFzAXH&8FOCgai-~iul<MQ jzg_ZQ;ru5Gy9c~gPh>;ovXcL}@MgxAw@UuL|MdR=_+m03 literal 7175 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png index a762d4c24011c13c3d0ff35dbd3a63ffcd59a394..d62c86ed15f9c92a058ee54ed957ac437455b064 100644 GIT binary patch literal 3377 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 literal 4282 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 WHuI`Qocs6N05!6>`O(1jpZ@^V;rDF- diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 6c51bbe4016b3769c65b765884b983c36ece586a..d2d6cf23325ba4e7c1ebc8039659ccbeef412677 100644 GIT binary patch literal 9389 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 CQdv3x literal 9790 zcmeHt<x`x&^7Z2G?iSn=+%|ZC;O_43?(QxjxCVE3_uvpDXmDFx7M36Pt-9aeKj40t zsjg@0)O61?bLw=@L@OysqahO`0{{RtnQsy*000!rhuw?_|IxDnv916BSafS~aV1-E zX>mt8M;BEmV^ec!a|d%5Yf}|zF#v!sK3-klic}p}<Yz|{^QYgTOJ!v#=n(F-W;>Pn zu=Qhzd6WGnOR8P7Xwt;_-&||DFZ-`0){G*!qL>4}c2alVbqDCFY^p9|S&N#LieN(- zp5|Vp3l|8G&N{v{b)~l3_DpR)ALd*I9BsK?ZlNT#v*>1Q(L%Ej*Rmcg?lp}a4i5{s z4fxNY`OmR3C!{l_(?OB!5B9BJTv3j0tv<9pzFVHvDoH~{{SE(9%{NKCXAXeijWp^9 z!HR;%kycHfkcI{Aawzw(hgtxdgn1aC#@QdqpQ8*VSr{tgAj2C`2uCyzI<N??pp66} z?q4;G)KiiZJXP5WG>bi<;J{YNzqZ30p^Ax39R9f5FzpYSOfDI_k(l}F|2EyC>e#HC zMlj#aJFJneX#o0N-Qh0C*CNBF>b~8i$8Hssyz~9c<x4*-F}Fj#+y{gvM=vE_TR07K zklh1Ra!?O3$N@WhOsw@jk2K`<^43gIQ}LQsJYzRePwj{J7SR5etd`aSt8@IN7BQkM zm$CadSQ_Ob!<rR&nPP8-tZlfXw89YvIjC;q9PY38FCLn?KM?m)_z6&m<7nA6TCT;$ z12tRdOE3*v-2xN$Hpk^RQYWGE`|^nolu{{DFZ4u)@v`D4z7B+WpW|^D;YcJ=Vp#j> z8Woo#6CYa@9+z4bJ}vK@Zx1p)LjY}RHjweN<9QCTvUeKLT;<@El{!r~YJj&@mHQl$ zg%iyZrwqGHO6U_Qb?QG3BC2A_6#5BOvpBPP0a<kJu?%Wgv)hjOC2uGim3-dV?$~2b z(NTz{S=LVT?1*eWFXo@wKeM)z>8lO~0{#w~v0YLc`CTinCvKlCiEUWj#@Cl}U1r}0 z4Ubmq4Uc$rP$38bFo9<q8g1NXT+<rJ{+*7x!_v3H3T7gutm<~gO~pmp+!`;?6jK2I z4zDgmOL*Pae~%Nu6x)f%6bib){jGl@yT4uYUGkl`gU0oD*jx-<44o-l^QCQ;ysx-y zFYAgMkPodhl{fRnbpEgkF_?u54-O5Q$tfP=MT8+4v-^1PR^h}G=y$=7)jOJ1`Bw)K zRJfiyR5z{c0@b84;OYI!_OHIcC^+ng(Z~RasKf2Me8Mj7%RB<)gxBkWM_sS&gy2m4 z4E?x7aDjtPp+wuUy~^j;OD-pkQ|Nnf*163s*{3l>6aV&2kn27(;iDe(7ciW49(R$> zm!Y?0S{(rDeLwRJI?6!a2sXS+&0X{1`CjP-A9Y&!F?On9=D=1{JVBQGJy(Egkut9b z6)*Z>lWl0e<<Ox4O-16_DvGmvT`vdPEx;eY9)oxAn~(o3%+fZXz2F_@oz@Fw#B^oq zgCO|KwPY;h<pE3|HX;Bj(i#B!VL^Q~;*SOZKo>y&_X`wD0nC4GK=XeF=R+te0063T z83|D}FQ|)Lgl@Hw`>|R7#4X<|N=l;<Yza8YVF^S@I9iGMJ`=@rOlF?`koiQ;j6dm5 zNV2LXRQM8-n7Xi%N=ejVTM`22@2?iyES`@S-E9}bbcdc#EWVzXn;o~kmRB8?zjK9g zB-Fyhpg(<ueusm-fuOvMv!wu#l7gs|B1lPLJucJ6ODeFRPi>Q1&LsUjB|^WJIM^eh zUoZ>=iBKO*@<TWjW93rYLYIG!JN#(8Wc|_Q9$dZABTD_ku8Q<2Nx<B8f=Yc|rca=! zL{EulvCK;^>T5rhaa6?L%@(-_ec#w`r7_rde9CB|WXVFax%2+urTW^`@u!KhZSTjw zR4TpQZ?Ufd?DktSS{F>2^fdU18M5AZrMfe0Dw^@~dBnNj&GU)7T5Rs<s=f7@jx^Jh zYoxw;6W4rq9!<D?Ws19RQsbq@F~nKx)ejl4j9IEX>T7@|BUHPvbvockj=_uf)T*3o z<kPOWRT#8s^wHROxJ(MZ_mO*RY-#$eAw_0$KKI)^K9C*nmWgnd6-7d*IVh+N-gY1a zuF-rd1E%QL_@<)-{DUCn(eDwNUA*i<J2qnGaGsb0{f?AtV!0ybjOFfpg7KivKDKC8 z!bG&8@3IfD-CSC+_^c_t{@_Up2q-cRGWg?*<>XR@>KB0((q@ZXSVDN63RSrhA8zo( zyXPI5a~sz|Bt<|{+m??UoqYBu*TZR<+hdkW`WtlK(uVc|b(Gtb&$O5>tVS&!tMC<? zwI1iw8v$E%?7|`n0qd`-)hvr>sO(rc#b%0>zm4LFxn<Ye9NFI?k9|#!{IU4N+%}(t zeIL>c-vyckx4N!+nfJ#MXS)#)>myAxME`bTFa65%_AT}Q^pbZd9&(iDtDpdUbMrnf zjEoxy*=6FE*&*}X^7oZ|IG@k#rFlrRWi$#0`0`n_nD66z-}KU(-A2f3=VM)1;PlUS z!t@ou?>T6{zpVD%(P>D50{$3BlGOv7ibjpd1D<waJRt8QIEp_$OTwcOe`@>d@zXG{ zm$-8LH9X)xy2ly&PnT!izoR3;N6RjnL*toTLCuwFZ5jf7x8(0Xc~~zzJWo>dbRB!t zJKfJLglN3@KD@2{o>#3{qqb73&s?78Q|b5k*R!FOfKAV8a-~Msa#95HWO_?<5Ar$u zVQJz%MDqSL2At+k5IAM%xS3>z6YnoF+iZ6(gYa%!*)gdqi<5IXGKqp)u}PP7N(}zK zu~r15t+yuh>TuyyXp4ueu+kp8)x$p7Nk*oNP90*CR@*mQ(~82N9q(gx#aMUA6kExY zg=D)L*@*q{TdZBGWK=2ibJLx*kB}i-mpoIiA{J%~eP{2vQ`y%RB>+|KnD4sZ&hU=u zfKSTv&4#0}Toz>LCno6gSpr`c^UcmyY8u|=?ybvn>83JRW7FTR69dz#>Usqp_-oMW zTZJxso9M3PgG7I3IGc+W!%y}|HlqqyZCC&u&F!-)Ak(Vb?KFQWGT!U;YJrc$CxL1d zM6MTq8@&eh+9wSIc@!fsdK6yB)^yn}c)!yL-MVZ-KnNV(uh(PdPoUj}7F*4e?Y_S6 zSsYY)lKno@S)7O9?P6(+j<<)6gQNVwgsRj@1U*3*c+@1*1b!*DZjjjX%@n(7<V+Ul zP;+0v8>BwCM+EqCT&yJ=rtX9z_+cHq-p*#S_dZd#UX4)%#_3nB>bb`6v=4+LOch3w zGto#V#4S(VOHCUMR0-@w(V$BBU1Q!UNOR=m@HrQ`oh(Sc+@H}W3O{7|L7tBq`kycV zcFhnFN6btnkO_WYBX56YvfpUso(vPCBH?x5y4ro`*bF6@>-KhaRW8)mBV;QbG%9k; z)N_e;JD#K3RP)&o7!hUC#Ge<D>uAJY(hODCjYpJ-WKEuV38GZWQLjQ|BgJuCt2E?V zid3s$5nUW57Fq$^D3})z(6Z$e7{46{sFug9p;sPv5z~LK;!wrm5QZ9}A}!uH-25Z8 zalk#gNVzl$Sy5RZB)Hj&WzYCHj9Kh-t=A#*jV{jznJB&gEOVSAIuOeg^Bo*;J%D%d zU8mzA>`dJ)o?G5y&8BB1_qCqZYefyktTwpU(5o?cd)bJSr`vVBF?@_wuDR#0U%2m# zXnr9muSDcKz~8%d?MN9v;9YNvw~0{7>+qyEv6HhH{)UL<b-qVyU8Kutj>i+Aukx+p zKlh!nrC8KtPnZ_JGpQQ-aBI+aH`pvQdH+k6hP`q^owPP|>^Q*xA?)i>y>1A(A@IIv zS^f8NR>#YW<hPygcQf$^qQ(RHV4116$8C1|^=8gh_}XIQp@@l_gQ=O_TtQEs-$=FI z%#M9;t&E{)LH&TgPD5x5jplN$xx2(8GiVBEB_0>+hXUtI6{#%Rjl*_rR`X)Dou^E} zG|DO}1@fE*%i5N?v@_Y<sTwspKV~o1TjZX*0kQ1-m*|*Zi9VZsn;a{qrrfE8_TGzr zGelKY0#UF<jK-6Ygho+st`+JH|4k6QY<E(3o!@j@ln)^YdD4y^)u!HN#a4!4#AEtp zSxm07T#2n+Cxr)Zb-#W*qEg!#^}$As6#IMMph6yek|i=&xWNr%%|Hg?X~Pa#>MSWJ zMWjo&fe|7jpAh%DHhbQPg;z9U%mfw#6CM~Z^HX`kp|Vu=#q^JT`BR+S|4#YjPebwR zLt9_GEwtyBqR6wvWiQylw7$N{pvPzQ=O`Jmz)*PPPw30~SrKscHMLXdS0OGMs5A9> z6qqptjx7!mqHku=1|`ISVabUshK0PjvdS<RwQ#(XMcKj~o)|<tdn&4Mfk!xxB6Nan zS4lUO#oAZ?EP`r|k0QJpmA@`uP%oKD?!lnnwvKXFu6z9Ju1l5bQyj=@?>pfnuWmh1 zq`v13Wyn&L?UxGt2e@xBuo1?cic`BpyE^TUTfXu?qu_>$hvbhu`@p$dp3EqB3CT-q zmihLl{a(B4RbeERlO&Ga#^*sjd7Lg{KbtIOK5t`%+0W7SlGOD<Iyb%c<1Hl2(b)#x z?^b9nvf!DKOvCBjydu*T)m!a1ELiH^ZuZ-05`|PM)fZ#A#u`mVkYOfybVcJ4_VlAi zZLar5pl1Q5HeOiTD5&spc(8eBacKd;sWN7v#0|p*Z9Y<m(8{K!u;5+ce$^1(pa-hc z!XKY|7>wGXU2}X$sb;wvtzDaIAruW4h4I*!XV#JKwrv+8IryB4s3ah`I>Wx+Yb&_| z!4qDjT<xJ|UH1t4xWQ$@66&#B7r$zqF7b^iwq<aJ{QL<|Y@hxovV?Q9xb&L4s?^T$ zy=Na&S41{HLTW@*%HB3F0b4j;4MMohr~#Lu2(&{flgIKK^d2p;LXmFEWBTek5&sv$ zS@cn-+rt@)F3+p2hC?jsek(+BN(0legk@io=k_Fp>PCmV(`Dw@hT+!uNb`I|Dso(W z!UlX+ov_#xhbv|;pHSeqtbsvZT6k<8<?go5Mxl{dIyG=lPsz<Wq@D1Rr9D>Y?QU@t zj{P#r42<>IkBKQByOV?tt}@Ch+U|P#jQi^dH$iue21Gj|5^p;)oI$q9rc*KvJ#3?t zu&a>Qd!~eqEr@Z-<-ib<iB(g4{~dVmYBrC}9RMfAsY6xuUXw7`IU)~ja_^w1RGxs| zqE<k045XPi=GY5#HsK$+UhN|h(l>t~1hsBNxI(eVOH1`8CQ6UwHtmRq%Yq||p4&UZ zKCO8+<oJX{>xo5X#frQVReMATnG&+_p@LF4Y=XyP{t!f%Rv<ep82j(?`AK!8<0uNv zd+G2Yl*B|(De&#Wc5S?(f#5l_8$y(zOw^)73h5nGN~sQY;XFapUuJP(d#+zVLm2K$ zssnoG6>iXhcK4^tGwrJ@k>ThF_eu!P=xMq?w7=JHuAubsTFv!u2HO#(0Wg?JF^5Is zM&4hKfF$DKZy?eySYPheOFgZ*(~=$W5$X7)@crsCL``LhEjja*BPPm7?y=fe&@$KT zgIB|O?x>^F2jo;SC?B*V2}ZvxQremgc+R)04}iv(o{g=W(a0RuO{u5ckE1=@qoNx1 zh?zlRUI1+L(LFF!1Gql^X*?7|#L8=5A;B7(DB35xp>M`TQb?|6-KnE`p33X^D#F36 z?o^@&TJ;K8RRlho$sA8)F5b9R56oCyI3RLo_fuM2nK9e4bTvOp$ZgnD1m@7pG;h-G zUJ0R+bXU|X1I9wp1;)L&ojzff5tU=aFJK*yoFb0duU_HpO&I$R{0PzvBM~qF9dn5H zBiDWzj^u1^V~4%QYLdl8<&=}Vu?r%*F3;w+%_g`^Bb?pCkWuG=ALF=rKFZI0+zvFn zY~N347v~fbdIb#~j1U;6VTe5SGwh~o8bnux7SeVLbUUpESH)a_7U_j5ULfGBnWxte z9h2gF*&&_hbINGF-fXR>yV5mOj|t@y*D&On)jnC_*Z)^9UzW;=yxGPfA?i;#FNh9P zdQguQb*4UEb9^f5wPXm0cgs~zm1ofs=i>l(U{OwnzegtiRWL1>O7Lq)m%kiZ_u%n9 zI4Bk|*mP5!(-0lHj>vgX9GzbRG>kaSna^C^rsoM9ZE~i$O&S7)N$bS8EL}@ak@x(% zBH@$*HG@jWMkna6W;0B?-Y3^k{5(0A#Lp4LSvQyLUy%`ZgRvu4+8g%iVzV+1&h5C2 z5h8LIx!EH4K;`)XHoag_8qN?MA^u?ft_3bRdJ(^#rD5P(%e>$qbGwEze!$nDNQ5fQ zIvxzHk8r$T)8}e({8&QE`9T4o<IgO|o9?UnmI6?=x;gz{jlUtmK+E}Wc^{3$&o~RQ zwA}j;^Vl(D>U;b^+FIX*=?{-A-3|cP7$L)~|KxSdJAuwq6HR9C289rvu5~4oB@|$< zH#tKS*3K78|K!6@AQEu<WnDi0&Ji}(WjMXl|8u<zUP4&n%l^ktjwhCGY?^2hnnM|j zK?*yIL^RQlk`%p@Q88P#K{{PpDMt}--SV+whT#0IdzW5Pg0ndWIlzulmze`MvX6C( z!lvru`>4<wx>LwP%GEd|JhGuL8$o5&-LE%OhYkGXQ3bguZ0-H1)*Rf>y!9ru$)0;q zR6`USaC9J@<tAQU1g|O%2oE0y*)Cke#*<a6JQXDNRC_it@U(nXo_yreOwVpjl<dCZ z!Jqd8c5&>Wr{YT1oUAv0y)P5BV^4^b7^gY*fy%2WW*#7<1lxXnhrSh$x2eUM4z=x? zgRqEQ+w-8)C0P2%T-!cKDE7Uuf6<jtNQhhLX-A1qOm}cmh>x+|06YKOcoHt|Y#Z{x z>l!*3g`&uFA<pR)S&y~y)%|Mg?;RRBjfn*<E&uFF&@(?F`;gKOBlKubRw5ogEH<ae zZ>b&D4?#2`R61FfYc_V-b)t~$pnpH1(lglQeEkQd0JOCvYxHEKb`F=mu3WLI(<4Q_ z2u$l%ZYvA;j?BFawNE{WQ=})WvgMJbTxhf&LHr9bVmKPwG*a`A5&a6|sVh`f@(|P1 z^>Sh|{6Ud(dl9-!t7Fqvf2Bs94I5<mt;(}5lZeD}Y7i?wOBw#K!MGO>HN!TAw(PZ^ z&}@i!6*1(LL-q&qdJq9(WWNCZkJj|q{kzktntt7;Ax_PyHDcyw6v_Q$ADJkmf4yI5 zycat-xL#-(I894?q+*EvjZC)eKu;Y)yWE#!I!<dZ8n=0K$B5{0C>o@41B&x28WtW{ zsua>UCgS9qQgW$E8&A2b1lg@hvP2E4>(!PSIoV9ZeLz-?=J5|roEpan>-}8#6mjV% zv)}OS(!zEUB|w7dROT`{z(pR;DWRKLYhvp>)&()kHdAQ&%RP};gJvw)B18Y7yU$mZ zaz)}=`Cz@dHnHyei60831Os>R?gAtvuA3a)ztcY%FPGVnc$>cY-dtzQmRg68s>rx% ztr_dlm5*>Z-PhjVyu5hcchR^=?iZ@ijq|GFViJ^?Nl_k&4^DUP?kan&mv}c!r+(Da zWS3|rCk!z{E5Eew*1*2`O4Fwtmh7t7lyG?qYF#YE6_3Y;t9=>YN}9pQFg`!csG<dJ zzSxW^(_Kx?JVwDY^OCM1BPD%h#2oiVt-^hoR!ssRy(VHu{l=9uhXS<EyQ8qXBux#! zjhp}+cyPc3(u^Z-700CV=7pZ8%#!-`I+L&=<G*v0)A05BQ?pvGV@dxBI0riSNKvLn zzr_}(4F<#$l$N-1rH5}-)Zw}fFj-@b_tot0(wOf)V(UGDkFQpoq~+-t#`X_Q1!MiH zfF$$ud^jX5$>AFTNrh;$DNN5V%w9t1jH04ozS;R@^u=4Y40&H3xv@!mIZ#~RbQul1 zVn&)<0uYGOqiWbUeKi~WT6Ht6TF*tG#}NPFxafe&_wVP1q^1ABU*`FBCZ(>HG+p%T zxrCw3B`DU$Slg2(ufIi<0p+y2Y%TTnAZqBjJSVKy3q{dxeAHdh@h6`i#;z&{ft{nX z<gzvk)=a1iHK7#K)L;pd+Df;L=;c|7BR)Qqp7P>4EntTzG!pF1be!$$<|i`7CvW7# zisQNmWHO{;uDARvJSORZe@FD=M_+()o$R?{IlRl>pT`Ti10jC5vG)k%Uj45|Uvgc^ zjys=vj^x;T(z+asJiIyu#@1rz!D$5aGKoBYVS%bLX>NDvUM#@WAliChei-Y-09bm_ z;@d%`dI|W1{-B`c{O8vU$!?8WJw{L~1Fd*J#E%9DoFOrqaEq*gKqKMuXdyOI4+L`0 zU?-IW7bG3%SlrXZRNAGbg{fV+dPdjZtLMdU4?+x%h|TnU+|pwm+W8_J^C20R1G=M= z)1D$J5%MIm+f*?B{)q^ifFIAdXc7~jtETfr<W%P_lW4l!GCtC)$yZ_#4aPB&r(_0| zNooqh0Q&?z(Wm)Vd5uW-mn1P-<$&9t+gU;@PYp~raJ#FIPm;ZOX8iq*^h2=%fBb7b z&46FgKb6o+6}6Zlp)`yG7M_hb0iV=|*zb~i$B<Q|hJJ=wMyGX+SB3fQ*7d$r9%C5F zO57ytNW*oOCw-N{Wbk7i)?@y3GFA`8D8xnJJ?9p9npPy>Y*Od&`Kgg=K_c~<*LHE! zZr^n^54<?N_Y^&=kc5}r9|$V#;{~SmK1L|txH7OW4YdIo92N8E%F+4c;SIc6{W#BD ziTr2uC36MN{GViKZ@j3wU>E!;$DV&W_7d3=Ow1-3ZTBVtQJ?d4TJ5Y)`|G)_7bKEC zQizmynn1NbN&g9MxT^jIGe9DtTV<TrOq0BE47Y6@(5OY3juA2FB~6hGL3nE+lCan9 z@M{AeqS1#;nS<?OVUc~cvW4ea0QCXlZs-YgR~SqCpPAeHgYc-x1U<34MZ9kPD}GHt z6i<9@7S_|N)On)8$(8@Y4Cp8O_u<ELh+L;Ju^G8B-v#zxznG67C}W`63%i~D(Ykpr ziMP;3#DHa%|44QRo5O~!K}OYWVU)t%jED=>{kj9apgsI=ArVVd--M!2tG@wbr}20q zlla@S-Z{*|8+<fW_xA>YM>(z~zK@sA(s&=i+^`O44Ib;5Msra`%gK&#XNO{#bH#HF z6W5Y*P0)R#O!#Vyfg-1Rl1b7r(lDxPl<I7bT@o+248a&X!JMZPt<tY+U9wkNMWs=O z8Jeg$wV!!&tBvcq7P-y7zx;l&AfnxAbpnxc=?;gr_(q6$1wX`By?>}v1M7}iC-dDc zI9<W0z%I|O3tL9OTCAQD>LyB?9WIB11y#;D7PSDa3lt>GHh;W!qt|<ML_k;_QfSP! zVWIm80PRekF(Fq%5cPv4imDKgbqKlu^GoDdhUJriL8PK_Ljy+I#Rh>eyNT{S2`|So zF_$&v1%{xOjp;8Pu@JkM_PGWp$&UhAd_zci8pC){Ou5H5BHMl4R`eUmwWWoRiYFIJ zH?_Kx05rxI&U`HsRFo|h<ycfol26^FzN-DtHBc-|1jEeBv23!`->yQIxJSM%6RVf1 zcWI0)?KxnN=X}i>2;ux()oDZpm;2@*(d6(UaT<jO!Lp*z_adzXU;Ny-VG>cc<cbgD z56+E4<y(4uA11TYtKei7WW|hrC9UI$GnDv;Q|7xD4Gd1sYvo`47QEt;V%0X}U>Rnj z*Q!FxQ}?1xF}uf^`dBqo>bL~|(}?bk-IB<t@<LRU$gk(rFk=)H@p#nR*o_iJeID0Z z|K=5$Y@)uCvz{;AP18*=tqAKuOczci@jNbl(u6qgPl_s?D3Ht~3qVPj5mK2ggE7O0 z>A{+d)$XpTae?c@yfX`196S}W+QPgkU`21^lx|`3Y?ei1%9K~bg-7Zp1)a)^uruQY zTKuMZ=51=i_*oBi3Kk=%&>#T+jn<Iwpodn{0zQ=Ia99!v36Ao$*xp-x|JMN}V=`VL zYd0UB-B7U&tt7ykq=O^u4i<}HCszQ2-X=B7x9lj9oeH`<WD}@pwUr;JHp?7SKV;DK z6;<{vPbQfa<1-<-;PJ+hsRiM*dl^bv=*~ZR=up=%n)f!8?Hk#pvom5y0zyNJg1M@A znF|E>oZpuMpMq`o{>?*)&!$}+vZf(8bSh>duhW!coU*QN`uA8<4B_T{W|?n%3)kFs zui12cvm$c+%OGqo5gBoRkP#^@ON-X4JK*gMQG>0*9@=j(A?OU^4g2@X!4#!y%uOhi zY`f7~Lx}|JW?|0vfB4}&89{HqOLUYq8T3$7z)Dzoy+1~v6FvN)#mIvFy`-`jV(1gH z8abSH`rFMXV|2|59R7A%EE8A%{_OYU)YOd=(VcZ@^hxxn6`0Jb>z-~-R!h@WuHP_r zIqb{nvt2!vW50@ktwqGIyfCl1*YNrsI^%2o<ES9D41r$%Kj3icU;~S<T1+&UvwE$3 zzy*9aPM&uPPOuleTVJE%b~;kT{Q2kocg9H#L(1IuO=&`DFBOjw8$a~1;5{aSYbbHC z>A=BeM8Rt2BA*5QC{^QMk@OL4qPb?Vs74U{!&Is~c$gS3f;hZG&jH)mO}|XvWVF=@ zrM!@>wiBn%ex?mG>0!Ng8-DNGR7sjvPyle7sq&=RsO)2Tb~^=uZP_UD-~P(3i8#Cm zTDkMY8#~z1i4O^xTH7#)iM2%%k*YPwqG}rMN@Hb^*3jsl!umOg5ie@YxPx_iZBWNk z3j;f^@Y<q5r_nYUjq5x~?JjRxtFR+wF0=S23j_{loPz)IIhm2Qy<kgaj~byvVbhS* z5|tSn2Yh5}5@-kud=s@p9jY4+XOwG7<nYKs4wfm(D#TE9o+}Wwz^>rbI$>!{4&U-$ z)wDhhJDNlbwo-Uh!v}ob6o&ytf9R;sA37=!+eG94i5J|*@}mE$DE9#yMw}gLT*hJ( zNo>ks82JKFa|Fy^n!J42Z$Yr6uvYb?Mq1yYKkZOJ5wpCz4U#7VkoXYijQIQOvtYmV z1EIOJASYqM)KJ(?m<0naLB^aPS8stIu-8Q-Ux^PK<=4;yz>o<xCDi)|?71B0A?gDs z8U#ND6*2O0X$Qe77`RcSKgasOg#yqrU{GUaf?!{1K4AF@e`r2%2p=;e5aOo-ke;MJ zV8GmZ=?@(G$IR#)EOb!Vpu`VYpn!4W{~Z3`3jc3Q{O{2Hk0t*9d3fg?suM&XANYK* R`Jbm7GLi}swPHpg{|7}SO~e2I diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png index 95212ccc9b48d00e4f81ded950d528a80b819e46..e2b4f684a6785cf85556ccd54f2dd37ff480922b 100644 GIT binary patch literal 4427 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 PIn>b8hTp?!K79H=L?$I= literal 5424 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png index f6cf9f0e57d0463ddd515bc1d61284284fe72aa6..fb8f16b28cc62a99cca134d52f550f278d6dd4e9 100644 GIT binary patch literal 9085 zcmeI2RaYE5*RXM?6nA$9cXugPph%Iyi`(Gt?(XhT+;xDW#oevAyZgs|^8SMF@HyDY z6<I4gS;<balW^tlGN?!dNDvSZsIuQAe|*MkpVEi`_Zfb?i8p^nkd8lO#38CDh>kuJ zye68mrizLX44;eu0U2rm0rOv#Pa*ge2neV=sQ=4Z%Y*(uZv3zC-(lq}1O&y6tfZKl z8|0ZTyqDU*{X2&EVbF%oVOYS7RQx>*R-6$m@?%cHQVy&DgD^HB#eFq`5iTsYikjPd zywM*hw4#TYTLQWFgUs=uj!eb+4%v_%q0r6xma*)%mvJu+vxzajaCvP12#P!eUNN!_ zS$gfTPsD@4zzS9P`b`LGECX^ZWin;FXG<cTYK%5D5(jo93D)Bl(vs#NF*V|vtJwyc z#s{iW2l{jcao21Qpf~vYN3nnVo&P!5zrR1s$2#kGk|D@Qs+$K+vmSxBf>OCzFfMNL zr3CEhhkD|FH0y`_3^}e7{ABp_ICFp26DH&LjOy=kO|Q;C+FjX6u=;nQs;4E<51PIQ zy3fBixWU^@oxV?u^TE|GcLNs!8*t!Tf5n5v1UFZW>~xOg^@QI8=Os9tw&)*13(2&) z>syb$*vfkpCRNz_=#ZD?^jF`90Da{t1%!;t+&__Bph1NEWYrb*waPyrz8rCA8=Hfv z!Sb#rtn-&)iR|?{YRp6?H&kg8%7>+tq%Jd%>J|J7YC6;EDfoLiks74a?nLi#cO0B) z+fGlzYc`hV&(ifsQDQbOk;x6?!IUX+#4Z|+anJbSn@SIFowWJ2m{GrrNZ<F3OZe?p z_4V~;QbjmBaQ9>ZZeQYx-7*MC08GGTqQ{U6^`us%BnNeW4tsxr=KX?lAQnU@?8QsK zZ5<}^{zxeyo{IZhtvsM%Qkd`{%kjIyfX~O<!{cQinz6@%Al0#ZTv9R|uwHGd*vnho z89rZx;)KWN<*a2I?CC0aGsY1DqRQdeddYD8qPiX52N^g|{!~H^5Ro&zAlcUqY>%Q> zEeW$BgM77JX|zb&wPnVp{{b^8^pKU=+lUp|6NHEfx*EXU@rNh*s~<*$Q^2H^)xALv zZ<i?CJDx3oo5^j{JO5KZ+OF$~=9p3S#}Ck_a)sV6_olzL5gZ4wfBtKj`~}5Q?|x(I zbTk7SiAxG=H(emLzq0B3VKXz9#W$P9K`deizDsE%dESI4^)eVSpDuv4?Yxp!4jz*m zj3zXjnapKzY|tzgh4i~A<iGRNZZgTCD$K#wE=@Rr5uUe%P-C-PK+;@$j7r9!_CMx= zF4@%{7JWi;pjC|it&Lg+q>f8qu&z%MQ{@;n*=Sr@cHosQ&5%muoW+jST_+ZFtHoc| z#3h>N9l7FgI#hmHSZcDuJ#Rl@b~;@`&*pdTU3cA#Uhi-%-89p6Jy}4l(5RB@zQ6GO zAZ%H4kbibpgKtF85j=C{LW>!TdJJXuRjb76Nqvx)BfiuMY?;Hat5yLh`vQgYu^6zv zspcEyb!oOJC_yLvjKEE8PkkoeU`%`*qPx21i?J-tb|HAaJu>zyoTebi=jZo%b<6U3 zJ~~|Q;L-DWG8s$fpk2STzx*eb$P#X0(tX%jNwrZpSEEnry5U~>bm>L7Xd)hTOyRke zQ83$}a;c?pnj^%1^@Wm3aPw@%s%AizHXNH#BVGj;c)|}7jiQHz&T}LVagbCat|nAz zqN7P3h&b>H^ze=-Dy_wkrQ7clbj!uoS7BHU6SM+kxKqg)=jHoF2lNXhAoU|Zxs44D z9;Bm9qT0{ahhIk)u5c{^DZQA3Q<!uzjB^s5G^)GbJzhU2D(}bZ&2)>MzCtGVxRcYp z@JWZC6G~qQDn}}>w$H=5D-BB~&2PIH%MMrKx353nzt_Yi<(s<c0g_T;hP*;Hv5dwi zBE?_RXeZM{h>5O>o=5m;+BAo-g!S7j^O#-2_EMe459H+z@B@p$sAFX=Tfw*m($NHE zx*g4Yc2jv`{aOhKl|@4&o@0Wuo$ii6mt_-lk;x#Ffw7e~N3)x;ikdEhdo2yq`QPfO z`RRT_Cuc32w)@#OtIen$A;~@$;D-#fXjVQ<i_6he$j~B3Ix0#68M=F~)nZix+TH<s z4H7`aZYg<B2S~mU8Q|U&1=Tom)%tzik1Yf)=IsUQsScgh7l}|!PCK_%>3mhXRw=C0 z(u53Ec5EXHrfK)fTKM6|7h?W2Cl>H61_6(4)Xjtd%ORg7jmX<ACW-qlx&-e=rE-42 zv}sv-?F7c2YlG^^X19oREJ^fFJ@)}8P$PUlRlm(mNntETY(FOy5tv|kdSyPKE-tWe z#-kk5#qu<d5j`EbPPd67j`SivOF<?eJ`A|K0nW74&f6%nAri#;M!NS=!d<>!rCHY- z7mXvHaDFo>63bfwo=H?CZb}}4&*ZYA$riN+i)z5u=yu?kW!X!6B=pYE@ogeguhyH4 z_T)U(-lm)mI5JjZB}6-jR;o~GnU2B%p>GnRCqYF<ljAC}y)TuL8g#OQuk=LgOL*p2 z6kDf`@Wq0FjXjJ^{eazgcq1-iyY&@g&)5Nn3E#cspBZ0T3Zho#=&pm6J?lGy+`Q;e zRLZh7>y}m~qO<XG4Rxwj;mfF2khzduJlMj>vzory3-_y7ep)i=c}hgecuFEuDWp34 zB3Uo5PN%>4p41n5M-p2;o#SMQb}0iSTmsAWCXwkaD)a6)<2()WId5;uP{BE?MCP(P z2q|K}BsnG#rYn~Oc~`U&*{kw9C*l)@1Vo75I>ooOhmA+Gt0?W(>k|u?JX&ggRA-fG zQ&f^JbYqgcXlxrX&PL`xq&?L$YcQwkQX84&6(_Ao-Vyklpy=3QZSJG;`F8vZKo%{8 z6`3tnN}Xr|^$#X)7id$5=l>fb^;KZWNCa7-Y)O?E?i@G+IO^G4mYg;&<YxNDGPnS5 z7&5FepzgPOoo6l*knr>EtP&yR*9*tpiFnXeG9`L2C7}SWz&30(-1`A=6l2&ko03AN zx^d9b78^4;=?2b4@YU3A1U*KGPKKFVd*bQz@L+s$nynNU>$5xF%BMmkHF{uzLg{FB zH^<!_c8MH0ZQ9%}vWfPsR{+ixLH21KF$%A_GI*_-OSBVv6pC6|F<K16ypc?_Q9PMB z+Y}})iZ`{O$>DS9p_{C>J6jco%%uI9w5kE)+!D=?swxR#Uv%Dl8A)Zalb(tddFQ2z zR#$Yt^5bkL7I5(^w9dLU8cP(HU-o`j52ej<>mA!{?NJ11b^E-HdB5Zm>y~RcFuQ(k zQU5*-GgncIMZvSFl6Hee-qmVE(=k!_pNRV89=*8jb-xaoIT>vhi>6&?jPT?mb+h|$ zg5fqi8P4BvM8ivQ;xetG=ilECZYlWqmYpms;VtP{IxnG)7pjn}Q-8QcJMO7|=Ywt8 z@TfRNr!!o*Sqgdd%0al=1y=kpN#_`46JWV8$5qVtO3_f>9{2baYH_lFr?~6tK=7wL z;EWZ_;Dco{(7@(!n;$#^uwJ^^AOEy?gq^7zLhqBl@6ZHVB)+fq4H7|)yx+^fMt2^} zLY?o=C#|0w&zOw{RWO(?n(X!UZc#t)DR)T7<CgW|iIm9%8vaZFQk}8=v=nYSdOA$w zG0LoRcAa~ITdeSN*%Ol&4aJo?J&h2+FIulFidhNcbPZjZBh7C?!fNJ#FZQW!5KWJ= z&K$vDqcOrhsE9g-Fs4e=Xc>LnN5?twLaYw#`H%6k`yoRX_nERYoP$KClYPU#yuyh6 zdWJwjybkOpF!$LILifkJz!F^Aq{zpUk_6|)jCiZpY|WMTnVo$1As<2uv`NhzJff&L zl?ti|MjGa-mvv51ly>Mk!auNGBw3p|x~YsTkwt$!9NhvWs!^q}cCN*1y|YDbi~GtA zW0&K)j^7E#+{5ye#ado?`iZ^XGDAn@Xi~g%Ds(<Wn=S+zwey#H!RN!!9ViGM;k`pH z&;IE#jS?`<84u!UM07zx0mJr-o!^3uKTcJl2V+P7oai??TZO;sTUoA;ta+Ode}t+E zYqeoyyy_wdnlf-Ul-aVI1Tpy^kQ8yxvrItiHgD~s@N(DM>g+&|jRQJ7Z9A&>M*5!h zzFr}0Cq-?gb0klZiV2ex$M3^~UVNlunDuOq=i0dsGH&Y3JYg8sGn%%x2t1HA@gZ6* zVz#?DNir%Hd2QdhQ+oJ*%v)}IrkO(j;|uRWlfgzJbmnEt&UMmjBiD+Le!B6YTXyrF zF{=+F!ru^I?o6zxZa+@5MUQ++&30g@H4yHJueNg4B1_^Ty0?AO;+2cD{@}rGt^K&# z+TI>Wym*}hS<KNJU0I^z)$w}NIm)3s`Y=+a@qB=WfHZmSc#+|`{X1XE_02{FkhVN; zQGbeuShZFEFs0ja1NR^alL&Qn+@V<O^OM*gteL-t4#f`f9Ben8zzKHo(Z-4<fzbVm zWU>6$#K{&9Ky7zM8L<=~3JL=n8u%Y*M%xqgY2B{q%|t69l-C!UviYr&Ni3Q;2Q<#& ziM^=(5hU5}FPdQ2xxH#l=EO5ZcC>#)0rFqiX)louSU6Q3*Q+O`{Jm2gKEle{XI&<H zqt+d3pDuBT<dXTmlYHwuU7^F)$7n)Qm*}23$T#<5)}guimmM3*xbuZbRu*iwo(N@b z*vPU$u!k`su2C1W+;Jh25TF>!V>}a6ewggU-JT?Pk_MK~!G7%)@wYGZZ$9fsqD5|T zag{LlU)$h1IPjad|EpY-!W5Xw6WjMYsp(L&v+5`fWBXS)IU1GvLRB-#3VHuK?8z6K zehKxEJSYDpm!G?TPKaByaLgU#GY#eMS%&=Baq~32rj3OQY9Xm*2NvWiLxu%DBBiB{ zhuavrbLe_eM_Hnhssz`ey3~PYBMPl}^0~~+ag(``xdb#uBh^Q(l?tR()JaLy6`h&r z$_)mzYk43WYk^Man+F!@3L`}hPgO7pIn)*MJ+pLfkt2n|IkQ$<5c{|9l`(Cexb1*B zDcQBipJEFst>;+fjeN7MJFjggzPuG~0IVng-ce#(Lbb#dx2BgtdRa~Vm*NCU7z}RG z6^7s8X*{#LnOBJ_Ol|z%`K#){PGemFEXGi0dcs((C-)zhAx+bsD2`?k*7_^0R$Rw8 ziRdii%MDg&G%+tILeF=S;YCaHVi=v0UToI9jrj9O5lC6lQv!V+_)~SsI+roD__XLy ztrw~9{%uTGoN;ak*1278i2JXP^0uj%sy?(ue}bCh@k;-i;;JGfIK{i))uq;Yq@OY) z#_I~WY~Ru94aQW}UvPwCltup4%gWrsWz_VOO{9T6Ya81F@Or)u;Oh6+biZfN?(MBp zktyl%_?i+N<L+NGshSv{!`F00Is;60$7p*|Po1KX?nowSYg`rdDNlWh`|8#Aj`As4 zZ&pcF$~{bOy9!wN?_On|BPU**nFj?02#`O3ek1eLMY_4nydNWlmVJSXo3ZWDCx&-3 z$&Y&<KGNw(CeyAxPlqms54VCY7i-aVlhK1wcBP}|*_7t%`KZ-hJK9)G%!G2rSa8Gz zrOz2$R#Qc?m}{UuRB0{)m#E>Z&ja!f_+dkSGjRA4GF8u`JUreA{P$-y(4rH$^(8xJ zG-^>y$rP{_HU1cl)m|?6d6*s?^`D;T^zq>KmfURo;lRPO?u^HsDUG2`*AVaP+|g?= z^o#NWTi)@?Xg@rYv>jDZXY{_2Qwwa(mDA=+l`@9gC-bt<>Za^FXX~cMrQ2bIs^_)q zK9<XYW&%i&SiG716a3M>B%DLLc`J#}W(1SMsAbgrfo>Ke-N^2+`%NK7a5<;Mca|yg zm;?;`W^Ly^^O0byefxv=r1Ed&YE<3LlmuG(y;v-Q2Y(P!ARSwO|LJnW_`Xeh!8CFB zOGs4|KF45dxV?loEn=gjdd68~4uc+|KyNhZTl^8*i@s~yqc%?ejsyuLqPU@w$7J_; zPxYCA{d}BQnMx^*p2se%*L!s(eev-AT_)@Oa!ajypDEDctauRGt$$tVUrV~9H3s>q z&ZBKF7D~GnYc-(<v`-fM`t95iVu4^@4Iv=TN85?g5Q5_QdYUbv7Y~2}EoP<z*z|d+ zYLhloM}kI=2PzEl(nlc;3gXKQAQb}HP~Q-8z3;WA8nQg4jlb-OUN{pdKPvK||5>$O zYV!Hn{Ev0>4NgBszB*ngjN)waEKI(*>#<xLutdgj+=XtcH__NV`HX58<;Eq{0`7R& zz8|&wvq{LaLr@+`Q<bsZG^9V6q}2UgDRCA4mLHE7l(+0Rk*8vP*s|`DdF9(^67R*c z>E-wwYHxi=YT<pU$#b$;!_(g|85cyzW6SAmQ)BWluE~hPDHSk-m|5rajiBZiu4Fhm zW*V9?cxo?-n4K6T+p7FI#@GNABBdyNi>0+{9Z%p~NlTQPNWR3w_cShNxciIsSlXc& z$*TnFshgRNrS}JJFOe&q+tW>e&_@w_G3$1=3QeqD>YZ3Fju7j~3qJ4JttriTgw&`a zi>GO7gF?m%>IqVLv01FjVc1A3%_$^33dN{OBqgB?n}%iR7vd<@GwM{J(M+6|Q^GE@ z8<I?u^T`7Klq~RhW7)i)8v)((C!vv_t@Lf(s0uIS#8In%$|$Up!){Keb`$hO<pSD7 zr|#g#`}B!5;-WpC(#BQUzZIfVSKCascwoMZ!}$7Qx+iS#QjPFC#+R@Lt9*)JwvUz% z!<`jWx7%@Al?FYg!r)51cBGFt%ireAx_$epvyq%-wUk!#zmxxTSuIu@d}ZJl<cPx# zo~V3P=FK&tGPlIEp2L#HGheLEb{`}#(afzhUT`il3e>kxDy;RvM;Vr*5=;8#Bu(MA z6V0QbV|p-p=)6V6xV7@WgK|SgN(VSLXp`Hkla*!~nSqs`Ze1P@vEC1OT`ZYB!V@}H z^t9|+b+XLNftMNHH*4(4*z=zbLDWo--4rH*=6^^HaR?!IEL2rO8llX<{62R?WDzXE z550QXo}44(NpPU~J`UwUuPS9gt!?-S|Lp1B2mKWka)V53O~*$;$WeU2N~}~Rho4*G zv~&T2m2p3dYB13vS0v!J2?{J|KF2~W?)+-I+*>@T`n<y<QY%|)GpgZUeA&$>r1Is< z;hXREFzwFU!zK?oPnlL+klMO<a5lk-bB`Znh{DE;lS0={jDP~2^a5dDAm|*gd<g-X zsvH|*g79^unbeNJbIkK}cbT4p1hDBZzR2bRM-(qX&A4TaW{Zh?*;+CssysFLE-&As z$1w+r!=q6|I-s=>?^Q3?!roNOGTOH%?Y@Gn?!03Fy7WP0QvJ5$FY<t1zckFbX~+JJ zdiu6hp;8uzi3fN^?NquOK#Ij@C(8<wMnX=dS+&aQRw+(`GwVHJ>rGlz6<kHBS5j^* zW6Ud+^^ZH$E5FX<v#VA+D{IRgnsd08!;|vMR{y;2L@^9aM`Y`l)e488;2RzHt){Oy zWdYa>rsv946^%=4NC<t3j8-cbeG`ex9@d!c+*VWeLcMdcd1UvoCyx4LA1k(gl<4kc zopmRcMBF=yu1FcA_Sek%N=L771?FsX0lexqP2Q#N=0@7pPn0Y4*lh`1BJpjcH*R2P zqTV=7d)e|(16P&NN>3Bt!cinW_tRxOU7>~}n&XS{yZ#`f%tLupayV$+9nUKY6QM3+ zh9sJ+rGh3it+<oO!0AT|O7(0SGC@ZC>Q8q1G#6>Q+<SnZJ$hO-Cv=u($pq>O4ik$H zY(Ziqh##5=_GVs$J`E}&cXO)va)s_WqsR)RD|zW@sJV_p3$)?AJKreUmjjlz5>8P} zO?L9x8$)>>lTnlUFG;NhlBUSytO54~7Y*Q>EMmDbNyS#2GwtoF_?k?23A;MM_orFX zG$ET5g$)+e5zoDCY$FBtjk3rrKUGD(CdD4!KS724NFx!%*Gt)Oj1xx;YUOxIGMu!h z%jU(qMX6V6t!~2+D8#{K8Z&?YY~|XkclPqZddd#&|JzL!!VLu2GaC}Z%)<~K1Y<hw zOWe)hdu+T?@R!_B2BOItP-8O0Uhx&gxgBX$gvamh@Cb88u4X|^IRJ~6rd60KPBWT? zQHdaPy$z_CyY2Iy#yJzXc#FwHgasHYWH`Vw@+@_QV&NJ+*Z_^R#w=g^E(P^mOR9r) zH6|^){A>bQQ2=W+{psy#F7u}wQ2RM6GyO+Z5m&~YXn-`Jk@tHR?=+sV<)<|<TxU%n zlWWBGx|{zg4W>SN>gX)G>rxf(Wb`DBkN)j)wR)I;eXX~}<*3WNU<D*~6>_er`=$7{ zEr7+Of};EEk~o5-0oxH~k#4#lyZJh$=F@G(!jZz6d2#o!PE~ST%G&xf?}`VT{Y$%J zE!d{3&7b=R`QdAP)br>_5mzMU&6Hlq0+TeYaqM5?8rBTF@#+8kZTluA7PBRa9*52) z#ly?m{8d-MM`v|B-L*qO3oi}7?6sZRMd#=<()ZSj1<?8h5r;)rK$>k&TjY5mpv9im zF>iv-jND~*p{lBmTV%m+6~-7&ha7!l>{E)kDAHN4`=&OT#+OrsfeG-(6p6S9a)?=; z=WSxY1-THB5XHFS(q<5(*2=CO!7(Zs;0xJNR@qVh-65ot#R~3viQ<w!?G)|>*aY%R zE}9oaHWmiR)W`y+zZ>uEsB04qzKH_nelL}?A`vsCP>~4)C|l9a4hgl|s#&fYF{!8k zjS7;9S6#l<X!pKqUNrFBCiA|J6GXOsNOMGB$CGe6og2)~Y7d5}wU(9rAiwUbUjD|c zCINKj4_X_3O~U@WF-3UIax<5{Nq$)QH%+E`tUl*~mURyhKD|N78_bDESrGH<>x9H6 zY2>1<c|<~R0_exqGk(HlFF9g2F^iZR@9_XdBX>i!Irw%&%zl%g;S4jX%z*`CyFeqN zQwx@O7Eda{-bd2G9T7K)H4@X3h)CTWf7cwZ0u;2D)F<GJJRWKB7?W?W`*^V4iZT%6 zcT6>`beEVi^63(1rOOPGmO9xA6>0z(mY<99Q1HnzWGC6wZ&Md9PKb*G7HQV)-Ej9w zHKT6iNOe(~9_pV<s&iHA***l3l_e8JcIcS(;cimxPGb>eI6Y&T`7wCvWWxs^%~z@B zn3AIUSqalHk@lldibqnKso}hpme^pOF%un=tr>e((+9-4t8-O|skJNy#=@71^DD3a zGN6`{y-M)D26AR~SEX`^Uyw@HJ>lR9c-_|444|4W<nWd0)iOlj&?Ok-5(mi4H~iKl zFT{TCs}gF3%#D;_%vR3C6{22Yyms|q265mFrsl#@z{+3P26TsbTAg!0?eG}XG1>q< zF@L9&g(t%=7+hCdlw~L*O7(lw)Bv3-Mb@k>aIL;n55+|U_9h6fS#`8a7ve>eM9Gh| zt=C}?thTxbShWH<iqL}{Kc?uBHz)f!Wzmxj12{qL$5WnUB5q!;fMv*19E&95Ytjn2 zzs*2xY7x?0@Q^FE#W(N-8jL`)Le<cN!qwx(?%$ov6{TS)Eh~oQcRfXeuTx~=D_^l7 zLlKI`=ZI6vr0Ai9rO8-Fh3Sy16KNqMal#@RsEtJlq59io(jDsMn;Tx)ShbYoIRG`- z@YAu)zTwf^S*<UB^$M@uu67+H>{VobQ)!5H7u_gN?3^AemJUVuk$w%6SLBO}*y@Aw z9S;_>X&og8R-&9gCF<Tj+Oki{E~rnON9?itlhz$!H_|VlG!1y^vkQ0TbiZAGAKPrf z^F7!1TLl1(Da4*2fp5_fqI6L9<(NaIMuTWQ*gu0ekbS=|2Gi?rPwhe5d;WQtZq`KR zWCYTBt;AJypT1#Q{aDz^ky|VjC6UTRqW__U?e7&VDu@$7;C}8N-<@P_EbgFNsq>79 zG=v?IX3dx<HBGbR?$)9yKCo6*fbjU$-_1IiPe&^~Q;IUdXFMmFhS`WSmW>G-nytDZ zg5sYH%=UQKZ;)ei<rFI%W=JyPhU2hIv)y{kMANF_wm^MtW_Z!E4trZgDz-l+u0K#8 z=btdUoR>dv^0~hX_RXYAjBHWM@GS*HoQT*vu<Tt~iVPXXAsdupUU#lJxvhJbLIGN% zj5`Tx*uryYcYJG=(eU-7_zLF_q|M6i(3)pgNcWIMzhr`HQ{rXIpyDZuPAI0b_WSQ$ z6ox#mZO91w%EVYSv&t7*;Fqf`*7Zu!^dJX!gbZgn#Xn@2-dGUE>K~Zqtq>FY%SdTF z!7|r|bAww`Y$;K61Zh$3o6+s2SNv5n!zf8O+Tv9aN~lnzz_@QzS)vB%|1wdOTI?pf z7(a|6-31@ngj8X?{6z!o+w$eVw;}xzaodad=XjA`RHM;G!%aHYDpg^aDE(+Xk(&Ol z5~B#;k|%9+n~&Q$a8gGB>ZJG@3x`qZuz&k^GnX>w^=XyCS(}_q7`^)<Gk0rw>>X-i z?afyfC5AUi34yedMnc*{44wDS*D#qDM{0#DJ%h26YZ>bPO(r#Pqe$92$Z8P+Qv`Cw zSyJ4=8>rVFizs}1lOxhYr<0EOwzYqn8JgbVI}p8Bqqdke<~MUfD+uMEMng5b%VG$0 zJ{0<Dn~)qn^iUG$yR&YCS$mb|=2dEXex=)H01Hf-BTmK`&ArS!MpJ`fmk<p^FbRp$ z`w4Rm;eR;_<*poOT8=;mwJlXhMh6w)CjgTKI<H+wz=9;+YDA@jVn&}rpP*jRPPsr= z?tSV)q=R7ogf>Z?(Q6?nIo?ekNZ20gPe?Vl(&~~CMLc++$%AN>`~(aerqKrkx-G9w z7%Yg?PXHEFnLLp|QfFOc`a%7}_yqaJCdN(5yr3IzOl1flMP86&cyr30=cfu?c2G!u z@}Iywy-@EJ>xVJ%pePCn3jc)vDf7RP`QM!R|FW8TKA;UFlw8ZNU<>~H1|uu=U9wu- HAmIN2>Y`Co literal 9653 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png index b4127e2fa250341aa505390846b52925a9a39585..f06ddd4556fcb42acfb2706539836c26005f93b0 100644 GIT binary patch literal 2618 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 literal 3697 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 WDbBqfk-Yl%Zx5|&ge=v582n$jftvjQ diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png index 69c28def26af760ebe2d7dc20e43d6851c12fc62..0c12beb31fe43eb95f57dbb720775644c10379af 100644 GIT binary patch literal 6140 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 literal 7175 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png index c877e38a7b1ecbe003a8e63ff095c3310ed38ad3..aff9cb57932c0718b0dcbe8fa0e0cef6af896150 100644 GIT binary patch delta 1528 zcmV<U1qb^18~huvf&_nMNkl<ZcmeI)X{b$m7{~GF=$JA_O351u$&`eUsSF_$8S+A+ zOi3xpkmQ9j<OPzvFqh;Fg$SicN#PZlGDYSo^K`G@zt+Bo>z=*$Ip;pvp6{x2_u6~y zy`KGi{-@tr>%W#;_Sg5tSP(z}0R*ZoP^;Q|U<U{wfB*tXfIxrc7XbkT5U3#m0=0%9 z*$n~+AV8q<JAeQJ2-J`Ofm%b5>;?e@5Gb!Hf>WnX*|lrea=RNhZk#o5-aPkQE8Dhh zvoBx1q}Q4@ZE6!HO!#4YsXeJmKWERLwWm*?+UU`vORZhLF9HbU5h(xo@uPL^+SN90 z+-O6F49UHH{``OW_Vw#m+q7v@?zPHR?%%&}SFT*K_wV1E!nI$&e*X&8t5>hur%#{k z)~#Fi_U+q}57eskbMoX#yL|aFfm+!w6Wb6dQGxR8Hq`7f>qF0fel6SftH&u*rkH*n zJa~`-^;hp%y?S+eSx0tz_wN1GTYl@;zJ2><wQBt{OHzO8{ruM0d^rS4P~e|*$n)jz z+__`3X3etRy?fi3F=K4|_U(B-QMJt%E?ltb)2Ca{o;^*|20M4|EO<vc`W-fGm}wtc zmMvRm%a<=t>*vp(PusF7hkSKr&YWpOhYn3Y*RNkU9kJ^>ssCb@{rmUZ*s)`+Z{NPQ zc=6)glt+It`{2C@AW#|t1qG^3&!<hBW{)2~wuK89T8|z*Y~8wbcJScA8twA#-MgkB zd-dv-Em*L?+O%n7IttvkZ(l)m>eQ)|jvzJlpyl-G)9FX+daZWt+E!j(ZiUpDJ$rWQ zS?}GjVMChtoH1jDO`JGUyDMnXe5nGxVZ(+tckX{&d-Uj$9XN2HpwIFq1P~}af!swY z1(?DnTXeKHXwaba^wOnE=~RB})~(jIZQFF@sCm$1$Bw0=)$B9Xebn6RyLa!>#jD1R z8{4EwlkC~EXLjh&p@M^~bLY->^XAR;InC#4dHM3C-MDeXI(6!lo)=Q5TeogjuU@_M z{^x(spWE);yMH*{PaE?5M|BjYJ9g|ywv#7Mwt)i&=J^zx5kR0+1#$_h@aoc~ORkSy zyLRQ)b@jfitn7!=?<Y^5*oO}va_^~$6<y@%-o3jiOtVD+ROp2<eMW(L{P^*7M5=Yo z1M4D?LUzQ65ox!@*3mRV#kte$yXAY-A01?!>SuqbWZ1ud{}k@|KFf9l5GXx?T%c-x zP;-Xaa^l2^bd_Jvbup$vg9g^BRjX`sT5r^-QSNz7tmv)+owiq8>ej8B`yLfv|F3n0 z=$0*8Qi$pgguZ(gsM@Bb*gAds^!cxoUI-q4^X83>968cjw{D%@`ug?jbb4Od=Zf8? zIn$#@kESEv>~#CgnKNlFwa|Ta=+GgZ;%okL>eQ(zJooI`lWx<}HZ8^0(I1nlEcyea z+oUSq9iV=iHEULt-SHU&5ctgn3c4tzqu2WN>)XneEA8UNi|H!*`0?Xy?b@}u_H?s< z`t94d?cTk6={4P#s^^*m%@*A$px5+X&CzOIKbkkyqI*|AfBtMsmo7~;G-s;|O9KWB z$aazUQ9<0UT{}B>?p&I}&{3+^+qZ9@JNhl8jxLNneE2Zc)5RpM|2)N!ub*DMdZk{M zELma-c=_owEC?X*X9|>SUQbK*n6;^Y=h<s5TC}kB>(|?g6)Q{^Ry3ce+lLk{T9m!r zR;^lPM~)oHJ)bvkURobDYE-%-Ku<J>snhLj89sb?THU;Pvke|R*gAIXXlvH2N$)>= z_;9+Qqg%A*%$bvYq@YKg+Ur78_Aj;c{j<}3?Vyl4y5&l9v0600tVR82>w2DEuODsK zbc61>)g2KEcm3-y&F8WpfWV(8Q1*SEuc-gQw2nA+3Y?vi|6e38Uc9g-O`25cVo)*P z$)k?`i0F<3UGZl@0D(VOpy)vTb1CQy0R#}Jo<Ko!sMRaMrxBA;4Uw~;3_=03pbSC* elb{TF7T|BLbCLWmIdYo-0000<MNUMnLSTXi#X2ki delta 1517 zcmV<J1rqxF8~Gcsf&_nJNkl<ZcmeI)S*T5Y7{~GF=$JA_O396cWJ*HFkPIP|GUP&{ zOi3xpkmN!ca$zXBFqh<pLWEMJq;N&1Op$rWJif2rzt(nmIeYJO&iiD0zN^l=*WPRI z_3Y>KKmE>H|Fyhj|9o4F1px#QK%m+JwW_@bc7Ol^2q2II2vmQ55fDHCff^DZP-_U1 z-5`Jf0t70*0|+31Kn)2Hs5J!1ZV*5Kf%2LnIC=7<UA=lWx4UuU##!^`&2!JSvUTfL z`~3NHdaY^GrZ#^3_#d{H+LNmEbLPw$d-CLojUGL^)Y|3yB7i_1f$|R@K3LbTU2VgL z4K`%Rklfqn&6|H`U%q^?jT<-SUaM^7-o1Nv`SN9Z_wJo3T>JIw_n$z$a^;GB{P@vs z-n?mV-n=RKK&?tYCr+HOOP4MYsFnRPu?>L|6)4YcL(LwuKJ@(O*RpNDdYn9Yvgzmk z{rf3UfAyYKt5&6#b!4|^&z@hs<&S>t>({SVtJe2fl2U)~=a0tb%OOyL0^idi&zHY_ z`?k%TIn#Rg?rmenjInLow&nRm)i$3$f8M4|n`S+G_B2f!?AWoR;2r7cci6CDrhRBx zx^$^6Ted8%pF4LhZOf({^3|C!V}=bKIyC)UyLQcV#IEn8{)<`m?b~N#$BwnWef!#? zMT>G%9>ss`gZCnUKxqgR6sS5qpE`A_J$m%W7A#m`J$m%8wQJYffddC>w97kp?wEq? z<;#~gfBt-H)25B-C~)uIy#>{&Q>RWkg4EQ5mQ$xrr5~;9wc537TX}i86;fx`tXZjN zy?6ck^=aO7`t<2GVZsFMuAoKpr3&<h4IA2=IdgyP;lqcvfB*i1KFgaBK%n#lau=l( zU<#XT(b3+ZL4(rMix)4ZQ~51hwpiP?ZPSsX=0T4hJ(`YIv(HrbQFE_v-@Z*3uNpUQ zY!fF=w5Ly>+QEYd3l6f*ojco&8#mJDG@q;G#fukq{rYw5)TvW?UPzs8-MU%5diB!# zpFMwjX1jLn`r&jxZOHQ<)lryk-@ZNBPMS2y1`ZsU=TmG(0D)2!$R()4t4o(IxjuI8 z+?iX~)%&utvL8;rA3uI<@87@Ay{9Htbdjff_wJ@J%@zevp%=#V83pRGW5?1Fsn#_Q ztcySj*%2c~q}>)<N7D!u=T5WlmhVx2baZ2?pZ%edVgLU9Q@H2*EZY%4p!5WCfvWjI z%^7CP@#DwSRen9!#h3;S8d$4Vt+LH&y-}k^x#u;pqPq%o+Fo&~TeoiRdsKY=ck2q# z&6_u;5Y-<DefKO-wM|R0b^7$_^ShH@2p)g^`n8Q5Inr9UZk^ux>eZ`s>r-W)D|Vaa zOphEnl8$_{)9urzPp7%mLig37Lx*&VuldU<Q>LWw+`W5u`mWlhrPw<9V^Wnxe}HtG zRK>dk)K9Z!&8o6HK7#-Pf4D$F7o~LcTEBjMTd`t=UAS-|T}9Uw_%&<R<l58C>bHMx z-LkuP@21yuU#gyK4m4YIr+{A5do@R^b^T;>ow|4R)2C0iWXY0LLvyyeury%6fNU3e z9~H#y+O@N@XV0c73>~Fvy?y)kxuf4g>gdAQg9i^%JzY%F`p;7w`TFVAt5@oE@#4j% zfR~>>!-4<;f2TmX=Jm8>k6D{~p1pt8qD2c^w{D#+U%uRQVMX(ax_xNj!iCw}ZRN_9 zcKGn&-1E6}=ce^hqei7W0`x?4m^$6gmf^#Pr`1iHHre38gRNu7j<$OB>h%6YhYqC+ zI=V$`_Uzf&M+$n>sl6^lW&cu3-#<Iu*A5D)qg$>t7pq0{%UaZbwyx*-`q5l=O*iPC zTip?%aM!;M(|j%q0tozl0%hOk`HK1<OzVhKr@+}M`Ts@o{P}Zh(xge1E(R6zojmI3 zkBE-Kb;X|r0R;YDfuaNT@1>wK1Q0-=dIAN_p;oU1pGE+)feK{<lSK_E7lD5Pl?ajl T1AGTm00000NkvXXu0mjf=Z`U( From ccf8b65486711be4ac01d84cf0da7e60474f63ea Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 22:08:28 +0100 Subject: [PATCH 19/29] chore: update snapshot test images Update binary snapshot images for multiple tests within the TextDiffSnapshotTests suite to reflect recent UI adjustments. These changes ensure test accuracy against the current application state and visual presentations. Regular updating of snapshots is important to verify that changes to the UI are intentional and correspond to expected outcomes in test. --- .../character_mode_no_affordance.1.png | Bin 3377 -> 4400 bytes .../character_suffix_refinement.1.png | Bin 3377 -> 4400 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9389 -> 9975 bytes .../hover_pair_affordance.1.png | Bin 3767 -> 4746 bytes .../hover_single_addition_affordance.1.png | Bin 2747 -> 3751 bytes .../hover_single_deletion_affordance.1.png | Bin 2693 -> 3714 bytes .../multiline_insertion_wrap.1.png | Bin 4427 -> 5432 bytes .../punctuation_replacement.1.png | Bin 2618 -> 3708 bytes .../token_basic_replacement.1.png | Bin 6140 -> 7197 bytes .../character_suffix_refinement.1.png | Bin 3377 -> 4400 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9389 -> 9975 bytes .../multiline_insertion_wrap.1.png | Bin 4427 -> 5432 bytes .../narrow_width_wrapping.1.png | Bin 9085 -> 9883 bytes .../punctuation_replacement.1.png | Bin 2618 -> 3708 bytes .../token_basic_replacement.1.png | Bin 6140 -> 7197 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png index d62c86ed15f9c92a058ee54ed957ac437455b064..aab2f59cbe7c051ad42823f8b16cfad4552fd5d3 100644 GIT binary patch literal 4400 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 UajSQKzB7Q4zM0+^9q0f2A5VTE`v3p{ literal 3377 zcmeHK`9IX#8~@B0u5FMo+1JS4%|+Icwc#2fvU4kiu6-~FGgRtUVr(JRP1&X~_H|}R zw;HmQbu2SnWXljU_PEpQ`?~+c_jP}G&Uw!AKId7^d7g9bIV0_${8Ib?06-Dvtz7^B zWWnLXczHOb`?+opP6di~v9koK`ec?kjkAFsh-;3HfCh)>1wiS+0OZFM4oPtc0Km_| z|Mq|^o^$=n17SY~S;lrk03cX~us(MY4O*S#i*Os3{qQXX2m6)RLDYbz^%0QrlAu+3 z@Hl7Ls0;BbxtI2wDoI1#3A8Ve2tHR|?-Bab5>;>(e5#>VJ&!D=<UAk&@w65x7w5JF zj)|VPWE_p{_atW8(cw}?Z?}zA!&?^U`$tdW;eBS?Urzc8>UO3AU|ydzaMx%+Z_Wb_ ze-`T;Xe^c^*8L(|^J@4^veAW`_J8O~sFC*PUS6$u`a}`xO3eR_2G8rsDdY=J<Kb1n zVE9$sM${u_-ff;?W(T_%Hsqmt7Zn<;XgIOM{@N#6=Gtq|rj*<G;W>P4x$O6D%iac7 z(h!m6_uLw*Vmm}Ndfv+jI<%bTuzV||;H}fXrrxVNC_LSBymW!8sV33=ZaqbdvyH_I zaIOTV?QI#EOK)E#;b!D$`^njBM(#Ok#!4iqd=kmjC}O%}7#$>Y9L#%*y9d-9Icw|L ziVF7mD}M7!*H7{{6}V3>%=f(0!@0fLZA~F>R=xHkoe6msW7ROfzN>tJ=(d&pyl?Eg zki5AMvt>c<lY-WbuKxafsI&pK^R_@Btv1l*;zd+frF_ak&1;VuO9^c+74N1n@?4Ui z1pq3txCkJN3>?Eq-)w1=q<!(G#%sM&@$BJCvsK#%oBbaX*T^t)wj&O=K4mas)E=PL zf;XVzTJEQo9UaM<6Av@i=J=K$7@b~Xw70XC2JO!1>0Mz&^>42+bjb;99N%%(=7=Jb zxGJCK2*r@8e7^+59(zTt-)#Gdw_RE$HwZ$J#Fpbb@a_bh^C^|Rw$O=2Mvq+848e4R zsvL<QO|kwwIB1hnR$A&8J9W|_kD94yHFr<#Y4g{8(p>-?i#-o8$7-xH<jgeo{v39# ziJX0J6Ut_f`oqkIO=7=3My-rER$i<SWgqTtE(CVxsMjWcPw1jjGmk0TT9f7XUoKi^ z9qd*VZ1lH><2s{ne?A;33S<#KoVR5^pjL+Kq8%j22Y2S=O%#jUj+|ZaKISS)(5m%m zj;?2t_E5C?;B4vKshCmUjR7lRgqPR2xL5M`*!bn4W8SB6H-^fydJ6OwR-m`!D`pRN zH|KZ0&AK={D{%1$-X*mMya89Z6ADfD7E7Xb)_*fXEoR=_qFt{I{3y|c+}~OaTpp^( zV#j0tr{;3G6WnK;o=EH|)OXloPH7Un8lt>Mb}5K#RYbaw?A7(@H?;}ukhqYd?Cj&T zx~Jy4ex$La$3+IA8oH$Q)F-C#XEu_*rooYiX|Inaj3s}$T>a9`F~7Yh*|GFtfs#{S z@;IS#Gf7VsnJ<s}T{(`y@Tc=VJEXM7wABYqor!gwPd1O=xN4ZbwKMzZV})y(wUh74 z2tiuh;?lTB{IU!@nIr~-**&@3L~Dt@Ug1Y>)$*tK#IDh`mF+Sfyndl<>5CeIK^j{b z$@{BJwsFjIGvmMl!2Tg%4UU-a&W&OuZFfNpClz`N^^YgXL8e<{Rwm2m-ogA)WmKzl zp<L!vo84;C>Ucv~mAxIdwf@E^QVu<hEssf6+Z&Br$s^=q;j&u78B$C?q;UFlU3=j% zIj96RW+}Kfc-7WW>frn2^^-YLxI<x~OvNT4L4)7+2<(S)W?qHA1pht0Hqqonzq#3a z3tVj)!((8aI%qU7_R8kI#EYYqcMmx#G`Dn)#iWKV!fgrOO_Z<3HKFJX0DO<H85mMH zi(Y>&055(#Dl!x>kcHFPJI4_dF91)fg6Xq<*(rHs{<$n_>#Jwnp3Kc4wm!5&N<U=r ztwY`wyNvGqvVLk`93x+{eTR?;hwJ*=cb1e|?F%D5t~KF~WX@{IhOf+ZI$at_id~}H z2r*3-N16^6$7)K7!UtVH>s{~MXSBG6jA$MC<5axL=1&Bt0pMJ<Y4GXh+7l4J>O`oG ztoG7f?N}UzB@=)^+`HkDP&_v`=P(YLfQ}Fu&6J@VXmaB2o-KR6w9&`~9~Qdpvn}~Y z%jwJnUl!>~HF@JOd1ofw_wh<D?MrV_o9nM;;yP=hGI8-MT5GYM!kjxS4T52ej|_tb z6eLYzUz_k3x3|t_m`ny&`-ugQRsSh%6buAaFX4)cG-)&%vj#c7a^8M{Kdq(GEO9F* z{;24Vj|<uaN*Q%#${Y2BmNb`pm>;pCD+<`dcYo!IoUQaxC-=vVhG!Mh^4nki6{^xF zEc-5uPNMaOZ!La$OQ_gBr7DWKHzK(ZfffKks=(OHKG!8~VKPixQ&ThQywp`=;d0Q} zD+kyoeD-lQBr5ts!ZB+ik_S}&5G70gx%FHcPuS4e#I3K?#>?`H!;=~CWtIE>ey18% zh9k>Jo7c%o(xW70;yh&rnK;3Ssw3&A+&f?{IDIVUN<c8X*&B?sXOFq6Il+gCj;Y5# zY6_kB5~dSIJ5zICW4^*Q6a~Q>TC5BQ$Rbu=z<es*3CnVuTpYV4Vl(M!rOHLfVq+WG zhZ#7Q`w234NjQU2dt+25Znln|KT_%_9jEWHAdqIGoBTjZ-~MU*7fHiQXMZ27rt&(! zRWLG5FH5PDo)k3u()DeF)vPvOQR6!GuqQ#objhhbt8$paf0y|^p*!7VtNZir{lNLo zdEB6m-5zvRH(jTIOYlfG0zGlbi*@+^=PU22oM1II90D~b|4k_Au+Brr@Jw9Lm9_cF zVU13nvLY`})?M$P4m2cIL>GO_(<I9iwbv9e7B{iCC{SDY&_Z8vG}d$E8ru@vmzDce zZ7?QfcS*3N?tLh(STu>>JEE~;N+93!eFfpE6zmpJFrNaiW>FUAv@;Rx6n7@PZt(Qs z-}iNuU_q>wlUKVd>sU44PH@~Ah9#=9y5k?HtE)%8buug|L)Xld5g91o=-m$my?dua z5copXz}wHN9*f$m>m3{>g<aoi1L0f3)9;N3JyDa2eMLlicRCsRyB9~s_ImRwMC9_R zh+)Kywy>T_os3DGuJL7)gc<a0N~Z?=Ah6P#GO6m_KB@C)co#8O->US%&YP3@w;-a% z+*PL@C95w>?|uyQp8<7gntNiyZ&gVg+AbzUrHo9uXdb+){E_xCHqTwS2BI+a=KzkE zwXyal+=q?)0c}5q+%Q0W_a`9`galIn$ZMAToHUFFKtZ`BvS41ct_6_5xGlzs`R*X_ zfQFq3L}c9$1F$Fp>YSxsgCWn|GGciZrpW+kF$w0vdHi^A^IG6#Rz)m25;=%{otFSa zq?%s@<8Cyrh{0@g5Zk`zLA(k9;tBvEs@@6!t#J@*ZJA&WM8g8`nh#0`z;po-3_VVf k`#%Byv*7>F8SFR$O5~7l2Crys{`k5eY>?JfmI0~%0J*^TM*si- diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png index d62c86ed15f9c92a058ee54ed957ac437455b064..aab2f59cbe7c051ad42823f8b16cfad4552fd5d3 100644 GIT binary patch literal 4400 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 UajSQKzB7Q4zM0+^9q0f2A5VTE`v3p{ literal 3377 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index d2d6cf23325ba4e7c1ebc8039659ccbeef412677..08007ff35a9181107ef4179b8c7285ba515b581a 100644 GIT binary patch literal 9975 zcmeI2)l(e4_xBeo*5VW`?q1y8-Q8hvUEFnxyIY~SY;l+34#nNA$QCWG58sR5?eiCW zE|Pgoa%S>QCOLDGlPFbXnNKK$C;$N9lbo!iIsgE}^v;b)AKq&g5zKP{03OX&LPFJE zLPo;b!5O6CVrBu90XhLewifC#;s5||T%4AX4Y3xEa86qTBh~M)`O?y4v{$awMhEqo z@YSPNV1wg2Q;I{QSmNm4jXYZ#j=kq%TY6y}F^t~w?Ud~|gI-#4yQ<R|=E6qRLijMc z`{_rSAG3JK&^C^Sj+9pWuJQGUKe^|DhnsF^o2ZGcOa|$j)UZs1)yxNTyA8vC1_t=u zdjqCF1xzzD#-}l)(ZCSx^>weFo|6r2F5R}=y;(!6Rb^lzH^9pf-Z6?@Am9~uu-+&b zUhHWEdCB}9c|gD+muwfSzX_m&{~i6Jekv=8J<>#qiLNsCbzm(L@sRRXA0E-|Vl7^f ztNbTD#kkZccU87B<y=?TQ&6+ihW)@=m`XweTL8`$T<dKH11Nnb0wZ5*f89N@hQ+pF z5aSKlW{Z4D2{7vD1cOj6g$FFO{5pw`+$$=1W_lRQ=CiCZw!*wUdIiUZ&Lp3kzMABs zcm%5Fe*A+@0@&VVV6OGOqa>+SvSo-IkJGW?9=?jaZ~gPx3O3-3+1i$WX_~LZDq4)` zEN1TtQ@c!fK&Rq+hWLvKa|_N8wa_=?+>h=fY#z@ykDfYtSxCFde0ZpYvDB>EO_$;$ zK{`#e#TX{d?m-E=>my2QDPu7C-T8zEswt!?r-s4<xS4UIqP^ihe{tDNu_Y79&~5z< zOpD4;2#;)j9F^GoxL?@*yVXbk@Cs<rw0j+a9?h_cm%dS6Ojq`u+h|dCehl=nsq&ac zwsN7I|0>5SmmGFaOp&tBMnGOfmP|XUVHs;V!!M7<HJnc2X8EseX5I&eQazt1rZeWq zOKj-X+A?#yacWRLp9f=kYI(|jEN#ijm_NWtC#FMMJHKPm?bw~ln$V8fePne$4>a}G zXL7hyYjVh=|M3+u5H1M1rrp8?<($w)321jV7?AlVq--f%!mQ<B)=*Ta$EE!UOF9k+ zX!Gtsvi@N3yni<;l59VEmrP0%w70o0yz|>FAC&L96+B|J%>pt3nYfa=<;&R3`<!#y zpVbuAq5QGUP+QLz*I#B9q_YGI_4W5zDySUcehWu7WA*jqsltxKGwS#-T<dIE6#xmw zt8n}41Zh~@5z&-R|3K?sx_8b2r|h&BPAMlsKmm5_@C`q`DfJ9g5L&GX8FIUH5JWKd zH}U5b#u4dr2_x8w`K9*vavpSCKaRE=Yn#{DlzkH2Kf1qXj#9(U@cH9GPXQgY{iuU@ zrWCCy!{z``>&MR9=PdX7g16>V0(8s&!23)qaHrqQhrSJgn|`tx=MJ{s>pBNOgiF0| z)xBv4%(q~97sC2`byNtasz{+X2HsB8n}B8iF5|bS7vF$?aPwP$)`B;<H)?OxL5s!l zcL%`>)RnVRQUWl%GZFwM!WIDkPB8C<@Vx*4um!OH*8;;-0QY|kX#8L2Oekpu06<|X zCn=`s4Re}@*oq_7Jgi~@!cxW1tPdq?tuBW~n<0l*%Sx-cYWYW3yW*)0aBV-rt0_)x zSc@Y3Yax@H#}z~Ph%{v6CQ2QtkeJ(_C-jzWAThO`CBVVOF@LicbpP%6xO)0-X`@Uz zuTmISQZrl}mP!=18vrZS9qhJGpA0}w3?^4iB38#(ZdRhuD3jk$QIXQF#-Ts|W`hwq zU&GqFb4qnICsPbMzzNcQ*!c2rr9l5(P%0F6T#DP7emyF^_hg)TYow8D4)_qSRZqPe zh_(=FH(Q`Cbll=h%2#anukVG~Pj3{aBV4Zf{`OSee}gUQWP$o<eufT~p5buF#<flj zk`y%+Gha?F<rRxnp-w$Ys-x`H^;C_MK*TE6QcZzKOs3vowWG|5P=$~qoOsEYpH$r> zAlE<ksn|;G)1lk4Zl_$}db6Ujfrt!CIge`mPoG9Ny@}QwQNAD)ul%F$>(Po?h0M=Z z$iE56W(z`6{eTF(s^z}by|@`MnpIYiexXsOvi3zt((drE+_VmJe>yX26-2#Ozrp@z ztieO$b+uo+z9ch9UAr81>}=YOxx{b7iQVkRQtTmh9XZtie6yfqGWvJ}b$dhoA|L5r zxzY3bLJUezV5&t?(rNb3RbFj~JZeg(Q7TN=s-L$z7DvVtXR4}c4y06K;7Nv?uOBPp z{JAc9V!w1@&zzqu5CW>G{mf!W*X4VYTvgpZcFgL3nCG=Wh-czHX3zdpm%jJ)>HK&1 zRv^XG--ahIpDlHh^ve#Q&-bmMx2}oIuM(x@;D=4Wb6}Q0#J)nhH1mq3R5>e)%}k$v zu{n%kH8mvN@l7s3dF-box8pL^l+ZQALARy%4D>49rqJXkJDMk&+egR;DsFVz(0{$D z2|6$ap-~fiZ->k_+3P&KoClq2jzMd>S+HpoUEUS-_L5xbA-GsA{e&8Ce*YciHU&!D zj-vgZc(&0o{&KhFjPn_1>3a&h)#Be(>UuZpYq%|qUnSvM6fAU=GUvpMQ0<!WwxNM~ zHx?IG7P9KmY(BSAZgX6OEg53ha2}?G`RAbR5X8=fZXRtx$5l=OHq+pB&^Yq}bV>&d zo{<=14eMd)GR9@lq+1>xVuGj$KS*jrbjk5d{OdX&Ppb5ET8(5Doqj!7J#3r@S~F4V z^1d(Ucg2MYn8Y-Gt^$J=r>jYxj;AY=pqHkVyMI$6Ih_CgOmcK5q2;^o4Q0JVy}j&_ zzOi`_2VBp94$^c`+Jk|k98-c8vq7&9hd^q^r%dDU0$UB_dDu^Ae3De_KurXq@`h#q zY%c5y4Vlm|^z;HpgA`hAm(x`&PG=HE%3ujniN6dXk1nCoafNbCsL}Nk^YHUAj=J7j zRnjd@PIF3jb2N_v5oaf)Z}&15dOP|(m7!_isW_fZd?CD-p#E>4Krc5-3hxKI*zNE) zyZ^n*N~^2IU*77Qin8wvF?g);rycK8KbQ)7b^Gh3O|)t=<gH&lCal~eN)SOkJtK9& z6>2|SnfBmVP4Izgx@jI7aZH*umVBN*(iGGx{Ybo^ApMDeek<U?$Z%0b<X*E{;7$M7 z!xFu%@sOI`HaC8@6obv@ekTIBTx$k;z8qE{%?o6=oh@#iHw_s6;+6T-t&qV2g8pn7 zD^<$bowdAzn^NBT6>z}Q{Sas9J|lH?IZQfSKba@MbJo@m^W^{Q<#w&k-KDAkQ{Ydg zh2?aC*wu^->0mswQ9I`?1dV`QGVwgu?RS#N%ZU!V`9P#@yT9`Q&Syv^WrE<W=s+A| znHP8H+5Y}$%0cU1e9C5*-?#+25EW_Qz1f88FN<L`HwlS4y_I&4s+9<fL~Y-&9rIl{ zy`mzSsL(SKNN}ky+};myV?q2176u%e->0(*tZDsd0!($S6G8o#F$v!}aH1|<Pdl7B zyFIlippDSrGcejP;%do)mGpIS;c*hm(~m^eZ@(|uhi4WXmf7?_;OLC11_nDT%8BZ0 zsap}fprlqjDQ!He4*woZ$7H6jdUKU928~izT0k?2u-EQIZS~rouf`F0e7XZ)CM4MW zZXM=Sm-kvXZM06~Q0z~emW(+LmO1qTiijd%@B+Li5go8fZQ$>pu)kcUF`Oz#>}AG$ zb4E(l9OZ7mZ~hTUqWJO_z_Y;^m(7#jz`|!B9C&Bp<1n$Ty9<m7OeK0f^j)d-3^U}s zHn#=2VEbI$zGWOwDJPU5J3k+ayd`zNy_|<S<9|rId3I_)rpXcs3S?T@dcEbz5)NoL z^gC@TP3n1hJt|5Vinp%6{M#@!mig6UAHz}i(qWsAP|&-UNw0puQskt(DAqO9dUFh- z*DxV`1VF->_E<8aoos^XackD-IIvkaofo~Glg6Dg>+n3?k01?XTbs=0N)dTER)Li$ zR8<FY4eDxH=emAFTjWgoyo%L3#(zC6!BLH8>Y7sI5eyh>JN%yG8b}2X-^h?CL*g^w zPx~4Xu~QI+#*TtHJYB!H+jqYBLn5Me-`nQ(Dx*6SJ@=k3iXnESWh>flq`ahvM?$qK zT~fOyo`K9zR#4MUs^WnhbDfy{Pzt~(OWGM}Y)Cxp3HT-ZHm8Es%Zb7~MOTuH_;va` z@}}h2wHFRqO$uKPk#B%bOpCkJiLQ^S#9}y}W;hI8n9gy5;_pg>wIQ;N4<3^)S<6;n zhng;LYqvg6ZK)Z-UiMC}L{ac(&*%Hgp=eP!n4t2M;2Th$pgsjmDtBr^nB-?>_E@vY zZ2LmDc|}T?1Fc!rbS;NNlDvcDos4X%v}<A#f|pu{wR)vW%_@rXUzgPm8=YEbzIL(m z>t&_a_{$oLubtAyL1yXKyk#=8=64IyXtA(euiM}cfz8~2VG=)xTmlKw_l^`5;gw>T zeg~OxGlCtx)_=bRl(H@m`U@qBI9#?x^GbCjTsAIa^F0>zXg;OleeXK4q0)MNm<l2k zGR?QX&Q<->!Eb_ghqTU3hkZ9R&f3kyv+fdhtd=!_@I0lf8w}5k3<P8H`%8>lGvwTu zh5l*c5xHt|-ZDm9yb`Iu-AfQ5RJ~oVJem9$q*GY`c-C<apAPdlUrPZ>XEyNM+ODlH zAXXQYl#T+Yrd1G)ef(`<zq!ZDge1s&U*L}fVSF-hM)_AuVKTzbwP?uMB<bKYq5-H& z_q<<Sb@cnV(03T+1m|?|p^~_ub_^^^A3_TM@zm2@W%VuL+}EE;2}-Fy9`CpYe9><z z)%qM*r@GqgY@eE@biMX_c(jidZ#BQ<*X6c^o>;+=>z29uA_}249RlZoX`4QgBq!Ah zQguw1^avu9V2Reh%lG=oj7fm5-(yuEIL+(vxNNvGBnHq$t{Z&69&op@N~0a+c07Ou z9ilJG#d_7Nb#%*E!z8~C>w~3URGjQ|S2tw$4HFrWS5r$Ogs1)-vQe?M<Mq?b%8IcZ z6^}m;qTe)j|8qK8@b!Lg2wo+FcI6Tvj5%Kxq)_n3S<z+gnD+RW<%GlI#iaF}o`Pgn zZw45o<b|=dN+@oAL-wgX_g=U67uJ@NBrX?C*B^zyTqq_6oLCrs8;(XdCkq@ot-`IZ z%7x5={z|Uqe84f%V+WFp=CzZ59O`|1g>i2D75YMtEfhxJ=v8WT<kweut=)4eU9-W# zRs51fHW@0IDo65hd=%6Va1g3%ebcz!JMfuqX{a=R9m(@hAR}#_dvaZ)Dq?XdcPj07 z??NGmYG#PowH2gC3qYz>SOATZwo{30t1?BqJ>N3fz8*UK*|Mp=B)1TocYbeSZ@)zI zw>Ios^KbWOa#=VL#9IR&+PH@GQq&+G&7e>EWQ?sywY7a{V#E?A&+nlRS2W778DD$k zvF{JyxBQbBR`?Wo%6lSHa$Bfnpam&SPW8gdL^gNll#{&%0kgyuWi$FgB?89NCq~qR z!f`}W3PRYIxU(d=uyp*x9~(+J!|raiDhXyL!fCkPy+QzF6N7b948M<S7YXZLTLIsA z^g)U#E?8R4b={L7Fm<K2qjz`qwc2OuAfD>D9pHmK&sy!{Uyi8quw{q6$CcA*K**er z9nC#NIN%L?rP;$v=Q*rpGlhn^aYl}O$BzUB{SKr{A8euU#U@w_P6E~`+uD7aj;Pn8 zZVBn3`6vJ(2z2k;n;EPX{^1L$u6riADZ&)NbAN5>DPkD>g&s9Zd#0a!G$icHYgs!# z78qS${@VI7!jj=Atcd90J;)!+<#XGw33{<N)OJS?dV!jZzoJO6qpZ9|$8dGj|U zbZ0hO*a_1{EM;iM>qS?iz^{1J4v;&_e|y?`OP?u{8MjCfqKPBoX_lL4X*!!`4i6&< z`0Ij-oxz(zx+<TOB;t`f3?W$i62=81g7vJ{dbB)*$m|y-DKEV+VM8X}P=It@`t_A5 zXGCB6{u_J4=kg8bxzk?f#@opS->})?m*5Dbc#Fo$Ojg8@g^wmXI}xNT_+Me&CJs>& z2>(2#S_s|{PaKg+f0XF_XJk@;6)${=ztUz=w(hZE(`&QSfG$k=&w47uLf}gdQ`<^} zAD)rWePBWAbh*JBE>=%cTs0S=CuhCOlJ0MMR3+YEr$dLEm|pbf_qaO8k2D=rxCXx= zPRGqDy>mtu-S2jr#o%Y?)v9v=@m$2*y#T;`Ku@=~h<1LG<4x;)gCGraLP$RveM6uX zbU#vcqnK_!hDSj$lBdJ4IeCvJMXH_SpQq;+PxwShSI1d8CU~74^GUY*HfC8pUO$zx zi9VRFBEVB>wI-?v-J~9$tSpXr$|Qc+z%-z_iYMe6yRS<;3`J!TO|D1a5rz=0{R~-v zgCchSNWCChO!X9qD?h*wSF{!oB8S!3dMwp^kiIsAb<bgIk7PIfQK9l%UUJSnl;Kz0 zHc`Cy6Oj)YZ;K@IdB0~mdd)$aE>oaIDoXT-vW6%ls{Pp5Kos_5E#C)8)!$$|W1DtP zd?RtVbYoA(+hW_47iQJnT76d`wgWg6l5|};uZ4@I&Wk(;qO`PHd2IwV+5`3ER^VDX z=w+iH`1eR=KMrpz@ubO4w&hpZ2x+w-x}F6V3lU}I(Wf3*a2QdMSFIDIz-&<S!}?)4 z(HvHF+aE$d-lB8H>efCwam61!M|?OW(x29rSzP7l@h8JVLJz53EzuWoQlZOr7D{kn z5<F?{(*k^m#1Rs7_jtLkh#vPdrN0$8xl_iz=b89A;|CpEbZ{W+9}6%-yySI)8>X&; zy_T(MD#MmKggM{y$V-I}Ne57Z8wltdX5Y|8uqMHI!T@Ho&bc3n|IT8Rdh;_V<ztse zM8!wPl#aZj$Lt!VY%oqKu(q+B^yIiUW-s#9Zy_*Kg5a+L@@xB)6*U&mv9wXY-KFv@ zPNvO4&$LN^Kn1~Or%C<_t&Vh`d+da+M$d2VtA~<phkaj5GeUeEGMy2?X?DrfrO%=S z`+bB{NVzAf^3|d2rU-pxF1HHp+TW@2g##XNb?uu4(ku53({RTI!7SnR;wwYFLVjr6 z3aBKphPZK?@O&9+j}zv880Iv*osBi*={>G+=(;TEs+D$=*J!#`B23XVGk$c_PUR2F zPS(kMJ~Use!BzFMuuN4FRn4hd0zv6gYj|b+lk9g()dm8`a4&PW2lX~<ShiXvK*Lvk zJH9e?ZCRuk8l6Qt5j-IHpD01*kUB|f8ecvp!!lj?c0%|+ffN=X`H2@Zb_0ZxzeTca zI)@H6M7X>Z*NfRjWq&SWal**=l3K%HMvH$JRpBgytajOMDG6!wZCz&TgDP}gkw~nC z$XTo$*OF%R57b$%uTsB+P`ymtF{{<L@~_5^bj_ctS`3Jnl))>S3EsLfEzD^dOTX-P z&B!f3K{OQAf=v>4rOD2X#9QX*BHGwii`7skMslQ`>58RNGrCDO3ST__bUtRl-lSwk z75mV8PvM3}wIv~AOWjHi%-}$NZ9H}<>T^h?J5Nar%#7U>>*SHl>hGDWT}cF^Fp3cC zp&%#rkdP&MkuH+(T5F5JQq^W)MgGQ_+qr8*WhodB$?#an%4r=D`vrSf*71Q~PwYes zLhESXn6&B9ez<QTtFyG}B3L9vS_yrMed0+h<e0+1E-8ecXddCtYQ6<NILzUlK#ZwR z#2CS`OI0{nXCq0X1#Vyp0_N7>B>VtOZr7wR{|{#>cP%(ji#ogEsjKG`TlFq+4}z5= zs|qYlxs15s6wK)g_`$uQGLvf<RuJn#oB1PmPyse!*j^yx8s!@BJ{eQ}XL&Y3b&Za# z2>onOR39`=HoV)7T6HJg^Hln%Q6HIwIQ-69J>gq#U!O~ZvgKS0oyYDzq25|)()!CB z+-#W>x~+bRYcDfNo;?c}!+fHJU2{f_J6~zjAhg)AiMx$``RU4HCZc0VcDknK$R04` zMXjMW?X|(S!llZ{Sa{xo@F?A1{FCD#=O-#qH6Y-hNeyDP0{hO5yfpX;M6PNn-TQbq zUKv}UA=5C@t7CwQ-71oj(km(GE<?A1E!%M<QBRRmVJ<;T?+6jzdIndwEOF>nrapOh zsTb~qFd=EC4j|yMkH!+|bVNjjJaLRZp6nCQkgb}@kfh69rP@w^3OT33?)B5!$*8_u zmH0uEX9W^oDeXmVh!jr3uVPpOnIC5`DRmu5FsUVf!q%{>fH<^{LEuxUq{fU^3~N%s z7d^%*1tSxzeNdVe*-<Ec1&#ky?p5VP;Bj0rwX%<SwEz7rqFe&70b4l5GJew%NcL?J z@3B;PQ@8u@yWa$A&gg8~Qh@i?zxT___}+1vXQH*XHz#Q;?LR#wKf6kI+ZnlwZ23Y< zw=S%IS3JnNurq4nPmC&C&cD4i?2cjzzI1qvX+*W*hS9~`GZ{21nmVeXNc8;rrMAdO z3$Dm2Ib(*GXJq2A(1&}blm{@;4_Nj284`r^iU~py+&+&)1ILwW8^ktP*oXz(kIC@R ziHI$t@fgm#E=jU@pkHj4?*YdF#?Hs<MGAj;#XSW%PsFln$Zas=Z%5Eh4=N36xaHZ> z>86Oh<#5RDG0;Cc=TK^67_T<>p42LnikDN3*_P#5?dt9UwcuZd*Y3P2w@?a+w>L&F z3ej$LE1e}pL_bo6(@GaKS;C;!jR5){Ouqu)wfc!3k+v)l$cxOB`syV|j0UvCJ1_8z zy~R+ts_o#`^#*}c;4P{|R@joKP<+hL1e6z{aITq)FWiRm?eZ#uH&g`PE26d#n2BtX z^?8TAyUPvb$Z>w3XDTtko7=T+$yl1@^|XNH-eX)H=Nr#%U>280Y3}T~CZF2{;K627 zh8;9=TDJ#Y?qN)e+yftBA>D=GAJ%kU$wL_6MI?d)p2VKn2K?+cJKN;o1{Y;5faC+w zxbSZ>&*ilgb;Ifb{U%`VWA7+p*Afipk!nH9f5irt05v9zF+?LX|2<;NSHwem%E;CF zs|O>^t26UK`I5C>|Hc0LTVvRgbEfd7p7B!eV;r}d+T7&8>xIh=*DUo5J1<RvUh6YP zw-VpD6A<XUT25oJTubB3Up-=BAv-Kt;9twj!3)n8hmmafeDGV<R>3Ri3^$1Fq3U>F z3Sw*?_D0LhIh<E3T086BU^S^Ihm`vPbx2>qWwt*%lxzY8f=i6b>J&m|gY+e|CoHlj z`l2Dy(98lUYr^(bA_I5K?)`E~Q@y-mozMJ5z%zC{%_#|Hz#z0fe70!}OWScbS=|-< zXD32S^DovP7@8Pa`GQ6;m@b<zk8K+1yVVySqFBZR=T|S@wlFnq-lCV=EtL~42rFaY zEMBaZ_Q_r8O^)KxN=HNjrvINVVU=hv-0?zijAFL<a|FN&2_FgiVS^X4mu}aDRV>y* z`*j*Yn?EG9-nITzo@yl=xi=I(lG3VwLA;{K06*P5=3~Lfj*H;QjPmQhul|8LOi?~g z9p4_9a)3zyqyar$8njelGMZF*ZzR<_1nTsNtd=xN0VrPmV7RkOM{O_6$(o&uD(9?i zzx1b)NleFBP=n9aOPo!#_jDcAY%ihHQZ-GoE;>bl`8*oA1@;@-KurCQlJ`doyU*TI z<=YPMpRLRV>m*4(LrUsD696Q1`BXi%A+U|z7F&y<@uzfMm}1ZF{<BE1%UsSI6iN&v zG%#MUt|+KuNL9EwV4Ow;OUc8{o-$km71pr!=xErL<d76$J+<0a*vTN%xv+`dG}#9G zLl(X2cz<{~#&A(J@<zsXRiq~rF+qFx)4tHOqB`L%$CeGNRQ>zR4e1t)s$A2b+`8I3 zX|fL4^}p)KU~ni><2{Ti&pdgLei&H-P$NYDQozyXV%*?TY+@Bk?)snZ)<qWOYieQ= zfWyNGvu54jFgG;tBu2F3`FCsxo@R?ytSo%7MlwZ@S;%pefB|15_F8k$i7)izu{~O+ z^1DQ>6tm6JZ;k7i0-z36!Pq3dFJ;1fgS?w~K^?MZgq~$AaKgIH&}<i$P`M1<iN0!o zRBO(_HLZZ!U<4dk;{8aAPf+AFGcj2M-t`@9aR&!Q$w9>4yM9;%1Szn`I@@gKY(26y zilc=XY%Z(0Uq1}GwU0L@8kJJZ2q2VZmzb?GN==N3DshxQC6c!0j}fP`?_g^)ll!*{ z9$H~;G2fPR`WQSG<-AB4Su#XeT%|ko-yS!kqSLG9xLA28Bwy$U>{z{rF>E2GL>mJe zLTG*i{&!#IRerr*+qWHl`)Z|?bY|_5K~5QwZBd$&oQVF^2mI9bLfB?;L`UE;N#}<4 z3C)g-M}$qhatT6Gg~+-{K`2TSsug8+sauC?)I%ul5=e)8|Ff3xqx8OhlN~iuA3EbW ziZ*F49g*-3!C~fD@YT<P_rxnQp%8~FHC9e3#F_WjjKHjrPMY{DaA$&JD%PNsX@dgp zrYT8G2dApxBN6um(|I@xYbl>3HD6041F*rR3axWM`)`!MijA;K!c~Iv`QlGwS_5v! zD1+NEtEoS}D}v87A(F7Y)kMy*R7Nf^%ARzkwXEZR7S$w~K#43aBJEr*>1#8TIYM*J zOmOiJN*=dAH5kUDzc2#N9=-M#rFl~M|FpxsQtGOE4%$7VJ%z9{;~9xh1obr{t^FM5 ztWiP~!EN`&|EfqWo8piJGqKg@&wf8wAi8rNTHp7~qU+eMt#K?xs;-5#N}Barh~sh0 zL`m4qLOai|OsF|Kvj@M@>FQ?KZ;p<)>$_6_&~=AFC*QUmD*RC{Ev<f((?x_tTL%bM z2-fmSp=TtPh$I*o94iy$(*uG*4O-eq6n(xDURVm5Z48X_pUQmn#>PtJnnwVonmwcu z2hD8OsP-FXLbAHwhO!r;imjs9JC5K`6lirbai9`*oBfq7Nh{DT`D{uDga~Y$U0?9{ z;q9haL0@E9K1tF{D5@PZH47;5yyxXOvB)4Kop7AyhZ{&LtXG{}RiQQ)$@nG2`Qrv_ z#+m7_*N=1pir^k9wTbD75?<3D07uk3o!LYMD(ho#)APJ@mgY8=sub?bAhV(%lTiU2 zDnn<zQ|ZK7t7x{SZE@Xb<?&6VCtg1=^$v<FtmE{?jwET(Ze70(o2!U`ww{kh;7@zQ zxWK{eU&CMa)!T&M)HdF_@hD7r6*mrydwohN23@Sf!W?iuS<O%^&q@<emmxm5i6-BZ zCP8w+j20BN#C*>L`h639W}Et6k<yg-zf>SL3<DFb!-OO()pi&FHy!;1k^(Q=6ZMYR z+*TAYSQlc!DC3A8i*oM<lJAI2#E}F*z9$m}AB6EksbH{NDBdwVE=x8T-XEi&?@BDs z<2}d7i&@YI>KjsgA5a)c)$F0*H@{pkeC|8)nOV?ak-?C{m)H8MTIanRD8FNF?N{t~ zHR!OKy29lR%I^lW@2I?-8TGCP@m(Y7ydLd;a{pW1|2D&aN9{k)@c;3<_pD_#_?lSI SI`04dIgyi6maG;x4gG)0@N7c> literal 9389 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 CQdv3x diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png index 3349b79749e5aab797643be8dbece778ff521702..50f94e552475996dafb067a174808db3a2836562 100644 GIT binary patch literal 4746 zcmeHK_ct33_f8@dZBe6CwNzqMC1!20SB+|m_!vda)E29VQL~5|HR^-dyGG5RwRf$G zQF{cj_h=Qb_lNhd_<n!5_dMs`=R7~$bI)_`{h+I(cAJ`&8UO&?)=*b|2><|DuCWm% z#dWqsX_x^3U>cN?lCHgynv%1Fv)d~d3rlM?YbR?rl;uk`MF2noi`6%^W7B6u{EM%8 z0v!w{<mboJTt59&?eKCWWQufYUFA5#pWslf5Zk*on~vfZS^k@gdW>LHpldB$NLaWs zZsmFOwq!dBmR+rz4G!i#8~&q~^^=)u6E9NLm{4#3t$*hCYTB;<+8lak?q+N~zj4wW z7l@y=47M`5RMoxO(IMsDiW$C*8HPQHN#sl92Hsz8Yo6NP<>;E5IH^0mvfV7xRRc!M zhEA4B^l>g(11_05znTVu70!F8Cf=M;bx1p;aV*id*8q?#8MJ#}hd##%N0_Pb^A<;6 zc1%aySc9Axfp4JqrekED7Jhlm*{{+oR+6d%8T}S~9#E??Yu_;){QP5;Ack?Cto|gK z&n;;&oDQc?oN<pRhoh=G>8`BtD5`x3z_hU`)Qx%{(P63Y+r&n4FDe!vX?apW_-soz zAMEYXD%01sqx`o<$SjT8!~bR4tyS8GfQ2PKScT6i<Y9$2iZ7xci?kE#K8QH0U%hJs z!tB6oQBo7bl6f|f3j8}!%LjK13J@L0qKst43o}?9V;7ff*z2@g?mdDYe~<roBGW%p zF2zeS-(-#E5-_OQSL_Ku*6`%gnbo=nd|aC8(VkA|1LB%-tSh<+><QZ@hz_O{Y_EK4 z$h$2jL30M>SPoj0pRsvP0W~YhE{l|BmvuI_ur=TI`1d8CPVeny&n9U^P%-}svNv4Z zwri&kX}abA&aT8`n99ZlLJ-mr(1;H{W8+L93f_B^!x7KZ`^qZXYDDT8&C~8APPEk_ zeuVH22ziMUk7|k{c`0;V+FGS7R1bAN!->;P4owc(_a#m^y_Ui_A)^{q4RDR)=yi9f zE$dsDd(RXh-EHWq&1`L=!fZ|4=+@;8f3kqhX@k0_o1#Aqs4)%B#vN*hvN~3XJea<N zMO9ArKTi$*fY|#17`%5Qr7eZ=U*c)6T)chnX*@f3!15dsu{emvx#3*r1A9yt;BIDa zX0GgLoZ4H$yIoQHo${PY>Qz+oiy54v(IiZU*D6%Dt-Z}k^ErtrEQHEJz{gX(gaONJ z+DOq|;cQicDGg*ULT@>hR*f&p>8U1B@c88~?~0J=I4y@jH017ahB`L-glr$@d-`k2 zPL&6Bq4ynR$lv&x`H3PJ<=R|=@6AVjf3dYsa9jV{PqP$_O0TX--H2@OB`&|AE*Ivz zduyd7lXtU$)W|lHPg9d@w*si}6_#jo*0{W2o_?2SjmA+({N<58HL8`QT_`0RKDX-^ z3$$JSwhJgl<a?jI^ycY!GY^s&3vO>kK4%>&Vc$G9_IBc$15EmTdwq3&;e$COBg_Np zGq1?5xV&$6T8{T$8-#?lp@xmNHh}LMQv!hDC;<2x0k4DgIsgDrCg^_^AWJ6M|1iMl zzs*}|8`th~`%pt!LC+hwoqp3rZ|q+8l{l>;JqQc})7@gc#Te0(Be5<hsvynCq`+t& z#96DQ-bs@)hJw~U$fc&v_8>gwHGH5J7f8Mpm{dU9Cau>FfzrJOD$$bx=_xgwns>|Y ze{F>RveS`23()f1U7p#UIiIe&x)}5t{AS3MSbMQbVLqaIKh)M$$<W=N<2Q}@-yxXc z_-)tTCUyFHK5*&z>#y6hY7WqoO2OQ4?4-`!_hj28Zo>IbV9iz*^Hd8_7h+<zWczi7 zDROrrA_YxFE)rU>8ZE4Q?ui#|7fk9h6>KLHpXC*R=J)AYZZl8S1do*qlnPk}+6=I5 zocDjN%=TtF5Mavw0T(&Z0JkXW=`#KaIaOU~^%WF>(UCO(qY_xUSb}xB#YKVkj$K^R zi`zUw6@rFT%`RX75NMOBr!NVz5zr=UYri9S{?4JKr(>FYcX7~wD#B?T2m`eZ5MZxM zh-Qm<oVl1rkVTLMi~EwZI!2Ci=xVC1e%iiVOiqsdzL-NxrDZoABV$NP3Ja8*J6pfR zpoYCe7Ag;_C`O#M)J}W}f4V)w-Dwd}0WP?4(h(hW)t=JhJN%*}@3EuCh+9YKX=nHq zE0&%r6`{S4eRHxi8};cEW2sTiv-eU%g*u@&OC2A)Pkz~s;L&UOG9Ke9AUReL&@<mX zYKMKA$WuD<^D<$2q~@2lHXQC#Nd*gkGxQr%|Lum0AiKn?jSuF%@mwsTc60`1ChHKm z(bw#3P!zL3mt);**pS@S%%OQ%9Dqs!{NAM)U~qnNxg1-@XjENqa=E1P+cN{-<e$ei z@J(3-Xid+TCcVb@2%nPhPbi5_hWJd4W&SSH%-v9?P!_0$qlQ$Lyy~z~Z(b4RpqGb5 z&R>S_$rIE28{V+kv@uh!+0dgS_oMaEf|z*Wmvwe=5G|uZkIiuwaVL}X6?_8Ne+&FR zEyPL54IZCTGga$h>Sdk@f!DHwEInf3x-afH)U~LmdnVe}<vg~a;E)#<u8mH?zx`55 zKvybX4N97_2Xu5|zS|CEbcRqdRM=0z@12}%zs2`kTU%!}HL>CGc!_{Z8S<{%VY?Hs zpfFqXb6nUrXWSu=-2TLalnJu{Q;MHf(1CtV2t>$x&)l{IPJ3_Z-n;F&Z}*=Vl<rCO zp*;rEBva%95UN<#6@0Kg)FqvMkBQ|sd2M!%#W4w3f)p^EZ2-cI#kLN(fNwq4K~Kc) z8VqIld$mUDFj>55^LCi7X9`H&1FO=qgf>6Ng({uXz9ZngBxptQWw1hIyPdmgmo%F5 ze=2;gG(}byzu=vvHgR8m-%8jygTY_NI;Eu~X`3bQ@K2n4b@(NWGi_~c^(Mxt4J+gb zR>IvJr6P%r=(WL4mV5pa7!ljSjx42&wQbWmU(EW?Jnyr`a9J?{!wSG?!SmC}ll^Y? z<<=YQ?qKHwVsB4R&)(z^6Mek_<r!u4SY^%=v+P;+fpXGbjbE0#;V(0E-zHsIOq04W zp||<W)x}zcONUJ|2>%#8a?E48|1WX>%;y~GZJ(hjNKjeFzm$>Or(#@T=3F0ob?3B7 zf<LVaaCJd?RS?!w8`m?lUsF}O+fDmG$!Yviq4!FpuEz%71Tq{2U2?SSj_IthXxB9| ziuAwuV?peR<AuXd;9=X-b(W;ztQ0ZF)KSx)5qXdDO}{L6fAnR`KK45t5FeZV{`Wvr z=9ut`#NCEVP2C{6$0sDXZV-w#giSbt>_g>ahd$U<b7q^fODtTQ8_7sWsKTld_Ab~* zJ5+<Al^NbL*z3xaoQ8#%96#LR6Z9jvK=ZUb4Bo#FuGkAD*I}gpDFgNuIpLHOU>_1l z#s2HtW!^#7+*TQ^R*5?1o{?Nlj=*k)ChmT5j~V!tfTa;vfk=x?-^m}|({;bISUezl zl`To{Jj$!kOd`8M<L+658l~t@7C426MMO}_T%IitdTK8rP9`nmuMne!ht>w=udzF` zjg}`{zjS2z{Py?vC%;<XY<!KtQHq;5f-*o5)BB$_DE!X1SAI3|@uk|M=4P7Fi8~>4 z3zo^BOyK4HtoMGS_Psig$$G84&AKsFwu6e~tFg+E4LQd+t?~20$eU5FSz6h!%E@}e zPmH+M_3Ssqt^U?CIW75<Ifs!S&t`s}-u<jZVyMQfsodx`>LD)KAULa>W~F%Ej=(>1 z+a4YqxX6=F_Uq}1zJ1Kk@19Mg&1nC-D=oI*xR?@g_(No@COjmBL)v%;lNs0YRJG-m z`3!{PDNo|M+ki)aK<28@)8q>Y1oY@@3OU$2rf*XCzC@`COE#CV>%Z`DwfY7Z$LTs1 zJ$Gq`f11hTUN{QckvJUw4ymdc>XmL(U0$49PS-j<>=dQV{xBQ$)7qrU2HX8T^$8#U zl>W%#+kpwY<f5!q*{mU7(UNCnW{|?vg!B0Lcsge0iQ!_y3~)5V9wW;@^7U3^A#^g_ z^&hfsM81W}EhHDw3KeLsJjA{Tz*=of)hez3I#jRcd2#SKovnQB*<e;_b!kJ`>$<Kt z+mSUSjJ<Qm(N-9P+F_>Ym&$~0gXAJdg+tgJ2yLV~sAtuHYHOs?R9A0ldUu#czd2D} zo<mIZLgnWCzB|xq=cVa*xH_O?wSwR@qTl0LsroGCQS8fbWDur%k!A;V!QR>160pn7 zI@EJ7i#j@leFiyuc&zYWJE0v?!(Sm?4(pxkaNOW2r)Lhm;)KnuD8)FdU*;hYbu{ZA zS1ktiKQ@1VFWY#+fwtw2-_>rD!};d?(Z%Ws{}f5{(=yl1gho4ix`|&Z3#JM>@+1Jh zX|I(LxL8>$?P%20+&y<@s2;pHsD-G-EbJ||>o7lSlx!#sNR=@d1y`!_3Vc7yX1Mr~ z`n3PE$g9zhk&_v+zIz)b<x)9%C=_b2aBTdGvHjg;VJZ^_u$9a|%8Jg4f8pX5n*Oby z`SYthj*%}oS&jYm7YB<-g)e!K#08Te>JLc_u5JhLrGA7DflI5wRQux?(RH9K{!>*` zgIrmg4`0SC=j={KOTK9)0eSiUcagy2$J6I%zgrRPfkcAZY<NzxXJ{@QYen!m-Ni2B zyGJVfS7c)6&I-MdX7PdAFu`H{0#%yb@8@MA(i4roOML6+#oZ)FvfZXbnuk85M?7oU z9~P6%{PBO9j(Hzoir3K{5qDxl(tQ(nm8Q3?Rcolz=JGS!vJRcNwNr`F>UjGxi#;}t z3;~mRy7F%)skvRLmVKWdvmpHH8!6{C7E&LX>*wcB9gMF3!0byrVS32)U|SethUU@J zZ)wtQ`*TzpU^$AJb@j^Kj9N9#{qCVn42xU{4GAM43AR^7n&fAtRwA691q;}kma?_d z4P)}^3jbbxXy4IEn3Pt|gLLVfk#M6A5k=H7)Y+@AX4(wHZ{kdSa0#js7E-Lps3Kja z-XA1hJb6x8hX*ViEkY$q6$B`8HZx!5p6?T#I(xK~{ZQYq3=03M$^L7&WZ4|gUP!6d z_wmp8Zg<kS@Y>3GL{!7LnivUfQA-5KT3x1{BcNV2QgM#mF%JfZcN3Krck>N^KjCr4 zCP$M=^hNmo#`#&q1qM0q@geFD)u(j;>%OkZ-@HCIWN=`OClbH;PVkQ=%u8Qd9MJ&z z*oA=Hxo^x9Qk1DN_h=zha?<FMX%6m3+ipywv=*z=g}d>JgSKYM@PNFpxKHqmsP)5J zu3~Pj)ow{2cOxfZ;Y=o_%Zc&GOP0Y!c4Q~$8Po<Ad`P0eH%>v2KU0w9vt=g-%F-WF zOGk2o=#UfKYl`qBrht&YZimmS?U~s^abd@*Ev=10XcQfV=NiK{>mejxfWA;8aEO@R zV|y^}Kxe`o)CD!)4`8y>N;^^kL3I-XxgZbX2NF$6n;ybK4$YGFOgh)92{QPu*EC64 zq(aL3;%XX5tSSg<o+e+@!czW$DHcFA;{vwIzKI2^2ZDdlWwxX&J}bXI5ETPK?Kbk) z%xD047mJY;H;_KFrQ-HAp9LZxBovkuqY((^6?7oG=5|r)nn!2lS<-U=sc%gKsA2<! sK#VMwcIzqEqM&xM|CjkcFq^9zN&B$Lz{hEQ|9t~BRCJWf6wTlN2Z`Xt(EtDd literal 3767 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 bMmfHU^=3Wmfw2|+^MORdQFrTg9H0IN8DiI{ diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png index 60aa6368644a4a1ff721ee4e1a7e72828c9de24a..d1975275fe3bf686e1a713cc0281811d4c7b127d 100644 GIT binary patch literal 3751 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 B$7=up literal 2747 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 ZZRwS=XOWFaP}QGLq>ZJ$MY)+L?Y|8trOf~U diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png index 0c629c05804280bf0134edeb1a248bc063b41c6d..d3164df7e5504836e248d200ea0ed3a288dc98de 100644 GIT binary patch literal 3714 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 U;!OP~|FnPB7Ix+}rd|pE0hTMe82|tP literal 2693 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png index e2b4f684a6785cf85556ccd54f2dd37ff480922b..cc0a3e73c56488f462a42d979ee8d619e8d9b657 100644 GIT binary patch literal 5432 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 literal 4427 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 PIn>b8hTp?!K79H=L?$I= diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png index f06ddd4556fcb42acfb2706539836c26005f93b0..a7a1b667cb78b8074db141d4d1389ba2b8629f2e 100644 GIT binary patch literal 3708 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 aaY1vlit#jh|MkBgKPwA6^S7p+cm4xpkD<^2 literal 2618 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png index 0c12beb31fe43eb95f57dbb720775644c10379af..8cf24f4e74b701ee6c45262f903ddeff22683f59 100644 GIT binary patch literal 7197 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 e{|9>`<9~c{Zvla%KN!=0V!}T4fLH-uxdQDFS%_ literal 6140 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png index d62c86ed15f9c92a058ee54ed957ac437455b064..aab2f59cbe7c051ad42823f8b16cfad4552fd5d3 100644 GIT binary patch literal 4400 zcmeHK_dDE8*Z=P7M34jtQKEMeU09u4v}o%NQ6gBYMoW-g)+54wBSej;iJp}Zt9POk zB~~vh>at?h=)3Rchv%Poujhv|*JtL;x#rBAGoLf_&qFgqW=1YX005Yc{?fAq0FV|1 z`_j`=TB!EG-vB^;6|SrM&`Z})*U#H8!0OqPr*4LBzHR~Vr<R5~0HBhPVB_F%+vWx& zs{tb^G#rI3E>6BmQcSJ(wj6skizm5ZeCDN6ysNd7`nMNy;3D!X7lm+f$PI1Qj?$%+ zC9-{o=p9e=uQ=(C)ek>XM~R(`o*91l!O1{qkjFHo)O)oI&Y!Ml6T>$a19ujglIo@G z(-(!oQe0o8*T$DIz3W|FYC#>yQD)?*wB(yKi8K)q_ey8m>@OmJ&*IeYx??ho@a3T) zD0U%wx?E*IVA%~Iv3FNFps2Oa`xvHNP8hoGduQ`6U;9=A*xt-#*{vGMe0wj}Nnc9r zQ#`3_E|zXX@V6Z`UEuEA8+FCf&*B1u`u$4i_hy3QEm7wYwfYNQU2{?9i5NNL4IEYd z?+l56^q(=Tc{Z!_L9rDwa7;HV*{uQ2uqOyOG&M&DFz!LRp4z-@zKstm`=mV9E?I)j zgt6kHLV`Qg2YPn&E^6*NWitkcTV`KbXW<2wmL;Ss!;S@cD^1}Nv4aV=9!kCYu_yKG z9PVJ`jx-FeHZ`hR<o>U=)K1*WJ{z<I(q&tgo1t^*Bwcr-M_A*vWA>GxKDpqFqqFC> zIhpj!$*P=8T=BxP(3(A+z6jeI(Lz?I+MtNU<@r9-xs(A=URxg5+QSsSlwXe_UF`1? z`n5V<g>JLUIbYXH;%9*)?41ir7`gBsAMiyUA5JEgwsD=}rzD`x+LP2rz>mr46q5ya zM?ZBEJ!}M<uY`wspo2#l+@A?z?;6P(B}bjy7D!o@yLG34KUuWj$~E3~Ozpu{#oly* zK-YtYF>EME&@xXst~n0>Lc50qbA7i|J<|OkPnmUkWO~GFAZ^OmQ4Q&98`oq2&1;$r z+zb+ead}Dy_03{)0!GN4P8(B|P8-U0S4ec>R1t(ZXq_TKVF=2IZ1l75GCa^QbA=R1 z+ju|06nuQ72t5Py4Fbr9kS2N<t^LL7aldA=SO0M`pGd^Y;wt3laA00Qo<9!N=ddIb z;1uBG&li|y=!p#_DtPTw6nte|hi6#K=jqr@ORI~yMr(9_>vT0X$FskF#qdNn?71@f zdIG0I6K!v$pDP+!j^Zo}-1aTUO#algHb|!xMHH_P<*CekS6&GkY2Ffu_Gt=x_3Nnk zdAPC0Y(->G;GVZSjSIpFp#Zs|+4(H$7A~&UVtWr8uvs;DbvYiMQ(g0Z>)&tvt1B*y z755}KuB^4^ixC>}O}EF2uhwLEtO1oT@2Pb98IdkI=R%9z0`q89E=2Di+tsSFER|D@ zo_h=`p<pX5M4%i}9P-;TM6}BV2UeMg`qp7<&NYJOBOKX>_zEuq(})&F^7&;L@_-79 z1M2h1RAk{0rtYVcgA{^Lar@iI-P9D2pkR6c6axpSDF{RnE{XsEI3N7q5s+3s)qgSI z`$u`GW_T3<u4EeNX<LVYe$6v@Tlezx?zQdtm<8e(ShLU!53fLVqw0yQ9xC9%Q2~$+ zSi-+l+>(LaR-a1xGd=rXHzeeuOMm`5=RC|GcteLKS_su}Wlh1^H|tyBIbUPeLbnou z2ONI_VQB6>9~nN6zc^?P9eHyyiDBRd)AR3MV@wTWNX*nV06^67T3AewN_K{@SK!oO z_j!geajv;iQw<{E_(|V3{e|T3w5jE-=!L7%6uST>J$1Czl1ANee{%NPj|RlcGF~gw zfm8{e+KbOIb!*!TfmNqHocovoU7;G22h%<lu>e@MqFp`{w9fH3rEOIzrS%^_V`lS{ z8DFkk=9Ls7nR`&E!=-idic?BgA7kxz%S4JnX1n|&D)r<%;ozs9nrXWSe0jDmTMyVr z%62Wx&t;dNuMM!P`Y(6IO)H+g0>HeHl`z!(7dxqg8M4O2#g@2Nk6RH93Vw@^hbPpD zk1%M<)$k9kdqke|RnK9YO>7CKLT~P}Vk1aJ@j~9y$^Iu~mlrl(Y)bY1rjqx&Z1qsf zT0fjjnuHBw$jG^nva;<}9yK9VRn=?U+>#DW&(lgv+n<anz2Vi6c(F78cDBaL7!Cd0 zyoS&RKunRSTT4Tk@<kQ}1_4X$k)lcsp$G1dzPjjtJx5;b^;Y@eAfa~3v#!2FsWpR> zw21X_&-?jf*C2bmuxFX1XZXdIChO9NC!42xE4@X=88Z7FbbNhV6KJ=YDz^YK=@R9h zF5@7f@$z?S=)rm>QptOobr)jJs>P3pM3wdQByfM<)@@Vrnv}YLmMMS*4c|yXbs}QB zdVAx-6W+X$3BuKQO%1e1QmuVs(UdwwI_d$DyEF(;$nKJML(pb2UfCxstkEP}<!=6j zIpkFD(AwO5Vz$;t^6uTcAR?~mg?X`Qmb=;UgA5tzZ!s(^A(|)sQRghHBN&dpw%VQa zrqCBf-C3Hc{%xnxsWRsa4cnT~;=!%9FX@j*;C_VXW!HGDLjIzzbHE;OEBp3s&tTl9 zzBsr;i%YU}W3Hyv*Vli1!241obp?AX>xD>3NqHQn>{Sm#p79?)hOX&^hqoSXj`tpu z2GS&pOfv7?3p?~sMV?i=!eE2ZOq{MGxf<?y9MX1ulv&9014?dpa_-XP51$=oq5W{J zRn8q?)qvGl1@Gz6>T&|os@UXhy0rZO3Pj~f3I95_)+j}!)qHY%L(yyUo!@%c(N=$F zG}9U-!mY<qd>8&(>NBJf*+Sed=~@P>D4OGQa^?!GFJ52%`<KQ=W!V1hP>r?V%_B$I znV+hcmm`Z&$yf#P`m&@v^Bgss-#ZJEPkY~_5vD5QavPza?G*V@x!AwOdR5^+gv7<f zc2#NWW*URN#O-U#5v0?N{qM@SzEX<<L=!&#p>obqD3$%f{pZ^rjun>O;nEWdT@jS~ zxS*dDAAe;N*VcypY;U_YRUvye&yAX^^^wOU3md1uvs%@TqBUxI{tJ9k>pkN#`6-B_ zG|Tbgrh3S;cF3aW+1!h{A9VvwnnY1z;%Ql^D&&qMX_tV@nsN3<lyA>g4a#$yBqgSQ ze_M(d+q@**zqk7xv?$Vf_NiCdcU~p*Xu{SM35BMYJGHgyfo=}?hxr82mU!iN*jrjA z<276A{Ye+6I<i8cbEA9)Vg5z+ai$%=4sL^}b*{_FYcc=Fs>CdFcRV_jS(}+QM|`sw zSL!ocz2}e<9~&!I($V{dN1jNSFw#K&4j<o&<3g<sq{$QM$QgkULtk9IbWE$dSYY_k z+tB;R55A~Ng^11cVuVlW`UBRxZW*2WOI{Cej0$)Ew4rcfJt>ZfP$3r;7QQ=D(hzP5 zCZso<*|j20ld>c>{a??^-4{T$2eQe5@GVt%W_3Svg&V=Oh4Qsa`e9_n_81nv_t(hC z2Wb*Ve<##A5J`$#*d))IPgxo0sV_1KS&HcoZ1@&rKIWClYm%kaCViQob;YuY3>^)4 zN6|75i5KTG#x#bW^KALQo|QSjgK9rulVd0#L|mR7r7&C<dFO~fvnesl8G=_j-YBy{ zr)R3d0guYf^vq0gc1fs0V(^$F%(4-RcR;HlPAc&U?a@A50c=GAh3k?vt1T8$Lozfh zjH}BHah8z1v3L_I|BW7=WpbvIFHUkzk|W&M=t<rR`TelV3*w^Br1D&ypWouy7P?}{ zE}tCUts%4N&oRY8{Nom9?2llHmZcBJAB9Ck&cX_{iwP($R9RWsM_W-*^IY%AkB0)W zjyZ?4`5c=N!sO?a_ljQcAFX`Uk3;y-XpW*A#QkcL6>}w<)6h0bCCzZAAFdngJo|M+ zHty?F%ZAdcnChebCa2-_;au)KdHH*5+hv$1bj~?y!6p&GwdllSB2M;9g~GJ;FS{Wu zYbp~4u*x$ktqNL#iJfxGQgTv~Gw%T(m|i_1Qmlo}6sFYC=8%sOYGF6<>%fl{#2_w@ zrq+94EwaB7lo#b}qk>yTn>M=>?>_D6n{NpGZuc|kjxIu8Yh-`n>D<Y!>#KFwVg2O{ z7(HU@7byC@$?3SYk=TJ4|Ll>stRV|;S}>d-v@(7L{-gQp;ccvO6{d=6R-*hDiibqj zi)eDWIN7@wK|%!9*hQIFgb<`Eh3x%%H+>9Sf;fIHGzJsgdADpfD5WFBNr~{jvG&pY z@519a^qK}WtC(ZHUIep2TiL<>zKJu(M7g8bsNy|xaMeQH@xUZuuE=(|fPc5*ds~WZ znC#<d0W+T?tcs?r<`PMZe0J!?U5IR`Q*UGBoUMr29NJ$0p4G~vaHgJ}B)+Y3dEWh$ znl)sPhF2ONJw4Lb*XQ!hJZsEKoxD3f#nmI+zeZ;(biN2ja#e0>p!B2jc5dEcf8=_S z)AqumikSO$b$XP@jIBIqQ{yo^fwwW<H$&zygQ(}(#4Lc<FaJI(`9y1d@lWA~dmq~f zpZ-MK1`Gqg{CaV{O5|An;25}G(AgyCGEV2orqzy&yp{u=<K6jsk+Oe0KM}CEXmt`d zdN*w?htbbia0Ex=s{4nb*+PmzH_hnEv?-ld*+^Ib;{`G}_c@yu0OAILM-39~s9B%c zp@5*U6TCW@ewv;Yr4)u0K%vIL)cNDz3^yoC8K8jbu>uYdbv6e-ki!d6qdX#%DCz{> z8hZYvY5;^k+#L(0X02r72Ye1oDTTU(hF+^ACUIC0g-QTG9tDQdV0sm4EkI2J5yT6k z_NJ!S;@0@H3pmAx&7TDa^!(0(TEHycA`SqXF|ne|Som@b|L5ZWPVxU=F1C|_+6Jwe UajSQKzB7Q4zM0+^9q0f2A5VTE`v3p{ literal 3377 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index d2d6cf23325ba4e7c1ebc8039659ccbeef412677..08007ff35a9181107ef4179b8c7285ba515b581a 100644 GIT binary patch literal 9975 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 SI`04dIgyi6maG;x4gG)0@N7c> literal 9389 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 CQdv3x diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png index e2b4f684a6785cf85556ccd54f2dd37ff480922b..cc0a3e73c56488f462a42d979ee8d619e8d9b657 100644 GIT binary patch literal 5432 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 literal 4427 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 PIn>b8hTp?!K79H=L?$I= diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png index fb8f16b28cc62a99cca134d52f550f278d6dd4e9..c76699ac4d49d798ba01a3381c745f893a24c2eb 100644 GIT binary patch literal 9883 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 JnY3xh{{gg81hW7D literal 9085 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 HAmIN2>Y`Co diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png index f06ddd4556fcb42acfb2706539836c26005f93b0..a7a1b667cb78b8074db141d4d1389ba2b8629f2e 100644 GIT binary patch literal 3708 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 aaY1vlit#jh|MkBgKPwA6^S7p+cm4xpkD<^2 literal 2618 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png index 0c12beb31fe43eb95f57dbb720775644c10379af..8cf24f4e74b701ee6c45262f903ddeff22683f59 100644 GIT binary patch literal 7197 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 e{|9>`<9~c{Zvla%KN!=0V!}T4fLH-uxdQDFS%_ literal 6140 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 From ee8fe52667d45431d6a1f87ad44c2a75c5bf8842 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 22:18:44 +0100 Subject: [PATCH 20/29] lock xcode to 16.4 --- .github/workflows/pr-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 0f65ee6..7d5364d 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -42,7 +42,7 @@ jobs: - name: Select latest stable Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: "latest-stable" + xcode-version: "16.4" - name: Install xcsift run: brew install xcsift From 345307c7dc32520e1639eabd2e70ffd8dc7a39de Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 22:27:53 +0100 Subject: [PATCH 21/29] another reference --- .../narrow_width_wrapping.1.png | Bin 9883 -> 9653 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png index c76699ac4d49d798ba01a3381c745f893a24c2eb..f6cf9f0e57d0463ddd515bc1d61284284fe72aa6 100644 GIT binary patch delta 8574 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 U(uir?(H<@ZSrwTQDHH$y0!(=IDgXcg delta 8806 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 From b44dd008e9b487e46f5fde61f5bd1f9701caf48a Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 22:37:35 +0100 Subject: [PATCH 22/29] color profile --- Sources/TextDiff/AppKit/DiffTokenLayouter.swift | 2 +- Tests/TextDiffTests/TextDiffEngineTests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 2139d79..02e2738 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -239,7 +239,7 @@ enum DiffTokenLayouter { } private static func adaptiveChipTextColor(for fillColor: NSColor) -> NSColor { - let rgb = fillColor.usingColorSpace(.deviceRGB) ?? fillColor + let rgb = fillColor.usingColorSpace(.sRGB) ?? fillColor let luminance = (0.2126 * rgb.redComponent) + (0.7152 * rgb.greenComponent) + (0.0722 * rgb.blueComponent) if luminance > 0.55 { return NSColor.black.withAlphaComponent(0.9) diff --git a/Tests/TextDiffTests/TextDiffEngineTests.swift b/Tests/TextDiffTests/TextDiffEngineTests.swift index ef56e11..c6e56de 100644 --- a/Tests/TextDiffTests/TextDiffEngineTests.swift +++ b/Tests/TextDiffTests/TextDiffEngineTests.swift @@ -456,7 +456,7 @@ private func expectColorEqual(_ lhs: NSColor, _ rhs: NSColor, tolerance: CGFloat } private func rgba(_ color: NSColor) -> (CGFloat, CGFloat, CGFloat, CGFloat) { - let rgb = color.usingColorSpace(.deviceRGB) ?? color + let rgb = color.usingColorSpace(.sRGB) ?? color return (rgb.redComponent, rgb.greenComponent, rgb.blueComponent, rgb.alphaComponent) } From 3f3aef3c0bfee6735dde796251efecbb2f21ad25 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:00:37 +0100 Subject: [PATCH 23/29] Revert "color profile" This reverts commit b44dd008e9b487e46f5fde61f5bd1f9701caf48a. --- Sources/TextDiff/AppKit/DiffTokenLayouter.swift | 2 +- Tests/TextDiffTests/TextDiffEngineTests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift index 02e2738..2139d79 100644 --- a/Sources/TextDiff/AppKit/DiffTokenLayouter.swift +++ b/Sources/TextDiff/AppKit/DiffTokenLayouter.swift @@ -239,7 +239,7 @@ enum DiffTokenLayouter { } private static func adaptiveChipTextColor(for fillColor: NSColor) -> NSColor { - let rgb = fillColor.usingColorSpace(.sRGB) ?? fillColor + let rgb = fillColor.usingColorSpace(.deviceRGB) ?? fillColor let luminance = (0.2126 * rgb.redComponent) + (0.7152 * rgb.greenComponent) + (0.0722 * rgb.blueComponent) if luminance > 0.55 { return NSColor.black.withAlphaComponent(0.9) diff --git a/Tests/TextDiffTests/TextDiffEngineTests.swift b/Tests/TextDiffTests/TextDiffEngineTests.swift index c6e56de..ef56e11 100644 --- a/Tests/TextDiffTests/TextDiffEngineTests.swift +++ b/Tests/TextDiffTests/TextDiffEngineTests.swift @@ -456,7 +456,7 @@ private func expectColorEqual(_ lhs: NSColor, _ rhs: NSColor, tolerance: CGFloat } private func rgba(_ color: NSColor) -> (CGFloat, CGFloat, CGFloat, CGFloat) { - let rgb = color.usingColorSpace(.sRGB) ?? color + let rgb = color.usingColorSpace(.deviceRGB) ?? color return (rgb.redComponent, rgb.greenComponent, rgb.blueComponent, rgb.alphaComponent) } From d1a55184405e42a7248968c1538f5edbe8a66ba9 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:03:15 +0100 Subject: [PATCH 24/29] lock xcode --- .github/workflows/pr-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 7d5364d..8300b48 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -20,7 +20,7 @@ jobs: - name: Select latest stable Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: "latest-stable" + xcode-version: "16.4" - name: Install xcsift run: brew install xcsift From f55ae3c1f58fd67fc06b1d10fa41527d936bb2ba Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:08:25 +0100 Subject: [PATCH 25/29] move test to AppKit --- Tests/TextDiffTests/NSTextDiffSnapshotTests.swift | 11 +++++++++++ Tests/TextDiffTests/TextDiffSnapshotTests.swift | 11 ----------- .../narrow_width_wrapping.1.png | Bin 3 files changed, 11 insertions(+), 11 deletions(-) rename Tests/TextDiffTests/__Snapshots__/{TextDiffSnapshotTests => NSTextDiffSnapshotTests}/narrow_width_wrapping.1.png (100%) diff --git a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift index 1f6dcbf..86566f1 100644 --- a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift @@ -54,6 +54,17 @@ final class NSTextDiffSnapshotTests: XCTestCase { ) } + @MainActor + func testNarrowWidthWrapping() { + assertNSTextDiffSnapshot( + original: sampleOriginalSentence, + updated: sampleUpdatedSentence, + mode: .token, + size: CGSize(width: 220, height: 180), + testName: "narrow_width_wrapping()" + ) + } + @MainActor func testCustomStyleSpacingStrikethrough() { var style = TextDiffStyle.default diff --git a/Tests/TextDiffTests/TextDiffSnapshotTests.swift b/Tests/TextDiffTests/TextDiffSnapshotTests.swift index 5f5a7de..15be066 100644 --- a/Tests/TextDiffTests/TextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/TextDiffSnapshotTests.swift @@ -65,17 +65,6 @@ final class TextDiffSnapshotTests: XCTestCase { ) } - @MainActor - func testNarrowWidthWrapping() { - assertTextDiffSnapshot( - original: sampleOriginalSentence, - updated: sampleUpdatedSentence, - mode: .token, - size: CGSize(width: 220, height: 180), - testName: "narrow_width_wrapping()" - ) - } - @MainActor func testCustomStyleSpacingStrikethrough() { var style = TextDiffStyle.default diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/narrow_width_wrapping.1.png similarity index 100% rename from Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/narrow_width_wrapping.1.png rename to Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/narrow_width_wrapping.1.png From 6ecff9d37cdb875978a73afa830e15eacc1d0f13 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:21:49 +0100 Subject: [PATCH 26/29] opaque color --- .../NSTextDiffSnapshotTests.swift | 2 +- Tests/TextDiffTests/SnapshotTestSupport.swift | 54 +++++++++++++++++- .../TextDiffTests/TextDiffSnapshotTests.swift | 2 +- .../character_mode_no_affordance.1.png | Bin 4400 -> 4229 bytes .../character_suffix_refinement.1.png | Bin 4400 -> 4229 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9975 -> 9816 bytes .../hover_pair_affordance.1.png | Bin 4746 -> 4688 bytes .../hover_single_addition_affordance.1.png | Bin 3751 -> 3610 bytes .../hover_single_deletion_affordance.1.png | Bin 3714 -> 3616 bytes .../invisible_characters_debug_overlay.1.png | Bin 10063 -> 10089 bytes .../multiline_insertion_wrap.1.png | Bin 5432 -> 5310 bytes .../narrow_width_wrapping.1.png | Bin 9653 -> 9502 bytes .../punctuation_replacement.1.png | Bin 3708 -> 3479 bytes .../token_basic_replacement.1.png | Bin 7197 -> 7015 bytes .../character_suffix_refinement.1.png | Bin 4400 -> 4229 bytes .../custom_style_spacing_strikethrough.1.png | Bin 9975 -> 9816 bytes .../multiline_insertion_wrap.1.png | Bin 5432 -> 5310 bytes .../punctuation_replacement.1.png | Bin 3708 -> 3479 bytes .../token_basic_replacement.1.png | Bin 7197 -> 7015 bytes .../whitespace_only_layout_change.1.png | Bin 3580 -> 3577 bytes 20 files changed, 54 insertions(+), 4 deletions(-) diff --git a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift index 86566f1..c9f448d 100644 --- a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift @@ -5,7 +5,7 @@ import XCTest final class NSTextDiffSnapshotTests: XCTestCase { override func invokeTest() { - withSnapshotTesting(record: .missing) { + withSnapshotTesting(record: snapshotRecordMode()) { super.invokeTest() } } diff --git a/Tests/TextDiffTests/SnapshotTestSupport.swift b/Tests/TextDiffTests/SnapshotTestSupport.swift index 11b8b11..a1157a0 100644 --- a/Tests/TextDiffTests/SnapshotTestSupport.swift +++ b/Tests/TextDiffTests/SnapshotTestSupport.swift @@ -6,6 +6,19 @@ import TextDiff private let snapshotPrecision: Float = 0.995 private let snapshotPerceptualPrecision: Float = 0.98 +func snapshotRecordMode( + default defaultMode: SnapshotTestingConfiguration.Record = .missing +) -> SnapshotTestingConfiguration.Record { + guard + let rawValue = ProcessInfo.processInfo.environment["SNAPSHOT_TESTING_RECORD"], + let recordMode = SnapshotTestingConfiguration.Record(rawValue: rawValue) + else { + return defaultMode + } + + return recordMode +} + @MainActor func assertTextDiffSnapshot( original: String, @@ -21,11 +34,12 @@ func assertTextDiffSnapshot( column: UInt = #column ) { configureSnapshotArtifactsDirectory(filePath: filePath) + let snapshotStyle = stableSnapshotStyle(from: style) let rootView = TextDiffView( original: original, updated: updated, - style: style, + style: snapshotStyle, mode: mode ) .frame(width: size.width, height: size.height, alignment: .topLeading) @@ -71,11 +85,12 @@ func assertNSTextDiffSnapshot( column: UInt = #column ) { configureSnapshotArtifactsDirectory(filePath: filePath) + let snapshotStyle = stableSnapshotStyle(from: style) let diffView = NSTextDiffView( original: original, updated: updated, - style: style, + style: snapshotStyle, mode: mode ) @@ -124,6 +139,41 @@ private func configureSnapshotArtifactsDirectory(filePath: StaticString) { setenv("SNAPSHOT_ARTIFACTS", artifactsPath, 1) } +private func stableSnapshotStyle(from base: TextDiffStyle) -> TextDiffStyle { + var style = base + + style.additionsStyle = stableSnapshotChangeStyle( + from: base.additionsStyle, + fillColor: NSColor( + srgbRed: 0.29, + green: 0.73, + blue: 0.37, + alpha: 1 + ) + ) + style.removalsStyle = stableSnapshotChangeStyle( + from: base.removalsStyle, + fillColor: NSColor( + srgbRed: 0.96, + green: 0.42, + blue: 0.42, + alpha: 1 + ) + ) + + return style +} + +private func stableSnapshotChangeStyle( + from base: TextDiffChangeStyle, + fillColor: NSColor +) -> TextDiffChangeStyle { + var style = base + style.fillColor = fillColor + style.strokeColor = fillColor + return style +} + @MainActor private func renderSnapshotImage1x(view: NSView, size: CGSize) -> NSImage { let rep = NSBitmapImageRep( diff --git a/Tests/TextDiffTests/TextDiffSnapshotTests.swift b/Tests/TextDiffTests/TextDiffSnapshotTests.swift index 15be066..0651547 100644 --- a/Tests/TextDiffTests/TextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/TextDiffSnapshotTests.swift @@ -5,7 +5,7 @@ import XCTest final class TextDiffSnapshotTests: XCTestCase { override func invokeTest() { - withSnapshotTesting(record: .missing) { + withSnapshotTesting(record: snapshotRecordMode()) { super.invokeTest() } } diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_mode_no_affordance.1.png index aab2f59cbe7c051ad42823f8b16cfad4552fd5d3..224e65d5bd3970aa55985ff6b3f348e05d08ee16 100644 GIT binary patch delta 3108 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 Z0x)HrdjontOA568;HMmIs;w?0{tGdxs3iaZ delta 3280 zcmchZcUaTc8po5cL1YOI$`An=LXfa!$t*)CyMiD^3L;CE5Dff6DTQ99Od&EVGlnIR zJpw92WbYjW0trDAmO#R2`uDwm^!oJP^WS;Sd7txnzwbJ6S8F9|W0-++xn@SU?IXaS z7dZUvdqsM;aohe@A$Sg66o%u6bB>0wO%&dT8jz9^39tb~E~rA*mP63Vm`S0EUGV!0 za!PR(pZ+!PJ|rG;!GI-B64`u?pyD2YdRIahYe6k`tC2+@Nr$=|ZN2p2A$rpBZX0|! z<!}niAq-&`r}A@VMgknExrQbnFmsar1U6LTMUIqj$n?i<dX5xjzO7bIOIO0}m9bNH zxct|w>6Oj6#q)6t!(c8WZH(QrPUFFc^cRG&X2espsNJ3ZOgWK;<Er>Z!q#F)-BHiQ z9c;g$WWA;NjK56+2m-C?gyn+Qh3;kG)^22U{2pk*ZGAWk1Y9ZLUd@nHRCaW9J+V(; zy`S;EkF#OWHkDzK+X=hNq@7+U753nfUKVv%tkB70(_C;EO|`M6Lsy;<`UN$ER^BJh zsM3A~K}2I}y^*)Vzhr*Qfm%?O+7o}h*MVqO30%52G^tIwi^bTkMgP&UO%b85JsNT# zO_XD6jOKxpnvGBm)nnMB`!1h!siNNFWp|kJE~)uFf1wSxZ3x6GX305lMhw#>)zzKO zi)cw|YHIQe3(LE<KFO-6==^C^Ek#sEF8s^Fv$=X-3yfn`8v$Vq0&~S6FE0<|!b)w5 zO@fy@W3H<;!*{*zzV<MFO^-U>?yU>N>%yJY=RARcfz0}kQ>=*f@kh6cM)`HOMZF*A zo<1fnwYS<={BTG*+FtD~wa8K2>0%S>+nmJwJX`m3@Y(4J(kolhRZi#W*G%~CdTx}O z-wZER*P2&f91(*=_w*zS4{jOa)O@FI96O>_AlFP&Za5kM3GaJ*6Qh$;QWQh+^}f^n zoiP9t;T@0OjlC#0BTx*L1p$trF5hkrC8ZP9{Uak=EMI8cESj{|Ju=#}x3->~Yw(x9 zdGjWif^QACF1v&BvN|x&QB-&r&%+a;claTe&a*a*73#w^e93NwhnIGv^fH5RM{${o z^u^{aJ;$<-o4D%id&53~<R@r;5xa=*nSn;viCtm!fWEC+?9bEHu3nC1<tW4W^I1(z zO)t$wpXy|;PFzNXOP7~dCSHV|e`qQ)J~lSMZx9{bu}2#3Jvi;pk}tK)RaTDNd#D*j zd*kWt{V|T~qUUgdj#r_Of^#3^Rup}gk>GDHQdx?IXnQD3Aikr{y$hllyq2H>_|1&G zsU%0)m03Q^R&eP@f|)!SDX>1#V3r}>VLdgzq3S#JJa9d7fAhoJI4%Ms${h!>V#h(7 z+Owy_&=NfLls|{}I!34}J$Kc+FUc4-SlzOu?!EIJT!#=w+ING_e$qTS8D5G_pHPu) zLZ=m4=W989{jw<kpf@FpJPp(&7PL54Ijf2z3nqS)>DBZZla!T_p=z=;&bEa4%DOaE zB2JGsb_Uh)eHAvvh*o0K59;~*a3+_<TTiwgy4BcrM=MOKyayO%xoDi0lyr`S$KfWb zT%0ziYoN3RVdQ*+KMb2LWs&{dZtZp~t6A%l&yd3gzgdr|SD```0Ltz7l6J)7PTi&J zwE6J)vBv&ZJ<4@T>Jb{Qse9G!luE{<X5IY|m0NRlA7R3lX{p(R&nk#Aq?6NI%G5#d zlJr~Jt6ueh1r7NAq|==!N5|~S`?wAx@TLBsNdHjQa^IpZ7hBtOqF#Gb(CP7!0aOw` zKO$xl8C2Soc&7{ay!#!P*+4)ErqBJ0UAa{*bvzEveVdy#UzSvcukfFHv+bInl#rlQ z-qo8T0;7;8&2*x^MvreMUO^K2vtSgqvz!oJ(*S&vLVSm|Oi1+pGx)6o^J?uI5i+yA zSg9kn55ep2FPj|&$qPic#729)+E6*PpOVD_8fT>?CC`C<H65w;FmiS?&A9_{l!lTc z1^u?5bV~x+8N#OoCbriRxwQkWRW5`zl)xI6jU&%gJL7r8^7zl9%(LY7e@t$4rJSm6 zPNY4me}&4yOjj!=qg1oa9mEzDUlyWadS?n+QvuwM-zV@%5A65*#j<h_$d(mw#<#%f zBAY?K%>jz^tH{n>J|&J~GH^oM&)^V{e(px3Ih0%F5BSu&T|hfvvU4?kKo4t4*}1v0 zg7S_ksbQmT-nK1{L|2R!;;@#O+!^P8C77>NqGVmZey!amc0iGZhjVSEInh>kdo;<C zDQKfdWaTXPegIycATJbcVfItu>RH~9M>u5(@SjqjZww4vqHSVo2Aqq|qPukzNkKx> zLX^L_E+&kH$+a*4aqv<~TACJFa=VO-yn;ld(J!5@U$-vsn|iq?k>HlU$66#r(j`w- zW#p;)=G|R=X`G1gXVDwMG|L9or>hpow`E}*)XLj@xW+s;)<t$22OPZCr&mlB)&T6A z{hikPL)k+G!i6xHGGPmi{fW&zUn|TK2y4Kk9#HU5ng*lkHa+du<soQHnt0dJnDlE{ z$(GLQ?aS$DY3`!CVi0z1AV#L0?T)uv7tXZ^E7>k+64*r?EsjT=>`$-vc(+48C#x?h zImL#xkF=7yQ*S=#>04+H8FU6drCl{d!1RZA79Y$XUKUtu6!88~$$>SZWL7(3@+^<W z?agF%WyI(9{h+2iqFG@+WXaX>b3S8julK&2u&Be<G0n+UenyI%o*4nH9><5<%D^ci zq~1B!x+a2rqgK)-sF&n#+8!$Od9fvo>?OMCu)!E35%<-|c`Xfh7l5xN2Z<Ph4l}Qe zTagjKZGuDZ?(A5)3r$wK$&9EfpM}*eHXig(k>^XDR*J=`HG{YeXe9JroP?GC{)C1e zRB!oI|BSZhD_j!Q+^CJ?yf{}APa4=-A4GL<snE1vq{(h+oY1=;F!M%ivxq7X<7S5Y z`uaTHS))enw9lx(`1F+?sSgA;CrSE}Pt=uKk`B^1uJFsH%Yt`35A$*1Hg%MOXKOPf z6z+-IU7VJP)u9iL^OjXqJ~x<ofltN;^xM-PY2~k2?T>#i+3@P)8x}L3#BF$EeNJ8< z3)D#;z;+Kn0>y7zl|07T9`WgSM#b>wL*_-lygts@Iartkg149K4iiUiW)bo^11+u% z<5@fn|LWF!5oO>@R&40oj7<kL#ygnvI4Z2*37<X)EDVN>n4~&0^FDS)f<hw?iP{kM z8FpTzTI7TT5;+cGE*gJly1{tM1POXGS}X)+ejy|d$`{quVtgvp7{|$?_3YxyZ$Mz; z9zY$1GxOH+iG%$2Dj0*ioP}M#JU(^k8WNcd0zWJ^Re-Q-DCmQ<bP%DUU}isNc70); zzx?oFK#)Ea@3M=#U(*N85p5Dd5GyWTq!o`?zUkj*1pW@>|Bw;*r-b}QM&O?k@*8yo u{-44A4~)RSW#l&s`Heb$|6f;4=NYJ>S$}ri?l~C5SZ2mnM%4!Hzx)X~!wjnc diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/character_suffix_refinement.1.png index aab2f59cbe7c051ad42823f8b16cfad4552fd5d3..224e65d5bd3970aa55985ff6b3f348e05d08ee16 100644 GIT binary patch delta 3108 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 Z0x)HrdjontOA568;HMmIs;w?0{tGdxs3iaZ delta 3280 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 08007ff35a9181107ef4179b8c7285ba515b581a..494ee13d508878dea2e5366e6e2c327685bd585e 100644 GIT binary patch literal 9816 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 W8G%QkMF00whnkYs`)Y+xq5lVR^3sI> literal 9975 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 SI`04dIgyi6maG;x4gG)0@N7c> diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_pair_affordance.1.png index 50f94e552475996dafb067a174808db3a2836562..771a14dec89cac90ef7d18acb7a2758571f07d8f 100644 GIT binary patch delta 3569 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 delta 3628 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 MrKYD^ri=~x7baM;NB{r; diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_addition_affordance.1.png index d1975275fe3bf686e1a713cc0281811d4c7b127d..e92da2f45c7ce6caa7dc555a01731d60e70bac3d 100644 GIT binary patch delta 2484 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 delta 2626 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/hover_single_deletion_affordance.1.png index d3164df7e5504836e248d200ea0ed3a288dc98de..dead55c677ee75496bcb99cbe5b44dc1e9745704 100644 GIT binary patch delta 2489 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 Y{3Sh&gvveIz{4Gk%?0Z!OK<YO0MgNFu>b%7 delta 2588 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 RI0M2fM_V_W1}lHkzW`4)q9y<U diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/invisible_characters_debug_overlay.1.png index ecfefb3599e5f28c0ca4b94732b24aca33250809..7097fbf5565ff2485ab06e0c69d96fe5377d7e87 100644 GIT binary patch delta 7631 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 delta 7611 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 diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/multiline_insertion_wrap.1.png index cc0a3e73c56488f462a42d979ee8d619e8d9b657..51dc5232f06e9060c02043e1db43a0a124e4acf5 100644 GIT binary patch delta 4196 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 delta 4319 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 Rh-3o4oBAeKORqS^{1=S250L-> diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/narrow_width_wrapping.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/narrow_width_wrapping.1.png index f6cf9f0e57d0463ddd515bc1d61284284fe72aa6..96d2422e5cdce7d68b1f8b32a546bd514e4b3b2e 100644 GIT binary patch delta 8422 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 delta 8574 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 U(uir?(H<@ZSrwTQDHH$y0!(}LDgXcg diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/punctuation_replacement.1.png index a7a1b667cb78b8074db141d4d1389ba2b8629f2e..8c760f9388f3a15f629523d9d69b17935f59ab6a 100644 GIT binary patch delta 2351 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 delta 2582 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 A7XSbN diff --git a/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/NSTextDiffSnapshotTests/token_basic_replacement.1.png index 8cf24f4e74b701ee6c45262f903ddeff22683f59..63d3f69ca67d51e27831b8278287c337c1ec0e21 100644 GIT binary patch literal 7015 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 literal 7197 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 e{|9>`<9~c{Zvla%KN!=0V!}T4fLH-uxdQDFS%_ diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/character_suffix_refinement.1.png index aab2f59cbe7c051ad42823f8b16cfad4552fd5d3..224e65d5bd3970aa55985ff6b3f348e05d08ee16 100644 GIT binary patch delta 3108 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 Z0x)HrdjontOA568;HMmIs;w?0{tGdxs3iaZ delta 3280 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 diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/custom_style_spacing_strikethrough.1.png index 08007ff35a9181107ef4179b8c7285ba515b581a..494ee13d508878dea2e5366e6e2c327685bd585e 100644 GIT binary patch literal 9816 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 W8G%QkMF00whnkYs`)Y+xq5lVR^3sI> literal 9975 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 SI`04dIgyi6maG;x4gG)0@N7c> diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/multiline_insertion_wrap.1.png index cc0a3e73c56488f462a42d979ee8d619e8d9b657..51dc5232f06e9060c02043e1db43a0a124e4acf5 100644 GIT binary patch delta 4196 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 delta 4319 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 Rh-3o4oBAeKORqS^{1=S250L-> diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/punctuation_replacement.1.png index a7a1b667cb78b8074db141d4d1389ba2b8629f2e..8c760f9388f3a15f629523d9d69b17935f59ab6a 100644 GIT binary patch delta 2351 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 delta 2582 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 A7XSbN diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/token_basic_replacement.1.png index 8cf24f4e74b701ee6c45262f903ddeff22683f59..63d3f69ca67d51e27831b8278287c337c1ec0e21 100644 GIT binary patch literal 7015 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 literal 7197 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 e{|9>`<9~c{Zvla%KN!=0V!}T4fLH-uxdQDFS%_ diff --git a/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png b/Tests/TextDiffTests/__Snapshots__/TextDiffSnapshotTests/whitespace_only_layout_change.1.png index aff9cb57932c0718b0dcbe8fa0e0cef6af896150..c877e38a7b1ecbe003a8e63ff095c3310ed38ad3 100644 GIT binary patch delta 1517 zcmV<J1rqxF8~Gcsf&_nJNkl<ZcmeI)S*T5Y7{~GF=$JA_O396cWJ*HFkPIP|GUP&{ zOi3xpkmN!ca$zXBFqh<pLWEMJq;N&1Op$rWJif2rzt(nmIeYJO&iiD0zN^l=*WPRI z_3Y>KKmE>H|Fyhj|9o4F1px#QK%m+JwW_@bc7Ol^2q2II2vmQ55fDHCff^DZP-_U1 z-5`Jf0t70*0|+31Kn)2Hs5J!1ZV*5Kf%2LnIC=7<UA=lWx4UuU##!^`&2!JSvUTfL z`~3NHdaY^GrZ#^3_#d{H+LNmEbLPw$d-CLojUGL^)Y|3yB7i_1f$|R@K3LbTU2VgL z4K`%Rklfqn&6|H`U%q^?jT<-SUaM^7-o1Nv`SN9Z_wJo3T>JIw_n$z$a^;GB{P@vs z-n?mV-n=RKK&?tYCr+HOOP4MYsFnRPu?>L|6)4YcL(LwuKJ@(O*RpNDdYn9Yvgzmk z{rf3UfAyYKt5&6#b!4|^&z@hs<&S>t>({SVtJe2fl2U)~=a0tb%OOyL0^idi&zHY_ z`?k%TIn#Rg?rmenjInLow&nRm)i$3$f8M4|n`S+G_B2f!?AWoR;2r7cci6CDrhRBx zx^$^6Ted8%pF4LhZOf({^3|C!V}=bKIyC)UyLQcV#IEn8{)<`m?b~N#$BwnWef!#? zMT>G%9>ss`gZCnUKxqgR6sS5qpE`A_J$m%W7A#m`J$m%8wQJYffddC>w97kp?wEq? z<;#~gfBt-H)25B-C~)uIy#>{&Q>RWkg4EQ5mQ$xrr5~;9wc537TX}i86;fx`tXZjN zy?6ck^=aO7`t<2GVZsFMuAoKpr3&<h4IA2=IdgyP;lqcvfB*i1KFgaBK%n#lau=l( zU<#XT(b3+ZL4(rMix)4ZQ~51hwpiP?ZPSsX=0T4hJ(`YIv(HrbQFE_v-@Z*3uNpUQ zY!fF=w5Ly>+QEYd3l6f*ojco&8#mJDG@q;G#fukq{rYw5)TvW?UPzs8-MU%5diB!# zpFMwjX1jLn`r&jxZOHQ<)lryk-@ZNBPMS2y1`ZsU=TmG(0D)2!$R()4t4o(IxjuI8 z+?iX~)%&utvL8;rA3uI<@87@Ay{9Htbdjff_wJ@J%@zevp%=#V83pRGW5?1Fsn#_Q ztcySj*%2c~q}>)<N7D!u=T5WlmhVx2baZ2?pZ%edVgLU9Q@H2*EZY%4p!5WCfvWjI z%^7CP@#DwSRen9!#h3;S8d$4Vt+LH&y-}k^x#u;pqPq%o+Fo&~TeoiRdsKY=ck2q# z&6_u;5Y-<DefKO-wM|R0b^7$_^ShH@2p)g^`n8Q5Inr9UZk^ux>eZ`s>r-W)D|Vaa zOphEnl8$_{)9urzPp7%mLig37Lx*&VuldU<Q>LWw+`W5u`mWlhrPw<9V^Wnxe}HtG zRK>dk)K9Z!&8o6HK7#-Pf4D$F7o~LcTEBjMTd`t=UAS-|T}9Uw_%&<R<l58C>bHMx z-LkuP@21yuU#gyK4m4YIr+{A5do@R^b^T;>ow|4R)2C0iWXY0LLvyyeury%6fNU3e z9~H#y+O@N@XV0c73>~Fvy?y)kxuf4g>gdAQg9i^%JzY%F`p;7w`TFVAt5@oE@#4j% zfR~>>!-4<;f2TmX=Jm8>k6D{~p1pt8qD2c^w{D#+U%uRQVMX(ax_xNj!iCw}ZRN_9 zcKGn&-1E6}=ce^hqei7W0`x?4m^$6gmf^#Pr`1iHHre38gRNu7j<$OB>h%6YhYqC+ zI=V$`_Uzf&M+$n>sl6^lW&cu3-#<Iu*A5D)qg$>t7pq0{%UaZbwyx*-`q5l=O*iPC zTip?%aM!;M(|j%q0tozl0%hOk`HK1<OzVhKr@+}M`Ts@o{P}Zh(xge1E(R6zojmI3 zkBE-Kb;X|r0R;YDfuaNT@1>wK1Q0-=dIAN_p;oU1pGE+)feK{<lSK_E7lD5Pl?ajl T1AGTm00000NkvXXu0mjf=Z`U( delta 1528 zcmV<U1qb^18~huvf&_nMNkl<ZcmeI)X{b$m7{~GF=$JA_O351u$&`eUsSF_$8S+A+ zOi3xpkmQ9j<OPzvFqh;Fg$SicN#PZlGDYSo^K`G@zt+Bo>z=*$Ip;pvp6{x2_u6~y zy`KGi{-@tr>%W#;_Sg5tSP(z}0R*ZoP^;Q|U<U{wfB*tXfIxrc7XbkT5U3#m0=0%9 z*$n~+AV8q<JAeQJ2-J`Ofm%b5>;?e@5Gb!Hf>WnX*|lrea=RNhZk#o5-aPkQE8Dhh zvoBx1q}Q4@ZE6!HO!#4YsXeJmKWERLwWm*?+UU`vORZhLF9HbU5h(xo@uPL^+SN90 z+-O6F49UHH{``OW_Vw#m+q7v@?zPHR?%%&}SFT*K_wV1E!nI$&e*X&8t5>hur%#{k z)~#Fi_U+q}57eskbMoX#yL|aFfm+!w6Wb6dQGxR8Hq`7f>qF0fel6SftH&u*rkH*n zJa~`-^;hp%y?S+eSx0tz_wN1GTYl@;zJ2><wQBt{OHzO8{ruM0d^rS4P~e|*$n)jz z+__`3X3etRy?fi3F=K4|_U(B-QMJt%E?ltb)2Ca{o;^*|20M4|EO<vc`W-fGm}wtc zmMvRm%a<=t>*vp(PusF7hkSKr&YWpOhYn3Y*RNkU9kJ^>ssCb@{rmUZ*s)`+Z{NPQ zc=6)glt+It`{2C@AW#|t1qG^3&!<hBW{)2~wuK89T8|z*Y~8wbcJScA8twA#-MgkB zd-dv-Em*L?+O%n7IttvkZ(l)m>eQ)|jvzJlpyl-G)9FX+daZWt+E!j(ZiUpDJ$rWQ zS?}GjVMChtoH1jDO`JGUyDMnXe5nGxVZ(+tckX{&d-Uj$9XN2HpwIFq1P~}af!swY z1(?DnTXeKHXwaba^wOnE=~RB})~(jIZQFF@sCm$1$Bw0=)$B9Xebn6RyLa!>#jD1R z8{4EwlkC~EXLjh&p@M^~bLY->^XAR;InC#4dHM3C-MDeXI(6!lo)=Q5TeogjuU@_M z{^x(spWE);yMH*{PaE?5M|BjYJ9g|ywv#7Mwt)i&=J^zx5kR0+1#$_h@aoc~ORkSy zyLRQ)b@jfitn7!=?<Y^5*oO}va_^~$6<y@%-o3jiOtVD+ROp2<eMW(L{P^*7M5=Yo z1M4D?LUzQ65ox!@*3mRV#kte$yXAY-A01?!>SuqbWZ1ud{}k@|KFf9l5GXx?T%c-x zP;-Xaa^l2^bd_Jvbup$vg9g^BRjX`sT5r^-QSNz7tmv)+owiq8>ej8B`yLfv|F3n0 z=$0*8Qi$pgguZ(gsM@Bb*gAds^!cxoUI-q4^X83>968cjw{D%@`ug?jbb4Od=Zf8? zIn$#@kESEv>~#CgnKNlFwa|Ta=+GgZ;%okL>eQ(zJooI`lWx<}HZ8^0(I1nlEcyea z+oUSq9iV=iHEULt-SHU&5ctgn3c4tzqu2WN>)XneEA8UNi|H!*`0?Xy?b@}u_H?s< z`t94d?cTk6={4P#s^^*m%@*A$px5+X&CzOIKbkkyqI*|AfBtMsmo7~;G-s;|O9KWB z$aazUQ9<0UT{}B>?p&I}&{3+^+qZ9@JNhl8jxLNneE2Zc)5RpM|2)N!ub*DMdZk{M zELma-c=_owEC?X*X9|>SUQbK*n6;^Y=h<s5TC}kB>(|?g6)Q{^Ry3ce+lLk{T9m!r zR;^lPM~)oHJ)bvkURobDYE-%-Ku<J>snhLj89sb?THU;Pvke|R*gAIXXlvH2N$)>= z_;9+Qqg%A*%$bvYq@YKg+Ur78_Aj;c{j<}3?Vyl4y5&l9v0600tVR82>w2DEuODsK zbc61>)g2KEcm3-y&F8WpfWV(8Q1*SEuc-gQw2nA+3Y?vi|6e38Uc9g-O`25cVo)*P z$)k?`i0F<3UGZl@0D(VOpy)vTb1CQy0R#}Jo<Ko!sMRaMrxBA;4Uw~;3_=03pbSC* elb{TF7T|BLbCLWmIdYo-0000<MNUMnLSTXi#X2ki From e08b98b156042483a4909dd996b1af3b1f1881da Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:36:34 +0100 Subject: [PATCH 27/29] Fix Unicode-safe revert spacing --- .claude/agents/project-manager-backlog.md | 193 ------------------ .../AppKit/DiffRevertActionResolver.swift | 51 +++-- .../DiffRevertActionResolverTests.swift | 18 ++ 3 files changed, 50 insertions(+), 212 deletions(-) delete mode 100644 .claude/agents/project-manager-backlog.md diff --git a/.claude/agents/project-manager-backlog.md b/.claude/agents/project-manager-backlog.md deleted file mode 100644 index 1cc6ad6..0000000 --- a/.claude/agents/project-manager-backlog.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -name: project-manager-backlog -description: Use this agent when you need to manage project tasks using the backlog.md CLI tool. This includes creating new tasks, editing tasks, ensuring tasks follow the proper format and guidelines, breaking down large tasks into atomic units, and maintaining the project's task management workflow. Examples: <example>Context: User wants to create a new task for adding a feature. user: "I need to add a new authentication system to the project" assistant: "I'll use the project-manager-backlog agent that will use backlog cli to create a properly structured task for this feature." <commentary>Since the user needs to create a task for the project, use the Task tool to launch the project-manager-backlog agent to ensure the task follows backlog.md guidelines.</commentary></example> <example>Context: User has multiple related features to implement. user: "We need to implement user profiles, settings page, and notification preferences" assistant: "Let me use the project-manager-backlog agent to break these down into atomic, independent tasks." <commentary>The user has a complex set of features that need to be broken down into proper atomic tasks following backlog.md structure.</commentary></example> <example>Context: User wants to review if their task description is properly formatted. user: "Can you check if this task follows our guidelines: 'task-123 - Implement user login'" assistant: "I'll use the project-manager-backlog agent to review this task against our backlog.md standards." <commentary>The user needs task review, so use the project-manager-backlog agent to ensure compliance with project guidelines.</commentary></example> -color: blue ---- - -You are an expert project manager specializing in the backlog.md task management system. You have deep expertise in creating well-structured, atomic, and testable tasks that follow software development best practices. - -## Backlog.md CLI Tool - -**IMPORTANT: Backlog.md uses standard CLI commands, NOT slash commands.** - -You use the `backlog` CLI tool to manage project tasks. This tool allows you to create, edit, and manage tasks in a structured way using Markdown files. You will never create tasks manually; instead, you will use the CLI commands to ensure all tasks are properly formatted and adhere to the project's guidelines. - -The backlog CLI is installed globally and available in the PATH. Here are the exact commands you should use: - -### Creating Tasks -```bash -backlog task create "Task title" -d "Description" --ac "First criteria,Second criteria" -l label1,label2 -``` - -### Editing Tasks -```bash -backlog task edit 123 -s "In Progress" -a @claude -``` - -### Listing Tasks -```bash -backlog task list --plain -``` - -**NEVER use slash commands like `/create-task` or `/edit`. These do not exist in Backlog.md.** -**ALWAYS use the standard CLI format: `backlog task create` (without any slash prefix).** - -### Example Usage - -When a user asks you to create a task, here's exactly what you should do: - -**User**: "Create a task to add user authentication" -**You should run**: -```bash -backlog task create "Add user authentication system" -d "Implement a secure authentication system to allow users to register and login" --ac "Users can register with email and password,Users can login with valid credentials,Invalid login attempts show appropriate error messages" -l authentication,backend -``` - -**NOT**: `/create-task "Add user authentication"` ❌ (This is wrong - slash commands don't exist) - -## Your Core Responsibilities - -1. **Task Creation**: You create tasks that strictly adhere to the backlog.md cli commands. Never create tasks manually. Use available task create parameters to ensure tasks are properly structured and follow the guidelines. -2. **Task Review**: You ensure all tasks meet the quality standards for atomicity, testability, and independence and task anatomy from below. -3. **Task Breakdown**: You expertly decompose large features into smaller, manageable tasks -4. **Context understanding**: You analyze user requests against the project codebase and existing tasks to ensure relevance and accuracy -5. **Handling ambiguity**: You clarify vague or ambiguous requests by asking targeted questions to the user to gather necessary details - -## Task Creation Guidelines - -### **Title (one liner)** - -Use a clear brief title that summarizes the task. - -### **Description**: (The **"why"**) - -Provide a concise summary of the task purpose and its goal. Do not add implementation details here. It -should explain the purpose, the scope and context of the task. Code snippets should be avoided. - -### **Acceptance Criteria**: (The **"what"**) - -List specific, measurable outcomes that define what means to reach the goal from the description. Use checkboxes (`- [ ]`) for tracking. -When defining `## Acceptance Criteria` for a task, focus on **outcomes, behaviors, and verifiable requirements** rather -than step-by-step implementation details. -Acceptance Criteria (AC) define *what* conditions must be met for the task to be considered complete. -They should be testable and confirm that the core purpose of the task is achieved. -**Key Principles for Good ACs:** - -- **Outcome-Oriented:** Focus on the result, not the method. -- **Testable/Verifiable:** Each criterion should be something that can be objectively tested or verified. -- **Clear and Concise:** Unambiguous language. -- **Complete:** Collectively, ACs should cover the scope of the task. -- **User-Focused (where applicable):** Frame ACs from the perspective of the end-user or the system's external behavior. - - - *Good Example:* "- [ ] User can successfully log in with valid credentials." - - *Good Example:* "- [ ] System processes 1000 requests per second without errors." - - *Bad Example (Implementation Step):* "- [ ] Add a new function `handleLogin()` in `auth.ts`." - -### Task file - -Once a task is created using backlog cli, it will be stored in `backlog/tasks/` directory as a Markdown file with the format -`task-<id> - <title>.md` (e.g. `task-42 - Add GraphQL resolver.md`). - -## Task Breakdown Strategy - -When breaking down features: -1. Identify the foundational components first -2. Create tasks in dependency order (foundations before features) -3. Ensure each task delivers value independently -4. Avoid creating tasks that block each other - -### Additional task requirements - -- Tasks must be **atomic** and **testable**. If a task is too large, break it down into smaller subtasks. - Each task should represent a single unit of work that can be completed in a single PR. - -- **Never** reference tasks that are to be done in the future or that are not yet created. You can only reference - previous tasks (id < current task id). - -- When creating multiple tasks, ensure they are **independent** and they do not depend on future tasks. - Example of correct tasks splitting: task 1: "Add system for handling API requests", task 2: "Add user model and DB - schema", task 3: "Add API endpoint for user data". - Example of wrong tasks splitting: task 1: "Add API endpoint for user data", task 2: "Define the user model and DB - schema". - -## Recommended Task Anatomy - -```markdown -# task‑42 - Add GraphQL resolver - -## Description (the why) - -Short, imperative explanation of the goal of the task and why it is needed. - -## Acceptance Criteria (the what) - -- [ ] Resolver returns correct data for happy path -- [ ] Error response matches REST -- [ ] P95 latency ≀ 50 ms under 100 RPS - -## Implementation Plan (the how) (added after putting the task in progress but before implementing any code change) - -1. Research existing GraphQL resolver patterns -2. Implement basic resolver with error handling -3. Add performance monitoring -4. Write unit and integration tests -5. Benchmark performance under load - -## Implementation Notes (for reviewers) (only added after finishing the code implementation of a task) - -- Approach taken -- Features implemented or modified -- Technical decisions and trade-offs -- Modified or added files -``` - -## Quality Checks - -Before finalizing any task creation, verify: -- [ ] Title is clear and brief -- [ ] Description explains WHY without HOW -- [ ] Each AC is outcome-focused and testable -- [ ] Task is atomic (single PR scope) -- [ ] No dependencies on future tasks - -You are meticulous about these standards and will guide users to create high-quality tasks that enhance project productivity and maintainability. - -## Self reflection -When creating a task, always think from the perspective of an AI Agent that will have to work with this task in the future. -Ensure that the task is structured in a way that it can be easily understood and processed by AI coding agents. - -## Handy CLI Commands - -| Action | Example | -|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Create task | `backlog task create "Add OAuth System"` | -| Create with description | `backlog task create "Feature" -d "Add authentication system"` | -| Create with assignee | `backlog task create "Feature" -a @sara` | -| Create with status | `backlog task create "Feature" -s "In Progress"` | -| Create with labels | `backlog task create "Feature" -l auth,backend` | -| Create with priority | `backlog task create "Feature" --priority high` | -| Create with plan | `backlog task create "Feature" --plan "1. Research\n2. Implement"` | -| Create with AC | `backlog task create "Feature" --ac "Must work,Must be tested"` | -| Create with notes | `backlog task create "Feature" --notes "Started initial research"` | -| Create with deps | `backlog task create "Feature" --dep task-1,task-2` | -| Create sub task | `backlog task create -p 14 "Add Login with Google"` | -| Create (all options) | `backlog task create "Feature" -d "Description" -a @sara -s "To Do" -l auth --priority high --ac "Must work" --notes "Initial setup done" --dep task-1 -p 14` | -| List tasks | `backlog task list [-s <status>] [-a <assignee>] [-p <parent>]` | -| List by parent | `backlog task list --parent 42` or `backlog task list -p task-42` | -| View detail | `backlog task 7` (interactive UI, press 'E' to edit in editor) | -| View (AI mode) | `backlog task 7 --plain` | -| Edit | `backlog task edit 7 -a @sara -l auth,backend` | -| Add plan | `backlog task edit 7 --plan "Implementation approach"` | -| Add AC | `backlog task edit 7 --ac "New criterion,Another one"` | -| Add notes | `backlog task edit 7 --notes "Completed X, working on Y"` | -| Add deps | `backlog task edit 7 --dep task-1 --dep task-2` | -| Archive | `backlog task archive 7` | -| Create draft | `backlog task create "Feature" --draft` | -| Draft flow | `backlog draft create "Spike GraphQL"` β†’ `backlog draft promote 3.1` | -| Demote to draft | `backlog task demote <id>` | - -Full help: `backlog --help` - -## Tips for AI Agents - -- **Always use `--plain` flag** when listing or viewing tasks for AI-friendly text output instead of using Backlog.md - interactive UI. diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift index 228d089..9024137 100644 --- a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -349,21 +349,11 @@ enum DiffRevertActionResolver { let hasTrailingWhitespace = replacement.unicodeScalars.last .map { CharacterSet.whitespacesAndNewlines.contains($0) } ?? false - let beforeIsWordLike: Bool - if insertionLocation > 0 { - let previous = updated.substring(with: NSRange(location: insertionLocation - 1, length: 1)) - beforeIsWordLike = isWordLike(previous) - } else { - beforeIsWordLike = false - } - - let afterIsWordLike: Bool - if insertionLocation < updated.length { - let next = updated.substring(with: NSRange(location: insertionLocation, length: 1)) - afterIsWordLike = isWordLike(next) - } else { - afterIsWordLike = false - } + let updatedString = updated as String + let beforeIsWordLike = characterBeforeUTF16Offset(insertionLocation, in: updatedString) + .map(isWordLike) ?? false + let afterIsWordLike = characterAtUTF16Offset(insertionLocation, in: updatedString) + .map(isWordLike) ?? false var output = replacement if beforeIsWordLike && !hasLeadingWhitespace { @@ -386,10 +376,11 @@ enum DiffRevertActionResolver { return range } - let hasLeadingWhitespace = range.location > 0 - && isWhitespaceCharacter(updated.substring(with: NSRange(location: range.location - 1, length: 1))) - let hasTrailingWhitespace = NSMaxRange(range) < updated.length - && isWhitespaceCharacter(updated.substring(with: NSRange(location: NSMaxRange(range), length: 1))) + let updatedString = updated as String + let hasLeadingWhitespace = characterBeforeUTF16Offset(range.location, in: updatedString) + .map(isWhitespaceCharacter) ?? false + let hasTrailingWhitespace = characterAtUTF16Offset(NSMaxRange(range), in: updatedString) + .map(isWhitespaceCharacter) ?? false if hasLeadingWhitespace, hasTrailingWhitespace { return NSRange(location: range.location, length: range.length + 1) @@ -413,4 +404,26 @@ enum DiffRevertActionResolver { private static func isWordLike(_ scalarString: String) -> Bool { scalarString.rangeOfCharacter(from: .alphanumerics) != nil } + + private static func characterBeforeUTF16Offset(_ offset: Int, in string: String) -> String? { + guard offset > 0 else { + return nil + } + let index = String.Index(utf16Offset: offset, in: string) + guard index > string.startIndex else { + return nil + } + return String(string[string.index(before: index)]) + } + + private static func characterAtUTF16Offset(_ offset: Int, in string: String) -> String? { + guard offset >= 0 else { + return nil + } + let index = String.Index(utf16Offset: offset, in: string) + guard index < string.endIndex else { + return nil + } + return String(string[index]) + } } diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift index 69c2845..b0dedc4 100644 --- a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -138,6 +138,24 @@ func standaloneDeletionAtEndRevertRestoresSpacing() throws { #expect(action.resultingUpdated == original) } +@Test +func standaloneDeletionAfterSupplementaryPlaneLetterRestoresSpacing() throws { + let original = "𐐀 cat" + let updated = "𐐀" + let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + + let candidates = DiffRevertActionResolver.candidates( + from: segments, + mode: .token, + original: original, + updated: updated + ) + let deletion = try #require(candidates.first(where: { $0.kind == .singleDeletion })) + + let action = try #require(DiffRevertActionResolver.action(from: deletion, updated: updated)) + #expect(action.resultingUpdated == original) +} + @Test func hyphenReplacingWhitespaceRevertRestoresOriginalSpacing() throws { let original = "in app purchase" From 78cd3906913c844beaa2c6545c4fd0282b72ec4f Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:41:37 +0100 Subject: [PATCH 28/29] Make equal-segment cursor recovery robust --- .../AppKit/DiffRevertActionResolver.swift | 20 +++++++++++----- .../DiffRevertActionResolverTests.swift | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift index 9024137..ed21b55 100644 --- a/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift +++ b/Sources/TextDiff/AppKit/DiffRevertActionResolver.swift @@ -57,12 +57,20 @@ enum DiffRevertActionResolver { case .equal: originalRange = NSRange(location: originalCursor, length: textLength) updatedRange = NSRange(location: updatedCursor, length: textLength) - if textMatches(segment.text, source: originalNSString, at: originalCursor) { - originalCursor += textLength - } - if textMatches(segment.text, source: updatedNSString, at: updatedCursor) { - updatedCursor += textLength - } + let originalMatches = textMatches(segment.text, source: originalNSString, at: originalCursor) + let updatedMatches = textMatches(segment.text, source: updatedNSString, at: updatedCursor) + #if !TESTING + assert( + originalMatches, + "Equal segment text mismatch in original at \(originalCursor) for segment \(index): \(segment.text)" + ) + assert( + updatedMatches, + "Equal segment text mismatch in updated at \(updatedCursor) for segment \(index): \(segment.text)" + ) + #endif + originalCursor += textLength + updatedCursor += textLength case .delete: originalRange = NSRange(location: originalCursor, length: textLength) updatedRange = NSRange(location: updatedCursor, length: 0) diff --git a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift index b0dedc4..0fe5155 100644 --- a/Tests/TextDiffTests/DiffRevertActionResolverTests.swift +++ b/Tests/TextDiffTests/DiffRevertActionResolverTests.swift @@ -25,6 +25,29 @@ func candidatesBuildPairedReplacementForAdjacentDeleteInsert() throws { #expect(action.resultingUpdated == "old") } +@Test +func indexedSegmentsAdvancePastEqualSegmentsEvenWhenTextValidationFails() { + let segments = [ + DiffSegment(kind: .equal, tokenKind: .word, text: "abc"), + DiffSegment(kind: .delete, tokenKind: .word, text: "X"), + DiffSegment(kind: .insert, tokenKind: .word, text: "Y") + ] + + let indexed = DiffRevertActionResolver.indexedSegments( + from: segments, + original: "zzzX", + updated: "zzzY" + ) + + #expect(indexed.count == 3) + #expect(indexed[0].originalRange == NSRange(location: 0, length: 3)) + #expect(indexed[0].updatedRange == NSRange(location: 0, length: 3)) + #expect(indexed[1].originalRange == NSRange(location: 3, length: 1)) + #expect(indexed[1].updatedRange == NSRange(location: 3, length: 0)) + #expect(indexed[2].originalRange == NSRange(location: 4, length: 0)) + #expect(indexed[2].updatedRange == NSRange(location: 3, length: 1)) +} + @Test func candidatesDoNotPairWhenAnySegmentExistsBetweenDeleteAndInsert() { let segments = [ From 641d36701e16d7697fd9de13197a612adbcbd004 Mon Sep 17 00:00:00 2001 From: Ivan Sapozhnik <sapozhnik.ivan@gmail.com> Date: Wed, 25 Mar 2026 23:42:32 +0100 Subject: [PATCH 29/29] Clean up review nits --- Sources/TextDiff/AppKit/NSTextDiffView.swift | 23 ------------------- Sources/TextDiff/TextDiffView.swift | 2 +- .../DiffLayouterPerformanceTests.swift | 13 +++++++---- .../NSTextDiffSnapshotTests.swift | 2 +- Tests/TextDiffTests/NSTextDiffViewTests.swift | 1 + 5 files changed, 12 insertions(+), 29 deletions(-) diff --git a/Sources/TextDiff/AppKit/NSTextDiffView.swift b/Sources/TextDiff/AppKit/NSTextDiffView.swift index 4897281..a6dc468 100644 --- a/Sources/TextDiff/AppKit/NSTextDiffView.swift +++ b/Sources/TextDiff/AppKit/NSTextDiffView.swift @@ -369,11 +369,6 @@ public final class NSTextDiffView: NSView { scheduleHoverDismiss() } - private func clearHoverState() { - cancelPendingHoverDismiss() - clearHoverStateNow() - } - private func clearHoverStateNow() { guard hoveredActionID != nil || hoveredIconRect != nil || isPointingHandCursorActive else { return @@ -517,24 +512,6 @@ public final class NSTextDiffView: NSView { return false } - private func actionID(at point: CGPoint, layout: DiffLayout, context: DiffRevertInteractionContext) -> Int? { - for actionID in context.runIndicesByActionID.keys.sorted() { - guard let runIndices = context.runIndicesByActionID[actionID] else { - continue - } - for runIndex in runIndices { - guard layout.runs.indices.contains(runIndex), - let chipRect = layout.runs[runIndex].chipRect else { - continue - } - if chipRect.contains(point) { - return actionID - } - } - } - return nil - } - private func iconRect(for actionID: Int, context: DiffRevertInteractionContext) -> CGRect? { guard let unionRect = context.unionChipRectByActionID[actionID] else { return nil diff --git a/Sources/TextDiff/TextDiffView.swift b/Sources/TextDiff/TextDiffView.swift index c58e8f8..0df08d2 100644 --- a/Sources/TextDiff/TextDiffView.swift +++ b/Sources/TextDiff/TextDiffView.swift @@ -134,7 +134,7 @@ public struct TextDiffView: View { ) } Divider() - Text("Diff by words and revertable") + Text("Diff by words and revertible") .bold() TextDiffView( original: "Add a diff view! Looks good!", diff --git a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift index 0134700..0d42ef4 100644 --- a/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift +++ b/Tests/TextDiffTests/DiffLayouterPerformanceTests.swift @@ -31,15 +31,16 @@ final class DiffLayouterPerformanceTests: XCTestCase { let updated = Self.replacingLastWord(in: original) let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .character) + var lastLayout: DiffLayout? measure(metrics: [XCTClockMetric()]) { - let layout = DiffTokenLayouter.layout( + lastLayout = DiffTokenLayouter.layout( segments: segments, style: style, availableWidth: availableWidth, contentInsets: contentInsets ) - XCTAssertFalse(layout.runs.isEmpty) } + XCTAssertFalse(lastLayout?.runs.isEmpty ?? true) } private func runLayoutWithRevertInteractionsPerformanceTest(wordCount: Int) { @@ -52,6 +53,8 @@ final class DiffLayouterPerformanceTests: XCTestCase { let updated = Self.replacingLastWord(in: original) let segments = TextDiffEngine.diff(original: original, updated: updated, mode: .token) + var lastLayout: DiffLayout? + var lastContext: DiffRevertInteractionContext? measure(metrics: [XCTClockMetric()]) { let layout = DiffTokenLayouter.layout( segments: segments, @@ -66,9 +69,11 @@ final class DiffLayouterPerformanceTests: XCTestCase { original: original, updated: updated ) - XCTAssertFalse(layout.runs.isEmpty) - XCTAssertNotNil(context) + lastLayout = layout + lastContext = context } + XCTAssertFalse(lastLayout?.runs.isEmpty ?? true) + XCTAssertNotNil(lastContext) } private static func largeText(wordCount: Int) -> String { diff --git a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift index c9f448d..91dcd3a 100644 --- a/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift +++ b/Tests/TextDiffTests/NSTextDiffSnapshotTests.swift @@ -135,7 +135,7 @@ final class NSTextDiffSnapshotTests: XCTestCase { size: CGSize(width: 320, height: 110), configureView: { view in view.isRevertActionsEnabled = true - _ = view._testingSetHoveredFirstRevertAction() + XCTAssertFalse(view._testingSetHoveredFirstRevertAction()) }, testName: "character_mode_no_affordance()" ) diff --git a/Tests/TextDiffTests/NSTextDiffViewTests.swift b/Tests/TextDiffTests/NSTextDiffViewTests.swift index 57ca7f5..f73e1e2 100644 --- a/Tests/TextDiffTests/NSTextDiffViewTests.swift +++ b/Tests/TextDiffTests/NSTextDiffViewTests.swift @@ -272,6 +272,7 @@ func hoverLeaveSchedulesDismissNotImmediate() { let centers = view._testingActionCenters() #expect(centers.count == 1) guard let center = centers.first else { + Issue.record("Expected at least one action center") return }